安装
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