提高Vim使用效率的 12 個(gè)技巧
1. 使用空格鍵做為Leader(熱鍵)
Leader是個(gè)非常有創(chuàng)意的設(shè)計(jì),通過不同按鍵的順序操作可以執(zhí)行各種命令,而不需要通過組合鍵的方式,自從使用Leader之后我就很少使用ctrl-xxx的這種組合鍵。
長久以來我都是使用 , 做為Leader,直到我意識(shí)到我可以使用鍵盤上更加好用的捷按鍵:空格鍵(<Space>)。
- let mapleader = "\<Space>"
這個(gè)完全顛覆了我的 Vim 操作效率,我現(xiàn)在可以使用雙手任何一個(gè)大拇指進(jìn)行操作,同時(shí)其它手指可以保持在鍵盤的主鍵區(qū)。因?yàn)?nbsp;Leader 相當(dāng)容易使用,所以我就將各種常用的操作進(jìn)行了 Leader 映射。
2. 將最常用的操作映射到 Leader 操作
我首先識(shí)別出最經(jīng)常使用的操作,并將它們映射到 Leader 操作,我經(jīng)常是這么使用的:
使用 <Space>o 創(chuàng)建一個(gè)新文件:
- nnoremap <Leader>o :CtrlP<CR>a
使用 <Space>w 保存文件(比 :w<Enter> 明顯快得多):
- nnoremap <Leader>w :w<CR>
使用 <Space>p 與 <Space>y 進(jìn)行剪切板拷貝、粘貼:
- vmap <Leader>y "+y
- vmap <Leader>d "+d
- nmap <Leader>p "+p
- nmap <Leader>P "+P
- vmap <Leader>p "+p
- vmap <Leader>P "+P
使用 <Space><Space> 進(jìn)入 Vim 編輯模式:
- nmap <Leader><Leader> V
我強(qiáng)烈建議你找到最常用的操作并將其映射到 Leader 。
3. 使用區(qū)域擴(kuò)展功能
為插件 terryma/vim-expand-region 做按鍵映射:
- vmap v <Plug>(expand_region_expand)
- vmap <C-v> <Plug>(expand_region_shrink)
這樣我就可以:
- 按一次 v 選擇一個(gè)字符。
- 再按一次 v 自動(dòng)擴(kuò)展選擇一個(gè)單詞。
- 再按一次 v 自動(dòng)擴(kuò)展選擇一段代碼。
- …
- 以此類推…
- 按<C-v> 回退上一次的選擇操作。
雖然 vvv 貌似比 vp 的操作更慢,但使用這種方式時(shí),我壓根就不需要考慮當(dāng)前要選擇哪些以及應(yīng)該使用哪個(gè)組合鍵進(jìn)行操作。
這么一來 v 把諸如 viw, vaw, vi", va", vi(, va(, vi[, va[, vi{, va{, vip, vap, vit,vat, … 這些操作都給替代了,這下你懂了吧。
4. 找到文本查找操作工具
我一直都不喜歡 Vim 中的查找和替換操作,直到我在 Vim wiki 找到了以下的配置:
- vnoremap <silent> s //e<C-r>=&selection=='exclusive'?'+1':''<CR><CR>
- :<C-u>call histdel('search',-1)<Bar>let @/=histget('search',-1)<CR>gv
- omap s :normal vs<CR>
這個(gè)直接替代了我常用的操作序列:
- 使用 /something 查找
- 使用 cs 替換第一個(gè),然后按 <Esc> 鍵
- 使用 n.n.n.n.n. 查找以及替換余下匹配項(xiàng)。
PS: 也可以考慮使用 Vim 7.4 提供的 cgn 命令。
5. 嘗試更多更棒的鍵盤映射
我每天都在使用這幾個(gè)快捷操作鍵,估計(jì)這已經(jīng)幫我省出了幾個(gè)月時(shí)間。
自動(dòng)跳轉(zhuǎn)到粘貼文本的最后
使用 ppppp 進(jìn)行多行多次粘貼操作
- vnoremap <silent> y y`]
- vnoremap <silent> p p`]
- nnoremap <silent> p p`]
避免緩沖區(qū)的內(nèi)容在粘貼后被覆蓋
通過以下的配置可以避免緩沖區(qū)的內(nèi)容被刪除的文本內(nèi)容所覆蓋(放到~/.vimrc文件的最后)
- " vp doesn't replace paste buffer
- function! RestoreRegister()
- let @" = s:restore_reg
- return ''
- endfunction
- function! s:Repl()
- let s:restore_reg = @"
- return "p@=RestoreRegister()<cr>"
- endfunction
- vmap <silent> <expr> p <sid>Repl()
譯注:這里沒有Title,估計(jì)是作者漏了,加了個(gè)。
在文件中快速跳轉(zhuǎn)
- 通過 12<Enter> 跳轉(zhuǎn)到第 12 行 (12G 我覺得不稱手)
- 按 <Enter> 跳到行文件末尾。
- 按 <Backspace> 回到文件開始。
- nnoremap <CR> G
- nnoremap <BS> gg
快速選擇粘貼的文本
- noremap gV `[v`]
關(guān)閉無聊的窗口提示
- map q: :q
6. 提高單元測試執(zhí)行效率
我用 vim-vroom 插件以及相應(yīng)的 tmux 配置來進(jìn)行我的測試。
vim-room 缺省使用 <Leader>r 執(zhí)行測試,由于我已將 Leader 映射為<Space> ,因此我通過 <Space>r 來運(yùn)行測試工具。
由于測試在 tmux 的單獨(dú)窗口運(yùn)行,因此我可以邊看測試進(jìn)展共修訂我的代碼。
#p#
7. 使用 Ctrl-Z 返回 Vim
我經(jīng)常要在shell下執(zhí)行一些命令,我通過 Ctrl-Z 掛起 Vim ,在完成 shell 命令執(zhí)行之后,通過 <Enter> 重新回到 Vim 。
使用 fg 退回 Vim 讓我覺得難受,我只想通過 Ctrl-Z 在 Vim 與 Shell 之間切換,不過我沒有找到解決方法,因此我寫了個(gè)在 ZSH 下完美運(yùn)行的腳本:
- fancy-ctrl-z () {
- if [[ $#BUFFER -eq 0 ]]; then
- BUFFER="fg"
- zle accept-line
- else
- zle push-input
- zle clear-screen
- fi
- }
- zle -N fancy-ctrl-z
- bindkey '^Z' fancy-ctrl-z
如果你將上述代碼放到 ~/.zshrc 文件中,你就可以在 shell 與 Vim 之間快速切換,你真值得去試試看。
8. 正確地配置 Tmux
在 OS X 下使用 Tmux 和 Vim 工具非常不方便,因?yàn)椋?/p>
- 系統(tǒng)的剪切板處理功能很弱
- Vim 與 Tmux 的窗口切換操作不同
- Tmux 下執(zhí)行命令的熱鍵不同 ( 使用 C-b )
- 在 Tmux 中拷貝模式超難用
我花了非常多的時(shí)間去修正上述配置,具體可以見以下:
配置使用 <C-Space> 作為 tmux 的熱鍵
有些人習(xí)慣使用 <C-a> 作為熱鍵,不過我是用這個(gè)熱鍵回到行首,所以我這里就不細(xì)說了。使用 <C-Space> 的方式會(huì)更好用,原因我一會(huì)再說:
- unbind C-b
- set -g prefix C-Space
- bind Space send-prefix
使用 <Space> 進(jìn)入拷貝模式
設(shè)想一下,使用 <C-Space><Space> 就可以直接進(jìn)入 Tmux 的拷貝模式有多方便。
- bind Space copy-mode
- bind C-Space copy-mode
使用 y 和 reattach-to-user-namespace (基于 OSX)
在使用系統(tǒng)的剪切板之前,你需要先執(zhí)行 brew install reattach-to-user-namespace
- bind-key -t vi-copy y
- copy-pipe "reattach-to-user-namespace pbcopy"
使用 vim-tmux-navigator
你要使用 <C-h>,<C-j>,<C-k>,<C-l> 這幾個(gè)快捷鍵在 vim 和 tmux 的各種窗口內(nèi)快速切換。
同時(shí)我建議使用 <C-Space>l 和 <C-Space>j 的映射配置來進(jìn)行 Tmux 窗口分割操作,這個(gè)絕對(duì)比用 <C-Space>% 和 <C-Space>| 來得快:
- bind j split-window -v
- bind C-j split-window -v
- bind l split-window -h
- bind C-l split-window -h
參看我的 tmux.conf 文件,這里有更多的干貨。
9. 提高 Git 工程中 Ctrl-P 的執(zhí)行效率
將下面的內(nèi)容添加到你的 .vimrc 文件中(配置使用 <Ctrl-P> 來使用 git 或 silver 查找工具來自動(dòng)補(bǔ)全):
- let g:ctrlp_use_caching = 0
- if executable('ag')
- set grepprg=ag --nogroup --nocolor
- let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
- else
- let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files . -co --exclude-standard', 'find %s -type f']
- let g:ctrlp_prompt_mappings = {
- 'AcceptSelection("e")': ['<space>', '<cr>', '<2-LeftMouse>'],
- }
- endif
我建議使用 vim-scripts/gitignore 插件。
10. 使用包管理器
neobundle.vim 是一個(gè)強(qiáng)大的管理 Vim 插件的工具:
- 你不需要手工管理 git 的子庫(submodules)
- 能夠并行地安裝以及更新插件
- 它支持 YouCompleteMe 這類需要 build 的插件
- NeoBundle 'Valloric/YouCompleteMe', {
- 'build' : {
- 'mac' : './install.sh',
- },
- }
- 出同樣支持 pry 這類支持打補(bǔ)丁的插件:
- NeoBundle 'rking/pry-de', {'rtp': 'vim/'}
11. 充分使用 Vim 的插件的優(yōu)點(diǎn)
- YouCompleteMe
- ack.vim(ag.vim 也不錯(cuò))
- tpope/vim-commentary
- tpope/vim-rsi
- tpope/vim-endwise
- tpope/vim-fugitive 主要使用 :Gblame
- tpope/vim-repeat
- tpope/vim-sleuth
- mmozuras/vim-github-comment
- vim-airline 并加上以下配置:
NeoBundle 'bling/vim-airline' let g:airline_theme='powerlineish' let g:airline_left_sep='' let g:airline_right_sep='' let g:airline_section_z=''
我是個(gè) Ruby 程序員,所以我還使用一些 Ruby 的插件:
- tpope/vim-rails
- vim-textobj-rubyblock (使用 var,vir 查找 ruby 代碼塊)
- ruby_pry
- AndrewRadev/splitjoin.vim 配置以下映射 nmap sj :SplitjoinSplit<cr> nmap sk :SplitjoinJoin<cr>
12. 在服務(wù)器上快速配置 Vim
我經(jīng)常需要服務(wù)上使用 Vim 進(jìn)行配置,不幸的是 Vim 的缺省配置相當(dāng)不合理。
一種方案是使用 vim-sensible 插件來生成壓縮包,不過這個(gè)對(duì)我來說不夠好用。我寫 vimrc 的插件來對(duì) Vim 做合理的初始化(特別是對(duì) Ruby 開發(fā)者),這個(gè)插件配置 Vim 只使用 ~/.vimrc 作為配置文件,同時(shí)它還包含了優(yōu)化的配色、包管理工具以及多種開發(fā)語言的語法著色。
這意味著我不需要手工配置服務(wù)器上的 ~/.vim 目錄,而是通過以下操作就可以方便地在服務(wù)器上配置 Vim 環(huán)境:
- git clone --recursive https://github.com/sheerun/vimrc.git ~/.vim
我還寫了個(gè) dotfiles ,用于快速配置我的開發(fā)環(huán)境。
思考
用好 Vim 的關(guān)鍵在于,你要在軟件開發(fā)過程中不斷發(fā)現(xiàn)你所遇到的 Vim 問題,并積極處理它們。
處理方法可以是在 .vimrc 中添加鍵盤映射,或是在 google 上查找解決方案,要不就在 IRC 上提問,或者其他方法。
你用什么方法提高了 Vim 的使用效率?