您的位置:首页 > 其它

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

2015-06-02 10:55 387 查看
译自http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/

转载请注明出处

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

1. 将Space 设置为 Leader

Leader
是一个很棒的概念。它将按键组合转变为按键时序。因为当我用了这个之后,我就很少按Ctrl-组合键来做事了。

我用了很长时间的
Leader
键之后意识到,我可以把
Leader
键映射到我键盘上最好按的键上,比如空格键Space.

[code]let mapleader = "\<Space>"


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

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

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

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

[code]nnoremap <Leader>o :CtrlP<CR>


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

[code]nnoremap <Leader>w :w<CR>


复制/粘贴 ,通过
<Space>p
<Space>y
:

[code]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>
:

[code]nmap <Leader><Leader> V


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

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

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

[code]vmap v <Plug>(expand_region_expand)
vmap <C-v> <Plug>(expand_region_shrink)


这让我可以:

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上发现了以下段落:

[code]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
.

[code]vnoremap <silent> y y`]
vnoremap <silent> p p`]
nnoremap <silent> p p`]


避免剪贴板缓存替换:

我可以选择和剪切某些文本,不用担心我的剪贴板缓存被我刚刚删除的文本替换掉(将命令放在
~/vimrc
的结尾).

[code]" 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

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

[code]noremap gV `[v`]


阻止窗口弹出:

[code]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下工作完美:

[code]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>
跟我后面提到的快捷绑定配合起来更好。

[code]unbind C-b
set -g prefix C-Space
bind Space send-prefix


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

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

[code]bind Space copy-mode
bind C-Space copy-mode


Use
y
and
reattach-to-user-namespace
(on OSX)

为了复制到系统剪贴板上,你需要提前
brew install reattach-to-user-namespace
.

[code]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>|
要快得多.

[code]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搜索器用于自动填充):

[code]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插件:

[code]NeoBundle 'Valloric/YouCompleteMe', {
      \ 'build' : {
      \     'mac' : './install.sh',
      \    },
      \ }


或者从本地获取,比如 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,使用以下配置:

[code]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
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简单至极:

[code]git clone --recursive https://github.com/sheerun/vimrc.git ~/.vim


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

Introspect!

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

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

提升你Vim效率的,又是什么呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: