Skip to content

Vim - 标记

Vim - 使用标记 (Marks) 快速导航 (Quick Navigation)

Section titled “Vim - 使用标记 (Marks) 快速导航 (Quick Navigation)”

Vim 的标记(marks)功能允许你在文件中设置书签(bookmarks)或路标(waypoints)。这使得你可以快速跳转回文件内的特定位置(locations),甚至跨越不同的文件(files),极大地加快了在大型项目(projects)或复杂文档(documents)中的导航(navigation)速度。

本章包含:

  • 创建本地标记 (local marks) 和全局标记 (global marks)。
  • 跳转到标记 (marks)。
  • 列出现有标记 (marks)。
  • 删除标记 (marks)。

Vim 支持几种类型的标记(marks):

  • 小写标记 (Lowercase marks) (a-z): 局限于单个缓冲区(buffer)(文件)。每个缓冲区可以有自己的一套 26 个小写标记。除非保存在 viminfo 文件中,否则当缓冲区关闭时,这些标记会丢失。
  • 大写标记 (Uppercase marks) (A-Z): 全局的(Global),也称为文件标记(file marks)。它们存储文件(file)以及文件内的位置(position)。如果 viminfo 配置正确,它们会在 Vim 会话之间持续存在。你可以从任何缓冲区(buffer)跳转到文件标记。
  • 数字标记 (Numeric marks) (0-9): 由 Vim 在写入 viminfo 文件时自动设置,存储最近编辑文件中的位置(positions)。标记 0 是上次退出文件中的位置。
  • 特殊标记 (Special marks): 由 Vim 预定义(例如, . 表示上次编辑的位置 last edit,' 表示上次跳转前的位置 position before last jump,< 和 > 表示上次可视选择(last visual selection)的开始/结束位置)。

在普通模式(Normal mode)下创建标记(mark),使用 m 命令,后跟标记字符(mark character)(a-z 用于本地标记 local,A-Z 用于全局标记 global)。

m{mark-character}

示例:

  • ma - 在当前文件的当前光标位置(current cursor position)设置本地标记 ‘a’。
  • mM - 在当前光标位置设置全局标记 ‘M’,并关联当前文件(current file)。

设置标记不会移动光标(cursor)。

设置标记后,你可以使用反引号(`)或单引号(‘)后跟标记字符(mark character)来跳转到该标记。

命令 Command描述 Description
`{mark-character}
(反引号 backtick)
将光标(cursor)移动到标记(mark)设置时的确切行(line)和列(column)。
‘{mark-character}
(单引号 single quote)
将光标移动到标记(mark)设置所在行的开头(第一个非空字符 beginning (first non-blank character))。

示例:

  • `a - 跳转到本地标记 ‘a’ 的确切位置。
  • ‘M - 跳转到全局标记 ‘M’ 所在行的开头(如果该文件当前未打开,可能会打开它)。
  • “ - 跳转到上次跳转(latest jump)前的确切位置(类似于 Ctrl+O,但专门用于上一个位置)。
  • ” - 跳转到上次跳转(latest jump)前所在行的开头。

要查看当前设置的所有标记(本地 local、全局 global 和一些特殊标记 special ones)的列表,使用 :marks 命令:

:marks

这将显示一个列表,显示标记字符(mark character)、行号(line number)、列号(column)和文件名(filename)(尤其是全局标记 global marks)。例如:

mark line col file/text
' 14 0 # Previous jump
a 5 10 print('Hello')
M 73 4 /home/user/project/main.py

你也可以列出特定的标记:

:marks aM

要删除一个或多个标记(marks),使用 :delmarks 命令:

:delmarks {mark-characters}

示例:

  • :delmarks a - 删除本地标记 ‘a’。
  • :delmarks xyz - 删除本地标记 ‘x’、‘y’ 和 ‘z’。
  • :delmarks a-d - 删除本地标记 ‘a’、‘b’、‘c’ 和 ‘d’。
  • :delmarks AB - 删除全局标记 ‘A’ 和 ‘B’。
  • :delmarks! - 删除当前缓冲区(current buffer)的所有小写标记(a-z)。(注意:默认情况下这不会删除全局标记 global marks;请参阅 :help :delmarks! 获取更多细微之处)。

全局标记(Global marks)通常保存在 viminfo 文件(通常是 ~/.viminfo)中。如果你删除一个全局标记,下次 Vim 写入 viminfo 文件时,它也会从其中被移除。

实际应用:标记(Marks)对于以下情况极其有用:

  • 在大型文件(file)中快速导航函数定义(function definition)及其调用位置(call sites)。
  • 在执行复杂操作(complex operation)之前设置一个临时占位符(temporary placeholder),以便轻松返回(return)。
  • 使用全局标记(global marks)在项目(project)中频繁访问的文件(files)之间跳转。