Vim在文件中跳转

在文件中跳转

Tip 55 Traverse the Jump List

遍历跳转列表

Vim 在跳转之前和之后记录我们的位置,并提供一些命令来回溯我们的步骤,类似于Web浏览器中的前进和后退。对vim来说:

  • < C - o > - 后退, 跳转到上一个位置

  • < C - i > - 前进, 后退之后就可以往前了

:jumps命令可以查看跳转列表,效果类似于 :ls

跳转位置的定义:Any command that changes the active file for the current window can be described as a jump.

任何更改当前窗口的活动文件的命令都可以描述为跳转。Vim 会把执行跳转命令之前和之后的光标位置,记录到跳转列表中。例如:

如果我们运行:edit命令打开了一个新文件,那么就可以用 <C-o> 和 <C-i> 命令在这个新文件以及原本的文件之间来回跳转。

[count]G命令直接跳到指定的行号也会被当成一次跳转,但每次向上或向下移动一行则不算。面向句子的动作及面向段落的动作都算跳转,但面向字符及面向单词的动作则不算。用一句话来概括,我们可以说大范围的动作命令可能会被当成跳转,但小范围的动作命令则只能算移动。

下表节选了一些跳转动作:

[count]G 行跳转
/pattern 或 ?pattern 跳转到 下一个/上一个 匹配的 pattern 位置
n / N 同上
% 跳转到 配对的括号位置 () [] {} <>
( / ) 跳转到 前/后 一句内容
{ / } 跳转到 前/后 一段内容
H / M / L 跳转到 上/中/下 屏幕
gf 跳转到 光标处的文件
<C-]> 跳转到 光标处关键词定义的地方
`{mark} / ‘{mark} 跳转到 标记 / 标记非空白行首 位置

命令本身不会被当成动作命令。也就是说,我们既不能用它们扩大可视模式的选区,也不能在操作符待决模式中使用它们。

​ Vim 可以同时维护多份跳转列表。实际上,每个单独的窗口都拥有一份自己的跳转列表。如果你正在使用分割窗口或多标签页,那么 命令会始终在当前活动窗口的跳转列表范围内进行跳转

注意:试着在插入模式中按一下 < C- i >,你会发现这和按 键的效果是一样的,

因为 Vim 本来就把 当成同一个东西。如果重新映射 键的话,那么也应该意识到,当你按下 时,该映射项也会被触发(反之亦然)。跳转的缺省行为将会被改变,只能单向遍历。

Tip 56 Traverse the Change List

遍历改变列表

每当对文档做出修改后, Vim 都会记录当时光标所在的位置。遍历改变列表的方法很简单,并且这大概是跳到你要去的地方的最快方式。

撤销/重做 命令:

  • u - 撤销变更 (相当于 win <C - z>)

  • - 撤销之前的撤销 (相当于 win <C - y>)

Vim 会在编辑会话期间维护一张表,里面记载我们对每个缓冲区所做的修改,此表就是所谓的改变列表,使用 :change 命令可以查看其内容。

Vim 为每次修改都记录了行号与列号,我们可以用 g; 和 g,命令反向或正向遍历改变列表。可以拿; 和 ,命令当参考,来帮你记忆 g; 与 g, 命令。前两条命令分别用来正向及反向重复 f{char} 命令,加上g前缀

标识上次修改方位的位置标记,Vim 会自动创建一些位置标记,它们是对改变列表的一个有用补充。

  • `. 标记总是指向上次修改的位置

  • `^ 标记则会指向上次退出插入模式时光标所在的位置 ( gi 命令)

Vim 会为编辑会话中的每个单独缓冲区维护一个改变列表,而与之不同的是,每个窗口都会创建一个单独的跳转列表。

在大多数场景下,跳转到 `` . 的效果与使用 g; 命令相同。不过位置标记只指向最后修改的位置,而改变列表中则保存了多组位置。我们可以多次按 g; 命令,每次它都会把我们带到改变列表中较早的一个位置,而 . 则总是把我们带到改变列表的最后一项。

​ ``^ 标记指向上次插入的位置,它比上次修改的位置更具体一点。如果我们先退出插入模式,接着又在文档中四处移动,然后,当我们又想快速回到退出的地方继续编辑时,用 **gi (g前缀 i插入**)命令就行了。此命令会用 ^ 标记恢复光标位置,并切换到插入模式,这真是省时省力的好办法!

Tip 57 Jump to the Filename Under the Cursor

跳转到光标下的文件

Vim 将文档中的文件名视为一种超链接。如果配置正确, 我们可以使用 gf 命令转到光标下的文件名。

指定文件的扩展名

suffixesadd 选项允许我们指定一个或多个文件扩展名,当 Vim 用 gf 命令搜寻文件名时,会尝试使用这些扩展名。

1
:set suffixesadd+=.rb      //添加.rb的文件扩展名

每次用 gf 命令时, Vim 都会在跳转列表中增添一条记录,因此我们总是可以用** 命令返回原处**。

指定要搜寻的目录

​ 引用的文件不位于工作目录的相对路径中,要引用第三方库的时候,需添加路径path。我们可以把它配置成一个以逗号分隔的目录列表。 当使用 gf 命令时, Vim 会检查path列表中的每一个目录,看看该目录中是否包含一个匹配光标下文本的文件名。path设置也会作用域 :find 命令

1
2
3
4
5
6
7
8
9
10
11
:set path+=app/**   //添加路径

:set path? //查看路径

❮ path=.,/usr/include, ,

. : 表示 当前文件所在目录

/usr/include : 这个很明显了

空 : 两个 , , 中间的空 就表示当前工作目录 (注意,一个文件所在,一个当前工作)

Tip 58 Snap Between Files Using Global Marks

用全局位置标记在文件间快速跳转

标记语法 m{letter}

  • m[a-z] - 小写字母的, 创建一个可以在当前文件(缓冲区)进行跳转的标签
  • m[A-Z] - 大写字母的, 创建一个可以全局的标签, 可以在多个文件之前跳转

跳转语法 `{letter}

编码之前设置全局标记,全局标记在多个文件切换时非常有用。