天天看點

vim 編輯神器

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

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

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

let mapleader = "<Space>"

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

将最常用的操作映射到 Leader 操作

我首先識别出最經常使用的操作,并将它們映射到 Leader 操作,我經常是這麼使用的:

使用 o 建立一個新檔案:

nnoremap o :CtrlP

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

nnoremap w :w

使用 p 與 y 進行剪切闆拷貝、粘貼:

vmap y "+y

vmap d "+d

nmap p "+p

nmap P "+P

vmap p "+p

vmap P "+P

使用 進入 Vim 編輯模式:

nmap V

我強烈建議你找到最常用的操作并将其映射到 Leader 。

使用區域擴充功能

為插件 terryma/vim-expand-region 做按鍵映射:

vmap v (expand_region_expand)

vmap (expand_region_shrink)

這樣我就可以:

按一次 v 選擇一個字元。

再按一次 v 自動擴充選擇一個單詞。

再按一次 v 自動擴充選擇一段代碼。

以此類推…

按 回退上一次的選擇操作。

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

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

找到文本查找操作工具

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

vnoremap s //e=&selection=='exclusive'?'+1':''

omap s :normal vs

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

使用 /something 查找

使用 cs 替換第一個,然後按 鍵

使用 n.n.n.n.n. 查找以及替換餘下比對項。

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

嘗試更多更棒的鍵盤映射

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

自動跳轉到粘貼文本的最後

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

vnoremap y y`]

vnoremap p p`]

nnoremap p p`]

避免緩沖區的内容在粘貼後被覆寫

通過以下的配置可以避免緩沖區的内容被删除的文本内容所覆寫(放到~/.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()"

vmap p Repl()

譯注:這裡沒有Title,估計是作者漏了,加了個。

在檔案中快速跳轉

通過 12 跳轉到第 12 行 (12G 我覺得不稱手)

按 跳到行檔案末尾。

按 回到檔案開始。

nnoremap G

nnoremap gg

快速選擇粘貼的文本

noremap gV <code>[v</code>]

關閉無聊的視窗提示

map q: :q

提高單元測試執行效率

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

vim-room 預設使用 r 執行測試,由于我已将 Leader 映射為 ,是以我通過 r 來運作測試工具。

由于測試在 tmux 的單獨視窗運作,是以我可以邊看測試進展共修訂我的代碼。

使用 Ctrl-Z 傳回 Vim

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

使用 fg 退回 Vim 讓我覺得難受,我隻想通過 Ctrl-Z 在 Vim 與 Shell 之間切換,不過我沒有找到解決方法,是以我寫了個在 ZSH 下完美運作的腳本:

fancy-ctrl-z () {

if [[ $#BUFFER -eq 0 ]]; then

else

fi

}

zle -N fancy-ctrl-z

bindkey '^Z' fancy-ctrl-z

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

正确地配置 Tmux

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

系統的剪切闆處理功能很弱

Vim 與 Tmux 的視窗切換操作不同

Tmux 下執行指令的熱鍵不同 ( 使用 C-b )

在 Tmux 中拷貝模式超難用

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

配置使用 作為 tmux 的熱鍵

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

unbind C-b

set -g prefix C-Space

bind Space send-prefix

使用 進入拷貝模式

設想一下,使用 就可以直接進入 Tmux 的拷貝模式有多友善。

bind Space copy-mode

bind C-Space copy-mode

使用 y 和 reattach-to-user-namespace (基于 OSX)

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

bind-key -t vi-copy y

copy-pipe "reattach-to-user-namespace pbcopy"

使用 vim-tmux-navigator

你要使用 ,,, 這幾個快捷鍵在 vim 和 tmux 的各種視窗内快速切換。

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

bind j split-window -v

bind C-j split-window -v

bind l split-window -h

bind C-l split-window -h

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

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

将下面的内容添加到你的 .vimrc 檔案中(配置使用 來使用 git 或 silver 查找工具來自動補全):

let g:ctrlp_use_caching = 0

if executable('ag')

let g:ctrlp_user_command = ['.git', 'cd %s &amp;&amp; git ls-files . -co --exclude-standard', 'find %s -type f']

let g:ctrlp_prompt_mappings = {

endif

我建議使用 vim-scripts/gitignore 插件。

使用包管理器

neobundle.vim 是一個強大的管理 Vim 插件的工具:

你不需要手工管理 git 的子庫(submodules)

能夠并行地安裝以及更新插件

它支援 YouCompleteMe 這類需要 build 的插件

NeoBundle 'Valloric/YouCompleteMe', {

出同樣支援 pry 這類支援打更新檔的插件:

NeoBundle 'rking/pry-de', {'rtp': 'vim/'}

充分使用 Vim 的插件的優點

YouCompleteMe

ack.vim(ag.vim 也不錯)

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=''

我是個 Ruby 程式員,是以我還使用一些 Ruby 的插件:

tpope/vim-rails

vim-textobj-rubyblock (使用 var,vir 查找 ruby 代碼塊)

ruby_pry

AndrewRadev/splitjoin.vim 配置以下映射 nmap sj :SplitjoinSplit nmap sk :SplitjoinJoin

在伺服器上快速配置 Vim

我經常需要服務上使用 Vim 進行配置,不幸的是 Vim 的預設配置相當不合理。

一種方案是使用 vim-sensible 插件來生成壓縮包,不過這個對我來說不夠好用。我寫 vimrc 的插件來對 Vim 做合理的初始化(特别是對 Ruby 開發者),這個插件配置 Vim 隻使用 ~/.vimrc 作為配置檔案,同時它還包含了優化的配色、包管理工具以及多種開發語言的文法着色。

這意味着我不需要手工配置伺服器上的 ~/.vim 目錄,而是通過以下操作就可以友善地在伺服器上配置 Vim 環境:

思考

用好 Vim 的關鍵在于,你要在軟體開發過程中不斷發現你所遇到的 Vim 問題,并積極處理它們。

處理方法可以是在 .vimrc 中添加鍵盤映射,或是在 google 上查找解決方案,要不就在 IRC 上提問,或者其他方法。

你用什麼方法提高了 Vim 的使用效率?

參考文獻

[2]H. Berenson, P. Bernstein, J. Gray, J.Melton, E. O’Neil,and P. O’Neil. A critique of ANSI SQL isolation levels. InProceedings of the SIGMOD International Conference on Management of Data, pages1–10, May 1995.

[3]Michael J. Cahill, Uwe Röhm, and Alan D.Fekete. 2008. Serializable isolation for snapshot databases. In SIGMOD ’08:Proceedings of the 2008 ACM SIGMOD international conference on Management of data, pages 729–738, New York, NY, USA. ACM.

[4]Michael James Cahill. 2009. Serializable Isolation for Snapshot Databases. Sydney Digital Theses. University of Sydney, School of Information Technologies

[5] A. Fekete, D. Liarokapis, E. O’Neil, P.O’Neil, andD. Shasha. Making snapshot isolation serializable. www.codexueyuan.com In ACM transactions on database systems, volume 39(2), pages 492–528, June 2005.

繼續閱讀