跳转至内容

Vim

来自 ArchWiki

Vim 是一款 vi 风格的终端文本编辑器。它是 vi 的一个扩展版本,增加了额外的功能,包括语法高亮、全面的帮助系统、原生脚本(Vim script)、用于文本选择的可视模式、文件比较(vimdiff(1))以及功能受限的工具,如 rview(1)rvim(1)

安装

安装以下软件包之一

  • vim — 支持 PythonLuaRubyPerl 解释器,但不支持 GTK/X
  • gvim — 还提供与上述 vim 包相同的功能,并支持 GTK/X。
  • vim 包在编译时未包含 Xorg 支持;特别是缺少 +clipboard 功能,因此 Vim 将无法与 primaryclipboard 选择缓冲区进行操作。gvim 包还提供了支持 +clipboard 功能的 Vim 命令行版本。
  • 非官方仓库 herecura 还提供了多个 Vim/gVim 变体:vim-clivim-gvim-commonvim-gvim-gtk3vim-rtvim-tiny

用法

有关如何使用 Vim 的基本概述,请通过运行 vimtutor(终端版本)或 gvimtutor(图形版本)来遵循 Vim 教程

Vim 包含一个广泛的帮助系统,可以通过 :h 主题 命令访问。主题包括命令、配置选项、按键绑定、插件等。使用 :h 命令(不带任何主题)可获取有关帮助系统和主题跳转的信息。

配置

Vim 的用户特定配置文件位于主目录:~/.vimrc,当前用户的 Vim 文件位于 ~/.vim/ 内部。全局配置文件位于 /etc/vimrc。全局 Vim 文件,如 defaults.vimarchlinux.vim,位于 /usr/share/vim/ 内部。

从 9.1.0327 版本开始,Vim 采用 freedesktop XDG Base Directory Specification:这意味着,您可以将配置文件放在 ~/.config/vim/ 下,这样 Vim 就不会弄乱您的主目录了。

对于 gVim,用户特定的配置文件位于 ~/.gvimrc,全局配置文件位于 /etc/gvimrc

  • defaults.vim 中启用了常见的行为,例如语法高亮,它在没有 ~/.vimrc 时被加载。在 /etc/vimrc 中添加 let skip_defaults_vim=1 可以完全禁用 defaults.vim 的加载。[1]。或者,要在存在 ~/.vimrc 时也启用 defaults.vim,请在 vim 中查看 :h defaults
  • gVim 加载 VimgVim 的配置文件,而 Vim 只加载 Vim 的配置文件。

剪贴板

Vim 命令,如 :yank:put,通常与未命名寄存器 "" 一起操作。如果 +clipboard 功能可用且其值包含 unnamed,则 Vim 的 yank、delete、change 和 put 操作将使用剪贴板寄存器 "* 而不是未命名寄存器,后者是 X 中的 PRIMARY 缓冲区。

