標籤:

Vim提高生產力的技巧

.

你沒看錯,就是Normal模式下的. 鍵,它可以重複上一次的編輯命令

比如,有一個函數:

int foo(char *s, int len) { char *p = s; for (char *e = s+len; p < e; p++) /* do something */ ; return len / 2;}

你可以:

  1. 將游標放在第一個len上,按* 鍵高亮選擇所有的len單詞,並跳到下一個len上
  2. 按N 鍵返回到第一個len上,按ciwn 將第一個len改成n
  3. 按n 調到第二個len上,按.
  4. 按n 調到第三個len上,按.

norm命令

norm命令可以讓你在Ex命令行上執行Normal模式的命令,比如在編輯Markdown時想在每一行前面都加上* 來讓普通文本行變成無序列表,可以先用V選中這些行,然後按:norm I* 並回車即可

Vim的命令豐富,組合使用可以使文本編輯更加高效,配合宏這種自動化的工具,可以實現更強大的功能

舉一個小栗子,假如有很多宏定義的常量

#define CONST_A 1 #define CONST_B 2#define CONST_C 3#define CONST_D 4#define CONST_E 5

現在想替換成const的形式

const int CONST_A = 1;const int CONST_B = 2;const int CONST_C = 3;const int CONST_D = 4;const int CONST_E = 5;

我需要錄製這樣的一個宏:

  1. 按qa 鍵開始錄製宏,將宏存到a寄存器里
  2. 按0 鍵將游標移到行首,按ce 刪除#define並進入插入模式,輸入const int 並按ESC回到Normal模式
  3. 按ee 來到變數名的最後一個字母,按a 進入模式,輸入= ,按ESC回到Normal模式
  4. 按A 將游標移動到最後並進入插入模式,輸入; 並按ESC回到Normal模式
  5. 按j 將游標移到下一行,按q 結束宏錄製

錄完這個宏之後,就可以按@a 執行了,這樣沒執行一次宏就會把當前行替換成const的形式並自動將游標移到下一行,我需要按四次@a (或者@@ ,@@ 是指執行上一次執行的宏)來完成這個編輯任務

不過按四次還是很麻煩的,於是體現Vim靈活的特性出現了,你可以通過按4@a 一次替換完所有要編輯的行

假如你要替換的不止是5行,而是100行,你可以在第一行錄完宏之後,在第二行只需按一次99@a ,100行就全部替換完成了,爽不爽?六不六?有一種快感有木有!!

:s命令

:s是Vim執行正則表達式替換的命令

還是剛才那個例子,我按V4j 選中這5行,然後執行:s/#define(.*)(d+)$/const int1= 2 便可完成相同的動作

理論上講,用:s命令完成是比用宏快的,但是思考構造正則表達式也是需要一定的時間的,有時候需要根據具體情況選擇使用那種方式

實現上面的編輯任務還用一個辦法:假如你對Normal模式的命令足夠熟悉並且記憶力足夠好,你可以使用:norm 命令完成

寄存器

Vim中很多東西都是通過寄存器來傳遞的,比如你複製剪切一段文本、訪問系統的剪貼板,就連剛才錄製的宏也是將你的按鍵序列保存在寄存器里的,使用:reg a 命令可以查看我們剛才錄製的宏

:reg a--- 寄存器 ---"a 0deiconst int^[wwi= ^[j

其中^[ 是ESC鍵產生的按鍵序列

常用的特殊寄存器還有

  • : 存放的是上一次執行的Ex命令的內容
  • + 這個寄存器和系統剪貼板相關聯,比如按"+yy 可以複製一行到剪貼板,"+p 可以將剪貼板的文本粘貼到Vim
  • / 存放的是上次用/命令搜索的內容
  • " 存放的是上一次剪切的文本
  • = 這個寄存器比較特殊,使用它Vim會讓你輸入一個表達式,它返回表達式的結果

使用:reg 命令查看所有的寄存器的內容

在插入模式下或者Ex命令模式下,使用<c-r> 鍵+寄存器名 可以輸入寄存器里的內容

舉一個例子,如果想使用:s命令替換一個很長的單詞而又不想手動輸入它,可以先在Normal模式下將他複製下來,他會存到"寄存器里,然後使用<c-r>" 就可以輸入了

最後說幾句

Vim提供的功能還是很強大的,不過Vim的腳本真的是像坨屎一樣臭,導致除了像我這麼懶的人之外沒大有人願意去研究它

不過Vim的正則還是很強大的,雖然它和現有的任何標準都不太一樣,不過正則這東西,你學會了一種再去學其他的就會觸類旁通,簡單多了

期待neovim的lua runtime,拯救像我一樣還在屎里掙扎的人~~~~


推薦閱讀:

如何把vim打造成一個真正的IDE?
VIM常用操作命令梳理
vim多人編輯是一種什麼樣的體驗
如何使用Notepad++和GCC搭建Windows下的C語言學習環境?
Neovim新特性:即時預覽命令效果

TAG:Vim |