Vim
Vim 是一款 vi 风格的终端文本编辑器。它是 vi 的一个扩展版本,增加了额外的功能,包括语法高亮、全面的帮助系统、原生脚本(Vim script)、用于文本选择的可视模式、文件比较(vimdiff(1))以及功能受限的工具,如 rview(1) 和 rvim(1)。
安装
安装以下软件包之一
用法
有关如何使用 Vim 的基本概述,请通过运行 vimtutor(终端版本)或 gvimtutor(图形版本)来遵循 Vim 教程。
Vim 包含一个广泛的帮助系统,可以通过 :h 主题 命令访问。主题包括命令、配置选项、按键绑定、插件等。使用 :h 命令(不带任何主题)可获取有关帮助系统和主题跳转的信息。
配置
Vim 的用户特定配置文件位于主目录:~/.vimrc,当前用户的 Vim 文件位于 ~/.vim/ 内部。全局配置文件位于 /etc/vimrc。全局 Vim 文件,如 defaults.vim 和 archlinux.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 加载 Vim 和 gVim 的配置文件,而 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 跳转到该功能第一个有效设置值的主题,然后是所有其他有效值的帮助。
语法高亮
要为多种编程语言启用语法高亮
:filetype plugin on :syntax on
缩进
可以使用以下方式加载特定文件类型的缩进文件
: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 中设置。
使用箭头键遍历换行符
默认情况下,在行首按下 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 命令
创建一个 vi 到 vim 的 别名。
或者,如果您希望能够键入 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 -R(gvim -R 等同于 gview)。这将导致编辑器以 readonly 模式打开文件。所有不涉及修改文件的编辑器功能都可正常使用。实际上,readonly 模式可以被显式覆盖,以启用修改。
高亮搜索结果
为了在高亮显示键入搜索时匹配的第一个字符串,请将以下行添加到您的 ~/.vimrc
set incsearch
为了高亮显示键入搜索时匹配的所有字符串,以及搜索执行后,请将以下行添加到您的 ~/.vimrc
set hlsearch
- 设置
hlsearch会一直高亮显示所有匹配项,直到进行下一次搜索。此行为可能不被期望,因此要暂时禁用高亮显示直到下次搜索,请运行:nohlsearch。如果您发现自己经常运行此命令,可以考虑将其绑定到某个键。 - 在进行涉及正则表达式的其他命令(如
s或g)时,匹配 regex 时也会出现此行为。
插件
添加插件到 Vim 可以通过扩展 Vim 的功能来提高您的生产力。插件可以改变 Vim 的界面,添加新命令,启用代码补全支持,将其他程序和实用工具集成到 Vim 中,添加对其他语言的支持等等。
安装
使用内置包管理器
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,并且希望以一致的方式更新插件,这会很有用。
- Vim-plug 是一个极简的 Vim 插件管理器,具有许多功能,如按需加载插件和并行更新,可通过 vim-plugAUR 或 vim-plug-gitAUR 获取。
- Vundle 可通过 vundleAUR 或 vundle-gitAUR 获取。
- pathogen.vim 是一个用于管理 Vim runtimepath 的简单插件,可通过 vim-pathogenAUR 或 vim-pathogen-gitAUR 获取。
- Dein.vim 是一个替换 NeoBundle 的插件管理器,可通过 vim-deinAUR 或 vim-dein-gitAUR 获取。
来自 Arch 仓库
vim-plugins 组提供了各种插件。使用 pacman -Sg vim-plugins 命令可以列出可用的软件包,然后您可以使用 pacman 安装它们。
值得关注的插件
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 具有自己的字母整形功能。尽管存在一些渲染问题,但它可以在没有字母整形支持的终端(如 alacritty 和 st)上运行。整形依赖于阿拉伯呈现形式-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。
参见
官方
教程
- vim 教程与入门
- vi 教程与参考指南
- 图形 vi-Vim 速查表与教程
- Vim 入门与教程
- Open Vim — Vim 学习工具集
- 循序渐进学习 Vim
- 2014 年学习 Vim
- 高效文本编辑的七个习惯
视频
速查表
- https://devhints.io/vim
- https://vim.rtorr.com/ - 移动友好型 Vim 速查表 - 来源
游戏
配置
- nion's
- Amir Salihefendic 的详细配置
- Bart Trojanowski
- Steve Francia 的 Vim 发行版
- Vim Awesome - Vim 插件
- W4RH4WK 的 Vim 配置
- askapache 的快速 vimrc/colorscheme
- 基础 vimrc