Vim
如何將vimscript變數和字元串插入vim搜尋和替換
直到今天我才發現 Vimscript 的存在,所以如果這個問題比看起來更基本,請原諒我,但我一直在努力尋找這個問題的答案。
我正在處理 vim 中的一個文件,我必須在其中執行大量重複操作。例如,我的文件看起來像這樣:
firstname secondname thirdname fourthname fifthname sixthname ...
該列表繼續進行,我想做的是在每行的末尾附加一個固定字元串,以便每行以遞增的數字結尾,即:
firstname = _first1 secondname = _first2 thirdname = _first3 fourthname = _first4 fifthname = _first5 sixthname = _first6 ...
我知道我可以編寫一個簡短的 bash 腳本來解決這個問題,但是我被使用 vimscript 在 vim 中完成所有這些操作的前景所吸引,這是我想獲得的技能。到目前為止,我已經制定了一個在 vim 的命令模式下執行的函式:
:let i=1 | g/name/s//\=i/ | let i=i+1
這似乎很有希望,因為結果大部分都是我想要的:
first1 second2 third3 fourth4 fifth5 sixth6 ...
但是無論我如何嘗試修改它,我都無法讓它列印一個字元串(= _first),然後是遞增的數字。比如這個…
:let i=1 | g/name/s//name = _first\=i/ | let i=i+1
產生這個。
firstname = _first=i secondname = _first=i thirdname = _first=i fourthname = _first=i fifthname = _first=i sixthname = _first=i ...
還有這個…
:let i=1 | execute 'g/name/s//name = _first' . i . '/' | let i=i+1
產生這個。
firstname = _first1 secondname = _first1 thirdname = _first1 fourthname = _first1 fifthname = _first1 sixthname = _first1 ...
我嘗試過其他組合,但在這一點上,我幾乎是在黑暗中刺傷。我嘗試的一切似乎要麼得到一個沒有字元串的遞增變數,要麼得到一個帶有靜態變數的字元串。我怎麼能用 vimscript 做到這一點?
編輯:
我正在向 Ingo Karkat 提供正確答案,因為它直接導致我找到了解決問題的方法。對於後代,這是我最終使用的程式碼:
:let i=1 | 1156,1271g/$/s//\=' = _first' . i/ | let i=i+1
生產:
firstname = _first1 secondname = _first2 thirdname = _first3 fourthname = _first4 fifthname = _first5 sixthname = _first6 ...
我的程式碼(特定於項目)中唯一的細微差別是它僅在第 1156 到 1271 行上執行,並且它附加到行尾而不替換任何文本。
一旦你使用sub-replace-special,引入 with
\=
,一切都必須是 Vim 表達式;您不能預先/附加文字替換文本。因此,您的靜態文本必須編碼為字元串,並與.
::let i=1 | g/name/s//\='_first' . i/ | let i=i+1