要更改默认寄存器,您可以 :set clipboard=unnamedplus 来使用 "+ 寄存器。"+ 剪贴板寄存器对应于 X 中的 CLIPBOARD 缓冲区。需要注意的是,clipboard 选项可以设置为逗号分隔的值。如果您 :set clipboard=unnamedplus,unnamed,那么 yank 操作还会将 yanked 文本复制到 "* 寄存器,以及 "+ 寄存器(然而,delete、change 和 put 操作仍只操作 "+ 寄存器)。

有关更多信息,请参阅 :help 'clipboard'clipboard 功能还有其他可以设置的值。您可以使用 :help clipboard-unnamed 跳转到该功能第一个有效设置值的主题,然后是所有其他有效值的帮助。

提示
  • 可以创建自定义的复制和粘贴操作快捷方式。例如,参见 [2],用于绑定 Ctrl+cCtrl+vCtrl+x
  • X 剪贴板会在 Vim 退出时刷新。为了使 Vim 选择在 X 剪贴板中持久存在,您需要一个 剪贴板管理器。或者,您可以将 autocmd VimLeave * call system("echo -n $'" . escape(getreg(), "'") . "' | xsel --input --clipboard") 添加到您的 .vimrc(需要 xsel 包)。
  • 从 9.1.1485 版本开始,具有系统剪贴板功能的构建也包括对 Wayland 的原生剪贴板支持。

语法高亮

要为多种编程语言启用语法高亮

:filetype plugin on
:syntax on

缩进

本文章或章节需要扩充。

原因:描述 autoindentsmartindent 选项。(在 Talk:Vim 中讨论)

可以使用以下方式加载特定文件类型的缩进文件

:filetype indent on

视觉换行

wrap 选项默认开启,它指示 Vim 在行长超过窗口宽度时换行,以便行的其余部分显示在下一行。wrap 选项仅影响文本的显示方式,文本本身不会被修改。

换行通常发生在最后一个能容纳在窗口中的字符之后,即使它在单词中间。更智能的换行可以通过 linebreak 选项控制。当使用 set linebreak 启用它时,换行发生在 breakat 字符串选项列出的字符之后,该选项默认包含空格和一些标点符号(请参阅 :help breakat)。

换行的行通常显示在下一行的开头,而不考虑任何缩进。breakindent 选项指示 Vim 在换行长行时考虑缩进,以便换行后的行保持与上一行相同的缩进。breakindent 的行为可以通过 breakindentopt 选项进行微调,例如,对于 Python 文件将换行后的行再向右偏移四个空格(有关详细信息,请参阅 :help breakindentopt)。

autocmd FileType python set breakindentopt=shift:4

使用鼠标

Vim 具有利用鼠标的能力,但它仅适用于某些终端。

要启用此功能,请将此行添加到 ~/.vimrc

set mouse=a

mouse=a 选项在 defaults.vim 中设置。

注意 如果可以访问 X 服务器,复制/粘贴将使用 "* 寄存器,请参见 #剪贴板 部分。通过按住 Shift 键 仍然可以使用 xterm 的鼠标按钮处理。

使用箭头键遍历换行符

默认情况下,在行首按下 Left 或在行尾按下 Right,光标不会移到上一行或下一行。

可以通过将 set whichwrap=b,s,<,>,[,] 添加到您的 ~/.vimrc 文件中来更改默认行为。

合并文件

Vim 包含一个 diff 编辑器(一个显示两个或多个文件之间差异并方便合并它们的程序)。使用 vimdiff 来运行 diff 编辑器 — 只需为其指定几个文件:vimdiff file1 file2。以下是 vimdiff 特有命令的列表。

动作 快捷键
下一个更改 ]c
上一个更改 [c
diff 获取 do
diff 放入 dp
展开折叠 zo
折叠 zc
重新扫描文件 :diffupdate

技巧与提示

行号

要显示行号列,请使用 :set number。默认显示绝对行号,可以使用 :set relativenumber 启用相对行号。同时设置两者可以启用混合行号 — 当前行是绝对的,而其他行是相对的。

可以使用 :行号行号gg 跳转到特定行。跳转会保存在跳转列表中,有关详细信息,请参阅 :h jump-motions

拼写检查

Vim 具有进行拼写检查的能力,通过输入以下命令启用

set spell

默认情况下,仅安装英语字典(位于 /usr/share/vim/vim82/spell/)。更多字典可以在 官方仓库 中通过搜索 vim-spell 找到。其他字典可以放在 ~/.vim/spell/ 文件夹中,并使用命令启用::setlocal spell spelllang=en_us(将 en_us 替换为所需字典的名称)。

动作 快捷键
下一个拼写错误 ]s
上一个拼写错误 [s
拼写建议 z=
拼写正确,添加 zg
拼写正确,会话 zG
拼写错误,添加 zw
拼写错误,会话 zW
拼写重复整个文件 :spellr
提示
  • 要用两种语言(例如英语和德语)启用拼写检查,请将 set spelllang=en,de 添加到您的 ~/.vimrc/etc/vimrc 中,然后重新启动 Vim
  • 您可以通过使用 FileType 插件和自定义文件类型检测规则来为任意文件类型(例如 .txt)启用拼写检查。要为任何以 .txt 结尾的文件启用拼写检查,请创建文件 /usr/share/vim/vimfiles/ftdetect/plaintext.vim,并将行 autocmd BufRead,BufNewFile *.txt set filetype=plaintext 插入到该文件中。接下来,将行 autocmd FileType plaintext setlocal spell spelllang=en_us 插入到您的 ~/.vimrc/etc/vimrc 中,然后重新启动 Vim。或者,也可以简单地将行 autocmd BufRead,BufNewFile *.txt setlocal spell 插入到您的 ~/.vimrc/etc/vimrc 中,然后重新启动 Vim。请务必编辑此行(特别是 *.txt)以包含意图进行拼写检查的文件类型。
  • 要仅为 LaTeX(或 TeX)文档启用拼写检查,请将 autocmd FileType tex setlocal spell spelllang=en_us 添加到您的 ~/.vimrc/etc/vimrc 中,然后重新启动 Vim

保存运行时状态

通常,退出 vim 会丢弃所有非必要信息,例如打开的文件、命令行历史记录、yanked 文本等。可以通过以下方式配置保留这些信息。

viminfo 文件

viminfo 文件还可以用于存储命令行历史记录、搜索字符串历史记录、输入行历史记录、寄存器内容、文件标记、文件内的位置标记、最后搜索/替换模式(可在搜索模式下使用 n& 在会话中使用)、缓冲区列表以及您可能定义的任何全局变量。要使用 viminfo 模式,您安装的 vim 版本必须使用 +viminfo 功能进行编译。

通过在您的 ~/.vimrc 文件中添加(例如)以下内容来配置将在 viminfo 文件中保留的内容

set viminfo='10,<100,:100,%,n~/.vim/.viminfo

其中每个参数前面都有一个标识符

'q  : q, number of edited file remembered
<m  : m, number of lines saved for each register
:p  : p, number of history cmd lines remembered
%   : saves and restores the buffer list
n...: fully qualified path to the viminfo files (note that this is a literal "n")

请参阅官方 viminfo 文档,了解预先存在的 viminfo 文件在更新当前会话信息(例如,从您正在退出的当前会话的多个缓冲区)时如何修改。

会话文件

会话文件可用于随时间保存任意数量特定会话的状态。您可以为每个感兴趣的会话或项目使用一个单独的会话文件。要使用此模式,您安装的 vim 版本必须使用 +mksession 功能进行编译。

在会话中,:mksession[!] [my_session_name.vim] 会将一个 vim 脚本写入当前目录下的 my_session_name.vim,或者默认写入 Session.vim(如果您选择提供文件名)。可选的 ! 会覆盖同名和同路径的预先存在的会话文件。

可以在启动终端中的 Vim 时恢复 Vim 会话

$ vim -S [my_session_name.vim]

或者在已打开的会话缓冲区中通过运行 Vim 命令来恢复

:source my_session_name.vim

确切保存的内容以及有关会话文件选项的更多详细信息,已在 Vim 文档 中进行了广泛介绍。注释示例可以在 这里找到。

保存光标位置

请参阅 Vim Wiki 上的 恢复上次编辑会话中的文件位置光标

用 Vim 替换 vi 命令

创建一个 vivim别名

或者,如果您希望能够键入 sudo vi 并得到 vim,请安装 vi-vim-symlinkAUR,它将删除 vi 并将其替换为指向 vim 的符号链接。您也可以自己创建此符号链接,并将其放在 PATH 中比 /usr/bin 更靠前的位置,以使其优先。

DOS/Windows 回车符

如果每行末尾都有 ^M,则表示您正在编辑一个在 MS-DOS 或 Windows 中创建的文本文件。这是因为在 Linux 中,换行符仅使用一个换行符(LF),但在 Windows/MS DOS 系统中,它们使用回车符(CR)和换行符(LF)的序列来表示。而这些回车符显示为 ^M

要从文件中删除所有回车符,请执行

:%s/^M//g

请注意,^ 是一个控制字符。要输入控制序列 ^M,请按 Ctrl+v,Ctrl+m

或者,安装 dos2unix 包并运行 dos2unix 文件 来修复文件。

注意 另一种简单的方法是更改 fileformat 设置。set ff=unix 将带有 DOS/Windows 行尾的文件转换为 Unix 行尾。要反向操作,只需发出 set ff=dos 将带有 Unix 行尾的文件转换为 DOS/Windows 行尾。

gVim 窗口底部有空白

当使用配置为忽略窗口大小提示的 窗口管理器时,gVim 会用 GTK 主题背景色填充非功能区域。

解决方案是调整 gVim 在窗口底部预留的空间量。将以下行放入 ~/.vimrc

set guiheadroom=0
注意 如果您将其设置为零,将无法看到底部的水平滚动条。

Vim 作为分页符

脚本允许 Vim 被用作 终端分页符,并享有各种 vim 功能,如颜色主题。要更改默认分页符,请 导出 PAGER 环境变量。

Vim 自带 /usr/share/vim/vim91/macros/less.sh 脚本,您可以为此创建一个 别名。请注意,此脚本不支持 less(1) § OPTIONS 中提到的任何命令行选项。

或者,还有一个 vimpager Vim 脚本。请注意,并非所有命令行选项都受支持;支持的选项列表 可在 GitHub 上找到

分页符和编辑器之间的折衷是 [g]vim -Rgvim -R 等同于 gview)。这将导致编辑器以 readonly 模式打开文件。所有不涉及修改文件的编辑器功能都可正常使用。实际上,readonly 模式可以被显式覆盖,以启用修改。

