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

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

  • 介绍一种粗暴但快捷的Vim插件安装方式 。
  • 介绍如何使用缓冲区、窗口、标签页和折叠来处理多个文件或长文件 , 从而使工作区更为整洁 。
  • 介绍插件Netrw、NERDTree、Vinegar和CtrlP , 通过这些插件 , 读者可以在不退出Vim的情况下浏览复杂的文件树 。
  • 介绍文件中的高级文本浏览方式、极其高效的光标移动插件EasyMotion以及多种文本对象 , 介绍通过grep和ack实现跨文件的搜索 。
  • 介绍如何利用寄存器来复制和粘贴 。
1 技术要求本章将介绍如何用Vim在一个Python工程上作业 。 读者可以在异步社区中找到本章用到的代码 。
2 安装插件本章会介绍几个Vim插件 , 但暂时不会涉及较为复杂的插件管理 , 相关的内容参见第3章 。
首先 , 读者必须要做好准备工作 。
1.创建一个存储插件的目录 , 执行下列命令 。
$ mkdir -p ~/.vim/pack/plugins/start如果在Windows系统中使用gVim , 则需要在用户目录(通常是C:\Users\ <用户名>)下创建vimfiles目录 , 然后在其中创建子目录pack\ plugins\ start 。
2.使Vim能够自动加载每个插件的文档(Vim默认不会这么做) 。 在~/.vimrc文件(在Windows系统中为用户目录下的_vimrc文件)中添加下列代码 。
packloadall" 加载所有插件silent! helptags ALL" 为所有插件加载帮助文档然后 , 每次安装插件都可按照下列步骤进行 。
1.在 GitHub 上找到想要安装的插件 。 比如 , 读者想安装scrooloose/ nerdtree(注意 , 这里的scrooloose/nerdtree为该GitHub仓库的唯一标识 , 实际地址为) 。 假设读者已经安装了Git , 则可以找到此Git仓库的克隆地址 , 然后运行如下命令 。
$ git clone~/.vim/pack/plugins/start/nerdtree如果读者没有安装Git , 或者在Windows系统中使用gVim , 则可以在GitHub页面上找到克隆或下载(Clone or download)按钮 , 下载ZIP压缩包 , 然后将其解压到相应的插件目录中 , 比如在Linux系统中为目录~/.vim/pack/ plugins/start/nerdtree , 而在Windows系统中为用户目录下的子目录vimfiles/pack/plugins/start/nerdtree 。
2.重启Vim之后 , 即可使用插件进行相关操作 。
3 组织工作区到目前为止 , 本书还只是用Vim处理单个文件 。 但是在编写程序时 , 经常需要同时处理多个文件 , 涉及来回切换、跨文件编辑或到其他界面查询资料等操作 。 幸运的是 , Vim提供了一个能够处理多个文件的插件 。
  • Vim内部用缓冲区来表示文件;通过缓冲区 , 读者可以在不同文件之间快速切换 。
  • Vim用多个窗口在同一屏幕中显示多个文件 。
  • Vim用标签页对窗口进行分组 。
  • Vim用折叠效果来隐藏或展开一个文件的部分内容 , 从而让读者可以更容易地浏览文件的内容 。
图1中展示了上述要点 , 解释如下 。
Vim 8文本处理实战:教您得心应手在日常任务中使用Vim文章插图
图1
  • 多个窗口用于同时打开多个文件(farm.py、animal/cat.py和animal_farm.py) 。
  • 顶部显示有两个标签页(3 farm.py和a/dog.py) 。
  • 以+--开头的行表示折叠 , 它隐藏了文件的部分内容 。
本节将详细介绍窗口、标签页和折叠 , 通过这些功能 , 读者可以在工作中同时处理任意多个文件 。
3.1 缓冲区缓冲区是文件的内部表示 , 每个打开的文件都有一个缓冲区 。 比如 , 通过命令行vim animal_farm.py打开一个文件 , 然后可以用:ls命令看到现有的缓冲区列表 。
很多命令都有别名或等价命令 , :ls也不例外 , 它和:buffers及:files实现的是同样的功能 , 读者可以从中选择一个最容易记的命令 。
图2所示为ls命令的执行结果(最下面的那3行) 。
Vim 8文本处理实战:教您得心应手在日常任务中使用Vim文章插图
图2
图2.2中的状态栏显示了已经打开的缓冲区(这里只有一个)的相关信息 , 这些信息的含义如下 。