Vim提高生產力的技巧
.
你沒看錯,就是Normal模式下的. 鍵,它可以重複上一次的編輯命令
比如,有一個函數:
int foo(char *s, int len) { char *p = s; for (char *e = s+len; p < e; p++) /* do something */ ; return len / 2;}
你可以:
- 將游標放在第一個len上,按* 鍵高亮選擇所有的len單詞,並跳到下一個len上
- 按N 鍵返回到第一個len上,按ciwn 將第一個len改成n
- 按n 調到第二個len上,按.
- 按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;
我需要錄製這樣的一個宏:
- 按qa 鍵開始錄製宏,將宏存到a寄存器里
- 按0 鍵將游標移到行首,按ce 刪除#define並進入插入模式,輸入const int 並按ESC回到Normal模式
- 按ee 來到變數名的最後一個字母,按a 進入模式,輸入= ,按ESC回到Normal模式
- 按A 將游標移動到最後並進入插入模式,輸入; 並按ESC回到Normal模式
- 按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 |