提高 Vim 使用效率的 12 个技巧
英文出处:sheerun。欢迎加入翻译小组。
1. 使用空格键做为Leader(热键)
Leader
是个非常有创意的设计,通过不同按键的顺序操作可以执行各种命令,而不需要通过组合键的方式,自从使用Leader
之后我就很少使用ctrl-xxx
的这种组合键。
长久以来我都是使用 ,
做为Leader
,直到我意识到我可以使用键盘上更加好用的捷按键:空格键(<Space>)。
1
|
let mapleader = "\<Space>"
|
这个完全颠覆了我的 Vim 操作效率,我现在可以使用双手任何一个大拇指进行操作,同时其它手指可以保持在键盘的主键区。因为 Leader
相当容易使用,所以我就将各种常用的操作进行了Leader
映射。
2. 将最常用的操作映射到 Leader 操作
我首先识别出最经常使用的操作,并将它们映射到 Leader 操作,我经常是这么使用的:
使用 <Space>o 创建一个新文件:
1
|
nnoremap <Leader>o :CtrlP<CR>
|
使用 <Space>w 保存文件(比 :w<Enter> 明显快得多):
1
|
nnoremap <Leader>w :w<CR>
|
使用 <Space>p 与 <Space>y 进行剪切板拷贝、粘贴:
1
2
3
4
5
6
|
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> 进入 Vim 编辑模式:
1
|
nmap <Leader><Leader> V
|
我强烈建议你找到最常用的操作并将其映射到 Leader 。
3. 使用区域扩展功能
为插件 terryma/vim-expand-region 做按键映射:
1
2
|
vmap v <Plug>(expand_region_expand)
vmap <C- v > <Plug>(expand_region_shrink)
|
这样我就可以:
- 按一次
v
选择一个字符。 - 再按一次
v
自动扩展选择一个单词。 - 再按一次
v
自动扩展选择一段代码。 - …
- 以此类推…
- 按<
C-v>
回退上一次的选择操作。
虽然 vvv 貌似比 vp 的操作更慢,但使用这种方式时,我压根就不需要考虑当前要选择哪些以及应该使用哪个组合键进行操作。
这么一来 v
把诸如 viw
, vaw
, vi"
, va"
, vi(
, va(
, vi[
, va[
, vi{
, va{
, vip
, vap
, vit
,vat
, ... 这些操作都给替代了,这下你懂了吧。
4. 找到文本查找操作工具
我一直都不喜欢 Vim 中的查找和替换操作,直到我在 Vim wiki 找到了以下的配置:
1
2
3
|
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
查找 - 使用
cs
替换第一个,然后按<Esc>
键 - 使用
n.n.n.n.n.
查找以及替换余下匹配项。
PS: 也可以考虑使用 Vim 7.4 提供的 cgn
命令。
5. 尝试更多更棒的键盘映射
我每天都在使用这几个快捷操作键,估计这已经帮我省出了几个月时间。
自动跳转到粘贴文本的最后
使用 ppppp
进行多行多次粘贴操作
1
2
3
|
vnoremap <silent> y y`]
vnoremap <silent> p p`]
nnoremap <silent> p p`]
|
避免缓冲区的内容在粘贴后被覆盖
通过以下的配置可以避免缓冲区的内容被删除的文本内容所覆盖(放到~/.vimrc
文件的最后)
1
2
3
4
5
6
7
8
9
10
|
" 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,估计是作者漏了,加了个。
在文件中快速跳转
- 通过
12<Enter>
跳转到第 12 行 (12G
我觉得不称手) - 按 <Enter> 跳到行文件末尾。
- 按 <Backspace> 回到文件开始。
1
2
|
nnoremap <CR> G
nnoremap <BS> gg
|
快速选择粘贴的文本
1
|
noremap gV `[ v `]
|
关闭无聊的窗口提示
1
|
map q: :q
|
6. 提高单元测试执行效率
我用 vim-vroom 插件以及相应的 tmux 配置来进行我的测试。
vim-room
缺省使用 <Leader>r
执行测试,由于我已将 Leader 映射为 <Space>
,因此我通过<Space>r
来运行测试工具。
由于测试在 tmux 的单独窗口运行,因此我可以边看测试进展共修订我的代码。
7. 使用 Ctrl-Z 返回 Vim
我经常要在shell下执行一些命令,我通过 Ctrl-Z
挂起 Vim ,在完成 shell 命令执行之后,通过<Enter>
重新回到 Vim 。
使用 fg
退回 Vim 让我觉得难受,我只想通过 Ctrl-Z
在 Vim 与 Shell 之间切换,不过我没有找到解决方法,因此我写了个在 ZSH 下完美运行的脚本:
1
2
3
4
5
6
7
8
9
10
11
|
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 工具非常不方便,因为:
- 系统的剪切板处理功能很弱
- Vim 与 Tmux 的窗口切换操作不同
- Tmux 下执行命令的热键不同 ( 使用
C-b
) - 在 Tmux 中拷贝模式超难用
我花了非常多的时间去修正上述配置,具体可以见以下:
配置使用 <C-Space>
作为 tmux 的热键
有些人习惯使用 <C-a>
作为热键,不过我是用这个热键回到行首,所以我这里就不细说了。使用<C-Space>
的方式会更好用,原因我一会再说:
1
2
3
|
unbind C-b
set -g prefix C-Space
bind Space send-prefix
|
使用 <Space>
进入拷贝模式
设想一下,使用 <C-Space><Space> 就可以直接进入 Tmux 的拷贝模式有多方便。
1
2
|
bind Space copy-mode
bind C-Space copy-mode
|
使用 y
和 reattach-to-user-namespace
(基于 OSX)
在使用系统的剪切板之前,你需要先执行 brew install reattach-to-user-namespace
1
2
|
bind-key -t vi -copy y
copy-pipe "reattach-to-user-namespace pbcopy"
|
使用 vim-tmux-navigator
你要使用 <C-h>
,<C-j>
,<C-k>
,<C-l>
这几个快捷键在 vim 和 tmux 的各种窗口内快速切换。
同时我建议使用 <C-Space>l
和 <C-Space>j
的映射配置来进行 Tmux 窗口分割操作,这个绝对比用 <C-Space>%
和 <C-Space>|
来得快:
1
2
3
4
5
|
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 查找工具来自动补全):
1
2
3
4
5
6
7
8
9
10
11
|
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 的子库(submodules)
- 能够并行地安装以及更新插件
- 它支持 YouCompleteMe 这类需要 build 的插件
12345
NeoBundle
'Valloric/YouCompleteMe'
, {
'build'
: {
'mac'
:
'./install.sh'
,
},
}
- 出同样支持 pry 这类支持打补丁的插件:
1
NeoBundle
'rking/pry-de'
, {
'rtp'
:
'vim/'
}
11. 充分使用 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 并加上以下配置:
12345
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<cr> nmap sk :SplitjoinJoin<cr>
12. 在服务器上快速配置 Vim
我经常需要服务上使用 Vim 进行配置,不幸的是 Vim 的缺省配置相当不合理。
一种方案是使用 vim-sensible 插件来生成压缩包,不过这个对我来说不够好用。我写 vimrc 的插件来对 Vim 做合理的初始化(特别是对 Ruby 开发者),这个插件配置 Vim 只使用 ~/.vimrc
作为配置文件,同时它还包含了优化的配色、包管理工具以及多种开发语言的语法着色。
这意味着我不需要手工配置服务器上的 ~/.vim
目录,而是通过以下操作就可以方便地在服务器上配置 Vim 环境:
1
|
git clone --recursive https: //github .com /sheerun/vimrc .git ~/.vim
|
我还写了个 dotfiles ,用于快速配置我的开发环境。
思考
用好 Vim 的关键在于,你要在软件开发过程中不断发现你所遇到的 Vim 问题,并积极处理它们。
处理方法可以是在 .vimrc
中添加键盘映射,或是在 google 上查找解决方案,要不就在 IRC 上提问,或者其他方法。
你用什么方法提高了 Vim 的使用效率?
想了解更多?
哈,雇我做你的 Vim 顾问吧,给我写个邮件吧。
提高 Vim 使用效率的 12 个技巧相关推荐
- 多个goruntine 性能变慢_提高 JavaScript 性能的 12 个技巧
作者丨Liz Parody 在创建 Web 应用程序时应始终考虑性能.为了帮助你开始,本文列举了有效提高应用程序性能的 12 种方法. 性能是创建网页或应用程序时最重要的一个方面.没有人想要应用程序崩 ...
- 使用vtwinfx插件时fcpx意外退出_10个提高 uTools 使用效率的小技巧
uTools 作为一款「生产力工具集」软件,旨在通过丰富的插件.智能的「场景功能」匹配,让我们能够更专注,效率 up! 本期,小编整理了10个提高 uTools 使用效率的小技巧.通读此篇后,必定操作 ...
- 提高PHP性能的53个技巧
提高PHP性能的53个技巧 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字 符串当作参数的 ...
- 【转】提高PHP性能的53个技巧
PHP技巧汇总:提高PHP性能的53个技巧 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个 ...
- Google AdWords广告的12个技巧
这篇文章要向大家展示在Google AdWords关键词排名广告中创建成功的广告内容的一些技巧.我已经用这些方法对Google的按点击付费广告服务测试了有一段时间了,结果非常成功.这12个技巧可以帮助 ...
- 总裁演说思维:商务谈判最经典的12个技巧
总裁演说思维:商务谈判最经典的12个技巧 商务谈判的技巧不仅仅适用于公司与公司之间的谈判,同时也适用应聘者与公司.销售人员与顾客等.下面是小编整理了商务谈判最经典的12个技巧,供你参考. 商务谈判的技 ...
- 提高效率的Java代码优化小技巧
可以提高效率的Java代码优化小技巧 前言 代码优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面 ...
- 如何提高说服力?说服别人的技巧都有哪些?
如何提高说服力?说服别人的技巧都有哪些? 对于本文标题中的这两个问题,你都可以从经典说服力书籍<沟通与说服必读12篇>中找到答案. 说服力在职场中的重要性毋庸置疑,事实上,说服力早已超出职 ...
- 克服过拟合和提高泛化能力的20条技巧和诀窍
克服过拟合和提高泛化能力的20条技巧和诀窍 你是如何提升深度学习模型的效果? 这是我经常被问到的一个问题. 有时候也会换一种问法: 我该如何提高模型的准确率呢? --或者反过来问: 如果我的网络 ...
最新文章
- 对象存在性检测集中管理
- CMU算法新教材的获取方法
- Unknown system variable 'tx_isolation'] with root cause
- Android编译Libwebcore出错解决方法
- 如果不懂Service mesh,就不要谈微服务了
- 日均互动50万次 微信的营销的成功之道
- mysql 根据子查询的结果查询朱标_Python - MySQL数据库操作
- Git入门(本地使用)
- (转)pb控制打印机
- matlab 不见了,matlab命令窗口不见了
- [文献阅读]Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
- 关于物联网你需要知道的一切
- 【Nmap】常用命令「一」——活跃主机发现
- cf网络不稳定或服务器异常,电脑玩穿越火线为什么提示网络环境异常 - 卡饭网...
- DIY一个简易查询系统
- Memcached 简介
- Linux如何设置开机自启动
- IT人必看!2018年上半年云栖大会300份干货PPT免费开放!最前沿的技术都在这了!
- Anaconda下Python中h5py与netCDF4模块下载与安装方法
- Python:从入门到实践(上)--自学
热门文章
- 儿童语言发育迟缓分类中C群d是指,(S—S法)语言发育迟缓检查(CRRC版)
- 免费的博客空间,漂亮的VuePress
- 真人照片转动漫效果教程
- 利用matlab将自己的数据制作为标准VOC数据集格式
- 目标检测系列——开山之作RCNN原理详解
- Sitecore 配置 Oauth2.0 OpenId Connect
- 怎样拼接删选语句DCOUNT和DSUM都用得到
- .hdu4288 Coder CF85-DSum of Medians
- 微软实习三个月的一点感想
- 新的一年总结与展望,分享公众号文章/读者/广告/生活的点点滴滴