1. 程式人生 > >提高 Vim 使用效率的 12 個技巧

提高 Vim 使用效率的 12 個技巧

1. 使用空格鍵做為Leader(熱鍵)

Leader是個非常有創意的設計,通過不同按鍵的順序操作可以執行各種命令,而不需要通過組合鍵的方式,自從使用Leader之後我就很少使用ctrl-xxx的這種組合鍵。

長久以來我都是使用 做為Leader,直到我意識到我可以使用鍵盤上更加好用的捷按鍵:空格鍵(<Space>)。

Shell
1 let mapleader="\<Space>"

這個完全顛覆了我的 Vim 操作效率,我現在可以使用雙手任何一個大拇指進行操作,同時其它手指可以保持在鍵盤的主鍵區。因為 Leader 相當容易使用,所以我就將各種常用的操作進行了 Leader 對映。

2. 將最常用的操作對映到 Leader 操作

我首先識別出最經常使用的操作,並將它們對映到 Leader 操作,我經常是這麼使用的:

使用 <Space>o 建立一個新檔案:

Shell
1 nnoremap<Leader>o:CtrlP<CR>

使用 <Space>w 儲存檔案(比 :w<Enter> 明顯快得多):

Shell
1 nnoremap<Leader>w:w<CR>

使用 <Space>p 與 <Space>y 進行剪下板拷貝、貼上:

Shell
123456 vmap<Leader>y"+yvmap<Leader>d"+dnmap<Leader>p"+pnmap<Leader>P"+Pvmap<Leader>p"+pvmap<Leader>P"+P

使用 <Space><Space> 進入 Vim 編輯模式:

Shell
1 nmap<Leader><Leader>V

我強烈建議你找到最常用的操作並將其對映到 Leader 。

3. 使用區域擴充套件功能

Shell
12 vmapv<Plug>(expand_region_expand)vmap<C-v><Plug>(expand_region_shrink)

這樣我就可以:

  • 按一次 v 選擇一個字元。
  • 再按一次 v 自動擴充套件選擇一個單詞。
  • 再按一次 v 自動擴充套件選擇一段程式碼。
  • 以此類推…
  • 按<C-v> 回退上一次的選擇操作。

雖然 vvv 貌似比 vp 的操作更慢,但使用這種方式時,我壓根就不需要考慮當前要選擇哪些以及應該使用哪個組合鍵進行操作。

這麼一來 v 把諸如 viw, vaw, vi", va", vi(, va(, vi[, va[, vi{, va{, vip, vap, vit, vat, … 這些操作都給替代了,這下你懂了吧。

4. 找到文字查詢操作工具

我一直都不喜歡 Vim 中的查詢和替換操作,直到我在 Vim wiki 找到了以下的配置:

Shell
123 vnoremap<silent>s//e<C-r>=&selection=='exclusive'?'+1':''<CR><CR>:<C-u>call histdel('search',-1)<Bar>let@/=histget('search',-1)<CR>gvomaps:normal vs<CR>

這個直接替代了我常用的操作序列:

  • 使用 /something 查詢
  • 使用 cs 替換第一個,然後按 <Esc>
  • 使用 n.n.n.n.n. 查詢以及替換餘下匹配項。

PS: 也可以考慮使用 Vim 7.4 提供的 cgn 命令。

5. 嘗試更多更棒的鍵盤對映

我每天都在使用這幾個快捷操作鍵,估計這已經幫我省出了幾個月時間。

自動跳轉到貼上文字的最後

使用 ppppp 進行多行多次貼上操作

Shell
123 vnoremap<silent>yy`]vnoremap<silent>pp`]nnoremap<silent>pp`]
避免緩衝區的內容在粘貼後被覆蓋

通過以下的配置可以避免緩衝區的內容被刪除的文字內容所覆蓋(放到~/.vimrc檔案的最後)

Shell
12345678910 "vp doesn'treplace pastebufferfunction!RestoreRegister()let@"=s:restore_regreturn''endfunctionfunction!s:Repl()lets:restore_reg=@"return"[email protected]=RestoreRegister()<cr>"endfunctionvmap<silent><expr>p<sid>Repl()
譯註:這裡沒有Title,估計是作者漏了,加了個。
在檔案中快速跳轉
  • 通過 12<Enter> 跳轉到第 12 行 (12G 我覺得不稱手)
  • 按 <Enter> 跳到行檔案末尾。
  • 按 <Backspace> 回到檔案開始。
Shell
12 nnoremap<CR>Gnnoremap<BS>gg
快速選擇貼上的文字
Shell
1 noremap gV`[v`]
關閉無聊的視窗提示
Shell
1 mapq::q

6. 提高單元測試執行效率

我用 vim-vroom 外掛以及相應的 tmux 配置來進行我的測試。

vim-room 預設使用 <Leader>r 執行測試,由於我已將 Leader 對映為 <Space> ,因此我通過 <Space>r 來執行測試工具。

由於測試在 tmux 的單獨視窗執行,因此我可以邊看測試進展共修訂我的程式碼。

7. 使用 Ctrl-Z 返回 Vim

我經常要在shell下執行一些命令,我通過 Ctrl-Z 掛起 Vim ,在完成 shell 命令執行之後,通過 <Enter> 重新回到 Vim 。

使用 fg 退回 Vim 讓我覺得難受,我只想通過 Ctrl-Z 在 Vim 與 Shell 之間切換,不過我沒有找到解決方法,因此我寫了個在 ZSH 下完美執行的指令碼:

Shell
1234567891011 fancy-ctrl-z(){if[[$#BUFFER -eq 0 ]]; thenBUFFER="fg"zle accept-lineelsezle push-inputzle clear-screenfi}zle-Nfancy-ctrl-zbindkey'^Z'fancy-ctrl-z

如果你將上述程式碼放到 ~/.zshrc 檔案中,你就可以在 shell 與 Vim 之間快速切換,你真值得去試試看。

8. 正確地配置 Tmux

在 OS X 下使用 Tmux 和 Vim 工具非常不方便,因為:

  • 系統的剪下板處理功能很弱
  • Vim 與 Tmux 的視窗切換操作不同
  • Tmux 下執行命令的熱鍵不同 ( 使用 C-b )
  • 在 Tmux 中拷貝模式超難用

我花了非常多的時間去修正上述配置,具體可以見以下:

配置使用 <C-Space> 作為 tmux 的熱鍵

有些人習慣使用 <C-a> 作為熱鍵,不過我是用這個熱鍵回到行首,所以我這裡就不細說了。使用 <C-Space> 的方式會更好用,原因我一會再說:

Shell
123 unbindC-bset-gprefixC-Spacebind Space send-prefix
使用 <Space> 進入拷貝模式

設想一下,使用 <C-Space><Space> 就可以直接進入 Tmux 的拷貝模式有多方便。

Shell
12 bind Space copy-modebindC-Space copy-mode
使用 yreattach-to-user-namespace (基於 OSX)

在使用系統的剪下板之前,你需要先執行 brew install reattach-to-user-namespace

Shell
12 bind-key-tvi-copyycopy-pipe"reattach-to-user-namespace pbcopy"

你要使用 <C-h><C-j><C-k><C-l> 這幾個快捷鍵在 vim 和 tmux 的各種視窗內快速切換。

同時我建議使用 <C-Space>l<C-Space>j 的對映配置來進行 Tmux 視窗分割操作,這個絕對比用 <C-Space>%<C-Space>| 來得快:

Shell
12345 bindjsplit-window-vbindC-jsplit-window-vbindlsplit-window-hbindC-lsplit-window-h

參看我的 tmux.conf 檔案,這裡有更多的乾貨。

9. 提高 Git 工程中 Ctrl-P 的執行效率

將下面的內容新增到你的 .vimrc 檔案中(配置使用 <Ctrl-P> 來使用 git 或 silver 查詢工具來自動補全):

Shell
1234567891011 letg:ctrlp_use_caching=0ifexecutable('ag')set grepprg=ag--nogroup--nocolorletg:ctrlp_user_command='ag %s -l --nocolor -g ""'elseletg:ctrlp_user_command=['.git','cd %s && git ls-files . -co --exclude-standard','find %s -type f']letg:ctrlp_prompt_mappings={'AcceptSelection("e")':['<space>','<cr>','<2-LeftMouse>'],}endif

10. 使用包管理器

  • 你不需要手工管理 git 的子庫(submodules)
  • 能夠並行地安裝以及更新外掛
  • 它支援 YouCompleteMe 這類需要 build 的外掛
    Shell
    12345 NeoBundle'Valloric/YouCompleteMe',{'build':{'mac':'./install.sh',},}
  • 出同樣支援 pry 這類支援打補丁的外掛:
    Shell
    1 NeoBundle'rking/pry-de',{'rtp':'vim/'}

11. 充分使用 Vim 的外掛的優點

  • ack.vim(ag.vim 也不錯)
  • vim-airline 並加上以下配置:
    Shell