文章目录
本节会讲一些 Vim 中的高级概念和进阶用法, 了解了这些之后, 可以解开很多疑惑, 使用起来也会更得心应手.
CWD/PWD
CWD(Current Working Directory), 当前工作目录, 这是 Vim 中一个挺重要, 但是却又经常被忽略的概念. 简单来说, CWD 是 Vim 和操作系统的文件系统进行交互时的上下文环境.
要查看 Vim 的 CWD, 你可以使用 :pwd
命令来查看. 正常来说, 当你点击桌面上的 gVim 图标打开 Vim 时, Vim 的 CWD 是用户目录, 当你在文件上右键->用 Vim 编辑打开 Vim 时, Vim 的 CWD 是文件所在路径.
CWD 有什么用呢? 现在请你打开 Vim, 然后在命令模式下执行 :e test_vim_cwd.txt
, 你会看到打开了一个名为 test_vim_cwd.txt 的新文件, 你随便添加一些文本, 然后保存, 你会发现这次 Vim 不再提示你没有文件名, 你可以直接保存了. 那么问题来了, 这个文件被存到哪里了呢?
我想你应该已经猜到了, 没错, 在 Vim 里新建的文件, 如果不指定路径, 会被保存到 CWD 里. 所以说 CWD 是 Vim 和文件系统交互时的上下文环境.
除此之外, Vim 的很多插件工作时也依赖 CWD, 比如 NERDTree, CtrlP 等等.关于插件我们以后再讲, 现在你先记住, CWD 是会影响一些插件的表现的.
在现阶段, 你不需要关心 CWD, 因为我们现在还是单文件操作, CWD 是哪都无所谓. 但如果你确实想改一下 CWD, 可使用 :cd
命令修改 CWD:
cd d:/xxx/yyy
这和命令行里切换目录的方式是一样.
OK, 关于 CWD, 先说到这, 后面还会再说. 另外, 现在你又学会一个新命令: :e
, 这个命令可以新建一个新文件. 其实, :e
这个命令后面可以路径/文件名, 如果给定的路径文件存在, 则是打开, 如果不存在, 则是新建.
文本对象
好, 我们再回到 Vim 的操作中, 请打开一个英文文本文件或输入一些英文, 以便接下来的学习.
之前的复制和删除都是以字符, 行为单位, 而 w, e, b的作用是从光标处到下个单词开头或本单词结尾, 所以要想删除整个单词, 你得这么做: bdw
, 这表示先将光标移动到单词开头, 然后 dw. 这很麻烦, 有时候不小心看错了, 光标就移动错了. 要解决这个问题, 可以使用 文本对象.
现在请移动到一个单词的任意一个字母上, 然后执行指令 daw
, 你会发现整个单词被删除了, 神奇吧. 这个指令中的 aw
在 Vim 中代表一个文本对象: a word, 即一个单词, 执行 daw
就表示删掉一个单词, 而且, 无论你在这个单词的哪个字母上, 都可以执行此命令删掉整个单词.
除了 aw, Vim 还支持下列文本对象:
- aw: a word, 表示一个单词, 及其后面的空白, daw 表示删除光标所在单词及空白
- iw: inner word, 也是表示一个单词, 但是不包括单词后面的空白
- as: a sentence, 表示一个句子, 及其后面的空白, das表示删除光标所在句子及空白
- is: inner sentence, 也是表示一个句子, 但是不包括句子后面的空白
- ap/ip: a paragraph, 一个段落, 细节同上
- a[, a] / i[, i]: 一个
[]
块, a[, a] 包括两边的 “[]”, i[, i] 不包括两边的 [] - a(, a) / i(, i) / ab ib: 一个小 block, 细节同上
- a{, a} / i{, i} / aB iB: 一个大 block, 细节同上
a<, a> / i<, i>
: 一个尖括号块, 细节同上- a", a’, a` / i", i’, i`: 一对引号, 细节同上
- at/it: 一个 tag, 匹配 HTML 或者 XML 中的 tag 及其内容, 会忽略单标签
上述文本对象大都可以使用计数器, 例如:
- d3aw: 表示删除3个单词, as, ap 同理
- y2ab / y2a(: 表示向外复制两层小括号的内容, 其他类似括号的同理
- ", ', `, 这几个不可使用计数器
这样一来, 一次性可操作的文本就大大增加了, 而且不用关心光标的位置, 非常便捷.
寄存器
我们之前说过, 剪切(删除)的文本会进入到 Vim 中的寄存器里, 那什么是寄存器呢?
所谓寄存器, 就是存放文本和指令/命令的地方, 例如使用 y, d, c 等命令复制或剪切的文本都会被自动存放在 Vim 的寄存器中, 用户可以将文本和指令放在寄存器中, 也可以从寄存器中读出来.
Vim 中共有9类寄存器, 具体如下:
类型 | 标识 | 读写者 | 是否只读 | 包含的字符来源 |
---|---|---|---|---|
Unnamed | " | <