书名:Vim 8文本处理实战
ISBN:978-7-115-52705-9
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [美] 鲁斯兰•奥西波夫(Ruslan Osipov)
译 王文涛
责任编辑 陈聪聪
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright © Packt Publishing 2019. First published in the English language under the title Hands-on Text Processing with Vim 8.
All Rights Reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
作为全面介绍Vim使用方法的教程,本书介绍了各种常用的文本编辑方法和程序设计中的实用操作,深入Vim内部的数据结构和VimScript脚本编程,内容详实。本书基于Vim 8平台,介绍了前沿分支Neovim,还推荐了更先进的Oni编辑器,兼容并包,集Vim社区典型使用经验和发展趋势于一体。
本书面向的读者群体是所有使用Vim的程序员,书中的示例文本为Python代码,并详细介绍了Git和正则表达式。读者需要对操作系统和程序设计有基本的了解,特别是需要了解Linux操作系统的基本使用。虽然本书尝试兼顾三大操作系统,但毫无疑问书中内容以Linux为主。本书可以帮助读者完善Vim技能,增加程序设计的知识储备。
Ruslan Osipov是Google公司的软件工程师,也是一名旅游爱好者和业余博主。他自学成才,2012年开始发布个人的Vim笔记。从那时开始,Ruslan就越来越关注这款强大的编辑器,以及那些可优化工作流程的应用。
特别感谢Divya和Pooja,他们的辛苦努力使本书顺利地通过了评审。
Bram Moolenaar是Vim的创造者和维护人,他致力于这项事业已经超过27年了。在众多志愿者的帮助下(包括提供补丁程序和测试),Vim还在不断改进并推出新的版本。
Bram在学习电子学并发明了数字复印机部件之后,发现编写开源软件更有用且更有趣,于是他数十年如一日地投入到了开源事业中。目前,他在Google公司工作,Google正是少数完全拥抱开源软件的公司之一。在此期间,他还为乌干达的一个项目做了志愿工作,并通过ICCF基金会帮助那里的贫困儿童。
我要感谢所有的Vim开发者,他们帮助我将Vim发展至今。没有他们,就没有这么多功能得以实现,质量也将远不如现在。我还要感谢所有的Vim插件编写者,他们让Vim能够实现更复杂的功能。最后,我要感谢Ruslan写了这样一本书,书中不仅向用户介绍了Vim内置的功能,还推介了不少插件及其用法。
本书向读者介绍了 Vim 的奇妙世界,其中包含了许多Python代码示例和一些面向工程的工具。本书强烈建议读者将Vim作为主要集成开发环境(IDE),以便将本书中的经验推广应用到任意编程语言。
本书适用于初级、中级和高级程序员。本书将介绍如何高效地将Vim应用于日常工作流程的方方面面。虽然书中涉及了Python,但Python或Vim的经验并不是阅读本书所必需的。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息并单击“提交”按钮即可,如下图所示。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发送邮件给我们,并请在邮件标题中注明书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网络上发现针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的行动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
本书将向读者介绍如何更好地使用Vim和Vim插件,以及一些与Vim理念一脉相承的工具。
每个工具背后都有它的独特理念,Vim也不例外。Vim引入了一种不同的文本处理方式,这种方式是现如今大部分人并不熟悉的。
本章的内容是为使用Vim作铺垫,重点介绍这种理念的与众不同之处,并向读者推荐一些良好的编辑习惯,帮助读者体验一个操作更友好的Vim,并确保读者能够在工作中找到适合自己的工具。为了让示例更加具体,本章会使用Vim来创建一个短小的Python程序。
本章会涉及如下主题。
.vimrc
。hjkl
键、逐个单词移动、逐段落移动等。本章示例是一些基本的Python程序,读者没必要专门去下载与本章相关的任何代码,因为这些代码都可以从头开始编写。如果读者没有跟上节奏而需要更多指引,可以在异步社区中找到示例代码。
本书用Vim编写Python代码,并且假定读者对该语言比较熟悉,版本为Python 3。
如果读者习惯Python 2的语法,则只需要修改
print()
命令,就可以将Python 3示例转换为Python 2了。比如,将所有的print('Woof!')
换成print 'Woof!'
,代码就可以作为Python 2版本正常运行了。
本章还会介绍如何创建和修改Vim配置文件,即.vimrc
文件。最终的.vimrc
文件可以在异步社区中找到。
如果读者曾经编辑过文本,很可能已经非常熟悉无模式(modeless)界面了,因为这是现代主流文本编辑器的默认选项,大多数人也是通过它来学习文本处理的。“无模式”指的是每个界面元素都只有一个功能,每个按钮都对应于屏幕上的一个字母或某种其他操作,每个按键(或组合键)总是做同样的事:此应用程序总是以单一模式来执行操作。
但这并不是文本处理的唯一方式。那么现在,欢迎来到模式界面的世界。在这里,根据上下文的不同,每个行为可能对应于不同的操作。现在常见的模式界面应用设备为智能手机,每当打开一个不同的应用或菜单时,在屏幕上单击一下就会执行不同的功能。
对于文本编辑器,情况类似。Vim就是一款模式编辑器,即在不同的上下文,单击一个按钮会产生不同的行为结果。当Vim处于插入模式(用于文本输入的模式)时,单击o
键会在屏幕上得到o
。但当切换到不同的模式时,按o
键的行为会发生变化,比如在光标下面添加新行。
使用Vim就像是与编辑器进行对话。通过命令d3w
[刚好是删除(delete)3个单词(word)的英文缩写]可以删除后面3个词;通过命令ci"
[改变(change)引号里面(inside)的英文缩写]则可以改变引号里面的文本。
编辑速度快并不是Vim的卖点。Vim让用户置身于文本处理的流程中,不需要因为找鼠标而打乱节奏;也不需要按17次方向键到达页面中的某个位置;更不需要在复制粘贴时通过鼠标操作来小心翼翼地选择文本。
当使用无模式编辑器时,工作流程总是会被打断。而对于模式编辑器,特别是Vim,文本处理就像是与编辑器进行了一次亲密交谈,而且是用一种一致的语言与编辑器进行交流,比如删除3个单词(命令为d3w
)、改变引号内文本(命令为ci"
)。通过Vim,文本编辑变成一种更从容的操作。
Vim可在各种操作系统中安装,而且在Linux和macOS中是自带的(不过,读者可能需要将其升级到更新的版本)。在接下来的章节中,请读者确认自己的操作系统,并根据指令设置好Vim。
如果读者在安装Vim时遇到问题,原因可能是系统中缺少一些依赖库。如果读者使用的是基于Debian的Linux发行版,下列命令可以用于安装常用的缺失依赖库。
Linux操作系统自带Vim,但是其版本可能比较旧了,而本书使用的Vim 8引入了一些急需的优化。首先,读者需要进入命令行界面,然后执行如下命令。
$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ make
$ sudo make install
$ sudo apt-get install make build-essential libncurses5-dev
libncursesw5-dev --fix-missing
注意,这里的$
仅仅用来标识这是一个Shell命令,并不属于命令行的一部分。按照上述方法,可以成功将Vim更新到最新版本。当然,如果读者不在乎是否最新,仍然可以使用系统的包管理器来更新Vim。不同的Linux发行版本使用不同的包管理器,如表1.1所示。
表1.1
发 行 版 |
安装最新Vim的命令 |
---|---|
基于Debian(Debian、Ubuntu、Mint) |
|
|
|
CentOS(以及Fedora 22之前的版本) |
|
|
|
Fedora 22+ |
|
|
|
Arch |
|
|
|
FreeBSD |
|
|
|
在表1.1中可以发现,Vim在不同的软件库中使用不同的名称。基于Debian的发行版中的
vim-gtk
,或CentOS上的vim-enhanced
提供了更多的功能(如图形用户界面支持)。
有一点需要注意的是,包管理器软件仓库中的Vim版本一般会有所滞后,少则几个月,多则几年。
现在已经准备好进入Vim世界了!可以通过如下命令打开一个Vim编辑器。
$ vim
在现代的操作系统上,读者可以通过命令vi
打开Vim,但这不是绝对的。在旧版本的系统上,两者是不同的程序。Vim是Vi的继承者(Vim是Vi improved的缩写),只不过,现如今Vi仅仅是指向Vim的一个别名。而且,我们没有理由使用Vi而不使用Vim,除非由于某种原因无法安装Vim。
macOS系统中已经安装好了Vim,但是版本较旧。安装更新版本的Vim有很多种方法,这里介绍两种。第一种方法是使用Homebrew安装,这是macOS上的一种包管理器。不过,读者需要首先安装Homebrew。第二种方法是下载MacVim的.dmg
安装包,对于习惯了图形界面的Mac用户而言,这种安装体验会更熟悉一些。
因为本书使用命令行进行交互,所以推荐使用Homebrew安装Vim。但是如果读者对命令行实在不感兴趣,则可以使用.dmg
安装包完成Vim的安装。
Homebrew是macOS上的一种第三方包管理器,它可以使用户方便地安装或更新到最新的软件。关于如何安装Homebrew,读者可以在Homebrew官网中找到相关指令。编写本书的时候,Homebrew的安装命令已经简化为一条命令行。
$ /usr/bin/ruby -e "$(curl –fsSL
https://raw.githubusercontent.com/Homebrew/install/master/install)"
图1.1为该命令执行Homebrew安装过程所需要经历的一系列操作。执行操作后按Enter
键。
图1.1
如果读者没有安装XCode(XCode通常是在macOS上进行与开发相关的行为的必备条件),则会得到一个XCode的安装提示框。这里不会直接使用XCode,因而按照默认设置安装好就可以了。
这个过程可能会有点长,但如果一切顺利,最终会安装好Homebrew。Homebrew是一个神奇的工具,它的功能不仅仅是安装Vim!安装完成时,会看到粗体字显示的安装成功!提示。
用下面的命令安装新版本的Vim。
$ brew install vim
Homebrew会安装好所有必要的依赖项,正常情况下,读者会看到如图1.2所示的结果。
图1.2
如果读者已经安装了Homebrew,而且曾经安装过Vim,则前面的命令将会产生一个错误。如果读者只是想更新到最新版本的Vim,这时应该执行下列命令。
$ brew upgrade vim
现在,已经准备好使用Vim了,那么用下面的命令开启Vim之旅吧。
$ vim
图1.3所示为Vim的启动界面。
图1.3
首先,下载MacVim.dmg
。然后双击打开MacVim.dmg
,再将Vim图标拖曳到Applications
目录中,如图1.4所示。
图1.4
由于Mac的安全设置,因此当读者进入Applications
目录并尝试打开MacVim
应用时,系统可能会弹出图1.5中的错误提示。
图1.5
为解决这个问题,可以打开Applications
目录,找到MacVim
,右键单击图标,选择Open选项,系统会弹出如图1.6所示的对话框。
图1.6
单击Open按钮,MacVim
会正常启动,而且以后都不会再弹出这样的对话框。图1.7所示为Vim的启动界面。
图1.7
在Windows操作系统下有两种安装Vim的方式:第一种是在Cygwin中安装命令行版本的Vim,并在命令行中使用Vim;第二种是安装Vim的图形界面版本gVim(它也有在cmd.exe
上运行的终端版本)。建议读者尝试两种安装方式并从中选择喜欢的一种:gVim更像Windows系统中的其他应用程序(也更容易安装),而Cygwin可能对于习惯了UNIX Shell命令行的人来说更亲切一些。
Cygwin是Windows的类UNIX环境,它提供了一种命令行界面,致力于将强大的UNIX Shell命令行以及相关的支撑工具带到Windows操作系统中。
(1)安装Cygwin
在开始安装之前,需要先浏览Cygwin官网 ,然后下载setup-x86_64.exe
或setup-x86.exe
,它们分别对应于64位和32位的版本。
如果不确定操作系统是32位还是64位,可以打开“控制面板->系统和安全->系统”,找到“系统类型”。比如,很多64位的Windows机器上会显示系统类型:64位操作系统,基于x64的处理器。
双击下载的可执行文件,会弹出如图1.8所示的Cygwin安装窗口。
图1.8
在接下来的安装工程中,单击Next按钮数次,即以此选择如下默认设置。
C:\cygwin 64
(或其他推荐的默认设置)。C:\Downloads
(或其他推荐默认设置)。http://cygwin.mirror.constant.com
(或任意其他可用选项)。在完成这些步骤之后,会看到选择软件包的界面。这里,本书将选择vim
、gvim
和vim-doc
软件包。较容易的方法是在搜索框中输入vim
,展开All|Editors类别,然后单击相应的软件包旁边的图标,如图1.9所示。
图1.9
图1.9显示Vim版本为8.0.1567-1。编写本书时,也就是2018年11月,这是Cygwin中唯一可用的版本。与8.1版本相比,8.0版本主要缺少了:terminal
命令(见第5章)。
读者可能还需要安装Net类别中的
curl
,以及Devel类别中的git
,因为在第3章中会用到这两个工具。另外,安装Utils类别中的dos2unix
也大有好处,此工具可将文本中Windows样式的换行符转换成Linux样式的换行符(使用Vim通常会遇到这个问题)。
然后,单击两次Next按钮,正式开始这些软件包的安装过程。安装过程会持续一段时间。
有时候,安装过程中会产生一些post-install脚本错误,大部分情况下可以安全地忽略(除非其中包含Vim相关的错误—— 这时可能就需要参考Google的意见:搜索错误消息中的文本,然后尝试找到解决方案)。
再接着单击Next按钮数次,即默认选择如下选项。
现在已经成功安装了Cygwin和Cygwin中的Vim。
如果读者还需要在Cygwin中安装其他软件包,则只需要再次打开安装包可执行文件,然后选择需要的软件包。
(2)使用Cygwin
Cygwin的应用程序可能叫作Cygwin64 Terminal或Cygwin Termianl,这取决于操作系统的类型。找到其图标,如图1.10所示。
图1.10
打开它,可以看到如图1.11所示的命令行提示界面,Linux用户应该相当熟悉了。
图1.11
Cygwin支持本书中用到的所有UNIX样式的Shell命令行。如果部分命令行需要修改才能用于Cygwin,本书也会特别说明。但是目前,只需要简单地打开Vim使用即可,直到第2章都不会有任何问题。在命令行提示符中输入vim
,按Enter
键启动Vim,界面如图1.12所示。
图1.12
Cygwin是在Windows环境下体验Linux系统Shell命令的一种方式,这意味着,一旦在阅读本书时选择使用Cygwin,就需要遵循Linux系统中的指令和约定。同时,还需要注意Windows样式的换行符和Linux样式的换行符,因为Windows和Linux处理换行的方式不同。如果在Vim中遇到^M
字符无法识别,则对相应的文件执行dos2unix
命令就可以解决。
通过对比命令行Vim和gVim,本节将详细介绍Vim的图形化版本gVim。
与Windows系统中其他程序的安装过程相比,gVim的安装过程要更图形化一些。在浏览器中打开Vim
网站,下载一个可执行的安装包。编写本书时(2018年11月),这个二进制文件名为gvim81.exe
,其中的81
代表版本8.1。打开这个可执行文件,会弹出如图1.13所示的提示框。
图1.13
单击Yes按钮,然后单击I Agree按钮,直到出现Installation Options界面。大部分默认设置是满足本书需求的,如果需要在命令行中使用Vim,可以通过启用Create .bat files for command line use选项来实现。这个选项让读者可以在Windows命令提示符中使用vim
。本书中的一些例子需要用到命令提示符,因此启用这个选项对于接下来的阅读是有帮助的。
图1.14所示为Installation Options界面的截屏,注意,图中已经启用了所有选项。
图1.14
单击Next按钮,设置如下选项。
Typical
),(启用Create .bat files for command line use选项之后,安装类型会自动变成Custom
)。C:\Program Files (x86)\Vim
(或其他推荐的默认值)。完成这些选项的设置之后,单击Install按钮,然后单击Close按钮,如图1.15所示。
图1.15
安装结束时系统会询问是否查看README文件,单击No按钮即可(谁会现在就看手册呢?),如图1.16所示。
图1.16
安装完成后,桌面上会出现一些新的图标,如图1.17所示。
图1.17
双击此图标,Vim就打开了!
不管在哪个平台上安装Vim,最好先确认一下Vim的相关功能是否都已经启用。在命令行中,执行如下命令。
$ vim --version
可以看到如图1.18所示的输出结果,它列出了一系列功能,每项功能前面都有加号(+
)或减号(-
)。
图1.18
这里,加号(+
)表示功能启用,减号(-
)表示功能未启用。图1.18中的Vim支持Python 2(+python
),而不支持Python 3(-python3
)。要想解决这个问题,可以重新编译Vim并启用+python3
,或者寻找一个支持Python 3的Vim发布版本。
Vim可以支持的所有功能列表参见
:help feature-list
。
在Linux系统中重新编译一个支持Python 3的Vim 8.1,可以执行如下命令。
$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ ./configure --with-features=huge --enable-python3interp
$ make
$ sudo make install
传入
--with-features=huge
编译选项,是为了启用Vim的大部分功能。不过,--with-features=huge
并不涉及语言的绑定,因此需要显式地启用Python 3。
一般而言,如果读者感觉自己的Vim不像其他Vim那样运行(包括本书中描述的行为),那么有可能是因为缺失了某个Vim功能。这和读者的计算机操作系统以及特定的功能有关,因而安装过程可能或多或少会有不同。通过在网上搜索Install Vim <version> with +<feature> on <operating system>可能会有所帮助。
通过前面介绍的指令,读者应该已经安装了两种Vim——命令行 Vim 和 gVim。Windows系统下的gVim如图1.19所示。
图1.19
gVim实际上是为Vim绑定了一个图形用户界面(GUI),它具有更好的鼠标支持,还有更多上下文菜单。与终端模拟器相比,它还支持更多的配色,并具备一些现代图形用户界面应有的优质功能。在Windows系统中,读者可以通过打开桌面图标gVim 8.1
来启动gVim,而在Linux和macOS系统中,可通过如下命令行启动。
$ gvim
Windows用户可能会更青睐于gVim。不过,由于本书更关注于文本编辑技巧中的效率方面,因此会避免涉及gVim菜单,虽然它们也很直观,但会影响用户专注于自己的工作流程。本书会更关注Vim的非图形界面版本,但这些内容同样适用于gVim。这两个版本的Vim共享配置文件,相互之间切换使用完全没有问题。
总体来说,gVim对新手更友好一些。
.vimrc
文件来配置VimVim从一个名为.vimrc
的文件中读取配置信息。Vim安装好后就可以使用,但是有些选项会使程序编码更容易。
在类UNIX系统中,以句点.开头的文件为隐藏文件。为了看到这些文件,可以运行
ls -a
命令行。
在Linux和macOS系统中,.vimrc
位于用户根目录中(完整路径为/home/<用户名>/.vimrc
)。读者也可以打开一个命令行终端,并通过如下命令进入终端。
$ echo $HOME
Windows系统不允许文件名中出现句点,因此配置文件的名称为_vimrc
,其路径通常为C:\Users\<用户名>_vimrc
。读者也可以通过命令提示符中的如下命令找到其所在的目录。
$ echo %USERPROFILE%
如果遇到了问题,可以打开Vim,输入
:echo $MYVIMRC
,然后按Enter
键。Vim会显示它正在使用的.vimrc
的路径。
找到操作系统存储Vim配置文件的目录,然后将准备好的配置文件放入其中。读者也可以从本书的官方GitHub仓库中找到本章涉及的.vimrc
。下列代码为本章中使用的.vimrc
文件的内容。
syntax on " 支持语法高亮显示
filetype plugin indent on " 启用根据文件类型自动缩进
set autoindent " 开始新行时处理缩进
set expandtab " 将制表符Tab展开为空格,这对于Python尤其有用
set tabstop=4 " 要计算的空格数
set shiftwidth=4 " 用于自动缩进的空格数
set backspace=2 " 在多数终端上修正退格键Backspace的行为
colorscheme murphy " 修改配色
上面的代码中,双引号开头的内容为注释,会被Vim忽略。这些设置还是比较合理的,比如语法高亮和一致的缩进。它同时还解决了不同环境中退格键可能出现不同行为的问题。
当编写Vim配置文件时,可以先尝试相应的设置,然后再写到
.vimrc
文件中去。操作过程为先输入冒号,然后输入相应的命令,再按Enter
键即可。比如:set autoindent
(按Enter
键执行)。如果想知道某种设置当前的值,可以在命令后面加上问号,比如执行:set tabstop?
命令会显示出当前的tabstop
的值。
此例中还修改了配色,让屏幕显示效果更好一些,但这并不是必需的。
Vim 8自带如下主题配色。
blue、darkblue、default、delek、desert、elflord、evening、industry、koehler、morning、murhpy、pablo、peachpuff、ron、shine、slate、torte、zellner。
读者可以尝试其中一种配色主题,方法是输入:colorscheme<name>
,然后按Enter
键;也可以在所有可用的配色主题之间循环切换,方法是输入:colorscheme
,然后输入一个空格,并多次按Tab键。第7章中有更多关于Vim的配置和配色的介绍,届时读者可以拥有完全属于自己的Vim。
图 1.20 所示为一位Vim用户在Twitter上发布的帖子:我已经使用Vim两年了,主要原因是我不知道怎么退出来。
图1.20
现在,本书将介绍如何在不使用鼠标或菜单的情况下与Vim进行交互。编程本身是一种要求精力高度集中的任务,没有人会愿意一直单击菜单,让双手一直保持在键盘中心位置也有助于避免在鼠标和键盘之间频繁切换。
首先,请读者打开自己最喜欢的命令行终端(Linux和macOS系统中是终端,Windows系统中为Cygwin),跟随下面的步骤来编写一个非常基础的Python程序。
先从一个简单的开平方根计算器开始,运行如下命令。
$ vim animal_farm.py
如果读者使用gVim,那么可以在File菜单中单击Open选项,然后打开一个文件。有时候,读者可能确实需要一个图形界面。
这会打开一个名为animal_farm.py
的文件。如果此文件存在,则读者会看到它的内容;如果文件不存在,则得到一个空白界面,如图1.21所示。
图1.21
在图1.21中,Vim的底部状态中显示了文件名,旁边还有[New File]
字样,表示这是一个新文件。现在读者已经用Vim打开了第一个文件。
Vim的状态栏通常会包含很多有用的信息,它是Vim与用户交流的主要途径,因此需要保持对状态栏中的消息的关注。
如果之前已经打开过Vim,则可以用如下命令加载一个文件(别忘了命令后面要按Enter
键)。
:e animal_farm.py
这有可能是读者在Vim中运行的第一条命令。输入冒号字符:
表示进入命令行模式,在此模式下输入的文字会被Vim解析为命令。按Enter
键可以结束命令,通过Vim命令可以执行很多复杂的操作,包括访问系统的命令行。命令:e
表示编辑(edit)。
Vim的帮助文档中通常将
Enter
键记为回车(carriage return)的意思。
默认情况下,Vim处于正常模式(normal mode),即每个键都对应于某个命令。输入命令i
将使Vim进入插入模式(insert mode)。它会在底部的状态栏中显示-- INSERT --字样(如果读者使用的是gVim,则光标由块状变为竖线状),如图1.22所示。
图1.22
插入模式下的行为和在其他无模式编辑器中相似。正常情况下,除添加新文本之外,本书不会花太多篇幅介绍插入模式。
本书中已经涉及了3种Vim模式:命令行模式、正常模式和插入模式。本书还会介绍很多模式,详情参见第3章。
现在输入如图1.23所示的代码,这就是之前提到的Python程序。本章将反复使用这几行代码。
图1.23
按下Esc键可以返回到Vim的正常模式。这时,状态栏上的-- INSERT --
字样消失,可以继续在Vim中输入命令。
上述代码并不是Python编程的最佳实践,这里只是用它来展示Vim的一些功能。
保存文件可执行:w
命令。
注意,在输入命令后按下
Enter
键。
:w
表示写(write)的意思。
:w
命令后面也可以接一个文件名,并另存为新文件。修改后的内容会保存到这个新文件中,当前文件也变成了这个新文件。尝试执行命令:w animal_farm2.py
。
退出Vim,并检查一下文件是否已经生成。命令:q
表示退出(quit)的意思。也可以将写和退出这两个命令组合为:wq
,表示先保存后退出。
如果修改了文件,但是不想保存而直接退出Vim,可以用命令:q!
强制退出Vim。命令后面的感叹号表示强制执行。
Vim的许多命令都有长短两个版本。比如
:e
、:w
和:q
分别是:edit
、:write
和:quit
的短版本。在Vim手册中,命令的可选部分通常置于一对中括号中,比如:w[rite]
和:e[dit]
。
退出Vim之后又回到了系统的命令行,可以检查一下当前目录中的内容是否发生了变化,如下列命令所示。
$ ls
$ python3 animal_farm.py
$ python3 animal_farm.py cat dog sheep
在UNIX中,ls表示列出当前目录的内容。
python3 animal_farm.py
表示用Python 3解释器来执行这个脚本。python3 animal_farm.py cat dog sheep
表示执行此脚本,并传入(cat, dog, sheep
)这3个参数。
图1.24中显示了这3条命令的输出结果。
图1.24
默认情况下,Vim用交换文件跟踪文件的变化情况。当用户编辑文件的时候,Vim会自动产生交换文件。交换文件的作用是恢复文件内容,以防止用户的Vim、SSH会话或系统崩溃。一旦出现上述问题,或者由于其他失误意外地退出Vim,再次用Vim打开同一个文件时,就会看到如图1.25所示的画面。
图1.25
这时,可以输入r
从交换文件中恢复文件,或者输入d
直接忽略交换文件。如果读者决定从交换文件中恢复,为了避免下次打开此文件时再次出现这个提示,可以输入d
删除交换文件。
默认情况下,Vim会在原始文件所在的目录下生成类似于<filename>.swp
或.<filename>.swp
的文件。为避免这些交换文件污染文件系统,可以修改这个默认行为,使Vim将所有交换文件都统一存放在同一个目录中。要实现这个设置,可以在.vimrc
文件中加入如下内容。
set directory=$HOME/.vim/swap//
如果使用Windows系统,设置命令为
set directory= %USERDATA%.vim\swap//
(注意最后两个斜线的方向)。
或者,也可以选择完全禁止交换文件,在.vimrc
中加入set noswapfile
即可。
Vim中的光标移动方式比大部分传统编辑器都要更便捷高效一些。本节只介绍基本的操作。
在Vim中可以用方向键或字母h、j、k、l
来逐个字符地移动光标,这是效率最低,但也是最精确的移动方式,如表1.2所示。
表1.2
按 键 |
替 代 键 |
行 为 |
---|---|---|
|
向左箭头键 |
向左移动光标 |
|
向下箭头键 |
向下移动光标 |
|
向上箭头键 |
向上移动光标 |
|
向右箭头键 |
向右移动光标 |
这几个字母不是随意选的,从图1.26中可以发现它们在方位上的对应关系。
图1.26
Vi(Vim的前身)是从ADM-3A终端机上创造出来的,如图1.27所示,这台机器并没有方向键,因而h、j、k、l
被选择用来表示方向。
图1.27
图1.27中由Chris Jacobs提供,来自于维基百科(CC BY-SA 3.0)。
习惯用hjkl
来移动光标有很多好处:双手就可以集中于键盘中央,从而使用户更专注于工作流程。此外,许多应用也将hjkl
用作方向键,也许数目多到让人惊讶。
现在,读者可能已经倾向于多次敲击这些方向键到达目标位置了,但是还有更好的方式。在每一个命令之前可以加一个数字,表示重复这条命令的次数。比如,敲击5j
会让光标下移5次,而14l
会让光标右移14个字符。这条规则适用于本书提到的大多数命令。
但是,精确计算到底要移动多少次往往是比较麻烦的(没人会愿意这么做),因此,还有一种方式是逐个词语移动光标。可以用w
移动到下一个单词开头,用e
移动到最近的单词的结尾。如果想反向移动到单词的开头,可以按b
键。
在Vim中还可以使用这些命令的大写版本,表示将除空格外的所有字符视为单词的一部分!这两套命令可让读者以两种不同的方式浏览文本。
Vim中有两种单词对象:狭义单词(word)和广义单词(WORD)。在Vim的世界里,狭义单词指的是由空白字符(比如空格、制表符或换行符)分隔的字母、数字和下划线组成的序列,广义单词则是由空格分隔的任何非空字符组成的序列。
比如前面的示例中的某一行代码,如图1.28所示。
图1.28
注意光标位置,它覆盖了
add_animal
的首字符。
输入w
,光标会停在add_animal
的首字符上,而W
则会跳到animal
的首字符上。大写的W
、E
和B
将以空格分隔的非空字符序列视为单词,如表1.3所示。
表1.3
按 键 |
行 为 |
---|---|
|
逐个狭义单词移动 |
|
向前移动直到最近狭义单词的结尾 |
|
逐个广义单词移动 |
|
向前移动直到最近广义单词的结尾 |
|
向后移动到狭义单词开头 |
|
向后移动到广义单词开头 |
表1.4则为每个命令的具体表现。
表1.4
按键 |
初始光标位置 |
光标最终位置 |
---|---|---|
|
||
|
||
|
||
|
||
|
||
|
将这些命令与之前的方向命令结合起来,可以用更少的输入实现更快的移动。
另外,按照段落移动也是很有用的。任意两个空行之间的文字被视为段落,这也意味着每个代码块可视为一个段落,如图1.29中所示。
图1.29
函数add_animal
和main
为两个不同的段落。在段落间向前移动的命令是结束大括号}
,向后移动的命令是开始大括号{
,如表1.5所示。
表1.5
命 令 |
行 为 |
---|---|
|
向后移动一个段落 |
|
向前移动一个段落 |
在这些命令前面也可以加数字,这样,即使需要跳过多个段落,也可以一步到位。
移动光标还有其他方式,上述只是一些重要的基础知识。第2章中会介绍更复杂的浏览方式。
使用Vim的时候,通常希望在插入模式下花费尽可能少的时间(除非只负责写而不编辑)。因为大部分文本操作涉及编辑,所以本节将关注于这一部分。
前面已经提到过,进入插入模式的命令为i
。除此之外,还有其他方式可以进入插入模式。很多时候,需要对一部分文字进行替换,实现这个功能的方式是修改命令c
。通过修改命令读者可以在删除一部分文字后立刻进入插入模式。修改命令是一个复合命令,即它后面必须指定其他命令,用于告诉Vim修改哪一部分。读者可以将修改命令与前面介绍过的任何移动命令组合起来使用,可参考表1.6中的示例。
表1.6
命 令 |
执 行 前 |
执 行 后 |
---|---|---|
|
||
|
||
|
||
|
||
|
其中有一个奇怪的例外,
cw
和ce
的行为类似,这是Vim的前身Vi的历史遗留问题。
在掌握了更复杂的移动命令之后,也可以将它们与修改命令组合起来,实现快速的无缝编辑。本书后续还会介绍一些Vim插件,它们会重新实现修改命令,从而支持更强大的编辑功能,比如修改括号里的文字或直接替换引号类型。
所有这些例子都遵循
<命令> <数字> <移动或一个文本对象>
这样的语法结构,可以将数字放在命令之前或之后。
若想将farm = add_animal(farm, animal)
修改为farm = add_animal (farm, creature)
,可以依次执行表1.7中列出的命令。
表1.7
代 码 行 |
行 为 |
---|---|
将光标置于行首 |
|
按 |
|
按 |
|
输入 |
|
按Esc键回到正常模式 |
不过,有时候用户可能只想删除文字,而不想插入任何东西,命令d
可以实现这个功能。它表示删除(delete)的意思,其行为类似于c
,只不过这时候的w
和e
的行为会标准得多,如表1.8所示。
表1.8
命 令 |
执 行 之 前 |
执 行 之 后 |
---|---|---|
|
||
|
||
|
||
|
||
|
还有两个更好的快捷命令用于修改或删除一整行,如表1.9所示。
表1.9
命令 |
行 为 |
---|---|
|
清除整行,然后进入插入模式。保持当前的缩进水平,这在编程时很有用 |
|
删除整行 |
比如,对于图1.30中的代码片断,通过dd
命令,可以移除整行,并得到图1.31中的结果。
图1.30
图1.31
但如果使用cc
命令删除该行,则会保留原来的缩进并进入插入模式,如图1.32所示。
图1.32
如果读者在选择正确的光标移动命令时存在困难,也可以用可视(visual)模式来选择待修改的文本。按
v
键可进入可视模式,然后通过常用的光标移动命令调整选择的文本。一旦选择完毕,就可以运行相应的命令(如用c
键来修改或用d
键来删除)。
和任何其他编辑器一样,Vim也记录了每一步操作。按u
键可以撤销最后一次操作,而Ctrl + r
组合键则可以重做此操作。
欲了解关于Vim撤销树的更多内容(Vim的撤销历史记录不是线性的!),以及如何浏览这些历史记录,请参考第4章。
Vim还支持在不同会话之间持久保存撤销历史,从而允许撤销几天前的操作。
可以通过在.vimrc
中进行如下设置来启用持久性撤销。
set undofile
不过,这会在系统中为每个被编辑过的文件保留一个撤销历史记录文件,显得有些混乱。也可以将这些文件保存在同一个目录中,配置如下所示。
" 为所有文件设置持久性撤销
set undofile
if !isdirectory("$HOME/.vim/undodir")
call mkdir("$HOME/.vim/undodir", "p")
endif
set undodir="$HOME/.vim/undodir"
对于Windows操作系统,将上述设置中的目录换成
%USERPROFILE%_vim
。需要注意,Windows下的配置文件是_vimrc
,而不是.vimrc
。
:help
阅读Vim手册Vim提供了一个学习工具:help
命令,其界面如图1.33所示。
图1.33
Vim手册中附带了大量的资源和教程。通过翻页键(PageUp和PageDown)可以浏览手册的内容(注意,Ctrl + b
组合键和Ctrl + f
组合键也能起到翻页的效果),信息极其丰富。
如果读者使用Vim时遇到问题,或者希望深入了解某个命令,可尝试使用:help
(其缩略版为:h
)来搜索这个命令。比如,读者可以搜索一下cc
。
:h cc
图1.34中的帮助信息显示了这条命令的运行方式,以及不同选项和设置是如何影响它的(如autoindent设置可保持缩进)。
图1.34
:help
命令可用于浏览所有这些帮助文件。在阅读帮助文件时会发现,某些词是高亮显示的。它们是标签,即可用于:help
命令的关键字。不过,不是每个标签名都很直观。如果想知道如何在Vim中搜索一个字符串,用户可能会尝试使用如下命令。
:h search
然而,输入这条命令后进入了表达式评估(expression evaluation)的页面,这并不是读者想要的,如图1.35所示。
图1.35
为找到正确的词条,输入:h search
(先不要按Enter
键),然后按Ctrl + D
组合键。这时会得到一个包含字符search
的标签列表。其中一项为search-commands
,这正是读者需要的。接下来继续补充命令行。
:h search-commands
得到如图1.36所示的帮助页面,这正是预期的结果。
图1.36
关于搜索功能,读者可以在帮助页面(或在Vim中打开的任何文件)中输入“
/关键字
”进行正向搜索,或输入“?关键字
”进行反向搜索。欲了解更多关于搜索操作的内容,请参考第2章。
任何时候都不要忘记使用Vim的帮助系统,特别是有疑问或希望更好地理解Vim的行为时。
原来的Vi版本是针对远程终端开发出来的,那时的带宽和网速都有限。但正是这些限制使Vi的文本编辑流程变得高效而专业,从而演变为如今的Vim(改进版Vi,Vi Improved)的核心。
本章介绍了如何在主流平台上安装和更新Vim,以及它的图形界面版本gVim(介绍了太多方法,有些可能根本就不需要)。
然后介绍了如何通过修改.vimrc
文件来配置Vim,这个过程在今后可能会反复进行,因为读者需要根据自己的需求定制这个编辑器。
另外,还介绍了处理文件、在Vim中移动光标和修改内容等基本操作。Vim中的文本对象的概念(字母、单词和段落)和复合命令(如d2w
会删除两个单词)可以帮助读者做出精确的文本操作。
如果读者能从本章中学会一件事,那一定是:help
。Vim内置的帮助系统极其详细,它几乎可以回答所有关于Vim的问题。
第2章会进一步深入Vim,介绍如何浏览多个文件,届时读者应该能够更好地编辑文本。