同样用Vim编辑器,为什么别人比你更高效?

26 篇文章 1 订阅
22 篇文章 0 订阅

 

世界上只有两种物质:高效率和低效率;世界上只有两种人:高效率的人和低效率的人。——萧伯纳

 

同理,世界上只有两种代码:高效代码和低效代码。

 

如何编写高效代码,是每个团队都面临的一个重大问题。

 

大多数程序员在编程时,都要花大量时间在看、写、改上面,而最终写出来的代码往往让人精疲力尽,在编辑文本上面同样的业务用不同的人来写,虽然最终效果很可能是一样的,但是呈现出来的却不尽相同。废话不多说,给大家看一个对比,自己摸索出来写出来的和使用文本编辑器协助撰写的:

 

 

这样的代码真的让人是很难受,定义在一个function方法里面的代码数量居然高达两千行,里面大部分都是if else,这样的代码不仅效率低,而且还不美观。

 

好的注释会让人大概理解该方法或者类是做什么的,从而减少理解的时间,把更多的时间放在解决问题上。

 

 

高效率的代码由简单的赋值语句、if else语句、注释等等组成,就像上图一样。

 

下面就是大家最关心的问题了,如何编写高效的代码?

 

组织工作区

 

在编写程序时,经常需要同时处理多个文件,涉及来回切换、跨文件编辑或到其他界面查询资料等操作。

幸运的是,Vim 提供了一个能够处理多个文件的插件。

 

· Vim 内部用缓冲区来表示文件;通过缓冲区,读者可以在不同文件之间快速切换。

· Vim 用多个窗口在同一屏幕中显示多个文件。

· Vim 用标签页对窗口进行分组。

· Vim 用折叠效果来隐藏或展开一个文件的部分内容,从而让读者可以更容易地浏览文件的内容。

 

下图展示了上述要点,解释如下:

 

· 多个窗口用于同时打开多个文件(farm.py、animal/cat.py 和 animal_farm.py)。

· 顶部显示有两个标签页(3 farm.py 和 a/dog.py)。

· 以+--开头的行表示折叠,它隐藏了文件的部分内容。

 

通过这些功能,我们可以在工作中同时处理任意多个文件。

 

缓冲区

 

缓冲区是文件的内部表示,每个打开的文件都有一个缓冲区。

比如,通过命令行 vim animal_farm.py 打开一个文件,然后可以用:ls 命令看到现有的缓冲区列表。

 

很多命令都有别名或等价命令,:ls 也不例外,它和:buffers 及:files 实现的是同样的功能,读者可以从中选择一个最容易记的命令。

 

下图所示为 ls 命令的执行结果(最下面的那 3 行)。

 

它的状态栏显示了已经打开的缓冲区(这里只有一个)的相关信息,这些信息的含义如下:

· 1 为缓冲区编号,在整个 Vim 会话中,它的值保持不变。

· % 表示该缓冲区位于当前窗口中。

· a 表示该缓冲区处于活动状态,即它已被加载并可见。

· "animal_farm.py"为文件名。

· line 30 表示当前光标位置。

 

现在,用下列命令打开另一个文件。

 
:e animals/cat.py

 

然后,可以看到之前打开的文件已经被当前文件所取代。不过,animal_farm.py 仍然存储在某个缓冲区中,读者可以再次用:ls 命令将其显示出来。

 

现在,可以看到两个文件名都被列出来了,如下图所示。

 

 

那么怎样才能跳转到之前的文件呢?

Vim 通过数字和名称来标识每个缓冲区,在同一个 Vim 会话中,它们都是唯一的(除非退出 Vim)。为了在不同的缓冲区之间切换,可使用:b 命令,其参数为缓冲区的编号数字。:b 1

 

:b 1 命令中的空格可以省略,得到简化版的命令:b1。

 

通过一条很简单的命令就可以回到原来的文件。由于缓冲区还可以用文件名来标识,因此读者可以用文件名的一部分来切换缓冲区。下列命令将打开 animals/cat.py 的缓冲区。

:b cat

 

不过,如果名称匹配了多个缓冲区,则 Vim 会报错。比如,用下面的命令查找所有文件名包含 py 的缓冲区。

 
 :b py

 

Vim 的状态栏中会显示错误,如下图所示。

 

 

为解决这个问题,可以使用 Tab 键补全文件名,从而实现在不同缓冲区之间循环切换。输入:b py(先不要按 Enter 键),然后按 Tab 键,在所有匹配的结果之间循环遍历。

 

读者也可以使用:bn(:bnext)和:bp(:bprevious)命令循环遍历缓冲区。

 

