2015-6-2-提高你的Vim效率

译自http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/
转载请注明出处

注:以下操作均在 _vimrc文件中

1. 将Space 设置为 Leader

Leader 是一个很棒的概念。它将按键组合转变为按键时序。因为当我用了这个之后,我就很少按Ctrl-组合键来做事了。
我用了很长时间的Leader键之后意识到,我可以把Leader键映射到我键盘上最好按的键上,比如空格键Space.

let mapleader = "\<Space>"

这让我用Vim的体验天翻地覆。现在我可以用两只大拇指按Leader键,而我的手指一直保持在键盘主行上。Leader是那么好用,以至于我都开始把它滥用在我诸多的快捷键绑定上了。

2. 把你最常用的行为映射到Leader上

我找出了我使用Vim时最耗时的行为。我将它们映射到我的Leader键上,像这样做:

输入 <Space>o 打开新文件:

nnoremap <Leader>o :CtrlP<CR>

输入 <Space>w 保存文件 (比 :w<Enter>快得多):

nnoremap <Leader>w :w<CR>

复制/粘贴 ,通过<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

进入可视化模式<Space><Space>:

nmap <Leader><Leader> V

我建议你们也找到你们最常用的行为,并映射它们。

3. 使用”区域扩张”功能

我用 terryma/vim-expand-region 这个插件,并有以下映射:

vmap v <Plug>(expand_region_expand)
vmap <C-v> <Plug>(expand_region_shrink)

这让我可以:

  • v 选择一个字符
  • 再按 v 把选择区域扩张到一个单词
  • 再按 v 扩张到一个段落
  • <C-v> 回到上一次选择的区域,如果我按v按多了的话

似乎 vvvvp 要慢,但实际上我不需要提前想要选择什么,要用什么组合键。

这种方式让 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>

它让我可以这样使用查找替换:

  • 我用 /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`]

避免剪贴板缓存替换:

我可以选择和剪切某些文本,不用担心我的剪贴板缓存被我刚刚删除的文本替换掉(将命令放在~/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()
  • 输入 12<Enter>跳到12行 (12G会累断我的手的 )
  • 按 Enter 到达文件结尾.
  • 按Backspace 到达文件开头.

    nnoremap G
    nnoremap gg

快速选择你所粘贴的文本:

noremap gV `[v`]

阻止窗口弹出:

map q: :q

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

如果你把它粘贴到你的~/.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

绑定 <Space> 来进入复制模式(copy mode).

想想看. <C-Space><Space> 让你在tmux中直接进入复制模式.

bind Space copy-mode
bind C-Space copy-mode

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"

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

查看我的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

我建议使用 vim-scripts/gitignore.

10. 使用包管理器

neobundle.vim 用来管理我的Vim插件效果拔群:

  • 你不需要手动管理git子模块(pathogen)
  • 它可以并行地安装和更新插件
  • 它可以像YouCompleteMe一样build插件:
NeoBundle 'Valloric/YouCompleteMe', {
      \ 'build' : {
      \     'mac' : './install.sh',
      \    },
      \ }
  • 或者从本地获取,比如 pry 插件:
    NeoBundle 'rking/pry-de', {'rtp': 'vim/'}

11. 使用Vim 插件

这里是一些我用来提升效率的一部分通用插件:

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插件:

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

我也开发了我的 dotfiles 这样我的开发环境就可以在几秒钟内配置好。

Introspect!

一个好的Vim配置的关键是,在你的开发过程中,你持续不断地识别出你遇到的问题并对他们做出响应。

响应可以是很快地在.vimrc中设置一个映射, 一次google, 在 IRC上问一个问题, 不管什么.

提升你Vim效率的,又是什么呢?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值