本章将为使用 Vim 建立一个坚实的基础。每种工具的构建都基于特定的使用理念,Vim 也不例外。与大多数人如今习惯的文本编辑方式相比,Vim 引入了一种截然不同的工作方式。本章重点介绍这些差异,并帮助你建立一套健康的编辑习惯。这将使你能够以适合 Vim 的思维方式来使用它,并确保你为任务选择了合适的工具。为了让例子更加具体,我们将在本章中使用 Vim 来创建一个小型的 Python 应用程序。
本章将涵盖以下主题:
- 不同 Vim 版本之间的差异
- 模态与无模态接口的区别,以及 Vim 与其他编辑器为何不同
- 安装和更新 Vim
- gVim——Vim 的图形用户界面
- 配置 Vim 以便使用 Python 进行工作,以及编辑你的配置文件
- 常见的文件操作——打开、修改、保存和关闭文件
- 移动方式——使用方向键和光标移动键、按单词、段落等方式导航
- 对文件进行简单编辑,并将编辑命令与移动命令结合使用
- 持久化撤销历史
- 浏览 Vim 内置手册
技术要求
在本章中,我们将编写一个基础的 Python 应用程序。你不需要下载任何代码即可跟随本章内容,因为我们将从零开始创建文件。不过,如果你感到迷惑并需要更多指导,可以在 GitHub 上查看最终的代码结果: github.com/PacktPublis…
在整本书中,我们将主要使用 Vim 来编写 Python 代码,并假设读者对该语言有一定的了解。示例代码假设你使用的是 Python 3 语法。
使用 Python 2 代码
如果你不得不使用旧版本,你可以通过更改 print() 命令语法将 Python 3 示例转换为 Python 2 代码。将所有的 print('Woof!') 改为 print 'Woof!' 以便在 Python 2 中运行代码。
我们还将创建和修改 Vim 配置,这些配置存储在 .vimrc 文件中。最终的 .vimrc 文件可以通过前面提到的 GitHub 链接获取。
简短的历史课
让我们回到时间的起点:20世纪中期。在个人计算机和终端出现之前,有电传打字机。电传打字机是一种机械打字机,可以通过电信通道发送和接收消息。这里有一张 Teletype ASR-33(1963年)电传打字机的照片——这是一种精巧的打字机,曾被用作计算机的接口和输入设备:
通过电传打字机与文本交互的唯一方式是逐行处理,因此像由 Ken Thompson 开发的 ed 或其后继者——Bill Joy 的 ex 这样的行编辑器被广泛使用。行编辑器和今天的 Vim 一样,都是模态编辑器(稍后会详细介绍),但由于前述的输入/输出限制,它们只能一次处理一行文本。没错,真的是这样。
随着技术的进步,电传打字机被带有屏幕的终端所取代,这使得文本编辑变得更加完善。Vim 的直接前身——vi,起源于 1976 年。与它的前辈不同,vi(由 ex 的作者 Bill Joy 开发)引入了许多提高生活质量的功能,甚至允许一次编辑多行文本——真是一种奢侈!
你知道吗? 在许多现代系统中,vi 命令是指向功能受限版本 vim-tiny 的符号链接(而非原始的 vi 实现)!
vi 激发了许多克隆版本的出现,其中包括 STEVIE(“VI 爱好者的编辑器”),而 STEVIE 的源代码最终成为 Vim 的基础。Bram Moolenaar 于 1991 年发布了 Vim 的第一个版本。现在,你已经了解了 Vim 的历史!
虽然你不太可能遇到自 20 世纪 90 年代末以来未更新过的 Vim 版本,但了解不同 Vim 版本之间的基本变化仍然很有帮助。
这里展示了在本书第二版写作时每个主要 Vim 版本的(简化的)亮点。自 1991 年以来,Vim 一直在持续开发中!
| 主要版本 | 年份 | 亮点 |
|---|---|---|
| 1.0 | 1991 | Bram Moolenaar 为 Amiga 计算机发布了 Vi Imitation。 |
| 2.0 | 1993 | Vi Improved 以它现在的名字发布! |
| 3.0 | 1994 | 多窗口支持。 |
| 4.0 | 1996 | 图形界面支持。 |
| 5.0 – 5.8 | 1998 – 2001 | 添加了语法高亮、脚本支持和选择模式。 |
| 6.0 – 6.4 | 2001 – 2005 | 添加了插件支持和折叠支持。 |
| 7.0 – 7.4 | 2006 – 2013 | 值得注意的新功能包括拼写检查、代码补全、标签页、分支历史和持久化撤销。 |
| 8.0 – 8.2 | 2016 – 2019 | 引入了优化、异步 I/O 支持、内置终端和弹出窗口。 |
| 9.0 | 2022 | 引入了新的脚本语言(Vim9script)。 |
就像 vi 一样,有许多 Vim 的克隆版本,其中一些相当成功。本书在第九章中讨论了其中一个较为成功的替代实现。
请求帮助 如果你对不同版本之间的差异有更详细的兴趣,你可以打开 :help(你将在本章末学会如何使用它),并查找“Versions”。试试 :help version9 以查看 Vim 9 中的新功能!
让我们开始一个关于模态界面的对话
如果你曾经编辑过文本,你很可能对无模态界面非常熟悉。现代主流的文本编辑器默认选择了无模态界面,这也是我们大多数人学习处理文本的方式。如果你足够年长,还记得智能手机出现之前的时代,许多固定电话和早期的移动电话也是无模态的。
无模态这个术语指的是每个界面元素只有一个功能。每次按下按钮都会在屏幕上显示一个字母,或者执行某个其他操作。每个键(或组合键)总是执行相同的操作:应用程序始终处于单一模式下运行。
然而,这并不是唯一的方式。
欢迎来到模态界面,在这里,每个触发器根据上下文执行不同的操作。我们今天最常见的模态界面例子是智能手机。每次我们在不同的应用程序中工作或打开不同的菜单时,点击屏幕会执行不同的功能。
在文本编辑器方面也是如此。Vim 是一个模态编辑器,这意味着单个按键可能会根据上下文执行不同的操作。你是否处于插入模式(用于输入文本的模式)?那么,按下 o 会在屏幕上输入字母 o。然而,一旦你切换到另一种模式,字母 o 的功能就会变成在光标下方添加新的一行。
使用 Vim 就像是在与你的编辑器对话。你可以通过按下 d3w 来告诉 Vim 删除接下来的三个单词(delete 3 words),也可以通过按下 ci" 来请求 Vim 修改引号内的文本(change inside “ [quotes])。
你可能经常听到 Vim 比其他编辑器更快,但这并不是 Vim 的核心目的。Vim 让你在处理文本时保持流畅。你不需要为了去拿鼠标而打断工作节奏,也不需要为了到达页面的某个位置而连续按某个键 17 次。你也不必一点一点地拖动鼠标来确保选择到正确的单词集进行复制和粘贴。
使用无模态编辑器时,工作流程充满了中断。与模态编辑器一起工作则有一种特定的流畅感:你用一种一致的语言来要求编辑器执行操作。在 Vim 中,编辑变成了一种更加深思熟虑的练习。
安装
Vim 可以在每个平台上使用,并且预装在 Linux 和 macOS 上(不过,你可能希望将 Vim 升级到更近期的版本)。根据你的操作系统和个人偏好,你有多种设置 Vim 的选项,这里有一个简单的示意图展示了一些更常见的选项:
找到你的系统对应的部分,并浏览安装指南来进行设置。
为什么有这么多截图?
你会发现,我在以下安装说明中包含了大量的细节和截图。虽然 Vim 在大多数平台上都很容易获取,但安装最新版本的 Vim 并不像你想象的那么简单。如果你发现自己使用了错误版本的 Vim,你可以随时回到本章的说明中寻求帮助。
在 Linux 和类 Unix 系统上设置
Linux 机器自带 Vim,这是个好消息!然而,它可能已经过时了,而 Vim 的新版本通常包含新功能和优化更改(你可以在本章的“简短的历史课”部分阅读有关版本变化的更多信息)。打开命令提示符,运行以下代码,从最新的补丁中构建一个最新版本的 Vim(在克隆源代码仓库时):
$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ ./configure --prefix=/usr/local --with-features=huge
$ make
$ sudo make install
继续阅读,了解下一节中的编译选项。
缺少依赖项
如果在安装 Vim 时遇到问题,可能是缺少某些依赖项。如果你使用的是基于 Debian 的发行版,可以使用以下命令来添加常见的缺失依赖项:
$ sudo apt-get install make build-essential \
libncurses5-dev libncursesw5-dev --fix-missing
这将确保你拥有 Vim 的最新主次版本。如果你不关心使用最新的版本,也可以使用你选择的包管理器来更新 Vim。不同的 Linux 发行版使用不同的包管理器,以下列表包括一些常见的包管理器命令:
| 发行版/系统 | 安装最新版本 Vim 的命令 |
|---|---|
| 基于 Debian 的系统 (Debian, Ubuntu, Mint) | $ sudo apt-get update $ sudo apt-get install vim-gtk |
| CentOS(以及 Fedora 22 之前的版本) | $ sudo yum check-update $ sudo yum install vim-enhanced |
| Fedora 22+ | $ sudo dnf check-update $ sudo dnf install vim-enhanced |
| Arch | $ sudo pacman -Syu $ sudo pacman -S gvim |
| FreeBSD | $ sudo pkg update $ sudo pkg install vim |
注意名称
你可以在前面的表格中看到,Vim 在不同的仓库中使用了不同的包名。像基于 Debian 的发行版上的 vim-gtk 或 CentOS 上的 vim-enhanced 这样的包,启用了更多的功能(例如 GUI 支持)。
请记住,包管理器仓库往往会滞后几个月到几年不等。
到此为止,你已经准备好进入 Vim 的世界了!你可以通过输入以下命令启动编辑器:
$ vim
Vim 与 Vi 的区别
Vi 是 Vim 的前身(Vim 代表 Vi Improved),可以通过 vi 命令调用。在某些发行版中,vi 命令指向一个功能有限的 Vim 版本(也称为 vim-tiny),而在某些发行版中,它仅仅是一个指向完整功能 Vim 的符号链接。
编译选项
从源代码编译通常是获取最新可用 Vim 版本的最佳方式。如果你不怕动手,你可能会想了解常见的编译选项。
本节将介绍 configure 命令的各种选项。要编译 Vim,你需要运行以下命令,将 <options> 替换为所需的编译选项:
$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ ./configure <options>
$ make
$ sudo make install
你可以使用 --prefix 控制安装位置:
--prefix=/usr/local作为系统范围安装的合理默认值--prefix=$HOME/.local将使新安装的 Vim 仅对你的用户可用
功能集允许你启用 Vim 中的不同功能集,选项包括 tiny、small、normal、big 和 huge。最有趣的选项包括:
--with-features=huge包含所有可能的功能,包括实验性的--with-features=normal包含合理的功能集,大部分在本书中都有介绍--with-features=tiny仅提供基本必需品,没有语法高亮或插件支持
语言支持由 --enable-<language>interp 选项控制。请注意,这指的是 Vim 内部与所选编程语言(例如,在插件或你自己的脚本中)交互的能力,而不是你编辑这些文件的能力。一些选项包括:
--enable-luainterp=yes启用 Lua 支持--enable-perlinterp=yes启用 Perl 支持--enable-python3interp=yes启用 Python 3 支持--enable-rubyinterp=yes启用 Ruby 支持
最后,为了将剪贴板与 X11 窗口系统(即你系统范围内的 Linux 剪贴板)集成,你可能需要使用 --with-x 选项编译 Vim。请注意,你可能需要 X 开发库(例如,如果你使用 apt 包管理器,可以使用 sudo apt install libx11-dev libxtst-dev)。
在 macOS 上设置
macOS 自带 Vim,但版本可能已过时。有几种方法可以安装最新版本的 Vim,本书将介绍其中两种。首先,你可以使用 Homebrew,一个 macOS 的包管理器来安装 Vim。不过,你需要先安装 Homebrew。其次,你可以下载一个 MacVim 的 .dmg 镜像。MacVim 更加符合 Mac 用户熟悉的视觉界面。
由于本书涉及与命令行的交互,我推荐使用 Homebrew 的方法。然而,如果你不喜欢与命令行互动,也可以选择安装 .dmg 镜像。
使用 Homebrew
Homebrew 是 macOS 的第三方包管理器,可以轻松安装并保持软件包的更新。如何安装 Homebrew 的说明在 brew.sh 上可以找到,截至本书写作时,只需在命令行中执行以下一行命令:
bash
复制代码
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
运行该命令后,按回车键继续(根据需要多次按下)。
如果你没有安装 Xcode
如果你没有安装 Xcode(这通常是任何与开发相关的活动的先决条件),你会看到一个 Xcode 安装弹窗。我们不会直接使用 Xcode,你可以按照默认设置安装它。
这可能需要一段时间运行,但最终你将安装 Homebrew:一个可以用来安装不止 Vim 的出色工具!当安装完成时,你会看到“Installation successful!”的粗体消息。
现在,让我们使用以下命令安装 Vim 的新版本:
$ brew install vim
Homebrew 还会安装所有必要的依赖项,因此你不必担心任何问题。
如果你已经安装了 Homebrew,并且过去安装过 Vim,上述命令会产生一个错误。不过,你可能需要确保你拥有最新版本的 Vim,因此,运行以下命令:
$ brew upgrade vim
现在你已经准备好享受 Vim 了;让我们试着用以下命令打开它:
$ vim
欢迎使用 Vim!
让我们继续下一部分,关于下载 .dmg 镜像的内容。
下载 .dmg 镜像
前往 github.com/macvim-dev/… 并下载 MacVim.dmg。
打开 MacVim.dmg,然后将 Vim 图标拖动到应用程序目录中,如下图所示:
根据你 Mac 的安全设置,当你导航到应用程序文件夹并尝试打开 MacVim 应用时,可能会遇到错误,如下图所示:
打开你的应用程序文件夹,找到 MacVim,右键点击图标,然后选择“打开”。接下来会弹出如下提示:
现在,点击“打开”,从此以后你就可以像往常一样打开 MacVim 了。试试看:
在 Windows 上设置
Windows 提供了两种主要使用 Vim 的途径:设置 Cygwin 以提供更类似 Unix 的命令行体验,或者安装 gVim——Vim 的图形版本(支持在 Windows 的 cmd.exe 上运行)。我建议你安装这两种方式,并选择你最喜欢的:gVim 在 Windows 上使用起来感觉更贴合(而且安装更简单),而如果你习惯了 Unix shell,Cygwin 可能会更适合你。
使用 Cygwin 提供类 Unix 体验
Cygwin 是一个类 Unix 的环境和 Windows 的命令行界面。它旨在将强大的 Unix shell 和支持工具带到 Windows 机器上。
Windows Subsystem for Linux (WSL) WSL 是 Windows 10 及更高版本中的一个功能,允许你直接在 Windows 上运行 Linux 环境。虽然我个人没有使用 WSL 的经验,但它被广泛称赞为一种快速、用户友好且可靠的在 Windows 上访问 Linux 命令行和工具的方式。随着其不断开发,它可能成为比 Cygwin 更好的替代方案。你可以在 learn.microsoft.com/windows/wsl 阅读更多关于 WSL 的信息。
安装 Cygwin
要开始安装过程,导航至 cygwin.com/install.htm…,并根据你使用的 Windows 版本(分别为 64 位或 32 位)下载 setup-x86_64.exe 或 setup-x86.exe。
你的系统是多少位的? 如果你不确定你的系统是 32 位还是 64 位,你可以打开“控制面板” | “系统和安全” | “系统”,查看“系统类型”。例如,我的 Windows 机器显示“系统类型:64 位操作系统,基于 x64 的处理器”。
打开可执行文件,你将看到如下的 Cygwin 安装窗口:
点击“Next >”几次,使用默认设置继续:
- Download source: Install from Internet
- Root directory:
C:\cygwin64(或推荐的默认路径) - Install for: All Users
- Local package directory:
C:\Downloads(或推荐的默认路径) - Internet connection: Use System Proxy Settings
- Download site:
http://cygwin.mirror.constant.com(或任何可用选项)
之后,你会看到“Select Packages”选择包的界面。在这里,我们需要选择 vim、gvim 和 vim-doc 包。最简单的方法是在搜索框中输入 vim,展开 “All | Editors” 类别,然后点击所需包旁边的箭头图标,如下图所示:
上面的截图显示的是版本 8.2.4372-2,这是在写作本章时(2023年7月)可用的最新版本。目前,Vim 的最新版本是 9.0,它引入了 Vim9script(你可以在“简短的历史课”部分了解更多关于版本差异的信息)。
使用 Cygwin 编译 Vim 如果你想使用最新版本的 Vim,建议使用 Cygwin 从其官方 Git 仓库中编译 Vim。安装 Cygwin 后,你可以参考本章前面介绍的“在 Linux 上设置”部分的指示进行操作。如果你选择这样做,你需要在 Cygwin 中安装 git 和 make 实用工具。
你可能需要额外的实用工具 你可能需要从 Net 类别下安装 curl,以及从 Devel 类别下安装 git,因为我们将在第三章中使用它们。另外,从 Utils 类别下安装 dos2unix 也可能会有所帮助,这是一种用于将 Windows 样式的行尾转换为 Linux 样式行尾的实用程序(你可能会偶尔遇到这种情况)。
点击“Next >”两次以继续,这将开始安装。安装需要一些时间,现在可以提前为自己准备一杯咖啡,庆祝一下!
安装过程中可能会遇到一些后安装脚本错误,这些错误可以安全地忽略(除非你看到与 Vim 相关的错误——在这种情况下,Google 是你的朋友:搜索错误信息并尝试找到解决方案)。
点击“Next >”几次,继续使用默认设置:
- 创建桌面图标
- 添加图标到开始菜单
恭喜你——你现在已经成功安装了包含 Vim 的 Cygwin!
安装 Cygwin 包 如果你以后需要在 Cygwin 中安装额外的软件包,只需重新运行安装程序并选择你想要的包即可。
使用 Cygwin
打开 Cygwin——根据你的系统版本,程序将被称为 Cygwin64 Terminal 或 Cygwin Terminal,如下图所示:
打开它!你将看到以下提示,这对 Linux 用户来说应该很熟悉:
Cygwin 支持我们在本书中将使用的所有 Unix 风格的命令。本书还会说明是否需要更改任何命令以在 Cygwin 中正常运行。
输入 vim 并按下回车键以启动 Vim,如下图所示:
Cygwin 是在 Windows 上获得类似 Linux shell 体验的一种方式,这意味着如果你决定使用 Cygwin,本书中的说明需要按照 Linux 特定的指示进行操作。
你还需要注意 Windows 风格的行尾与 Linux 风格的行尾,因为 Windows 和 Linux 处理行尾的方式不同。如果你遇到 Vim 报告无法识别的 ^M 字符问题,可以在有问题的文件上运行 dos2unix 实用程序来解决问题。
使用 gVim 的可视化 Vim
你可以在本章稍后的“Vanilla Vim versus gVim”部分中阅读更多关于 Vim 图形版本的信息。
与 Windows 的操作一样,这个过程稍微更加可视化。打开浏览器,导航到 github.com/vim/vim-win… 并下载可执行安装程序。在写作本章时(2023年7月),最新的 gVim 版本是 9.0。
你也可以使用 winget 另外,如果你熟悉 winget 工具,可以运行以下命令安装 Vim:
winget install -e --id vim.vim
(如果你希望使用最新的开发版本,可以替换为 vim.vim.nightly)。
打开可执行文件并按照屏幕上的提示进行操作,如下图所示:
让我们继续点击“Next”,然后点击“I Agree”直到我们到达“Installation Options”(安装选项)屏幕。我们对 gVim 提供的大多数默认选项感到满意,但你可能希望启用“Create .bat files for command line use”选项。启用此选项后,vim 命令可以在 Windows 命令提示符中使用。本书中的一些示例依赖于使用命令提示符,因此启用此选项将有助于你更好地跟随内容。
以下是“Installation Options”屏幕的截图,显示了正确选中的选项框:
点击“Next >”。接下来,你需要继续使用以下设置:
- Select the type of install: Typical(启用“Create .bat files for command line use”后,安装类型会自动变为 Custom)
- Do not remap keys for Windows behavior(不重新映射用于 Windows 行为的键)
- Right button has a popup menu, left button starts visual mode(右键显示弹出菜单,左键启动可视模式)
- Destination Folder:
C:\Program Files (x86)\Vim(或推荐的默认路径)
完成设置后,点击“Install”,然后点击“Close”。当询问是否查看 README 文件时,选择“否”(当然,你也可以选择“是”——毕竟我是一本书,不是警察)。
现在,你的桌面上会出现几个图标,其中最有趣的是 gVim 9.0,如下图所示:
启动它,你就可以继续了!祝你使用 Vim 愉快!
在 ChromeOS 上设置
ChromeOS 变得越来越受欢迎,尤其是在教育领域和一些企业环境中。Chrome 设备价格低廉,用户友好,甚至可以在一台简单的设备上运行。我已经使用 Chromebook 作为工作中的日常设备好几年了——幸运的是,如果你选择 ChromeOS 作为平台,你不必放弃 Vim。
要在你的 ChromeOS 设备上运行 Vim,你需要能够安装一个 Linux 环境。这不是一个复杂的过程,不需要双重启动,并且在 ChromeOS 和 Linux 环境之间提供无缝的集成。
ChromeOS 中的 Linux 支持 一些旧款 ChromeOS 设备不支持运行 Linux 环境。你可以通过打开“设置”应用并搜索“Linux”来检查你的设备是否支持 Linux。如果没有结果,那么你将无法在你的 ChromeOS 设备上使用 Vim。
首先,通过打开“设置”应用并导航到“高级 | 开发者 | Linux 开发环境 | 启用”选项来设置在 ChromeOS 上运行 Linux:
你会看到一个设置 Linux 开发环境的提示。点击“Next”继续。默认设置已经足够,如下图所示:
点击“Install”进行安装,整个设置过程应该在几分钟内完成。
新安装的 Debian Linux 环境可以通过终端应用访问。默认环境名称是 penguin,你只需选择它即可:
你会看到一个(希望你熟悉的)Linux 命令行提示符:
Vim 已预装在绝大多数 Linux 机器上,这台设备也不例外:你应该已经可以访问 Vim。
编译最新版本的 Vim 如果你想使用 Vim 的最新版本,我建议从其官方 Git 仓库中编译 Vim(这很简单)。请参阅本章前面“在 Linux 上设置”部分的说明,了解如何安装最新版本的 Vim。
现在,你可以通过在终端中调用以下命令来启动 Vim:
$ vim
输出结果如下所示:
通过 Linux 访问 ChromeOS 文件 由于 ChromeOS 和 Linux 之间的集成,你可以通过 ChromeOS 的文件应用程序访问你的 Linux 主目录(可以通过终端窗口中的 cd ~ 命令访问):
此外,你还可以通过右键点击文件并选择“Share with Linux”来将单个 ChromeOS 文件共享给 Linux。这些文件将在 Linux 中通过 /mnt/chromeos 目录访问。
验证和排查安装问题
无论你使用哪个平台安装 Vim,确保 Vim 启用了所有正确的功能是很重要的。在命令行中运行以下命令:
$ vim --version
你将看到如下输出,其中一组功能前面带有 + 和 - 号:
在上面的截图中,你可以看到我的 Vim 实际上是使用 Python 2 支持(+python)而非 Python 3 支持(-python3)编译的。要修正这个问题,我需要重新编译 Vim 并启用 +python3 支持(为此,我需要安装必要的依赖项),或者找到一个已经编译好并启用了 +python3 支持的 Vim 包。
Vim 集成
请注意,+python3 和类似选项指的是 Vim 的 Python 3 集成。你仍然可以编辑任何文件(包括 Python 3),但这意味着你的 Vim 实例、插件和脚本将无法运行 Python 3。
请求帮助
要查看 Vim 可以启用的所有功能列表,请参阅 :help feature-list。
例如,如果我们想在 Linux 上重新编译带有 Python 3 支持的 Vim,可以执行以下操作:
$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ ./configure --prefix=/usr/local \
--with-features=huge \
--enable-python3interp
$ make
$ sudo make install
指定功能集
我们传递 --with-features=huge 标志是为了在编译 Vim 时启用大多数功能。然而,--with-features=huge 并不安装语言绑定,因此我们需要显式启用 Python 3。
通常,如果你的 Vim 表现与其他 Vim 安装(包括本书描述的行为)不一致,可能是因为缺少某个功能。
根据你的系统和所需的功能,安装过程可能会有一些或很大的不同。快速进行一次类似“在<操作系统>上安装带有+<feature>的 Vim <version>”的网络搜索应该可以帮助你找到解决方案。
既然你已经完成了安装说明,现在让我们更仔细地看看我们安装了什么。
原生 Vim 与 gVim
按照之前的说明,你已经安装了两种 Vim 版本:命令行 Vim 和 gVim。以下是在 Windows 上 gVim 的外观:
gVim 为 Vim 提供了一个图形用户界面(GUI),具有更好的鼠标支持,并添加了更多的上下文菜单。它还支持比许多终端模拟器更广泛的颜色范围,并提供了一些你期望从现代 GUI 中获得的便利功能。
你可以通过在 Windows 上运行 gVim 9.0 可执行文件来启动 gVim,或者在 Linux 和 macOS 上使用以下命令启动:
$ gvim
Windows 用户可能更喜欢使用 gVim。
本书的重点是提高文本编辑技能的有效性,因此我们会避免在 gVim 中浏览多个菜单,因为这些菜单相当直观,并且会让用户脱离工作流。
因此,我们将专注于非图形版本的 Vim,但适用于 Vim 的所有内容也同样适用于 gVim。两者共享配置文件,你可以根据需要在两者之间切换。总体而言,gVim 对新手更为友好,但对于本书的目的来说,使用哪一种并不重要。
尝试一下两者吧!
使用 .vimrc 配置 Vim
Vim 从 .vimrc 文件中读取配置。Vim 开箱即用,但有一些选项可以让代码编写更加轻松。
显示隐藏文件
在类 Unix 系统中,以点号 (.) 开头的文件是隐藏的。要查看它们,可以在命令行中运行 ls -a。
在 Linux 和 macOS 上,.vimrc 文件位于用户目录中(完整路径通常是 /home/<username>/.vimrc)。你也可以通过打开命令提示符并运行以下命令来找到你的用户目录:
$ echo $HOME
旧版本的 Windows 资源管理器不允许文件名中包含点号,因此文件名为 _vimrc。它通常位于 C:\Users<username>_vimrc,但你也可以通过打开 Windows 命令提示符并运行以下命令来找到它:
$ echo %USERPROFILE%
定位 .vimrc
如果你遇到问题,可以打开 Vim 并输入 :echo $MYVIMRC 然后按回车键。它会显示 Vim 从哪里读取 .vimrc 文件。
找到适合你操作系统的正确位置,并将准备好的配置文件放在那里。你可以从 GitHub 下载本章使用的 .vimrc 文件:github.com/PacktPublis…。以下代码显示了本章使用的 .vimrc 文件的内容:
syntax on " Enable syntax highlighting.
filetype plugin indent on " Enable file type based options.
set nocompatible " Don't run in backwards compatible mode.
set autoindent " Respect indentation when starting new line.
set expandtab " Expand tabs to spaces. Essential in Python.
set tabstop=4 " Number of spaces tab is counted for.
set shiftwidth=4 " Number of spaces to use for autoindent.
set backspace=2 " Fix backspace behavior on most terminals.
colorscheme murphy " Change a colorscheme.
你可能最终会想更改这些选项
为了获得更好的使用效果,建议你将某些选项限制为仅适用于 Python 文件——特别是如果你计划(希望如此)将 Vim 作为多种文件类型的主要编辑器。我建议你为某些选项添加 autocmd filetype python 前缀,这样它们只会应用于 Python 文件:
autocmd filetype python set expandtab
autocmd filetype python set tabstop=4
autocmd filetype python set shiftwidth=4
以双引号 (") 开头的行是注释,Vim 会忽略这些内容。这些设置引入了一些合理的默认值,比如语法高亮和一致的缩进。它们还修复了在基本的 Vim 安装中常见的一个问题——在不同环境中,退格键的行为不一致。
试用配置选项
在处理 Vim 配置时,你可以在将选项添加到 .vimrc 文件之前先进行试用。要做到这一点,可以输入 : 然后输入命令,例如 :set autoindent(按回车键执行)。如果你想知道某个设置的值,可以在命令末尾加上 ?,例如,:set tabstop? 会告诉你当前的 tabstop 值。
我还更改了颜色方案,以便截图在印刷品中看起来更好,但你不必这样做(除非你在写一本关于 Vim 的书——那么你可能应该这样做)。
颜色的世界
Vim 9 预装了许多颜色主题,并且每次发布时列表都会增长。你可以通过输入 :colorscheme <name> 然后按回车键来试用颜色主题,还可以通过输入 :colorscheme 后加空格并多次按 Tab 键来循环浏览可用的颜色方案名称。在第 7 章中,你可以阅读更多关于配置 Vim 和颜色方案(包括使用在线找到的颜色方案)的内容。
现在你已经配置好了 Vim,是时候学习如何真正使用它了!
常见操作(或者,如何退出 Vim)
我们现在将重点介绍如何在不使用鼠标或导航菜单的情况下与 Vim 进行交互。以下是我几年前找到的一个梗图:
编程本身是一项需要集中注意力的任务。没有人会觉得在上下文菜单中寻找选项是一件愉快的事情,而将手保持在键盘的主键区有助于减少在键盘和鼠标之间的频繁切换。
在本节中,我们将学习如何打开(更重要的是,关闭)Vim,保存文件以及进行基本的编辑。
打开文件
首先,启动你喜欢的命令提示符(在 Linux 和 macOS 中是终端,在 Windows 中是 Cygwin)。我们将编写一个非常简单的 Python 应用程序。为了简单起见,让我们做一个简单的平方根计算器。运行以下命令:
$ vim spam.py
图形界面胜利! 如果你使用的是 gVim,你可以通过进入“文件”菜单并选择“打开”来打开一个文件。有时候,图形界面正是你所需要的!
这将打开一个名为 spam.py 的文件。如果文件已存在,你会看到它的内容,但由于该文件不存在,我们看到的是一个空白屏幕,如下例所示:
你可以通过屏幕底部文件名旁边的 [New File] 文本判断该文件不存在。恭喜!你已经用 Vim 打开了你的第一个文件!
如果你已经打开了 Vim,可以通过输入以下命令并按下回车键来加载一个文件:
:e spam.py
你刚刚执行了你的第一个 Vim 命令!按下冒号字符(:)进入命令行模式,这允许你输入一行文本,Vim 会将其解释为命令。命令通过按下回车键(Enter)来终止,这使你能够执行各种复杂操作,并访问系统的命令行。:e 命令表示编辑(edit)。
Vim 帮助文档中经常将回车键(Enter)称为 <CR>,即“carriage return”(回车)。
修改文本
默认情况下,你处于 Vim 的正常模式,这意味着每个按键对应一个特定的命令。按下键盘上的 i 键进入插入模式。这将在状态栏(底部)显示 -- INSERT --,如果你使用的是 gVim,光标将从块状变为竖线,如下例所示:
插入模式的行为与其他无模式编辑器类似。通常,我们不会在插入模式下花费太多时间,除了添加新文本的情况。
模式,模式,模式
你已经遇到了 Vim 的三种模式:命令行模式、正常模式和插入模式。本书还将介绍更多的模式——详情和解释请参见第 3 章。
让我们通过输入以下代码来创建我们的 Python 应用程序。在本章中,我们将围绕这个小代码片段进行操作:
要返回到 Vim 的正常模式,按下键盘上的 Esc 键。你会看到状态栏中的 -- INSERT -- 消失了。现在,Vim 准备再次接受你的命令!
这段代码不是最佳实践
前面的代码并未展示 Python 的最佳实践,它仅用于演示 Vim 的一些功能。
保存和关闭文件
让我们保存文件!执行以下命令:
:w
不要忘记执行命令! 不要忘记在命令末尾按下回车键以执行它。:w 表示保存(write)。
命名文件
write 命令后面也可以跟随一个文件名,从而将内容保存到一个不同于当前打开文件的文件中(例如 :w spam_2.py)。如果你在保存时想将当前打开的文件更改为新文件,可以使用 :saveas 命令::saveas spam_2.py。
让我们退出 Vim 并检查文件是否确实被创建了。:q 表示退出(quit)。你还可以通过执行 :wq 来结合保存和退出命令,以保存文件并退出 Vim。
:q
如果你对文件进行了修改并想在不保存更改的情况下退出 Vim,你需要使用 :q! 强制退出 Vim。命令末尾的感叹号表示强制执行。
命令简写
Vim 中的许多命令都有简写和全称版本。例如,:e、:w 和 :q 是 :edit、:write 和 :quit 的简写。在 Vim 手册中,命令的可选部分通常用方括号([])标注;例如 :w[rite] 或 :e[dit]。
现在我们已经回到了系统的命令行,让我们检查一下当前目录的内容,如下代码所示:
$ ls
$ python3 spam.py
以下截图显示了上述两个命令的输出结果:
命令聚焦
在 Unix 中,ls 列出当前目录的内容(-a 标志显示隐藏文件)。python3 spam.py 使用 Python 3 解释器执行脚本。
关于交换文件的说明
默认情况下,Vim 会通过交换文件(swap files)跟踪你对文件所做的更改。交换文件是在你编辑文件时创建的,如果 Vim、你的 SSH 会话或你的机器崩溃,它们用于恢复文件的内容。如果你没有正常退出 Vim,或者尝试同时多次编辑同一个文件,你将看到以下屏幕:
你可以按 r 键来恢复交换文件的内容,或者按 d 键删除交换文件并放弃更改。如果你决定恢复交换文件,可以通过重新打开文件、运行 :e 命令,并按 d 键删除交换文件,防止下次在 Vim 中打开文件时出现相同的提示(尽管如果该文件当前在另一个 Vim 实例中打开,Vim 不会让你删除交换文件)。
默认情况下,Vim 会在与原始文件相同的目录中创建类似 <filename>.swp 和 .<filename>.swp 的文件。如果你不喜欢文件系统中充满交换文件,可以通过将所有交换文件放在一个目录中来更改此行为。为此,将以下内容添加到你的 .vimrc 中:
vim
复制代码
set directory=$HOME/.vim/swap//
请注意,末尾的双目录分隔符是必需的;如果没有它,此设置将无法正确工作!
对于 Windows 用户 如果你使用的是 Windows,你应该使用以下命令:set directory=%USERDATA%.vim\swap//(注意最后两个斜杠的方向)。
你也可以通过在 .vimrc 中添加 set noswapfile 来选择完全禁用交换文件。
“但是,”我听到你说,“我大部分时间都在浏览代码(或文本),而不是从头到尾地写!”别担心,这正是 Vim 有别于传统编辑器的地方。下一节将教你如何在你刚刚写的内容中进行导航。
移动光标——与编辑器对话
Vim 允许你比大多数传统编辑器更高效地浏览内容。让我们从基础开始。
你可以使用箭头键或 h、j、k 和 l 键逐字符移动光标。这是最不高效但最精确的移动方式:
| 键 | 替代键 | 动作 |
|---|---|---|
h | 左箭头 | 向左移动光标 |
j | 下箭头 | 向下移动光标 |
k | 上箭头 | 向上移动光标 |
l | 右箭头 | 向右移动光标 |
下面的图表是一种更直观的表示方式,可能会让你更容易理解:
Vi(Vim 的前身)是在一台古老的 ADM-3A 终端上创建的,该终端没有箭头键。因此,h、j、k 和 l 键被用作箭头键。
试试看!习惯使用 h、j、k 和 l 键来移动有很多好处,例如,你的手可以保持在键盘的主键区。这样你不必移动双手,能够帮助你保持工作流。此外,许多应用程序将 h、j、k 和 l 键视为箭头键——你会惊讶于有多少工具会对这些键作出响应。
现在,你可能倾向于多次按方向键来达到所需的位置,但有更好的方法!你可以在每个命令前加一个数字,这会将该命令重复执行指定的次数。例如,按下 5 + j 会将光标向下移动五行,而按下 1 + 4 + l 会将光标向右移动 14 个字符。这适用于本书中你遇到的大多数命令。
计算出确切要移动的字符数量是相当困难的(而且没有人愿意这么做),所以有一种按单词移动的方法。使用 w 可以移动到下一个单词的开头,使用 e 可以移动到最近单词的结尾。要向后移动到单词的开头,按 b。
你还可以将这些字母大写,以将除空格以外的所有内容视为一个单词!这使你能够区分你希望遍历的内容类型。
Vim 有两种类型的单词对象:分别称为小写的 “word” 和大写的 “WORD”。在 Vim 的世界中,word 是由字母、数字和下划线组成的序列。WORD 是由任何非空字符组成的序列,以空白字符分隔(技术上比这更复杂;如果你感兴趣,可以查看 :help iskeyword)。
让我们看一下示例中的以下代码行:
注意
请注意光标的位置——它停留在 ingredient 的第一个字符上。
按下 w 会将光标移动到下一个逗号,而按下 W 则会将光标移动到 with_spam 的开头。大写的 W、E 和 B 会将所有由空格分隔的字符组合视为独立的单词。下表展示了这些按键的行为:
| 键 | 动作 |
|---|---|
w | 向前移动一个单词 |
e | 向前移动直到单词的结尾 |
W | 向前移动一个 WORD |
E | 向前移动直到 WORD 的结尾 |
b | 向后移动到单词的开头 |
B | 向后移动到 WORD 的开头 |
将这些移动与之前学到的方向键移动结合起来,可以用更少的按键移动!
按段落移动也非常有用。由至少两个换行符分隔的内容都被视为一个段落,这也意味着每个代码块都是一个段落,如以下示例所示:
INGREDIENTS 常量,以及 prepare_menu_item 和 main 函数是三个独立的段落。使用闭括号 } 向前移动,使用开括号 { 向后移动,具体如下表所示:
| 命令 | 动作 |
|---|---|
{ | 向后移动一个段落 |
} | 向前移动一个段落 |
如果你需要移动多个段落,不要忘记将这两个命令与数字结合使用。
还有更多的方法可以在文本中移动,但这些是最重要的基础内容。我们将在第二章中介绍更复杂的导航方法。
在插入模式中进行简单编辑
使用 Vim 时,通常希望尽量减少在插入模式中的时间(除非你在写作而不是编辑)。由于大多数文本操作都涉及编辑,我们将重点讨论这一点。
你已经学会了通过按下 i 键进入插入模式。其实,还有更多方式可以进入插入模式。通常,你可能想要将一部分文本替换为另一部分文本,而有一个专门的命令可以做到这一点——c。c 命令(change)允许你删除一部分文本并立即进入插入模式。c 是一个复合命令,这意味着它需要后续的命令来告诉 Vim 需要更改什么。你可以将其与之前学到的任何移动命令结合使用。