当不再需要某缓冲区的时候(如不再需要编辑该文件),可以将其删除。通过如下命令可以将一个缓冲区从打开的缓冲区列表中删除,而无须退出 Vim。

 
 :bd

 

但如果没有保存当前缓冲区,则 Vim 会报错。因此,在不小心删除缓冲区之前,读者还有一次保存文件的机会。

 

插件unimpaired

 

Tim Pope 的 vim-unimpaired 是一个 Vim 插件,它为很多内置命令(以及一些新的命令)添加映射。我每天都会使用这个插件,因为它提供了更为直观的映射,比如]b 和[b 用于循环遍历缓冲区,]f 和[f 用于遍历目录中的文件。

 

该插件可以在 GitHub 仓库 tpope/vim-unimpaired 中找到。

 

下面是 vim-unimpaired 提供的部分映射。

· ]b 和[b 循环遍历缓冲区。

· ]f 和[f 循环遍历同一目录中的文件,并打开为当前缓冲区。

· ]l 和[l 遍历位置列表。

· ]q 和[q 遍历快速修复列表。

· ]t 和[t 遍历标签列表。

 

此插件还支持用少数几次按键来切换某些选项,比如 yos 切换拼写检查,或 yoc 切换光标行高亮显示。

 

窗口

 

Vim 将缓冲区加载到窗口中。一个屏幕上可以同时显示多个窗口,它们将屏幕分割成几块。

 

窗口的创建、删除和跳转

 

Vim 窗口的使用方式:

 

首先,打开 animal_farm.py 文件(在命令行中执行$ vimanimal_farm.py 或从 Vim 中执行:e animal_farm.py)。

 

然后,使用如下命令将窗口分割成两个,其中一个显示新的文件。

 
 :split animals/cat.py 

 

:split 命令可以简化为:sp。可以看到 animals/cat.py 被打开,显示在原文件上方的窗口中,而且光标也出现在里面,如下图所示。

 

 

也可以使用下面的命令按水平方向分割窗口。

 
 :vsplit farm.py 

 

如下图所示,当前窗口又水平分隔出一个新的窗口(光标也随之移动到左边的新窗口中)。

 

 

:vs 是:vsplit 的简化版。

通过组合:split 和:vsplit,可以生成任意多个窗口。

 

目前提到的所有命令都适用于窗口,包括切换缓冲区。为了使光标能在不同窗口间移动,先按 Ctrl +w 组合键,然后输入一个方向键:h、j、k、l 中的一个或键盘方向键。

 

按 Ctrl + h 组合键,之后再按 Ctrl + j 组合键(Ctrl 键可以不松开,记为 Ctrl + w,j 组合键),光标会进入下面的窗口,而使用 Ctrl + w,k 组合键则进入上面的窗口。

 

如果经常使用窗口,读者可以按照如下配置绑定快捷键。

" 使用+ hjkl 快速在窗口间跳转

d68e216f144f4d3296d3102851f27acduploading.4e448015.gif转存失败重新上传取消

 

 

然后,就可以用 Ctrl + h 组合键跳到左边的窗口,用 Ctrl + j 组合键跳到底部的窗口,依此类推。

 

读者可以用下列方式来关闭窗口。

· 使用 Ctrl + w,q 组合键关闭当前窗口。

· 使用:q 命令关闭窗口并卸载缓冲区;不过,当只有一个窗口打开的时候,这会导致退出 Vim。

· 使用:bd 命令删除当前缓冲区,并关闭当前窗口。

· 使用 Ctrl + w,o 组合键(或:only,或:on 命令)关闭除当前窗口之外的所有窗口。

 

当打开了多个窗口时,可通过:qa 命令关闭所有窗口并退出。也可以结合:w 命令,即:wqa,它会先保存所有打开的文件,再退出 Vim。

 

如果只想关闭缓冲区,而保留它所在的窗口,则可以在.vimrc 文件中加入如下配置。

 

然后,读者就可以使用:Bd 来关闭缓冲区,而保留分割窗口。

 

窗口的移动

 

窗口也可以移动、交换或改变大小。因为 Vim 中没有鼠标拖曳的功能,所以只能记住一些命令了。

 

读者并不需要记住所有这些命令,只要知道 Vim 支持哪些窗口操作,剩下的操作可以通过查看文档。

使用:

 

和:

 

打开 Vim 手册中相应的条目,即可找到所有相关的快捷键。

 

窗口命令的快捷键都要先按 Ctrl + w 组合键,后面跟一个大写的方向键(H、J、K 和 L 中的一个),当前窗口会被移动到相应的位置。

· 使用 Ctrl + w,H 组合键将当前窗口移动到屏幕的最左边。

· 使用 Ctrl + w,J 组合键将当前窗口移动到屏幕的底部。

· 使用 Ctrl + w,K 组合键将当前窗口移动到屏幕的顶部。

· 使用 Ctrl + w,L 组合键将当前窗口移动到屏幕的最右边。

 

比如下图所示的窗口布局(先打开 animal_farm.py,然后再依次运行:sp animals/cat.py 和:vs farm.py,可得到这个布局)。

 

注意,图中光标位于 animals/cat.py 文件所在的窗口中。通过前面介绍的几个快捷键,可以让这个窗口朝不同的方向移动。

 

· 使用 Ctrl + w,H 组合键将 animals/cat.py 移动到最左边,如下图(a)所示。

· 使用 Ctrl + w,J 组合键将 animals/cat.py 移动到底部,而且左右分割变成了上下分割,如下图(b)所示。

· 使用 Ctrl + w,K 组合键将 animals/cat.py 移动到顶部,如下图(c)所示。

· 使用 Ctrl + w,L 组合键将 animals/cat.py 移动到最右边,如下图(d)所示。

 

(a)

 

(b)

 

(c)

 

(d)

 

若想修改一个窗口的内容,则只需要跳转到这个窗口,然后用:b 命令来选择所需的缓冲区。

不过,也有一些快捷键可以用于交换两个窗口的内容。

· 使用 Ctrl + w,r 组合键将当前行或当前列(行优先于列)中的每个窗口的内容向右或向下移动。使用 Ctrl + w,R 组合键则以相反的方向执行类似的操作。

· 使用 Ctrl + w,x 组合键将当前窗口与下一个窗口的内容交换(如果当前窗口是最后一个,则与前一个交换)。

 

Vim 内部用数字来标识窗口。

不过,与缓冲区不同,窗口的编号是随着布局变化而改变的,而且并没有直接的方法来修改窗口编号。

有些窗口管理命令以窗口编号为参数,但本书不会涉及这部分内容。有一条原则仅供参考,窗口编号顺序为由上至下、由左至右递增。

 

改变窗口的大小

 

Vim 窗口默认的宽高比为 50/50,这可能并不满足读者的需求,因此窗口的大小可以通过一些方法来改变。

 

快捷键 Ctrl + w,=(按 Ctrl+w 后再按=键)能够将所有打开窗口的宽和高调整为一致。如果不恰当地调整了窗口大小,这个命令将非常有用。

 

:resize 命令会增加或减少当前窗口的高度,而:vertical resize 将调整窗口的宽度。读者还可以使用如下命令。

· :resize +N 用于将当前窗口的高度增加 N 行。

· :resize -N 用于将当前窗口的高度减少 N 行。

· :vertical resize +N 用于将当前窗口的宽度增加 N 列。

· :vertical resize -N 用于将当前窗口的宽度减少 N 列。

 

:resize 和:vertical resize 可分别简写为:res 和:vert res。

另外,还有将窗口高度和宽度改变一行/列的快捷键:Ctrl + w,-和 Ctrl + w,+用于调整高度,而 Ctrl+w,>和 Ctrl + w,<用于调整宽度。

 

两种命令都可以将宽度/高度设置为具体的行数/列数。

· :resize N 用于将窗口高度设置为 N。

· :vertical resize N 用于将窗口宽度设置为 N。

 

标签页

 

在很多现代编辑器中,标签页(Tabs)用于表示不同的文件。在 Vim 中自然也是如此,但读者需要考虑其原始目的。

 

Vim 用标签页来组织一个窗口的集合,进而支持在不同的窗口集合之间切换,这让用户方便地拥有了多个工作区。标签页通常用来在同一个 Vim 会话中区分不同的问题或者文件集合。

标签页功能不一定是一个频繁使用的功能,但如果希望在不同项目或同一项目的不同上下文之间切换,那么标签页将是一个不错的选择。

 

用户愿意使用标签页的另一个原因可能与 Vim 的 diff 功能有关,因为 diff 作用于一个标签页内。

在一个新标签页中打开一个空缓冲区的命令如下。

 
:tabnew

 

在新标签页中打开一个已有文件的命令为:tabnew <文件名>。如下图所示,标签页显示在屏幕的顶部。

在标记为 3 farm.py 的标签页中打开了三个窗口及一个活动缓冲区 farm.py。[No Name]标签页则是刚才打开过的空缓冲区。

 

 

在一个标签页中,可以通过常用的方式(:e <文件名>)来加载文件,也可以用:b 命令在不同缓冲区之间切换。

 

为了在不同标签页之间跳转,可以使用如下命令。

· 快捷键 gt 或:tabnext 命令用于切换到下一个标签页。

· 快捷键 gT 或:tabprevious 命令用于切换到上一个标签页。

 

标签页可通过:tabclose 命令来关闭,标签页关闭也会导致其中的窗口关闭(如果只剩一个标签页,则需要用:q 来关闭)。

:tabmove N 命令将当前标签页移动到第 N 个标签页之后(如果 N 为 0,则变成第一个标签页)。

 

折叠

 

Vim 为浏览大型文件提供的一个强大工具是折叠。折叠功能支持文件部分内容的隐藏,隐藏的依据既可以是预定义的规则,也可以是手动添加的折叠标记。

 

如下图所示,animal_farm.py 中的部分代码片断被折叠了,代码中每个方法的具体内容被隐藏了,从而可以在整体上来查看代码。

 

 

折叠 Python 代码

 

以 Python 编程为例,所以这里只介绍 Python 示例代码的折叠方式。

首先,需要在.vimrc 文件中将 foldmethod 设置为 indent,设置代码如下。

 
set foldmethod=indent

 

不要忘记重新加载~/.vimrc,方法是重启 Vim 或在 Vim 中执行:source $MYVIMRC 命令。

设置 foldmethod 为 indent,使 Vim 基于缩进来折叠代码。

再次打开 animal_farm.py,可以看到该文件中的部分代码已经被隐藏,如下图所示。

 

 

将光标移动到其中一个折叠行上,输入 zo 可以打开当前折叠,如下图所示。

 

 

只要光标在一个潜在的折叠文本中(本例中为缩进的代码块),输入 zc 都会将此折叠关闭。

 

为了方便看清折叠的位置,可以使用:set foldcolumn=N 命令,其中 N 的取值为 0~12。这会告诉 Vim 用从屏幕左边开始的 N 列来标记折叠,其中符号-表示一个打开的折叠,符号|表示打开的折叠的内容,符号+表示关闭的折叠。

 

输入 za 可切换折叠状态(打开关闭的折叠或关闭打开的折叠)。输入 zR 和 zM 分别用于同时打开和关闭所有折叠。

 

将 foldmethod 设置为自动类型(如 indent)会默认将所有文件折叠。这只是一种偏好,读者也可能会选择在打开新文件时打开折叠。

在.vimrc 文件中添加 autocmd BufRead * normal zR 会在打开新文件时令折叠处于打开状态,即 Vim 在读取新的缓冲区时执行 zR 命令(打开所有折叠)。

 

折叠的类型

 

从某种意义上来说,Vim 在折叠代码方面是比较智能的,而且支持多种折叠方式。折叠的方法由.vimrc 文件中的 foldmethod 选项来指定。

 

Vim 支持如下折叠方式。

· manual:手动折叠,这种方法对于长文本而言并不适用。

· indent:基于缩进的折叠,这对于依赖缩进的编程语言非常合适(不管哪种语言,标准的编码风格中总是会采用某种一致性的缩进。因此,当读者想要快速隐藏不关心的代码时,indent 折叠方式不失为一种高效率的选择)。

· expr:基于正则表达式的折叠。如果读者想要用复杂的规则来定义折叠,那么可以选择这种方式。

· marker:使用文本中特殊的标记来定义折叠,比如{{{和}}}。这种方法对于管理很长的.vimrc 文件非常有效,但是在 Vim 之外不常用,因为这种方式需要修改文件内容。

· syntax 提供了可识别语法的折叠,但它并非对所有语言都开箱即用(不支持 Python)。

· diff:当 Vim 处于 diff 模式时会自动采用这种折叠方式,diff 模式下需要展示两个文件的不同之处,而相同之处往往需要隐藏起来。

 

设置折叠方式的方法为在.vimrc 文件中加入 set foldmethod=<折叠方法>。

 

以上内容来自鲁斯兰 • 奥西波夫老师的《Vim 8文本处理实战》,这本书作为全面介绍Vim使用方法的教程,本书介绍了各种常用的文本编辑方法和程序设计中的实用操作,深入Vim内部的数据结构和VimScript脚本编程,内容详实。

 

 

本书基于Vim 8平台,介绍了前沿分支Neovim,还推荐了更先进的Oni编辑器,兼容并包,集Vim社区典型使用经验和发展趋势于一体。本书面向的读者群体是所有使用Vim的程序员,书中的示例文本为Python代码,并详细介绍了Git和正则表达式。读者需要对操作系统和程序设计有基本的了解,特别是需要了解Linux操作系统的基本使用。

 

虽然本书尝试兼顾三大操作系统,但毫无疑问书中内容以Linux为主。本书可以帮助读者完善Vim技能,增加程序设计的知识储备。

 

希望大家通过学习,都成为编写高效代码的程序员。

 

-END-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值