2020换台新能源车?务必三思

通过阅读本章,读者将能更加得心应手地在日常任务中使用Vim。本章使用一个Python工程作为示例,模拟了一系列日常编码的场景。当然,读者完全可以拿自己手头的项目练手;只不过,本章中的使用场景不一定都适用于读者自己的代码。

本章包括如下主题。

  • 介绍一种粗暴但快捷的Vim插件安装方式。
  • 介绍如何使用缓冲区、窗口、标签页和j n / * ~ g l 6折叠来处理多个文件或长文M { _件,从而使工作区更为整洁。
  • 介绍插件Netrw、NERDTree、Vinegarg J o 7 E $和CtrlP,通过这些插件,读者可以在不退出Vim的情况下浏览复杂的文件树。
  • 介绍文件中的高级文本浏览方式、极其高效的光标移动插件EasyMotion以及多种文本对象,介绍通过, b q t / 9 Dgrep和ack实现跨文件的搜索。
  • 介绍如何利用寄存/ | . V + t器来复制和粘贴。

1 技术要求

本章将介绍如何用Vim在一个Pyth! f n [ ion工程上作业。读者可以在异步社区中找到本章用到的代码。

2 安装插件

本章会介绍几个Vim, N S B插件,但暂时不会涉及较为复杂的插件管理,相W u n . * Y关的内容参见第3章。

首先,读者必须要做好准备工作。

1.创建一个存储插件的目录,执n 9 3 1 K Z行下列命令。

$ mkdir -p ~/.vim/paco _ h Fk/plugins/start

如果在Windows系统中使用gVim,则需要在用户目录(通常是C:\\Users\\ <用户名>)下创建vimfiles目录,然后在其中创建子目录pack\\ plugins\\ start。

2.使Vim能够自动加载每个插件的文档(Vim默认不会这么做)。在~/.vimrc文件(在Windows系统中为用户目录下的_v9 / 0 y } 9 dimrc文件)中添加下列代码。

packloadall               \" 加载所有插件
silent! helptags AL} ? y c [ 2L \" 为所有插件加载帮助文档

然后,每次安装插件都可按照~ H # 6 W C下列步骤进行。

1.在 GitHub 上找到想要安装的插件。比如,读者想安装scrooloose/ nerdtree(注意,这里的scri I b jooloose/nerdtree为该GitHub仓库的唯一标识,实际地址为https://github.com/scrooloose/nerD Z ` A ? u 4 0 &dtree.git)。假设读者已经安装了Git,则可以找到此Git仓库的克隆地址,然后运行如下命令。

$ git clone https://github.com/S v j p k { Oscr @ T _  C  6 .rooloose/nerdtree.git 
~/$ = ! { 8.vim/pack/plugins/start/nerdtree

如果读者没有安装, ; CGit,或者在Windows系统中使用gVim,则可以在GitHub页面上找到克隆或下载(Clone or download)按钮,下载ZIP压缩包,然后将其解压到相应的插件目录中,比如在Linux系统中为目录~/.vim/pacE I % .k/ plugins/start/nerdtree,而在Windows系统中为用户目录下的子目录vimfiles/pack/pluginsW K % ( R N F/start/nerdtree。

2.重启Vim之后,即可使用插件进行相关操作。

3 组织工作区

到目前为止,本书还只是用Vim处理单h ^ x v - , V y 0个文件。但是在编写程序时,经常需要同时处理多个文件,涉及来回切换、跨文件编辑( 6 & - ? v f 6 x或到其他界面查询资料等操作。幸运的是,Vim提供了一个能够处理多个文件的插件。

  • Vim内部用缓冲区来表示文件;通过缓冲区,读者可以在不同文件之间快速切换。
  • Vim用多个窗口在同一屏幕中m 2 j k C显示多个文件。
  • Vim用标签页对窗口进行分组。
  • Vim用折叠效果来隐藏或展开一个文件的部分内容,从而让读者可以更容易地浏览文件的内容 # ) 4 S i !

图1中展示了上述要点,解释如下。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图1

  • 多个窗口用于同时打开多个文件(f8 c J y a iarm6 8 I _.pyi d U、animal/cat.P @ % 8 7 Q #py和animal_farm.py)。
  • 顶部显示有两个标签页(3 farm~ ^ .py和a/dog.py)。
  • 以+--开p A r 4 8 i K ^头的行表示折叠,它隐藏了文件的部分内容。

本节将| v 9 2 s详细介绍窗口、标签页和折叠,通过这些功能,读者可以在工作中同时处理任意多个文件。

3.1 缓冲区

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

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

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

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图2

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

  • 1为缓冲区编号,在整个Vim会话中,它的值保持不变。
  • % 表示该缓冲区位于= | L - 2 * ,当前窗口中。
  • a 表示该缓冲区处于活动状态,即它已被加载并可见。
  • \"animal_farm.py\"为文件名。
  • line 30表示当前光标位置。

现在,用 ? - y D w t ~ x下列( _ f命令打开另一个文件。

:e animals/cat.} 4 D w @ 0py

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

现在V # { % c,可以看到两个文件名都被L M K : S ) ;列出来了,如图3所示。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图3

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

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

:/ x h z sb 1

:b 1命令中的空格可P o a ? 3 8 Y以省略,得到简化版的命令:b1。

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

:b cat

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

:b py

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

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图4

为解决这个问题,可以使用Tab键补全文件) v V Z h s j C名,从而实现在不同缓冲区之间循环w y c切换。输入:b py(i @ ] 5 t ? s p先不要按Enter键),然后按Tab键,在所有匹配的结果之间循环遍历。

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

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

:bd

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

3.2 插件——unimpaired

Tim Pope的vim-unimpaired是一个s O v @ P jVim插件,它为很多内置命令(以! # k ? D {及一些新的命令)添加映射。本书作者每天都m U h会使用这个插件,因为它提供了更为直观的映射,比如]b和[b用于循环遍历缓冲区,]f和[f用于遍历目录中的文件。该插件可以在GitHub仓库tpope/vim-unimpaired中找到(安装方法参见本章2.2节)。

下面] S @ 3 F m A是vim-unimpaired提供的部分映射。

  • ]b和[b循环遍历缓冲区。
  • ]f和[f循环遍= : ?历同一X 2 r U R # , a }目录中的文件,并打开为当前缓冲区。
  • ]l和[l遍历位置列表(参见第5章)。
  • ]q和[q遍历快速修复列表(参见第5章)。
  • ]t和[t遍历标签列表(参见第4章)u ~ [ ( X z d C ^

此插件还支持用少数几次按键来切换某些选项,比如yos切换拼写检查,或yoc切换光标行高亮显示。更多功能参见:help unimpaired中vim-unimpaired所提供的完整映射和功能清单x p F ! r R _ y F

3.3 窗口4 0 v w d n

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

1.窗口的创建、删除和跳转

本节将介绍Vim窗口的使用方式。首先,打开anima$ y ol_farm.py文件(在命令行中执行$ vim animal; : | ? s_f J [ N E U S e Zarm.py或从Vim中执行:e animal_farm.py)。

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

:split ani b  1 Y R 1mals/cat.py

:split命令可以简化为:sp。

可以看到* r 2 ] 0animk ? j = = C g Zals/cat.py被打开,显示在原文件上方的窗口中,而且光标也出现在里o d | h S &面,如图5所示。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图5

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

:vsplit farm.py

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

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图6

:vs是:vsplit的简化版。

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

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

按Ctrl + h组合键,之后再, u y 6按Ctrl + j组合键(Ctrl键可以不松开,记# C { m K 4 }为Ctrl + w,j组合键),光标会进入下面的窗口,而使用Ctrl + w,k% & T l r { y M组合键则进入上面的窗口。

如果经常使用窗口,读者可以按照如下配置绑定快捷键。\" 使用<T C G L l d 9 aCtrl>b : / W e x + hjkl快速在窗口间跳转 noremap <c-h> <c-s ; e , J ^ A T iw><c-h> noremap <c-j> <c-w><c-j> noremap <c-k> <c-S Y { N 4 y , Bw><c-k> noremap <c-l> <c-w><c-l>

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

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

  • 使用Ctrl + w,q组合键关闭当前窗口。
  • 使用:q命令关闭窗口并卸载缓冲区;不过,当只有一个窗口打开的时候,这会导= 8 f X B w Y j 8致退出Vim。
  • 使用:bdn { B q ~命令删除当前8 T Y缓冲区,并关闭当r p 7 { m J b前窗口。
  • 使用Ctrl + w,o组合键(或:only,或:on命令)关闭除当前窗口之外的所有窗q f 0 & 6 {口。

当打开了多个x _ P 0 b . ; 窗口时,可通过:qa命令关闭所有窗口并退出。也可以结合:w命令,即:wqaQ : h P c e,它会先保存所有打开的文件,再退出Vim。

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

\" 关闭缓冲区而不关闭窗口
command! Bd :bp | :sp | :bn | :bd

然后| ( p 2,读者就可以使用:Bd来关闭缓冲区,而保留分割窗5 $ a p口。

2T O +.窗口的移动

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

读者并不需要记住所有这些命令O 7 ~,只要知道Vim支持哪些窗口操作,剩下的操作可以通过查看文档。使用U a F o X ~ t:help window-moving和:help windt p z q | T N = oow- resize打开y q z q j G H 4 %Vim手册中相应的条目,即可找到所有3 M | q d , d相关的快捷键。

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

  • 使用Ctrl + w,H组合键将当前窗口移动到屏幕的最左边。
  • 使用Ctrl + w,J组合键将当前窗口移动A D & { L e ]到屏幕的底部。
  • 使用Ctrl + w,K组合键将当前窗口Z k N b d + O D h移动到屏幕的顶部。
  • 使用Ctrl + w,L组合键将当前窗口移动到屏幕的最右边。

比如图 7 所示的窗口布局(先打开animal_farm.py,然后再依次运行:sp animals/cat.py和:vs farO 9 D D 0 N w K Tm.py,可得到这个布局)。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图7

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

  • 使用Ctrl + w,H组合键将animals/cat.py移动到最左边,如图8(aG ; B)所示。
  • 使用Ctrl + w,J组合键将animals/cat.py移动到底部,而且左右分割变成了上下分割,如图8(b)所示。
  • 使用Ctrl + w,K组合键将animals/cat.py移动到顶部,如图8(c)所示。
  • 使用Ctrl + w,L组合键将animals/cat.py移动S L K = D / 3 F X到最右边,如图8(d)所示。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

(a)

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

(b)

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

(c)

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

(d)

图8

若想修改一个窗口的内容,则只需要跳转到这个窗口,然后用:b命令来选Z s d { K Q b择所需的缓冲区。不过,也有一些快捷键可以用于交换两个窗口的内容。

  • 使用Ctrl + w,r组合键将当前行或当前列(行优先于列)中的每个窗口的内容向右或向下移动。使用Ctrl + w0 = o } r m v,R组合键则以相反的方向执行类似的操作。
  • 使用Ctrl + w,x组合键将当前窗口与下一个窗口的内容交换(如果当前窗口是最后一个,则与前一个交T y y * ; k $ T换)。

Vim内部用数字来标识窗口。不过,与缓冲区不同,窗口的编号是随着布局变化而改变的,而且并没有直接的方法来修改窗口编号。有些窗口管理命令以窗口编号为参数,但本书不会涉及这部分内容。$ L } c Z ;有一条原a Z O b w R则仅供参考,窗口编号顺序为由上至下、由左至右递增。

3.改变窗口i ] K的大小

Vim窗口默认的宽高比+ h H D F M ; b为50/50,这可能并不满足读者的需求,因此窗口% # % J k的大小可以通过一些方法来改变。

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

:resize命令会增加或减少当前窗口的高度,而:vertical ren _ = vsize将调整窗口的宽度。读者还可F ( 3Q h ` ] I % 3 y使用如下命令。

  • :resize +N用于将当前窗口的高度增加N行。
  • :resize -N用于将当前窗口的高度减少N行。
  • :vertical resize +N用于将当前窗口的宽度增加N列。
  • :vertical resize -N用于将当前窗口的宽度减少N列。

:resize和:vertical rn g W c z H }esiX K e % G 9 s b 9ze可分别简写为:res和:vert re2 2 c k x q H ) ,s。另外,还有将窗口高度和宽度改变一行/列的快捷键:Ctrl + w,-和Ctrl + w,+用于调整高度,而Ctrl+w,>和Ctrl + w,<用于调整宽度。

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

  • :resize N用于将窗口高度设置为N。
  • :vertical resize N用于a G x将窗口宽度设置为N。

3.4 标签页

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

Vim用标签页来组织一个窗口的集合,进而支持在不同的窗口集合之间切换,这让用户方便地拥有了多个工作区。标签页通常用来在同一个Vim会话中区分不同的问题或者文件集合。标签页功能不一定是一个频繁使用的功能,但如果希望在不同项目或= r { 8同一项目的不同上下文之间切a C 3换,那么标签页h P e将是一个不错的选择。

用户愿意N g ! = v + O使用标签页的另一个原因可能与Vim的diff功能有关,因为diff作用于一个标签页内。更多详情请参考第5章中关于vimdiff的介绍。

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

:tabnew

在新标签页中打开一个已有文件的命令为:tabnew <文件名>。

如图9所示,标签页显s % }示在屏幕的顶部。在标记为3 farm.O i a P e K ?py的x n 4标签页中打开了三个窗口及一个活动缓冲区farm.py。[No Name]标签页则是刚才打开过的空缓冲区。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图9

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

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

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

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

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

3.5 折叠

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

如图10所示,animal_farm.py中的部分代码片断被折叠了,代码中每个方V 8 =法的具体内容被隐藏了,从而可以在整体上来Z ~ ) : $ ~ Y X 5查看代码。

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图10

1.折叠Python代码

因为本书以Python编程为例,所以这里只介绍Python示例代码的折J t 5 K A . b S叠方式。首先,需要在.vimrc文件中将foldmethod设置为indent,设置代码如下。

set foldmethod=in) ~ ] ! O & L K @dent

不要忘7 ? _ [ z ( C b记重新加载~/.vimrc,方法是重启Vim或在Vim中执% o 1 5 !行:source $MYVIMRC命令。

设置foldmeth* C 7 aod为indent,使Vim基于缩进来折叠代码。

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

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图11

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

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

图12

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

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

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

将foldmethod设置为自动类型(如indent)会默认将所有文件折叠。这只是一种偏好,读者也可能会选择在打开新文件时打开折叠。在.vimrc文件中添加autocmd BufRead * normal zR会在q R h T ] 4打开$ ` i ? B新文B e ( ] [ Y件时令折叠处于打开状态,即Vim在读取新的缓冲区时执6 [ 3行zR命令(打开所有折叠)。

2.折% z g A叠的类型

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

  • manuz 0 F t Kal:手动折叠,这种方法对于长文本而言并不适用。
  • indent:基于缩进的折叠,这对于依赖缩进的编程语言非常合适(不管哪种语言,标准的编码风格中总是会采用某种一致性的缩进。因此,当读者想要快速隐# ~ o p藏不关心的代码时,inden0 P f K $ 4 %t折叠方式不失为一V 6 U , g种高效率的选择)。9 f i R # m
  • expr:基于正则表达式的折叠。如果读者想要用复杂的规则来定义折叠,那么可以选择这种方式。
  • marker:使用文本中特殊9 ` 4 A } s t * @的标记来定义折叠,比如{{B [ a %{和}}}。这种方法对于管理很长的.vimrc文件非常有效,但是在Vim之外不常用,因为这种方式需要修改文件内容。
  • syntax提供了可识别语法的折叠,但它并非对所有语言都开箱即用(不支持Pythone Q F 7 ?)。
  • diff:当Vim处于diff模式时会自动采用这种折叠方式,diff模式下需要展示两个文件的不同之处,而相同之处往往需要隐藏起来(参见第5章s % q ~ R)。

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

4 文件树的浏览

软件项目往往包含大量的文件和目录,能够利用Vim快- 9 o { J S ] C速浏览和展示这些文件和目录将是一件很方便的事。本节介绍5种不同的文件5 a $ m浏览方式m D K ! ,它们分别是内置的Netrw文件管理器、启用了wildmenu的:e命令、NERDTree、Vinegar和CtrlP插件。这些方式都可用A Y K ;于处理文件,并可按需求组合使用w C K ( v M

本文截选自《Vim 8文本处理实战》

Vim 8文本处理实战:教您得心应手在日常任务中使用Vim

  • Vim8文本处理技术指南,vim实用技巧
  • 文本编辑器书0 = t l =
  • 程序员编程R 6 d - H h开发技能,python语言结合

作为全面介绍Vim使用方法的教程,本书介绍了各种常用的文本编辑方法和程序设计中的实用操作,深入VH i h 8 i I @ x vim内部的数据结构和VimScript脚本编程,内容详实。本书基于Vim 8平台,介绍了前沿分支Neovim,还推荐了更先进的Oni编辑器,兼容并包,集Vim社区典型使用经验和发展趋势于一体。

本书面向的读者群体是所有使用Vim的程M p j 3序员,书中的示例文本3 M 4 ` S为Python代码,并详细介绍了Git和正则表达式。读者需要/ 4 x G O Z `对操作系统和程序设计P O = 7 p $ k M有基本的了解,特别是需要了7 x x $ =解Linux操作系统的基本使用。虽然本书尝试兼顾三大操作系统,但毫无疑问书中内容以Linux为主。M c J本书可以帮助读者完善Vim技能X y p 5 @ { & Z Y,增加程序设计的知识储备。

上一篇

精选5部迪士尼改编真人童话电影,让你坠入童话梦!

下一篇

蜘蛛侠最狡猾的对手!离成功一步之遥,临死前反扑惹来大麻烦

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部