Skip to content

Vim - 用作 IDE

Vim 可以配置和扩展,使其功能与现代集成开发环境(IDE - Integrated Development Environment)非常相似。本节探讨如何在 Vim 中启用几种类似 IDE 的功能:

  • 语法高亮 (Syntax highlighting),提高代码可读性 (code readability)
  • 智能缩进 (Smart indentation),用于结构化代码 (structured code)
  • 导航代码块 (code blocks) 和匹配对 (matching pairs)
  • 执行外部 Shell 命令 (external shell commands)
  • 使用 ctags 和 cscope 进行代码导航 (Code navigation)
  • 内置自动补全 (auto-completion) 和建议 (suggestions)

语法高亮(Syntax highlighting)是提高代码可读性(code readability)的关键功能,它以不同的颜色和样式显示代码(code)的不同部分(关键字 keywords、注释 comments、字符串 strings)。要在 Vim 中启用语法高亮,使用命令:

:syntax on

例如,编辑 C 文件(C file)时,int、void、if 和 for 等关键字(keywords)将与变量名(variable names)、注释(comments)或字符串(strings)显示为不同的颜色,使代码(code)更容易视觉解析。

为确保语法高亮(syntax highlighting)根据文件类型(file type)自动启用,你可以将以下内容添加到你的 Vim 配置文件(Vim configuration file)(通常是 ~/.vimrc 或 Neovim 的 ~/.config/nvim/init.vim)中:

filetype plugin indent on
syntax on

要禁用当前会话(current session)的语法高亮(syntax highlighting),使用:

:syntax off

禁用语法高亮(syntax highlighting)后,所有文本通常会显示为单一颜色,这使得区分代码元素(code elements)变得更加困难。

适当的缩进(indentation)使代码(code)更具可读性和可维护性。Vim 提供了几种自动和智能缩进(indentation)的选项:

:set autoindent " Copies indent from the current line to the new line
:set smartindent " Enables smarter indentation for C-like languages (e.g., after '{')

对于 C 和类似 C 的语言(C-like languages),你也可以使用特定于 C 风格的缩进(C-style specific indentation):

:set cindent

一种更通用的方法是启用文件类型特定的缩进(filetype-specific indentation),它根据当前文件的类型加载缩进规则(indentation rules)。将其添加到你的 Vim 配置文件中:

filetype indent on

这个命令与 filetype plugin on 一起,允许 Vim 自动为各种编程语言(programming languages)应用适当的缩进设置(indentation settings)。

导航匹配对 (Matching Pairs)(跳转 Bounce)

Section titled “导航匹配对 (Matching Pairs)(跳转 Bounce)”

在许多编程语言(programming languages)中,使用括号 ()、方括号 [] 和花括号 {} 来分组语句(statements)或定义块(blocks)。Vim 的 % 命令对于在这些匹配对(matching pairs)之间导航非常有价值。

将光标(cursor)放在一个开放或关闭的括号、方括号或花括号上,然后在普通模式(Normal mode)下按下 %。Vim 将跳转到其对应的匹配项。再次按下 % 将跳回。这对于 C 风格注释 /* ... */ 和某些文件类型(filetypes)中的预处理器条件语句(preprocessor conditionals)如 #if/#endif 也有效。

例如,如果你的光标(cursor)位于函数(function)开头的开放花括号 { 上,按下 % 将把光标移动到函数末尾对应的关闭花括号 } 上。

Vim 允许你在不离开编辑器(editor)的情况下执行外部 Shell 命令(external shell commands)。

要执行单个 Shell 命令:

:!command

将 command 替换为你实际要运行的命令。例如,要查看当前工作目录(current working directory):

:!pwd

要将命令的输出(output)直接插入到你缓冲区(buffer)中当前光标位置(current cursor position):

:read !command

例如,:read !date 将把当前日期和时间(current date and time)插入到你的文件(file)中。

如果你需要运行多个 Shell 命令(shell commands)或想要一个交互式 Shell 会话(interactive shell session),使用:

:shell

这个命令会打开一个新的 Shell 会话(shell session)。完成后,在 Shell 中输入 exit 返回到你的 Vim 会话(Vim session)。

代码导航 (Code Navigation):ctags 和 cscope

Section titled “代码导航 (Code Navigation):ctags 和 cscope”

对于大型项目(projects),快速导航代码(code)(例如,跳转到函数定义 function definitions,查找函数 function is called 的位置)至关重要。ctags 和 cscope 是在 Vim 中提供此功能的经典工具(tools)。

