过这 5 个插件扩展 Vim 功能来提升你的编码效率。
-- Ricardo Gerardi
我用 Vim 已经超过 20 年了,两年前我决定把它作为我的首要文本编辑器。我用 Vim 来编写代码、配置文件、博客文章及其它任意可以用纯文本表达的东西。Vim 有很多超级棒的功能,一旦你适合了它,你的工作会变得非常高效。
在日常编辑工作中,我更倾向于使用 Vim 稳定的原生功能,但开源社区对 Vim 开发了大量的插件,可以扩展 Vim 的功能、改进你的工作流程和提升工作效率。
以下列举 5 个非常好用的可以用于编写任意编程语言的插件。
Auto Pairs 插件可以帮助你插入和删除成对的文字,如花括号、圆括号或引号。这在编写代码时非常有用,因为很多编程语言都有成对标记的语法,就像圆括号用于函数调用,或引号用于字符串定义。
Auto Pairs 最基本的功能是在你输入一个左括号时会自动补全对应的另一半括号。比如,你输入了一个 [,它会自动帮你补充另一半 ]。相反,如果你用退格键删除开头的一半括号,Auto Pairs 会删除另一半。
如果你设置了自动缩进,当你按下回车键时 Auto Pairs 会在恰当的缩进位置补全另一半括号,这比你找到放置另一半的位置并选择一个正确的括号要省劲多了。
例如下面这段代码:
package main
import "fmt"
func main() {
x :=true
items :=[]string{"tv", "pc", "tablet"}
if x {
for _, i :=range items
}
}
在 items 后面输入一个左花括号按下回车会产生下面的结果:
package main
import "fmt"
func main() {
x :=true
items :=[]string{"tv", "pc", "tablet"}
if x {
for _, i :=range items {
| (cursor here)
}
}
}
Auto Pairs 提供了大量其它选项(你可以在 GitHub 上找到),但最基本的功能已经很让人省时间了。
NERD Commenter 插件给 Vim 增加了代码注释的功能,类似在 IDE(integrated development environment) 中注释功能。有了这个插件,你可以一键注释单行或多行代码。
NERD Commenter 可以与标准的 Vim filetype 插件配合,所以它能理解一些编程语言并使用合适的方式来注释代码。
最易上手的方法是按 Leader+Space 组合键来切换注释当前行。Vim 默认的 Leader 键是 \。
在 可视化模式(Visual mode)中,你可以选择多行一并注释。NERD Commenter 也可以按计数注释,所以你可以加个数量 n 来注释 n 行。
还有个有用的特性 “Sexy Comment” 可以用 Leader+cs 来触发,它的块注释风格更漂亮一些。例如下面这段代码:
package main
import "fmt"
func main() {
x :=true
items :=[]string{"tv", "pc", "tablet"}
if x {
for _, i :=range items {
fmt.Println(i)
}
}
}
选择 main 函数中的所有行然后按下 Leader+cs 会出来以下注释效果:
package main
import "fmt"
func main() {
/*
* x :=true
* items :=[]string{"tv", "pc", "tablet"}
*
* if x {
* for _, i :=range items {
* fmt.Println(i)
* }
* }
*/
}
因为这些行都是在一个块中注释的,你可以用 Leader+Space 组合键一次去掉这里所有的注释。
NERD Commenter 是任何使用 Vim 写代码的开发者都必装的插件。
Vim Surround 插件可以帮你“环绕”现有文本插入成对的符号(如括号或双引号)或标签(如 HTML 或 XML 标签)。它和 Auto Pairs 有点儿类似,但是用于处理已有文本,在编辑文本时更有用。
比如你有以下一个句子:
"Vim plugins are awesome !"
当你的光标处于引起来的句中任何位置时,你可以用 ds" 组合键删除句子两端的双引号。
Vim plugins are awesome !
你也可以用 cs"' 把双端的双引号换成单引号:
'Vim plugins are awesome !'
或者再用 cs'[ 替换成中括号:
[ Vim plugins are awesome ! ]
它对编辑 HTML 或 XML 文本中的 标签(tag)尤其在行。假如你有以下一行 HTML 代码:
<p>Vim plugins are awesome !</p>
当光标在 “awesome” 这个单词的任何位置时,你可以按 ysiw<em> 直接给它加上着重标签(<em>):
<p>Vim plugins are <em>awesome</em> !</p>
注意它聪明地加上了 </em> 闭合标签。
Vim Surround 也可以用 ySS 缩进文本并加上标签。比如你有以下文本:
<p>Vim plugins are <em>awesome</em> !</p>
你可以用 ySS<div class="normal"> 加上 div 标签,注意生成的段落是自动缩进的。
<div class="normal">
<p>Vim plugins are <em>awesome</em> !</p>
</div>
Vim Surround 有很多其它选项,你可以参照 GitHub 上的说明尝试它们。
Vim Gitgutter 插件对使用 Git 作为版本控制工具的人来说非常有用。它会在 Vim 的行号列旁显示 git diff 的差异标记。假设你有如下已提交过的代码:
1 package main
2
3 import "fmt"
4
5 func main() {
6 x :=true
7 items :=[]string{"tv", "pc", "tablet"}
8
9 if x {
10 for _, i :=range items {
11 fmt.Println(i)
12 }
13 }
14 }
当你做出一些修改后,Vim Gitgutter 会显示如下标记:
1 package main
2
3 import "fmt"
4
_ 5 func main() {
6 items :=[]string{"tv", "pc", "tablet"}
7
~ 8 if len(items) > 0 {
9 for _, i :=range items {
10 fmt.Println(i)
+ 11 fmt.Println("------")
12 }
13 }
14 }
_ 标记表示在第 5 行和第 6 行之间删除了一行。~ 表示第 8 行有修改,+ 表示新增了第 11 行。
另外,Vim Gitgutter 允许你用 [c 和 ]c 在多个有修改的块之间跳转,甚至可以用 Leader+hs 来暂存某个变更集。
这个插件提供了对变更的即时视觉反馈,如果你用 Git 的话,有了它简直是如虎添翼。
Vim Fugitive 是另一个将 Git 工作流集成到 Vim 中的超棒插件。它对 Git 做了一些封装,可以让你在 Vim 里直接执行 Git 命令并将结果集成在 Vim 界面里。这个插件有超多的特性,更多信息请访问它的 GitHub 项目页面。
这里有一个使用 Vim Fugitive 的基础 Git 工作流示例。设想我们已经对下面的 Go 代码做出修改,你可以用 :Gblame 调用 git blame 来查看每行最后的提交信息:
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 1 package main
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 2
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 3 import "fmt"
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 4
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│_ 5 func main() {
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 6 items :=[]string{"tv", "pc", "tablet"}
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 7
00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│~ 8 if len(items) > 0 {
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 9 for _, i :=range items {
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 10 fmt.Println(i)
00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│+ 11 fmt.Println("------")
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 12 }
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 13 }
e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 14 }
可以看到第 8 行和第 11 行显示还未提交。用 :Gstatus 命令检查仓库当前的状态:
1 # On branch master
2 # Your branch is up to date with 'origin/master'.
3 #
4 # Changes not staged for commit:
5 # (use "git add <file>..." to update what will be committed)
6 # (use "git checkout -- <file>..." to discard changes in working directory)
7 #
8 # modified: vim-5plugins/examples/test1.go
9 #
10 no changes added to commit (use "git add" and/or "git commit -a")
--------------------------------------------------------------------------------------------------------
1 package main
2
3 import "fmt"
4
_ 5 func main() {
6 items :=[]string{"tv", "pc", "tablet"}
7
~ 8 if len(items) > 0 {
9 for _, i :=range items {
10 fmt.Println(i)
+ 11 fmt.Println("------")
12 }
13 }
14 }
Vim Fugitive 在分割的窗口里显示 git status 的输出结果。你可以在该行按下 - 键用该文件的名字暂存这个文件的提交,再按一次 - 可以取消暂存。这个信息会随着你的操作自动更新:
1 # On branch master
2 # Your branch is up to date with 'origin/master'.
3 #
4 # Changes to be committed:
5 # (use "git reset HEAD <file>..." to unstage)
6 #
7 # modified: vim-5plugins/examples/test1.go
8 #
--------------------------------------------------------------------------------------------------------
1 package main
2
3 import "fmt"
4
_ 5 func main() {
6 items :=[]string{"tv", "pc", "tablet"}
7
~ 8 if len(items) > 0 {
9 for _, i :=range items {
10 fmt.Println(i)
+ 11 fmt.Println("------")
12 }
13 }
14 }
现在你可以用 :Gcommit 来提交修改了。Vim Fugitive 会打开另一个分割窗口让你输入提交信息:
1 vim-5plugins: Updated test1.go example file
2 # Please enter the commit message for your changes. Lines starting
3 # with '#' will be ignored, and an empty message aborts the commit.
4 #
5 # On branch master
6 # Your branch is up to date with 'origin/master'.
7 #
8 # Changes to be committed:
9 # modified: vim-5plugins/examples/test1.go
10 #
按 :wq 保存文件完成提交:
[master c3bf80f] vim-5plugins: Updated test1.go example file
1 file changed, 2 insertions(+), 2 deletions(-)
Press ENTER or type command to continue
然后你可以再用 :Gstatus 检查结果并用 :Gpush 把新的提交推送到远程。
1 # On branch master
2 # Your branch is ahead of 'origin/master' by 1 commit.
3 # (use "git push" to publish your local commits)
4 #
5 nothing to commit, working tree clean
Vim Fugitive 的 GitHub 项目主页有很多屏幕录像展示了它的更多功能和工作流,如果你喜欢它并想多学一些,快去看看吧。
这些 Vim 插件都是程序开发者的神器!还有另外两类开发者常用的插件:自动完成插件和语法检查插件。它些大都是和具体的编程语言相关的,以后我会在一些文章中介绍它们。
你在写代码时是否用到一些其它 Vim 插件?请在评论区留言分享。
via: https://opensource.com/article/19/1/vim-plugins-developers
作者: Ricardo Gerardi 选题: lujun9972 译者: pityonline 校对: wxy
本文由 LCTT 原创编译, Linux中国 荣誉推出
im 是 Linux 下的常用文本编辑器,但也经常被称为是一个上古神器,因为它对于初学者而言相当不友好,也不好入门。
但是,对于高手而言,他们不仅将 Vim 玩得很溜,而且还将它当作代码开发的主要工具。为什么?因为 VS 等 IDE 比较庞大,运行起来比较慢,而 Vim 就相当轻量了,瞬间就能打开代码并开始工作,这对于追求效率的高手而言自然是爱不释手。
但是,如果是官方版的 Vim ,依然是局限性相当大,十分不方便。但是高手毕竟是高手,高手懂得使用插件。下面良许就介绍高手常用的 3 个很实用的插件。
这个插件叫 Auto Pairs ,它可以自动补全配对的符号,比如:花括号、方括号、圆括号、引号等。这对于我们程序员而言非常有用,因为在代码里我们大量使用到了上述的几种配对符号,如果能自动补全那将很大提高我们的写 bug 效率。
使用这个插件后,当我们敲入一个符号时,会自动补全它的所匹配的另一个符号。比如,我们敲入 [ 时,它会自动补全 ] 。当我们删掉 [ 时,] 也自动被删除了。
如果我们开启了自动缩进,那么它不仅会在合适的位置补全匹配的符号,还会将光标插入到合适的位置。比如下面这段 Go 代码:
package main
import "fmt"
func main() {
x :=true
items :=[]string{"tv", "pc", "tablet"}
if x {
for _, i :=range items
}
}
现在,我在倒数第 3 行 items 后面插入一个花括号 { ,然后敲一下回车,我们就得到这样的结果:
package main
import "fmt"
func main() {
x :=true
items :=[]string{"tv", "pc", "tablet"}
if x {
for _, i :=range items {
| (光标在这里了)
}
}
}
当然 Auto Pairs 还提供了很多选项,我们可以在它的 Github 仓库查看更多用法。但是,以上的这些基本用法就已经可以节约我们很多时间了。
作为一个合格的上古神器,Vim 没办法像那些 IDE 一样去注释代码块。但是有了 NERD Commenter 这个插件,我们就可以实现这样的目标。
NERD Commenter 很智能,它可以自动识别代码,并给出对应语言的注释风格。最简单的方法,我们可以在命令模式下通过敲 <Leader> +空格 来快速注释代码块。在这里, 键默认是反斜杠 \ 键,我们也可以进行自定义。
我们怎么选中多行呢?那就是要在 visual mode (可视化模式)下进行了,这是 Vim 的基本操作了。
还有一个很有用的特性是 Sexy Comment (性感模式),我们可以使用 <Leader>+cs 来触发。性感模式可以将代码块用很优雅的方式来注释,比如下面这种风格的注释就是性感模式:
package main
import "fmt"
func main() {
/*
* x :=true
* items :=[]string{"tv", "pc", "tablet"}
*
* if x {
* for _, i :=range items {
* fmt.Println(i)
* }
* }
*/
}
Vim Surround 插件堪称是一个大杀器,因为它可以将现有的代码添加成对包围符号。比如我们现在有这么一句代码:
"Vim plugins are awesome !"
如果我们想把引号去掉,只需敲 ds" 即可:
Vim plugins are awesome !
如果我们想将双引号改成单引号,我们可以敲 cs"':
'Vim plugins are awesome !'
想要换成其它符号也是一样的道理。不仅如此,它还对 HTML 或 XML 标记语言支持非常好。比如有这么一句 HTML 语句:
<p>Vim plugins are awesome !</p>
现在我们想要加粗 awesome 这个词,我们可以将光标放在这个单词上,然后敲 ysiw<em> ,它就会自动添加标记:
<p>Vim plugins are <em>awesome</em> !</p>
Vim Surround 还可以以锯齿的方式,在语句的上下方添加包围符号,并将当前语句自动缩进。比如我们想在上面那条代码添加标签,我们可以敲 ySS<div class="normal"> :
<div class="normal">
<p>Vim plugins are <em>awesome</em> !</p>
</div>
同样地,它的功能不仅于此,我们可以进它的 Github 仓库查看更多强大的功能。
最后,最近很多小伙伴找我要Linux学习路线图,于是我根据自己的经验,利用业余时间熬夜肝了一个月,整理了一份电子书。无论你是面试还是自我提升,相信都会对你有帮助!目录如下:
免费送给大家,只求大家金指给我点个赞!
链接:https://pan.baidu.com/s/1_6uniaFV0rdMWIdMwgZjbg 提取码:9pbc
也希望有小伙伴能加入我,把这份电子书做得更完美!
推荐阅读:
用这 10 个 Vim 插件,可以让你在写代码或运维时,感觉更棒。-- Maxim Burgerhout(作者)
我使用 Vim 文本编辑器大约 20 年了。有一段时间,我一直在定制我的 Vim 配置,但在只有在最近两年我才会使用插件。
最近,当我重新安装系统时(就像我经常做的那样),我觉得这是一次好的机会,我想找出多种编程语言环境下的最佳 Vim 插件,以及如何将这些插件和每种语言结合起来。
有时,我会为特定的语言和配置使用特定的插件(例如,我只在 Ansible 配置中安装 Rocannon),在此不细讲了。不过下面介绍的 10 个 Vim 插件都是我的最爱,无论使用哪种编程语言,我几乎都会使用它们。
我的首选并不是一个插件,但是它可以替换类似于 Vundle 的插件,所以在此介绍。
Volt 是一个不依存于 Vim 的 Vim 插件管理器。你可以用它安装插件,并创建名为“profile”的插件组合。你可以使用一个简单的命令 volt profile set myprofile 启用新的配置。这样我可以做到这样的事情,如为 Python 配置单独启用 indentpython 插件。Volt 还提供了一种针对每个插件配置的简单方法,这些配置会在“profile”之间共享,因此只需要安装一次插件,就可以在多个“profile”之间使用。
Volt 还是相对较新且不够完美(比如,不管你想要使用多少个“profile”,每个插件只能有一个配置文件),但除此之外,我发现它非常方便、快速和简单。
Volt plugin
除了 Python,几乎所有的主流编程语言都使用括号(小括号、方括号和大括号)。通常,它们会嵌套使用多对括号,因此很难搞清楚某个括号的开闭区间。我发现自己经常要数小括号,尤其是在复杂的 Bash 脚本中,以确保无误。
这时候就需要 vim-rainbow 插件!它为每对括号设置不同的颜色,因此很容易识别出哪些括号是一对括号。它非常有用而且五彩斑斓。
vim-rainbow plugin
Vim 有很多这种插件,例如 Powerline ,它会在底部栏显示你正在处理的文件、光标所在的文件位置以及文件类型等信息。这些插件各有利弊,在简单比较后,我选择了 lightline 。它相对较小,便于安装和扩展,并且不依赖于其他工具或插件。
Lightline plugin
NERDTree 是一个很经典的插件。在大型项目中,你可能很难找到想要编辑的内容所在文件的确切名称和路径。使用快捷键(我使用的是 F7,因为我在 .vimrc 中配置了这个快捷键),搜索窗会以垂直分屏的方式打开,就可以轻松找到所需文件并打开它。对于大型项目,这是必备插件。对于那些经常忘记文件名的人也很有用,比如我。
NERDTree vim plugin
程序员们在写代码时,有时会遇到一些难以调试的问题,导致他们想要注释或不执行某段代码。这时候就需要 NERD Commenter 出场了。选择代码段,按 Leader 键 + cc,代码就会被注释掉。(标准的 Vim Leader 键 是 / 字符。)按 Leader 键 + cn,取消注释。对于大多数文件类型,NERD Commenter 会自动使用正确的注释符。例如,如果你正在编辑 BIND 区域文件 ,并将文件类型设置为 BIND 区域文件,Vim 会正确地使用 ;(分号)字符进行注释。
NERD Commenter
我喜欢我的 Vim 主题配色。我也喜欢终端的主题色。我一直在 Vim 上使用 Solarized 配色,并且将我的终端、文件夹配色和 Vim 设为一致。
但是,有时我会根据周边环境、屏幕亮度以及是否需要分享投屏,来切换明暗模式。
显然,你可以选择自己喜欢的任何配色方案,但我喜欢 Solarized,因为它有明暗模式功能,它可以简单快捷地切换两种模式。我的第二个选择是 Monokai 。Volt 插件管理器让我可以轻松地在两者之间切换,因此我在 Python 编程时,使用 Monokai;Bash 编程时,使用 Solarized。
我没有给 Solarized 找相应的图片,因为本文中的所有其他图片都使用了 Solarized 中的浅色或深色效果,可以确认一下这些图片。
当寻找一个文件时,有时你想要一个文件浏览器,有时你只想在键盘上敲打出与文件名模糊匹配的内容,对吗?
fzf (全称 “模糊查找器”)插件提供了这一功能。打出 :FZF 并输入文件名内容。不断缩短的列表将显示出与你输入的文件名内容相匹配的一些文件。我经常使用它,最近使用它的频率估计比使用 NERDTree 还多。缺点是这个插件依赖于 fzf binary,因此也必须安装这个依赖包。它适用于 Fedora、Debian 和 Arch,据我所知并不在 EPEL 中。
fzf Vim plugin
有时,你需要搜索包含特定行或特定单词的文件。我真的很喜欢使用 ack 插件,最好与 ag 结合使用,它俩的组合又被称为 “ silver searcher ”。这一组合的速度非常快,覆盖了 grep 或 vimgrep 的绝大多数使用场景。缺点是你需要安装 ack 或 ag 才能正常运行。好消息是 Fedora 和 EPEL7 都可以使用 ag 和 ack。
ack vim plugin
大多数 IT 人员都使用 Git 和 Git 仓库中的文件进行工作。 gitgutter 插件在行号附近添加了一列,通过符号显示该行的状态为:已更改(~)、已添加(+)或者已删除(-)。这有利于跟踪你所做的更改,并且可以使你专注于手头的任务,例如编写补丁来修复一个关键错误。
gitgutter vim plugin
如果你在一个很大的文件中编写代码,会很容易忘记当前所在的位置,你可能需要上下滚动来查找某个功能。使用 Tag List 插件,只需要输入 :Tlist,就能垂直分屏显示出包含变量、类型、类和函数的代码,你可以轻松跳转到这些变量、类型、类和函数。这个功能对于多语言同样适用,例如 Java、Python 以及任何能够使用 ctags 功能的文件类型。
Tag List vim plugin
以上介绍的 10 个 Vim 插件使我作为系统管理员和兼职程序员的生活变得更轻松。你正在使用哪些 Vim 插件?请在评论中分享你最爱的插件。
via: https://opensource.com/article/19/11/vim-plugins
作者: Maxim Burgerhout 选题: lujun9972 译者: hello-wn 校对: wxy
本文由 LCTT 原创编译, Linux中国 荣誉推出
*请认真填写需求信息,我们会在24小时内与您取得联系。