高亮搜索结果

为了在高亮显示键入搜索时匹配的第一个字符串,请将以下行添加到您的 ~/.vimrc

set incsearch

为了高亮显示键入搜索时匹配的所有字符串,以及搜索执行后,请将以下行添加到您的 ~/.vimrc

set hlsearch
  • 设置 hlsearch 会一直高亮显示所有匹配项,直到进行下一次搜索。此行为可能不被期望,因此要暂时禁用高亮显示直到下次搜索,请运行 :nohlsearch。如果您发现自己经常运行此命令,可以考虑将其绑定到某个键。
  • 在进行涉及正则表达式的其他命令(如 sg)时,匹配 regex 时也会出现此行为。

插件

添加插件到 Vim 可以通过扩展 Vim 的功能来提高您的生产力。插件可以改变 Vim 的界面,添加新命令,启用代码补全支持,将其他程序和实用工具集成到 Vim 中,添加对其他语言的支持等等。

提示 有关流行插件的列表,请参阅 Vim Awesome

安装

使用内置包管理器

Vim 可以原生加载第三方插件。通过将第三方包存储在 ~/.vim/pack 文件夹中来使用此功能。此文件夹的结构与典型的插件管理器略有不同,后者通常为每个插件有一个目录。以下是典型的安装过程和目录结构(以 Tim Pope 的 vim-surround 插件为例)

