Skip to content

Vim - 技巧与窍门

在对 Vim 有了基本了解后,让我们探索一些技巧与窍门来提高您的工作效率。本节介绍了一些常见任务的实用技术。

  • 转换空格为制表符,反之亦然
  • 高亮显示拼写错误的单词
  • 单词补全
  • 在 Insert 模式下复制相邻行的字符
  • 代码缩进
  • 更改文件格式(行尾)

管理空白(空格 vs 制表符)对于代码一致性至关重要。Vim 提供了控制此行为的设置。

要使 Vim 在您按下 Tab 键时插入空格(对于新编写的代码):

:set expandtab

要定义一个制表符字符应代表多少个空格以及自动缩进的宽度(通常设置为 2 或 4):

:set tabstop=4
:set shiftwidth=4

在根据需要设置 expandtab、tabstop 和 shiftwidth 后,要将当前文件中的现有制表符字符转换为空格:

:retab

最佳实践是将这些设置放入您的 ~/.vimrc(或等效文件)中,以使其自动应用。对于项目特定的设置,可以考虑使用 EditorConfig 文件或 Vim 的本地 vimrc 功能(:help exrc)。

要使 Vim 在您按下 Tab 键时使用实际的制表符字符,并将当前文件中现有的前导空格转换为制表符:

:set noexpandtab
:retab!

:retab! 中的 ! 很重要;它告诉 Vim 将空格转换回制表符。请确保 tabstop 和 shiftwidth 根据您期望的制表符宽度进行了适当设置。

Vim 内置了拼写检查器。要为当前缓冲区启用它:

:set spell

拼写错误的单词将被高亮显示。您可以设置拼写检查的语言,例如,美式英语:

:set spelllang=en_us

常用拼写检查命令(在 Normal 模式下):

  • ]s - 移动到下一个拼写错误的单词。
  • [s - 移动到上一个拼写错误的单词。
  • z= - 建议光标下单词的更正。
  • zg - 将光标下单词添加到词典(正确单词)。
  • zw - 将光标下单词标记为错误单词(错误单词)。

例如,如果单词 “mispelled” 被高亮显示,将光标移动到它上面并按下 z= 将显示一个建议列表,如 “misspelled”。

Vim 提供了基本的内置单词补全功能。在 Insert 模式下,输入一个单词的开头部分,然后按下:

  • Ctrl + p - 在文件中向后补全匹配项。
  • Ctrl + n - 在文件中向前补全匹配项。

如果找到多个匹配项,您可以使用 Ctrl + p 或 Ctrl + n 再次按下进行循环选择。这种类型的补全会扫描当前缓冲区和其他已打开的缓冲区中匹配的单词。

对于更高级的、上下文感知的代码补全,现代的 Vim 和 Neovim 设置通常利用 Language Server Protocol (LSP) 客户端和补全引擎,如 nvim-cmp (适用于 Neovim) 或 coc.nvim。

在 Insert 模式下复制相邻行的字符

Section titled “在 Insert 模式下复制相邻行的字符”

在 Insert 模式下,您可以复制光标当前位置正上方或正下方行中的字符:

命令 (Insert 模式)描述
Ctrl + y插入正上方行中与光标处于同一列的字符。
Ctrl + e插入正下方行中与光标处于同一列的字符。

这些命令对于在不离开 Insert 模式的情况下快速垂直复制单个字符很有用。例如,如果您有:

Lnem ipsum
Lrem ipsum

并且您的光标在 Insert 模式下位于第二行的 ‘Lrem’ 中的 ‘r’ 上。按下 Ctrl + y 将插入 ‘n’,将 ‘Lrem’ 变为 ‘Lnem’。

Vim 可以帮助您根据特定语言规则或通用设置进行代码缩进。

启用基于文件类型的缩进(强烈推荐,放入您的 ~/.vimrc 中):

filetype plugin indent on

常用缩进命令(在 Normal 模式下):

  • >> - 增加当前行缩进。
  • << - 减少当前行缩进。
  • =% - 重新缩进由匹配的括号、花括号等包围的代码块(光标必须位于其中一个分隔符上)。
  • =i{ or =a{ - 重新缩进花括号内的 ‘inner’ 或 ‘a’ 代码块。
  • gg=G - 重新缩进整个文件。

例如,如果您有一段缩进不规范的 Python 代码:

def my_function():
print("Hello")
print("World")

将光标放在函数内的任意位置并使用 gg=G(如果 Python 的缩进设置正确)将将其格式化为:

def my_function():
print("Hello")
print("World")

不同的操作系统使用不同的行尾字符(例如,Unix/Linux/macOS 使用 LF,Windows 使用 CRLF)。Vim 可以检测并转换这些格式。

检查当前文件的格式:

:set fileformat?

更改当前缓冲区的行文件格式(这仅设置保存时使用的格式):

  • 对于 Unix/Linux/macOS (LF)::set fileformat=unix
  • 对于 Windows (CRLF)::set fileformat=dos
  • 对于旧版 Mac (CR - 现在很少使用)::set fileformat=mac

设置所需的 fileformat 后,保存文件(:w)将使用新的行尾写入。例如,将文件转换为 Unix 行尾格式:

:set fileformat=unix
:w

您还可以配置 Vim 使用 :set fileformats=unix,dos,mac 自动检测文件格式(通常这是默认设置)。