ctags(最好是支持更多语言的 Universal Ctags)生成一个索引文件(index file)(通常名为 tags),其中包含在源文件(source files)中找到的语言对象(language objects)。Vim 可以使用此文件快速跳转到定义(definitions)。

  1. 安装 Universal Ctags:使用你的系统包管理器(system’s package manager)(例如,Debian/Ubuntu 上使用 sudo apt install universal-ctags,macOS 上使用 brew install universal-ctags)。
  2. 生成标签(tags):在终端(terminal)中导航到你的项目根目录(project’s root directory),然后运行:
  3. $ ctags -R .
  4. 此命令递归地(recursively)扫描当前目录(.)中的所有文件(files),并生成一个 tags 文件。
  5. 配置 Vim:确保 Vim 知道在哪里找到 tags 文件。你可以明确设置它:
  6. :set tags=./tags,tags;/向上搜索
  7. 添加 tags;/ 允许 Vim 在当前目录中搜索 tags 文件,然后在目录树(directory tree)中向上搜索,这非常方便。
  8. 导航:将光标(cursor)移动到函数名(function name)、变量(variable)或类(class)上,按下 Ctrl + ] 跳转到其定义(definition)。使用 Ctrl + T 返回到上一个位置(previous location)。如果一个标签(tag)有多个匹配项(matches),你也可以使用 :tag <name> 跳转到特定的标签,或使用 g<Ctrl+]>。

cscope 提供了比 ctags 更高级的代码搜索(code searching)功能,例如查找符号(symbol)的使用位置,哪些函数(functions)调用了另一个函数等。

  1. 安装 cscope:使用你的系统包管理器(system’s package manager)(例如,Debian/Ubuntu 上使用 sudo apt install cscope,macOS 上使用 brew install cscope)。
  2. 生成 cscope 数据库(database):在你的项目根目录(project’s root directory)中,运行:
  3. $ cscope -b -R -k
  4. 此命令递归地(recursively)(-R)、在后台(background)(-b)并以内核模式(kernel mode)(-k,禁用使用 /usr/include)构建 cscope.out 数据库。
  5. 将 cscope 连接到 Vim:将 cscope 数据库(database)添加到 Vim:
  6. :cs add cscope.out
  7. 你可能希望将此命令添加到你的 .vimrc 中,或者使用插件(plugin)自动管理 cscope 连接。
  8. 使用 cscope 查询(Query):Vim 提供了命令来查询 cscope 数据库(database)。例如:
  9. 你可以为这些命令创建映射(mappings)以便更轻松地访问。更多详情,请参阅 :help cscope。

注意:对于许多现代编程语言(modern programming languages),语言服务器协议(LSP - Language Server Protocol)客户端(通常通过 Vim 插件 plugin 集成)提供更复杂的代码导航(code navigation)、自动补全(auto-completion)和诊断(diagnostics)。虽然 LSP 正在成为标准,但 ctags 和 cscope 仍然是快速、轻量级且有效的工具(tools),特别是对于 C/C++ 以及 LSP 服务器(LSP servers)可能不可用或资源开销较大的项目(projects)。

自动补全 (Auto-completion) 和建议 (Suggestions)

Section titled “自动补全 (Auto-completion) 和建议 (Suggestions)”

Vim 提供了几种内置的自动补全(auto-completion)机制,可以显著提高编码(coding)速度。这些命令通常在插入模式(Insert Mode)下使用:

  • Ctrl + N 或 Ctrl + P: 关键字补全(Keyword completion)。扫描当前缓冲区(current buffer)和其他已打开的缓冲区(open buffers),查找与你正在键入的词匹配的单词。Ctrl+N 查找下一个匹配项(next match),Ctrl+P 查找上一个匹配项(previous match)。
  • Ctrl + X Ctrl + L: 整行补全(Whole line completion)。建议整行以完成当前行(lines)。
  • Ctrl + X Ctrl + F: 文件名补全(File name completion)。帮助完成文件路径(file paths)和文件名(names)。
  • Ctrl + X Ctrl + O: Omni 补全(Omni completion)。提供特定语言(language-specific)、上下文感知(context-aware)的补全。这需要 filetype plugin on,并且通常需要你使用的语言对应的 ftplugin。

虽然 Vim 的内置补全功能相当强大,但 Vim 生态系统(Vim ecosystem)提供了许多插件(plugins)(例如,coc.nvim、YouCompleteMe 或基于 LSP 的补全器 LSP-based completers),它们提供更高级的、类似 IDE 的补全功能(IDE-like completion features),包括模糊查找(fuzzy finding)、代码片段集成(snippet integration)和详细的签名帮助(detailed signature help)。探索这些插件可以进一步增强你的 Vim 体验(Vim experience)。

请记住在插入模式(Insert Mode)下使用这些命令。Vim 通常会弹出一个菜单(pop-up menu)显示建议(suggestions),你可以使用 Ctrl+N 和 Ctrl+P(或在某些配置中使用箭头键 arrow keys)导航,然后按 Enter 或 Ctrl+Y 选择。