Vim
Vim是一个终端文本编辑器。作为vi的一个扩展版本,它具有以下附加功能:语法高亮,全面的帮助系统,本地脚本(Vim script),文本选择的可视模式和文件比较(vimdiff(1))。以及有限功能的工具,如 rview(1) 和 rvim(1)。
安装[编辑 | 编辑源代码]
安装下面两个软件包中的一个:
用法[编辑 | 编辑源代码]
有关如何使用Vim的基本概述,请遵循vim教程运行vimtutor(控制台版本)或gvimtutor(图形界面版本)。
Vim包含了一个广泛的帮助系统,可以用:h subject
命令来访问。subject可以是命令,配置选项,热键绑定,插件等。使用:h
命令(不带任何subject)来获取帮助系统的相关信息以及在不同的主题之间切换。
配置[编辑 | 编辑源代码]
Vim的用户特定配置文件位于主目录~/.vimrc
,当前用户的Vim文件位于~/.vim/
;全局配置文件为/etc/vimrc
,全局Vim文件是位于/usr/share/vim/
的 defaults.vim
和 archlinux.vim
。
对于 gVim,用户特定的配置文件为 ~/.gvimrc
,全局配置文件为 /etc/gvimrc
。
- 常用的功能,如语法高亮在
defaults.vim
中启用,当没有~/.vimrc
时加载。将let skip_defaults_vim=1
添加到/etc/vimrc
以完全禁用加载defaults.vim
。[1]。或者,若要启用defaults.vim
,即便~/.vimrc
存在,请参见 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 操作还会将被拉取的文本复制到 "*
寄存器(但是,delete, change 和 put 操作仍然只在 "+
寄存器上操作)。
欲见更多信息,请参见 :help 'clipboard'
。
可以为 clipboard
功能设置其他值。您可以使用 :help clipboard-unnamed
进入帮助主题,查找可为此功能设置的第一个有效值,然后查找所有其他有效值的帮助。
语法高亮[编辑 | 编辑源代码]
启用语法高亮(Vim支持许多语言的语法高亮):
:filetype plugin on :syntax on
自动换行显示[编辑 | 编辑源代码]
wrap
默认是开启的,这会使Vim在一行文本的长度超过窗口宽度时,自动将放不下的文本显示到下一行。wrap
只会影响文本的显示,文本本身不会被改变。
自动换行显示一般在该行窗口能容纳下的最后一个字符发生,即使刚好是在一个单词的中间。更为智能的自动换行显示可以用linebreak
来控制。当用set linebreak
开启时,自动换行发生在字符串选项breakat
中列出来的字符之后。默认情况下,breakat
包含空格和一些标点符号(参考:help breakat
)。
被换行的字符一般在下一行的开头开始显示,没有任何相应的缩进。breakindent 指示Vim在换行时将缩进考虑在内,因而新行将与原本要显示的文本有相同的缩进。breakindent
行为可以用breakindentopt
选项来调整,比如说在Python文件中,新行将在原本缩进的基础上再缩进4个空格(更多细节参考:help breakindentopt
):
autocmd FileType python set breakindentopt=shift:4
使用鼠标[编辑 | 编辑源代码]
Vim可以使用鼠标,但只在某些终端上起作用:
要开启这个功能,将下面这行代码加入~/.vimrc
中:
set mouse=a
mouse=a
选项在 defaults.vim
中已被设置。
跨行移动光标[编辑 | 编辑源代码]
默认情况下,在行首按←
或者在行尾按→
不能将光标移动至上一行或下一行。
如要改变默认行为,将set whichwrap=b,s,<,>,[,]
加至你的~/.vimrc
文件中。
文件合并[编辑 | 编辑源代码]
Vim自带了一个文件差异编辑器(一个用来显示多个文件之间的差异还可以方便的将其合并的程序)。用vimdiff来启动它——指定所需文件即可:vimdiff file1 file2
。以下是vimdiff-specific命令的清单。
行为 | 快捷键 |
---|---|
下一差异 | ]c
|
上一差异 | [c
|
差异导入 | do
|
差异导出 | dp
|
打开折叠 | zo
|
关闭折叠 | zc
|
重新扫描文件 | :diffupdate
|
窗口切换 | Ctrl+w+w
|
技巧和建议[编辑 | 编辑源代码]
显示行号[编辑 | 编辑源代码]
使用:set number
来显示行号。默认显示绝对行号,可用:set relativenumber
开启相对行号。当两种显示方式同时开启时,当前行显示绝对行号,其它行显示相对行号。
使用:line number
or line numbergg
跳转到指定行号。跳转都记录在一个跳转列表中,更多细节参考:h jump-motions
。
拼写检查[编辑 | 编辑源代码]
Vim有拼写检查的功能,用下面的命令开启:
set spell
Vim默认只安装了英语字典(在 /usr/share/vim/vim82/spell/
)。更多字典可以通过搜索 vim-spell
在官方软件仓库中找到。其他字典可以在Vim的FTP archive中找到。把下载的字典文件存入~/.vim/spell/
中,并使用以下命令启用::setlocal spell spelllang=en_us
(将en_us
换成所需的字典的名称)。
行为 | 快捷键 |
---|---|
下一个拼写错误 | ]s
|
上一个拼写错误 | [s
|
拼写纠正建议 | z=
|
拼写正确,添加到用户正确字典 | zg
|
在会话中当作正确拼写 | zG
|
拼写错误,添加到用户错误字典 | zw
|
在会话中当作正确拼写 | zW
|
重新进行拼写检查 | :spellr
|
- 如果需要针对两种语言进行拼写检查(例如英语与德语),在
~/.vimrc
或/etc/vimrc
中添加set spelllang=en,de
并重启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。一定要编辑这一行(特别是*.txt
),以包括用于拼写检查的文件类型。
- 如果想只对LaTeX(或TeX)文档起用拼写检查,在
~/.vimrc
或/etc/vimrc
添加autocmd FileType tex setlocal spell spelllang=en_us
,重启Vim即可。至于非英语语言,替换上述语句中的en_us
为相应语言代码即可。
保存运行状态[编辑 | 编辑源代码]
通常,退出 vim
会丢弃所有不重要的信息,如打开的文件、命令行历史记录、删除的文本等。可以通过以下方式配置保存这些信息。
viminfo 文件[编辑 | 编辑源代码]
viminfo
文件可用于存储命令行历史、查找字符串历史、输入行历史、寄存器内容、文件标记、文件内的位置标记、最后的查找/替换模式(在会话中使用 n
和 &
的查找模式)、缓冲区列表以及您可能定义的任何全局变量。要使 viminfo
模式可用,您安装的 vim
版本必须使用 +viminfo
功能进行编译。
通过在 ~/.vimrc
文件中添加特定内容可以配置保存在 viminfo
文件中的内容,以下是一个示例:
set viminfo='10,<100,:100,%,n~/.vim/.viminfo
其中每个参数前面都有一个标识符:
'q : q 是记住的编辑过的文件数 <m : m 为每个寄存器保存的行数 :p : p 是记住的历史命令行数 % : 保存和恢复缓冲区列表 n...: viminfo 文件的完整路径名称(注意,这是一个字面上的 "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可以记录上次打开某一文件时的光标位置,并在下次打开同一文件时将光标移动到该位置。要开启该功能,在配置文件~/.vimrc
中加入以下内容:
augroup resCur autocmd! autocmd BufReadPost * call setpos(".", getpos("'\"")) augroup END
参见 Vim wiki 上的 Restore cursor to file position in previous editing session
用 vim 替代 vi[编辑 | 编辑源代码]
创建一个别名,如下:
alias vi=vim
或者,如果你想输入sudo vi
而得到vim
,安装vi-vim-symlinkAUR,它将移除vi
并用一个符号链接vim
代替。您还可以自己创建这个符号链接,并将其放置在 path 中比 /usr/bin
更高的位置,以使其更为优先。
DOS/Windows回车问题[编辑 | 编辑源代码]
打开MS-DOS或Windows下创建的文本文件时,经常会在每行行末出现一个^M
。这是因为Linux使用Unix风格的换行,用一个换行符(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 作为 pager[编辑 | 编辑源代码]
如果使用脚本,那么 Vim 可以用作 terminal pager,这样您就可以获得各种Vim功能,如颜色方案。
Vim 附带了 /usr/share/vim/vim90/macros/less.sh
脚本,您可以为其创建别名。注意,该脚本不支持 less(1) § OPTIONS 中提到的任何命令行标志。
另外,还有 vimpager包 Vim 脚本。要更改默认 pager,请导出 PAGER
环境变量。注意,并非所有命令行标志都受支持;GitHub上提供了支持的标志列表。
高亮搜索结果[编辑 | 编辑源代码]
为了突出显示在搜索中匹配的第一个字符串,请在 ~/.vimrc
中添加以下行:
set incsearch
为了突出显示在搜索中匹配的所有字符串,在 ~/.vimrc
中添加以下行:
set hlsearch
- 设置
hlsearch
将突出显示所有匹配项,直到进行更多搜索。这种行为可能是不被希望的,因此要在下次搜索之前暂时禁用高亮显示,请运行:nohlsearch
。如果您发现自己经常运行此命令,请考虑将其绑定到按键。 - 当在其他命令(如
s
或g
)中匹配正则表达式时,也会观察到这种行为。
插件[编辑 | 编辑源代码]
向Vim添加插件可以提高您的效率。 插件可以改变Vim的界面,添加新命令,代码完成支持,使用Vim集成其他程序和实用程序,添加对其他语言的支持等等。
安装[编辑 | 编辑源代码]
使用内置包管理器[编辑 | 编辑源代码]
Vim 8增加了原生加载第三方插件的可能性。可以通过在 ~/.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 无关。它本身是一个插件,其功能是作为其他 Vim 插件包管理器。
- Vundle 是现在最流行的 Vim 插件管理器,从 vundleAUR 或 vundle-gitAUR 获取。
- Vim-plug 是一个极简的 Vim 插件管理器,有许多的特性,比如按需插件加载和并行升级,从 vim-plugAUR 或 vim-plug-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
~/.vim/plugin/cscope_maps.vim
中取消下列行的注释来启用 cscope 快捷键:
set timeoutlen=4000 set ttimeout
创建一个文件,该文件包含了你希望 cscope 索引的文件的清单(cscope 可以操作很多语言,下面的例子用于寻找 C/C++ 中的 .c、.cpp和.h 文件):
cd /path/to/projectfolder/ find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files
创建 cscope 将读取的数据文件:
cscope -bq
$CSCOPE_DB
变量指向 cscope.out
文件,并导出。默认快捷键:
Ctrl-\ and c: 查找调用指定函数的函数 d: 查找指定函数调用的函数 e: 查找指定 egrep 模式 f: 查找指定文件 g: 查找指定定义 i: 查找指定文件 #including 的文件 s: 查找指定 C 符号 t: 查找指定的字符串
可随意改变这些快捷键。
#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运行缓慢[编辑 | 编辑源代码]
GTK 3 GUI 下 vim 可能比 GTK 2 下运行缓慢(参阅 FS#51366)。可安装gvim-gtk2AUR来避免该问题。
参阅[编辑 | 编辑源代码]
官方资源[编辑 | 编辑源代码]
教程[编辑 | 编辑源代码]
- vim 入门教程
- 中文版《A Byte of Vim》
- vi参考指南
- vi-Vim 图解教程
- Vim 简介与教程
- Open Vim - Vim 学习工具集合
- Vim 渐进式教程
- 学习 Vim 在 2014
- 有效率进行文本编辑的七个习惯
- 基本 Vim 技巧
视频[编辑 | 编辑源代码]
- Vimcasts - .ogg 格式的视频教程。
- Vim Tutorial Videos - 从入门到精通,各种视频教程
速查表[编辑 | 编辑源代码]
- 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/色彩方案
- 基础 vimrc
- Usevim