如何使用Vim為每一行自動編號?

原文件:

a

b

c

d

e

...

z

修改後的文件:

1,a

2,b

3,c

4,d

...

26,z

想了半天沒有想通,哪位高手指教一下?


vim內部有內置命令如 line(), 用法可以查看幫助 :h line()

常用的參數有:

  • 所在行的行號 「.」
  • 可視模式下首行的編號 ""&<"

因此

  1. 每行前面插入行號如下

    :%s/^/=line(".")/

  2. 可視區域插入從1開始的編號

    :"&<,"&>s/^/=line(".") - line(""&<") + 1/

當:s 命令的替換字元串以「="開頭時,表示以表達式的計算結果作為替換值。


:%s/^/=line(".").","/


受人之魚不如受人之漁。

遇到這樣的問題用 Google,而且最好換成對應的英文搜

例如此例用 Google 這樣搜:vim line number site:http://stackoverflow.com

你看看 stackoverflow 上面的回答多好:

Add line numbers in vim


好像還沒有人提供過用宏實現的方法,那我就獻個丑吧。

移動游標到字母 a 上,然後依次鍵入以下按鍵序列:

I1,&qq0yf,jP0&q25@q

以下為分解動作:

1. 添加首行序號「1,」

I1,&

2. 錄製宏到 q 寄存器

qq

按 q 開始宏錄製。選擇 q 寄存器,是因為連續敲兩下 q 比較方便。

3. 複製從行首到逗號(含)的所有內容

0yf,

確保當序號由一位數變為兩位數時,複製的內容不多不少,正好是所有的數字加上逗號。

4. 將複製的內容粘貼到下一行行首,並且自增 1,然後退出宏錄製

jP0&q

使用大寫 P 粘貼,確保粘貼的內容出現在游標之前。

5. 將錄製好的宏執行25次

25@q

總共26個字母,已經人工輸入了一個,還剩25個。


Linux的藝術在於,每一個工具獨立做好沒一件事情,對於添加行號這樣的事情,你應該安裝 nl 命令,而不是用 Vim。使用 nl 加文件名加可以給該文件每一行添加行號。

另外,前段時間翻譯了一篇 Vim 相關的教程,詳細介紹了 Vim 的歷史以及以一些使用技巧:

wsdjeg/vim-galore-zh_cn


:%!cat -n 字數最少的方法
:%s/^/=line(".").", "/ 最正規的方法
:let i=0|g/^/s//=i.","/ |let i+=1 不用函數的方法
:g/^/exec "s/^/".strpart(line(".")." ", 0, 4)
:g/^/exec "s/^/".line(".")." "


我一直用的是這個方法:

1、列模式在原文件要插入的列前面插入一列 #

2、然後,:let i=1|g/#/s//=i/|let i=i+1


vim /etc/vimrc

跳到最底部加入set nu

wq退出!

永久解決方案。


另一種使用宏實現的方式:

錄製宏:
:let i=1
qa
I&=i&,&
:let i += 1
q

使用宏
jVG
:"&<,"&>normal @a


恩,雖然我以前也經常用@pw的做法,但總是記不住命令行里調用函數的方法。

所以我的辦法就是。。。

:%!cat -n " 加行號

:%s/^ * " 去掉行首空格

:%s/&/, "改成題主要求的逗號

好記又好寫。


用ue直接列模式啊


推薦閱讀:

如何使用 Vim 做前端開發?
在哪裡能看到大牛使用 vim 或者 Emacs 編程的視頻?
vim中為什麼有那麼多map?nnoremap, vnoremap .....
Vim 和 Emacs 到底哪個更牛逼一點?
如何使用Notepad++和GCC搭建Windows下的C語言學習環境?

TAG:文本編輯器 | Vim |