安装
Vim大概有如下几个版本:vim、vim-athena、vim-gnome、vim-gtk、vim-gtk3、vim-noxvim-tiny。它们中有编译进最小功能的 Vim 包(vim-tiny),有较全功能的文本界面 Vim 包(vim-nox),有适用于老的 X-Window 界面的版本(vim-athena),有适用于 KDE 环境的 GTK2 版本(vim-gtk),等等。
对于Ubuntu而言,一般情况下sudo apt install vim-gtk3即可。在 Ubuntu 上,vim 和 gvim 都是指向同一个应用程序的符号链接,且 gvim 的执行效果和 vim -g 相同。所以要启动图像化界面的vim,直接在终端执行gvim即可。
另外,若使用远程软件连接到Linux机器上,需要注意远程终端软件的远程字符集(如 PuTTY 中的“Windows > Translation > Remote character set”)应当设置成 UTF-8。
然后,还可以安装中文版本的帮助文件:
1 | cd ~/.vim |
当然,也可以在这个 Vim 中文文档计划 的下载页面下载 tar 包,然后自行解压到 ~/.vim/pack/my/start 目录下(或 Windows 用户目录下的 vimfiles\pack\my\start 目录下)。
最后,可以使用LANG=zh_CN.UTF-8 vimtutor命令查看Vim教程,可以作为Vim的入门教程。
Vim模式
Vim 有以下四种主要模式:
- 正常(normal)模式(也称为普通模式),缺省的编辑模式;如果不加特殊说明,一般提到的命令都直接在正常模式下输入;在任何其他模式中,都可以通过键盘上的 Esc 键回到正常模式。
- 插入(insert)模式,输入文本时使用;比如在正常模式下键入 i(insert)或 a(append)即可进入插入模式。
- 可视(visual)模式,用于选定文本块;教程中已经提到可以用键 v(小写)来按字符选定,Vim 里也提供其他不同的选定方法,包括按行和按列块。
- 命令行(command-line)模式,用于执行较长、较复杂的命令;在正常模式下键入冒号(:)即可进入该模式;使用斜杠(/)和问号(?)开始搜索也算作命令行模式。命令行模式下的命令要输入回车键(Enter)才算完成。
记住正常模式就是正常情况下你应当处于的模式。
Vim的键描述体例
下面的教程将会使用Vim中的标准键描述方式来讲解。Vim一般使用尖括号来描述特殊的输入序列。
| 尖括号 | 表示 | 显示 |
|---|---|---|
| Esc 键 | ⎋ | |
| 回车键 | ↩ | |
| 空格键 | ␣ | |
| Tab 键 | ⇥ | |
| 退格键 | ⌫ | |
| 删除键 | ⌦ | |
| < | < | |
| 光标上移键 | ⇡ | |
| 光标下移键 | ⇣ | |
| 光标左移键 | ⇠ | |
| 光标右移键 | ⇢ | |
| Page Up 键 | ⇞ | |
| Page Down 键 | ⇟ | |
| Home 键 | ↖ | |
| End 键 | ↘ | |
| 功能键 1 到 12 | “F1”到“F12” | |
| Shift 组合键 | ⇧ | |
| Control 组合键 | ⌃ | |
| Alt 组合键 | ⌥ | |
| Command 组合键 | ⌘ |
例如前面提到的 Esc、Enter、v、V 和 Ctrl-V,按我们现在的描述惯例,以后就会写成 <Esc>、<CR>、v、V 和 <C-V>。
需要强调的一点是,对“<”的特殊解释仅在描述输入时生效。在描述命令行(以:、/、?、$开头)和代码时,写“<CR>”仍表示四个字符,而非回车键。对于命令行详细解释如下:
- 若描述的命令行首是
“:”,表示这是一个输入:开始的 Vim 命令行模式命令(以回车键结束) - 如果行首是
“/”或“?”,表示这是一个输入/或?开始的搜索命令(以回车键结束) - 如果行首是
“$”,表示这是一个在linux shell 命令行上输入的命令(以回车键结束),“$”(和后面的空格)不是命令的一部分,通常后续行也不是命令的一部分,除非行尾有“\”或“^”字符,或行首有“$”字符。
例如“:set ft?<CR>”表示在Vim里面输入:set :ft然后回车;“which vim<CR>”表示在Linux shell中输入which vim然后回车。
此外,当用“:help”描述帮助命令时,你不仅可以在 Vim 里输入这个命令来得到帮助,也可以点击这个帮助的链接,直接在线查看相应的中文帮助页面。
Vim常用命令
光标移动
Vim 里的基本光标移动是通过 h、j、k、l 四个键实现的。(分别是左移、上移、上移、右移)。不过,标准的光标移动键(键盘上的上下左右键)可以在任何模式下使用,而这四个键并不能在插入模式下使用,因此,它们并不构成完全的替代关系。
跳转到行首:0;跳转到行尾:$;跳转到行首的第一个非空白字符:^;w/W以单词为单位的跳转,小写和大写命令的区别在于,小写的跟编程语言里的标识符的规则相似,认为一个单词是由字母、数字、下划线组成的(不严格的说法),而大写的命令则认为非空格字符都是单词(例如hello world,当光标停在了h上,按下w键会跳转到w字母上,这是因为空格不属于后面的world单词)。
cw删除一个单词(c5w删除5个单词);f(find)、t(till)找到下一个(如果在输入它们之前先输入数字 n 的话,那就是下面第 n 个)紧接着输入的字符。两者的区别是,f 会包含这个字符,而 t 不会包含这个字符(例如fi则找到下一个i的位置);
写文字时,可以使用( 和 ) 移到上一句和下一句;{ 和 } 移到上一段和下一段。
gg 和 G 跳转到开头和结尾行(小区别:G是跳转到最后一行的第一个字符,而不是最后一个字符)。
文本修改
c 和 d 配合方向键,可以对文本进行更改。可以认为 c(修改)的功能就是执行 d(删除)然后 i(插入)。
d加动作来进行删除(dd 删除整行);D则相当于d$,删除到行尾。c加动作来进行修改(cc 修改整行);C则相当于c$,删除到行尾然后进入插入模式。s相当于cl,删除一个字符然后进入插入模式;S相当于cc,替换整行的内容。i在当前字符前面进入插入模式;I则相当于^i,把光标移到行首非空白字符上然后进入插入模式。a在当前字符后面进入插入模式;A相当于$a,把光标移到行尾然后进入插入模式。o在当前行下方插入一个新行,然后在这行进入插入模式;O在当前行上方插入一个新行,然后在这行进入插入模式。r替换光标下的字符;R则进入替换模式,每次按键(直到<Esc>)替换一个字符。u撤销最近的一个修改动作;U撤销当前行上的所有修改。
文本对象选择
可以使用 c、d 加动作键对这个动作选定的文本块进行操作(如dj就是删除当前行和下一行,相当于2dd),也可以使用 v 加动作键来选定文本块(以便后续进行操作)。
有几个动作只能在c、d、v、y这样命令之后用,例如基本附加键是 a 和 i。其中,a 可以简单理解为英文单词 a,表示选定后续动作要求的完整内容,而 i 可理解为英文单词 inner,代表后续动作要求的内容的“内部”。
假设有下面的文本内容:if (message == "sesame open")。进一步假设光标停在“sesame”的“a”上,那么:
dw(理解为 delete word)会删除ame␣,结果是if (message == "sesopen")diw(理解为 delete inside word)会删除sesame,结果是if (message == " open")daw(理解为 delete a word)会删除sesame␣,结果是if (message == "open")diW会删除"sesame,结果是if (message == open")daW会删除"sesame␣,结果是if (message == open")di"会删除sesame open,结果是if (message == "")da"会删除"sesame open",结果是if (message ==)di(或di)会删除message == "sesame open",结果是if ()da(或da)会删除(message == "sesame open"),结果是if␣
Vim的选项和配置
根据 Unix 下的惯例,Vim 的配置文件放在用户的主目录下,文件名通常是.vimrc;而它在 Windows 下名字是 _vimrc,也是放在用户主目录下面。最基本的配置文件是这个样子的:
1 | set enc=utf-8 |
这三行采用的是shell编程,完成的功能是:
- 设置编辑文件的内码是 UTF-8(非所有平台缺省,但为编辑多语言文件所必需)
- 设置 Vim 不需要和 vi 兼容(仅为万一起见,目前大部分情况下这是缺省情况)
- 导入 Vim 的示例配置(这会打开一些有用的选项,如语法加亮、搜索加亮、命令历史、记住上次的文件位置,等等)
对于现代 Unix 系统上的 Vim 8,实际上只需要最后一句就足够了。对于现代 Windows 系统上的 Vim 8,中间的这句 set nocompatible 也可以删除。如果你在较老的 Vim 版本上进行配置,那么把这三行全放进去会比较安全。
备份和撤销文件
在示例配置里,Vim 自动设置了下面两个选项:
1 | set backup |
前一个选项使得每次编辑会保留上一次的备份文件,后一个选项使得 Vim 在重新打开一个文件时,仍然能够撤销之前的编辑(undo),这就会产生一个保留编辑历史的“撤销文件”(undofile)了。所以修改文件时会出现结尾为“~”的文件,有文件名后面直接加“~”的,还有前面加“.”后面加“.un~”的。
可以不产生备份文件,但保留跨会话撤销编辑的能力;因为有了撤销文件,备份其实也就没有必要了。同时,把撤销文件放在用户个人的特定目录下,既保证了安全,又免去了其他目录下出现不必要文件的麻烦。
Linux/MacOS下可以在.vimrc文件中写:
1 | set nobackup |
Windows 下可以在_vimrc文件中写:
1 | set nobackup |
无论哪个环境都要自动创建该文件夹,所以可以加上:
1 | if !isdirectory(&undodir) |
中文支持
在windows下,使用vim打开utf-8编码的文件,通常会产生乱码,解决方法为在配置文件_vimrc(用户目录下的)中,添加如下设置:
1 | set fileencodings=utf-8,ucs-bom,cp936,big5 |
vim关于文件编码常用的命令
1 | :set fileencoding 查看文件编码 |
启用backspace
我在Windows的平台下面遇到了backspace退格键不能向左删除的问题,解决方法为在配置文件_vimrc中添加:
1 | set backspace=indent,eol,start |
参考
01|各平台下的 Vim 安装方法:上路前准备好你的宝马
02|基本概念和基础命令:应对简单的编辑任务
03|更多常用命令:应对稍复杂的编辑任务
Windows下,Vim的配置文件(_vimrc)在哪?
解决windows下vim中文乱码
Backspace key not working in Vim/vi

