Vim

如何將vimscript變數和字元串插入vim搜尋和替換

  • September 4, 2013

直到今天我才發現 Vimscript 的存在,所以如果這個問題比看起來更基本,請原諒我,但我一直在努力尋找這個問題的答案。

我正在處理 vim 中的一個文件,我必須在其中執行大量重複操作。例如,我的文件看起來像這樣:

   firstname
   secondname
   thirdname
   fourthname
   fifthname
   sixthname
   ...

該列表繼續進行,我想做的是在每行的末尾附加一個固定字元串,以便每行以遞增的數字結尾,即:

   firstname = _first1
   secondname = _first2
   thirdname = _first3
   fourthname = _first4
   fifthname = _first5
   sixthname = _first6
   ...

我知道我可以編寫一個簡短的 bash 腳本來解決這個問題,但是我被使用 vimscript 在 vi​​m 中完成所有這些操作的前景所吸引,這是我想獲得的技能。到目前為止,我已經制定了一個在 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

引用自:https://unix.stackexchange.com/questions/89352