UPDATE
As @Matt pointed out g:jsonTemplate is a list that needs to be copied. I originally thought that multiline strings were strings and overlooked the varible assignment detail after debugging. The doc for the mutiline string is :h let-heredoc.
There was another issue, unrelated to this question, that I solved thanks to @D. Ben Knoble's answer. I misunderstood the docs when trying to make the search pattern case sensitive and used a non-existant 'C' flag for substitute(), instead of prepending the search pattern arg with '\C' (and using single quotes). After reading 27.1 from :h usr_27, I realised that the cause was a forgotten setting in my .vimrc (set ignorecase).
Working solution:
function InsertJsonObj() let date = trim(system('date +"%T"')) let uuid = GetUUID() let copy = copy(g:jsonTemplate) " now using copy() "next 2 lines: substituted double quotes for single quotes, removed erroneous flag and prepended pat with \C to make it case sensitive. let copy[1] = substitute(copy[1], '\CUUID', uuid, '') let copy[2] = substitute(copy[2], '\CDATE', date, '') call append(line('.'), copy) endfunction ORIGINAL POST
The goal:
I want to insert a dynamically generated json string with 1) a unique UUID and 2) the date
The issue:
The function I made appends the same string every time I ':call InsertJsonObj()'
My understanding:
Well ... I don't understand. I have other functions that insert different json strings and each function produces a distinct UUID but every call of a function returns the same UUID (i.e. InsertA() will always return id = A1 and InsertB() will always return id = B1).
After replacing the date format to show the time I noticed that the string did change but only each time the vimrc is sourced (InsertA() now returns id = A2 and InsertB() return id = B2).
I don't understand why a function is only made once when the config is sourced but using :call calls the function when the command is executed. I tried reading ':h function' but nothing really jumped at me.
My questions:
What is the cause of the problem?
What doc page or paragraph should I be looking into here?
The functions:
function GetUUID() return trim(system('uuidgen')) "a script endfunction function InsertJsonObj() let date = trim(system('date +"%T"')) let uuid = GetUUID() "call append(line('.'), GetUUID()) "this line appends a different value every time let copy = g:jsonTemplate let copy[1] = substitute(copy[1], "UUID", uuid, "C") let copy[2] = substitute(copy[2], "DDDD", date, "C") call append(line('.'), copy) endfunction let g:jsonTemplate =<< END { "id": "UUID", "date": ["DDDD"], }, END Bellow are some of the calls to one of the functions:
# some calls to :call InsertJsonObj() after editing and resourcing .vimrc { "id": "91fe667f-7caf-47e5-b650-da1bc7532d8c", "date": ["15:21:59"], }, { "id": "950e3fef-f4f5-4b47-a684-c28a1b70b6e5", "date": ["15:21:01"], }, { "id": "950e3fef-f4f5-4b47-a684-c28a1b70b6e5", "date": ["15:21:01"], }, { "id": "bda591b6-c9cd-4093-8659-697738b191f4", "date": ["Dec 09, 2022"], }, # bellow GetUUID appended twice with ':call append(line('.'), GetUUID())' c79011d8-2f01-41ef-adca-6e12b39e02df 6d265289-8e16-4848-a719-f5ff6897c4d3 # adding 'call append(line('.'), GetUUID())' to the function body produces a different UUID but the same template string { "id": "11eb069b-ed95-4e03-af70-aae2711f10a0", "date": ["15:28:31"], }, def19400-d01f-4b40-8594-52a6fdc668aa { "id": "11eb069b-ed95-4e03-af70-aae2711f10a0", "date": ["15:28:31"], }, 8f1ab0c4-8d8a-404b-a62c-b8379094f2f5