译自http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/
转载请注明出处
注:以下操作均在 _vimrc文件中
1. 将Space 设置为 Leader
Leader
是一个很棒的概念。它将按键组合转变为按键时序。因为当我用了这个之后,我就很少按Ctrl-组合键来做事了。
我用了很长时间的Leader
键之后意识到,我可以把Leader
键映射到我键盘上最好按的键上,比如空格键Space.
let mapleader = "\<Space>"
- 1
- 2
这让我用Vim的体验天翻地覆。现在我可以用两只大拇指按Leader
键,而我的手指一直保持在键盘主行上。Leader
是那么好用,以至于我都开始把它滥用在我诸多的快捷键绑定上了。
2. 把你最常用的行为映射到Leader上
我找出了我使用Vim时最耗时的行为。我将它们映射到我的Leader
键上,像这样做:
输入 <Space>o
打开新文件:
nnoremap <Leader>o :CtrlP<CR>
- 1
- 2
输入 <Space>w
保存文件 (比 :w<Enter>
快得多):
nnoremap <Leader>w :w<CR>
- 1
- 2
复制/粘贴 ,通过<Space>p
和 <Space>y
:
vmap <Leader>y "+y
vmap <Leader>d "+d
nmap <Leader>p "+p
nmap <Leader>P "+P
vmap <Leader>p "+p
vmap <Leader>P "+P
- 1
- 2
- 3
- 4
- 5
- 6
- 7
进入可视化模式<Space><Space>
:
nmap <Leader><Leader> V
- 1
- 2
我建议你们也找到你们最常用的行为,并映射它们。
3. 使用”区域扩张”功能
我用 terryma/vim-expand-region
这个插件,并有以下映射:
vmap v <Plug>(expand_region_expand)
vmap <C-v> <Plug>(expand_region_shrink)
- 1
- 2
- 3
这让我可以:
- 按
v
选择一个字符 - 再按
v
把选择区域扩张到一个单词 - 再按
v
扩张到一个段落 - …
- 按
<C-v>
回到上一次选择的区域,如果我按v
按多了的话
似乎 vvv
比 vp
要慢,但实际上我不需要提前想要选择什么,要用什么组合键。
这种方式让 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>
- 1
- 2
- 3
- 4
它让我可以这样使用查找替换:
- 我用
/something
来查找something - 我输入
cs
, 替换第一个匹配, 然后输入<Esc>
- 我输入
n.n.n.n.n
. 查看和替换所有的匹配
P.S. 一种替代方案是使用cgn
(从Vim 7.4起).
5. 发明更酷的按键映射
我日常使用下面这些快捷键,它们为我节省了数以月计的时间。
自动跳到你所粘贴文本的最后
我可以粘贴多行文本任意多次,只要输入ppppp
.
vnoremap <silent> y y`]
vnoremap <silent> p p`]
nnoremap <silent> p p`]
- 1
- 2
- 3
- 4
避免剪贴板缓存替换:
我可以选择和剪切某些文本,不用担心我的剪贴板缓存被我刚刚删除的文本替换掉(将命令放在~/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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 输入
12<Enter>
跳到12行 (12G
会累断我的手的 ) - 按 Enter 到达文件结尾.
按Backspace 到达文件开头.
nnoremap G
nnoremap gg
快速选择你所粘贴的文本:
noremap gV `[v`]
- 1
- 2
阻止窗口弹出:
map q: :q
- 1
- 2
6. 让你的单元测试体验更加无缝(Seamless)
我使用 vim-vroom 并且适当配置 tmux
来做我的测试.
由于vim-room
用 <Leader>r
来执行测试, 而我用 <Space>
作为我的Leader键,所以我按 <Space>r
, 测试就马上执行了.
而且由于测试是在tmux分屏中进行的,所以我可以在运行测试的时候同时查看代码和进行下一步开发。
7. 使用Ctrl-Z切换回Vim
我经常需要在shell里执行一些命令。为了这样做,我得按Ctrl-z
暂停Vim,输入命令,然后按fg<Enter>
切换回来。
这个fg
部分太伤人了。我想要再按Ctrl-z
就能切换回Vim。我找不到一个解决方案,所以我自己开发了一个,它在ZSH下工作完美:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
如果你把它粘贴到你的~/.zshrc
中,你也能在你的shell和Vim之间快速切换了。试试。
8. 正确设置Tmux
Tmux + OS X + Vim的组合相当艰辛:
- poor system clipboard handling
- difficult navigation between Vim and Tmux windows
- difficult execution of tmux commands (C-b)
- hard to use copy mode in tmux
我花了很长时间将它调整正确,这是结果:
将 <C-Space>
作为你tmux的新前缀(prefix).
有些人用 <C-a>
, 但是我用这个快捷键来回到行首, 所以它就不行了. 再加上 <C-Space>
跟我后面提到的快捷绑定配合起来更好。
unbind C-b
set -g prefix C-Space
bind Space send-prefix
- 1
- 2
- 3
- 4
绑定 <Space>
来进入复制模式(copy mode).
想想看. <C-Space><Space>
让你在tmux中直接进入复制模式.
bind Space copy-mode
bind C-Space copy-mode
- 1
- 2
Use y
and reattach-to-user-namespace
(on OSX)
为了复制到系统剪贴板上,你需要提前 brew install reattach-to-user-namespace
.
bind-key -t vi-copy y \
copy-pipe "reattach-to-user-namespace pbcopy"
- 1
- 2
- 3
Use vim-tmux-navigator
那样你就可以在vim和tmux的任何组合间无缝切换,只要使用 <C-h>
, <C-j>
, <C-k>
, <C-l>
.
我也推荐使用以下的绑定来划分tmux窗口:<C-Space>l
and <C-Space>j
。这比按 <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
- 1
- 2
- 3
- 4
- 5
- 6
查看我的tmux.conf 获取更多.
9. 为Git项目使用Ctrl-P
将下面的内容放入你的 .vimrc
(它配置了Ctrl-P来使用git或者silver搜索器用于自动填充):
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
我建议使用 vim-scripts/gitignore.
10. 使用包管理器
neobundle.vim 用来管理我的Vim插件效果拔群:
- 你不需要手动管理git子模块(pathogen)
- 它可以并行地安装和更新插件
- 它可以像YouCompleteMe一样build插件:
NeoBundle 'Valloric/YouCompleteMe', {
\ 'build' : {
\ 'mac' : './install.sh',
\ },
\ }
- 1
- 2
- 3
- 4
- 5
- 或者从本地获取,比如 pry 插件:
NeoBundle 'rking/pry-de', {'rtp': 'vim/'}
11. 使用Vim 插件
这里是一些我用来提升效率的一部分通用插件:
- YouCompleteMe
- ack.vim (ag.vim is also good)
- tpope/vim-commentary
- tpope/vim-rsi
- tpope/vim-endwise
- tpope/vim-fugitive mainly for
: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=''
- 1
- 2
- 3
- 4
- 5
我是一个Ruby开发者,所以我用一些Ruby插件:
- tpope/vim-rails
- vim-textobj-rubyblock (
var
,vir
for selecting ruby blocks) - ruby_pry
- AndrewRadev/splitjoin.vim ,使用以下快捷键映射:
nmap sj :SplitjoinSplit<cr> nmap sk :SplitjoinJoin<cr>
12. 在你服务器上加速Vim的配置
我常常需要在服务器上用Vim来配置他们。不幸的是Vim没有提供自适应的默认配置。
你可以用vim-sensible来做,但这对我来说不够。我开发了[vimrc][https://github.com/sheerun/vimrc]插件,用了一些真正好用的默认配置(特别是对Ruby开发者来说) 使得~/.vimrc
成为单一的Vim配置的源。它也包括了一个更好的默认scheme, 包管理器(package manger), 以及多语言语法支持.
这意味着我不用去乱改 ~/.vim
文件夹来配置Vim。在我的服务器上安装Vim简单至极:
git clone --recursive https://github.com/sheerun/vimrc.git ~/.vim
- 1
我也开发了我的 dotfiles 这样我的开发环境就可以在几秒钟内配置好。
Introspect!
一个好的Vim配置的关键是,在你的开发过程中,你持续不断地识别出你遇到的问题并对他们做出响应。
响应可以是很快地在.vimrc
中设置一个映射, 一次google, 在 IRC上问一个问题, 不管什么.
提升你Vim效率的,又是什么呢?