$ mkdir -p ~/.vim/pack/tpope/start

需要注意的是,~/.vim/pack/tpope 是一个包目录,它被松散地定义为包含一个或多个插件的目录,请参阅 Vim 文档。插件仓库不应下载到此目录。包目录的名称也是任意的。您可以选择将所有插件保留在一个包目录中,或者像我们的示例一样,使用作者的 GitHub 名称 tpope

包目录可以包含以下子文件夹

  • start - 此子文件夹中的插件将在 Vim 启动时自动加载。这是最常用的位置。
  • opt - 此子文件夹中的插件可以通过在 Vim 中发出 :packadd 命令按需加载。

现在进入 start 文件夹并签出插件仓库

$ cd ~/.vim/pack/tpope/start
$ git clone https://tpope.io/vim/surround.git

这将创建一个额外的子文件夹,~/.vim/pack/tpope/start/surround,插件文件将放在这里。

接下来,如果插件包含帮助文件,请更新帮助索引

$ vim -u NONE -c "helptags surround/doc" -c q

启动 Vim 时,插件将自动加载。无需更改 ~/.vimrc,插件特定的选项除外。

使用插件管理器

插件管理器是一个用于安装、管理和更新 Vim 插件的插件。如果您也在 Arch Linux 之外的平台上使用 Vim,并且希望以一致的方式更新插件,这会很有用。

