如果使用 macbootstrap 的安装脚本,不用另行安装,否则需要运行:
brew install neovim
git clone git://github.com/bestswifter/vim-config.git ~/.config/nvim
ln -s ~/.vim ~/.config/nvim
然后用 nvim 打开文件就可以看到效果了。
- Leader 键是
空格 space
, NerdTree 和 Denite 专用的 Leader 键是;
- 替换字母时,
s
键时无效的,需要用r
加上替换后的内容。 - 在普通模式下,输入 q 可以快速关闭无修改的文件,
Ctrl-s
可以保存文件,等价于:w
,Ctrl-q
可以忽略改动强行退出,Ctrl-x
可以保存改动并退出。 - 在输入状态下,
Ctrl-q
可以忽略改动强行退出,Ctrl-x
可以保存改动并退出。
- e 移动到单词结尾,w 移动到下一个单词开头
- % 移动到对应的括号上,包括
(
、[
和{
- * 移动到下一个相同单词,# 移动到上一个相同单词
使用 /
进行搜索,我的搜索默认是忽略大小写的,使用 /pattern\C
可以强制匹配大小写
使用 :范围s/oldpattern/newpattern/替换模式
可以进行替换。
如果我们已经进行过搜索,那么 oldpattern
可以省略不写,默认就是上一次的搜索内容。
最常用的范围是 begin,end
,其中 begin 是开始行号,end
是结束行号,表示在第 begin 行到第 end 行之间进行替换,比如::1,10s/hello/hallo/g
表示把第 1 - 10 行中 所有 的 hello
换成 hallo
。
范围还有一些简单的表示法:
.,10
表示当前行到第 10 行,点表示当前行.,$
表示当前行到文件末尾,美刀符号表示文件结尾%
表示1,$
,也就是整个文件,比如全文替换通常写成:%s/old/new/g
.,+2
表示当前行和接下来的两行
上文反复提到的字母 g 其实是一种替换模式,表示替换这个范围内所有出现的 oldpattern
,如果不写则只替换第一次出现。常用的模式还有 c
,表示替换需要确认(Confirm),i
表示大小写不敏感,I
表示大小写敏感。
如果需要替换光标停留的单词,并不需要搜索,或者手动输入它。直接使用 <Leader + s>
即可。接下来只需要输入替换后的内容和替换模式。 这种替换是全局替换。
首先要明确 Window 和 Buffer 的概念,和编辑器无关的外部窗口,比如 NerdTree 这样的文件列表属于 Window。而打开的多个文件,每个都是一个 Buffer。
切记不要使用鼠标或者触摸板切换 Window,这样非常低效,常见的做法有三种:
- 按
<Tab>
键可以在多个 Window 间切换 - 如果 Window 过多,可以按下
-
,将会弹出所有 Window 的缩写,输入对应的字母就可以快速切换了 - 以
Ctrl
为前缀,hjkl
为操作键,可以切换 Window,比如Ctrl-h
就表示切换到左边一个 Window
当打开多个 Buffer 时,以下快捷键有助于快速在 Buffer 间切换:
g0
表示前往第一个 Buffer,g$
表示前往最后一个 Buffer。- 表示前一个 Buffer, 表示后一个 Buffer
- guu 当前行全部小写,gUU 当前行全部大写
- ~ 当前光标下的字符切换大小写, 3~ 当前光标下后面三个字符切换大小写
- guiw 当前单词全部小写,gUiw 当前单词全部大写
- g~iw 当前单词每个字符大小写交换
受篇幅所限,这里只介绍一些 Life-Changing 系列的插件,我会按照重要性倒序排列
如果只能安装一个 vim 插件,我会选择它,因为原生的 vim 虽然有很多快速的跳转方式,但依然不够快,而 easymotion 则是一个能让 光标移动速度跟上你手速的神器。
虽然 easymotion 有很多配置,但我一般只用到三个:
;w
,全局以单词(word)为单位跳转,屏幕内的每个单词都会显示高亮的缩写,只要输入缩写就可以快速跳转了。;l
,在行内(line)跳转, 速度更快,更准确,但使用场景肯定略小一些;s
, 如果内容实在太多,我们可以按字母来搜索(search),注意它只能搜索一个字母,然后按对应提示跳转。
如果还有选择第二个插件的机会,那一定是 Denite,它集成了诸多好用的功能,可以理解为一个工具库
首先是项目内的文件搜索,类似于 Xcode 中的 Command + Shift + o
,根据文件名称模糊搜索,在 Vim 中的快捷键是 ;f
。可以用 file 这个单词来记忆
如果是项目内的字符串搜索,类似于 Xcode 中的 Command + Shift + f
,全局搜索字符串,在 Vim 中的快捷键是 ;g
。可以用 grep 这个单词来记忆
对于打开过的文件,它们存在于缓存区内,使用快捷键 ;b
可以在缓存区内搜索。
在搜索框内输入文字时,搜索结果会实时更新,当看到满意的结果时按下 Esc
键,可以在输入模式和选择模式中相互切换,打开文件有三种方式:
- st: 在新的 tab 中打开(ab)
- sv: 垂直切分当前 tab 并打开 (vertical)
- sh: 水平切分当前 tab 并打开文件 (horizental)
如果不想搜索了,可以在选择模式中按下 q
退出。
我们知道 Vim 中有文本对象(Text Object)的功能,比如 ciw
可以删除光标下的单词并进入编辑模式,再比如 di"
可以删除双引号内部的内容。这个插件就是用来拓展 Text Object 功能的。
首先是基础模式,一共有添加(append)、替换(replace)和删除(delete)三种操作:
sa + Text Object + 内容
:假设现在有一个单词 abc,光标停留在 b 上,怎么样把这个单词引用起来,也就是从 abc 变成 "abc" 呢。只要输入saiw"
即可。这里的 sa 表示添加,iw 表示文本对象是单词,"
则是要拓展的内容。sd + Text Object
:注意这个命令没有内容,因为它会自动把包裹在文本对象两边的字符删除。以刚刚修改过的 "abc" 为例,现在广告停留在字母 b 上,想要删除双引号,可以用sda"
。可以对比ad"
这个命令,它会删除单词和单词两边的双引号,而sad"
只会删除周围的双引号,因为 s 的含义是 surround。sr + Text Object + 替换后内容
:如果想把 "abc" 变成 'abc',除了删除双引号再添加单引号外,还可以用sriw'
。 其中 sr 表示替换,iw
表示单词两边的字符,'
表示替换成单引号。同样效果的命令还有sra"'
,但sri"'
无法达到预期效果,请读者自行思考。
这三种模式都需要我们手动选择 Text Object,在高级模式下,Text Object 会自动选择。插件会自动找到最近的,左右两个相同的字符,比如 "Hello, (world), Hello",如果光标停留在单词 world 中,你的操作将对圆括号生效,否则则会对外层的双引号生效。
还是以 "Hello, (world), Hello" 这个模式为例,介绍高级模式下的用法。
saa + 内容
: 假设光标停留在单词 world 上,按下saa'
,将会得到 "Hello, ('world'), Hello"srr + 内容
: 假设光标停留在单词 hello 上,按下srr'
,将会得到 'Hello, (world), Hello'sdd
:假设光标停留在单词 world 上,按下sdd
,将会得到 "Hello, world, Hello"- 如果想得到 Hello, (world), Hello,此时高级模式就无能为力了,只能用
sda"
总结一下:
- 这个插件的核心是处理 Text Object 周围(Surround)的字符,所以命令都已 s 开头
- 一共有三种处理方式,分别是添加(append)、替换(replace)和删除(delete),对应命令
sa
、sr
和sd
- 高级模式会自动选择 surrounding,所以命令更简单,但无法自定义哪一组 surrounding。
可以在 Vim 中直接打开终端,快捷键是 t<Enter>
,会在底部打开一个 10 行高的终端。这个终端是一个单独的 Window,所以上述切换 Window 的规则同样适用。
此外,所有 iTerm 的配置和 .zshrc 的配置都会生效,功能非常强大,比如我们可以在 Vim 里面编辑脚本,在终端里面运行。
注意,这个终端也是个 Vim 窗口,所以输入状态下是无法切换 Window 的,要先按 退出编辑状态。
这个插件依赖于 ctags,在配置脚本中会自动安装,否则需要使用下面的命令来安装:
brew install --HEAD universal-ctags/universal-ctags/universal-ctags
把我 TagBar 配置为启动时自动打开,手动打开的快捷键是 <leader> + o
得益于 denite 中 ;f
快捷键的使用,NerdTree 的使用并没有那么频繁,装饰作用似乎比较多,所以我将它排在比较靠后的位置。
在这份配置中,NerdTree 会在打开文件时自动打开,在关闭最后一个文件时自动关闭,也可以用 ;a
手动打开
在 NerdTree 中,使用 hjkl
操作,jk
表示上下移动,hl
表示展开或者折叠文件夹。
表示展开或者折叠文件夹。
选中一个部分后,按下 <Leader> v
即可注释,如果这部分已经注释,则上述做法的效果将是取消注释。
按下 v
会自动进入可视模式,再次按 v
会智能增加选中范围,但肯定不如手动选择来得精确
由于本项目使用 dein 来管理插件,所以插件可以按需加载。比如下面这行配置:
- { repo: vim-python/python-syntax, on_ft: python }
就表示 python-syntax
这个插件只在打开 Python 文件时才加载。
目前本项目提供了对 HTML/CSS/JS/Python/Go 语言的语法支持,我会逐步整理出来。
Python 的效果如图所示:
配置中主要用到了 [Python-mode] 这个插件,可以在 vim 中输入 :help pymode
查看更多选项和用法。对 Python 的拓展主要有以下几点:
- 提供了基于语法的补全,这是 deoplete-jedi 插件提供的能力
- 提供了运行 Python 的能力,快捷键是
rr
。r 的意思是 run,为了避免和替换(replace) 键冲突,所以需要快速按两次。 - 提供了语法校验的能力,每次保存文件(Ctrl + S) 时会自动触发,当光标停留在有问题的那一行时,底部会有提示。
- 文本对象(Text Object)的拓展,C 表示类(Class),M 表示方法(包括 Method 和 Function),所以想要删除整个函数时,可以用快捷键
daM
来处理