用一些超酷的功能使 Vim 变得更强大
======

![](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/making-vim-even-more-awesome-with-these-cool-features_orig.jpg)

Vim 是每个 Linux 发行版]中不可或缺的一部分，也是 Linux 用户最常用的工具（当然是基于终端的）。至少，这个说法对我来说是成立的。人们可能会在利用什么工具进行程序设计更好方面产生争议，的确 Vim 可能不是一个好的选择，因为有很多不同的 IDE 或其它类似于 Sublime Text 3，Atom 等使程序设计变得更加容易的成熟的文本编辑器。

### 我的感想

但我认为，Vim 应该从一开始就以我们想要的方式运作，而其它编辑器让我们按照已经设计好的方式工作，实际上不是我们想要的工作方式。我不会过多地谈论其它编辑器，因为我没有过多地使用过它们（我对 Vim 情有独钟）。

不管怎样，让我们用 Vim 来做一些事情吧，它完全可以胜任。

### 利用 Vim 进行程序设计

#### 执行代码


考虑一个场景，当我们使用 Vim 设计 C++ 代码并需要编译和运行它时，该怎么做呢。

(a). 我们通过 `Ctrl + Z` 返回到终端，或者利用 `:wq` 保存并退出。

(b). 但是任务还没有结束，接下来需要在终端上输入类似于 `g++ fileName.cxx` 的命令进行编译。

(c). 接下来需要键入 `./a.out` 执行它。

为了让我们的 C++ 代码在 shell 中运行，需要做很多事情。但这似乎并不是利用 Vim 操作的方法（ Vim 总是倾向于把几乎所有操作方法利用一两个按键实现）。那么，做这些事情的 Vim 的方式究竟是什么?

#### Vim 方式

Vim 不仅仅是一个文本编辑器，它是一种编辑文本的编程语言。这种帮助我们扩展 Vim 功能的编程语言是 “VimScript”（LCTT 译注： Vim 脚本）。

因此，在 VimScript 的帮助下，我们可以只需一个按键轻松地将编译和运行代码的任务自动化。

 [![create functions in vim .vimrc](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_orig.png)][2] 

以上是在我的 `.vimrc` 配置文件里创建的一个名为 `CPP()` 函数的片段。

#### 利用 VimScript 创建函数

在 VimScript 中创建函数的语法非常简单。它以关键字 `func` 开头，然后是函数名（在 VimScript 中函数名必须以大写字母开头，否则 Vim 将提示错误）。在函数的结尾用关键词 `endfunc`。

在函数的主体中，可以看到 `exec` 语句，无论您在 `exec` 关键字之后写什么，都会在 Vim 的命令模式上执行（记住，就是在 Vim 窗口的底部以 `:` 开始的命令）。现在，传递给 `exec` 的字符串是（LCTT 译注：`:!clear && g++ % && ./a.out`） -

[![vim functions commands & symbols](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_1_orig.png)][3]


当这个函数被调用时，它首先清除终端屏幕，因此只能看到输出，接着利用 `g++` 执行正在处理的文件，然后运行由前一步编译而形成的 `a.out` 文件。

#### 将 `Ctrl+r` 映射为运行 C++ 代码。

我将语句 `call CPP()` 映射到键组合 `Ctrl+r`，以便我现在可以按 `Ctrl+r` 来执行我的 C++ 代码，无需手动输入`:call CPP()` ，然后按回车键。

#### 最终结果

我们终于找到了 Vim 方式的操作方法。现在，你只需按一个（组合）键，你编写的 C++ 代码就输出在你的屏幕上，你不需要键入所有冗长的命令了。这也节省了你的时间。

我们也可以为其他语言实现这类功能。

 [![create function in vim for python](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_2_orig.png)][4] 

对于Python：您可以按下 `Ctrl+e` 解释执行您的代码。

 [![create function in vim for java](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_3_orig.png)][5] 


对于Java：您现在可以按下 `Ctrl+j`，它将首先编译您的 Java 代码，然后执行您的 Java 类文件并显示输出。

### 进一步提高

所以，这就是如何在 Vim 中操作的方法。现在，我们来看看如何在 Vim 中实现所有这些。我们可以直接在 Vim 中使用这些代码片段，而另一种方法是使用 Vim 中的自动命令 `autocmd`。`autocmd` 的优点是这些命令无需用户调用，它们在用户所提供的任何特定条件下自动执行。

我想用 `autocmd` 实现这个，而不是对每种语言使用不同的映射，执行不同程序设计语言编译出的代码。

 [![autocmd in vimrc](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_4_orig.png)][6] 

在这里做的是，为所有的定义了执行相应文件类型代码的函数编写了自动命令。

会发生什么？当我打开任何上述提到的文件类型的缓冲区， Vim 会自动将 `Ctrl + r` 映射到函数调用，而 `<CR>` 表示回车键，这样就不需要每完成一个独立的任务就按一次回车键了。

为了实现这个功能，您只需将函数片段添加到 `.vimrc` 文件中，然后将所有这些 `autocmd` 也一并添加进去。这样，当您下一次打开 Vim 时，Vim 将拥有所有相应的功能来执行所有具有相同绑定键的代码。

### 总结

就这些了。希望这些能让你更爱 Vim 。我目前正在探究 Vim 中的一些内容，正阅读文档，补充 `.vimrc` 文件，当我研究出一些成果后我会再次与你分享。

如果你想看一下我现在的 `.vimrc` 文件，这是我的 Github 账户的链接: [MyVimrc][7]。 

期待你的好评。

--------------------------------------------------------------------------------

via: http://www.linuxandubuntu.com/home/making-vim-even-more-awesome-with-these-cool-features

作者：[LINUXANDUBUNTU][a]
译者：[stevenzdg988](https://github.com/stevenzdg988)
校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

[a]:http://www.linuxandubuntu.com
[1]:http://www.linuxandubuntu.com/home/category/distros
[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_orig.png
[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_1_orig.png
[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_2_orig.png
[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_3_orig.png
[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/vim_4_orig.png
[7]:https://github.com/phenomenal-ab/VIm-Configurations/blob/master/.vimrc