来自 Arch 仓库

vim-plugins 组提供了各种插件。使用 pacman -Sg vim-plugins 命令可以列出可用的软件包,然后您可以使用 pacman 安装它们。

值得关注的插件

cscope

Cscope 是一个用于浏览项目的工具。通过导航到单词/符号/函数并调用 cscope(通常使用快捷键),它可以找到:调用该函数的函数、函数定义等等。

安装 cscope 包。

复制 cscope 默认文件,以便 Vim 自动读取它

mkdir -p ~/.vim/plugin
wget -P ~/.vim/plugin https://cscope.sourceforge.net/cscope_maps.vim

创建一个包含 cscope 要索引文件列表的文件(cscope 可以处理多种语言,但此示例查找 .c.cpp.h 文件,专门用于 C/C++ 项目)

$ cd /path/to/project/dir
$ find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files

创建 cscope 将读取的数据库文件

$ cscope -bq
注意 您必须从该位置浏览您的项目文件,或者设置并导出 $CSCOPE_DB 变量,将其指向 cscope.out 文件。

默认键盘快捷键

 Ctrl-\ and
      c: Find functions calling this function
      d: Find functions called by this function
      e: Find this egrep pattern
      f: Find this file
      g: Find this definition
      i: Find files #including this file
      s: Find this C symbol
      t: Find assignments to

您可以随意更改快捷键。

#Maps ctrl-c to find functions calling the function
nnoremap <C-c> :cs find c <C-R>=expand("<cword>")<CR><CR>

Taglist

Taglist 提供源代码文件结构的概览,并允许您高效地浏览不同编程语言的源代码文件。

安装 vim-taglistAUR 包。

应放入 ~/.vimrc 的有用选项

let Tlist_Compact_Format = 1
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Close_On_Select = 1
nnoremap <C-l> :TlistToggle<CR>

故障排除

gVim 运行缓慢

Vim 的 GTK 3 GUI 可能比 GTK 2 版本慢(参见 FS#51366)。可以安装 gvim-gtk2AUR 作为一种解决方法。

gVim 在 Wayland 下无法启动

默认情况下,gVim 会尝试搜索 X11 显示,如果找不到则回退到终端。要在仅 Wayland 的环境中运行它,请添加 GVIM_ENABLE_WAYLAND=1 环境变量

双向支持

Vim 仍然缺乏完整的双向支持,这取决于终端。

使用 :rightleft 来强制文本对齐。可以使用以下方式将其分配给快捷键

inoremap <C-X> <C-O>:silent if &rl <Bar> set rl! <Bar> else <Bar> set rl <Bar> endif<CR>

Vim 具有自己的字母整形功能。尽管存在一些渲染问题,但它可以在没有字母整形支持的终端(如 alacrittyst)上运行。整形依赖于阿拉伯呈现形式-B(U+FE70–FEFF),因此请确保您的字体支持这些字符。由于没有已知的完全支持这些字符的等宽字体,您需要一个额外的回退字体(例如:vazir-code-fontsAUR 回退到 ttf-dejavu)。有关示例终端字体设置,请参阅 St#Arabic shaping support

但是,如果终端支持字母整形,如 gnome-terminal 和其他基于 libvte 的终端,那么 Vim 和终端字母整形可能会冲突,导致阿拉伯文本混乱。目前,Vim 无法检测终端是否具有字母整形功能。因此,解决方法是手动告知 Vim 将字母整形留给终端,使用 :set notbidi。请注意,由于限制,当 :set rightleft 时,这会导致文本反转。有关更多信息,请参阅 :set arabic

参见

官方

教程

视频

速查表

游戏

配置

颜色