VIM入门

安装

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
2
3
cd ~/.vim
mkdir -p pack/my/start
git clone https://github.com/yianwillis/vimcdoc.git pack/my/start/vimcdoc

当然,也可以在这个 Vim 中文文档计划下载页面下载 tar 包,然后自行解压到 ~/.vim/pack/my/start 目录下(或 Windows 用户目录下的 vimfiles\pack\my\start 目录下)。

最后,可以使用LANG=zh_CN.UTF-8 vimtutor命令查看Vim教程,可以作为Vim的入门教程。

Vim模式

Vim 有以下四种主要模式:

  1. 正常(normal)模式(也称为普通模式),缺省的编辑模式;如果不加特殊说明,一般提到的命令都直接在正常模式下输入;在任何其他模式中,都可以通过键盘上的 Esc 键回到正常模式。
  2. 插入(insert)模式,输入文本时使用;比如在正常模式下键入 i(insert)或 a(append)即可进入插入模式。
  3. 可视(visual)模式,用于选定文本块;教程中已经提到可以用键 v(小写)来按字符选定,Vim 里也提供其他不同的选定方法,包括按行和按列块。
  4. 命令行(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>”仍表示四个字符,而非回车键。对于命令行详细解释如下:

  1. 若描述的命令行首是“:”,表示这是一个输入 : 开始的 Vim 命令行模式命令(以回车键结束)
  2. 如果行首是“/”“?”,表示这是一个输入 /? 开始的搜索命令(以回车键结束)
  3. 如果行首是“$”,表示这是一个在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的位置);

写文字时,可以使用() 移到上一句和下一句;{} 移到上一段和下一段。

ggG 跳转到开头和结尾行(小区别:G是跳转到最后一行的第一个字符,而不是最后一个字符)。

文本修改

cd 配合方向键,可以对文本进行更改。可以认为 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这样命令之后用,例如基本附加键是 ai。其中,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
2
3
set enc=utf-8
set nocompatible
source $VIMRUNTIME/vimrc_example.vim

这三行采用的是shell编程,完成的功能是:

  1. 设置编辑文件的内码是 UTF-8(非所有平台缺省,但为编辑多语言文件所必需)
  2. 设置 Vim 不需要和 vi 兼容(仅为万一起见,目前大部分情况下这是缺省情况)
  3. 导入 Vim 的示例配置(这会打开一些有用的选项,如语法加亮、搜索加亮、命令历史、记住上次的文件位置,等等)

对于现代 Unix 系统上的 Vim 8,实际上只需要最后一句就足够了。对于现代 Windows 系统上的 Vim 8,中间的这句 set nocompatible 也可以删除。如果你在较老的 Vim 版本上进行配置,那么把这三行全放进去会比较安全。

备份和撤销文件

在示例配置里,Vim 自动设置了下面两个选项:

1
2
set backup
set undofile

前一个选项使得每次编辑会保留上一次的备份文件,后一个选项使得 Vim 在重新打开一个文件时,仍然能够撤销之前的编辑(undo),这就会产生一个保留编辑历史的“撤销文件”(undofile)了。所以修改文件时会出现结尾为“~”的文件,有文件名后面直接加“~”的,还有前面加“.”后面加“.un~”的。

可以不产生备份文件,但保留跨会话撤销编辑的能力;因为有了撤销文件,备份其实也就没有必要了。同时,把撤销文件放在用户个人的特定目录下,既保证了安全,又免去了其他目录下出现不必要文件的麻烦。

Linux/MacOS下可以在.vimrc文件中写:

1
2
set nobackup
set undodir=~/.vim/undodir

Windows 下可以在_vimrc文件中写:

1
2
set nobackup
set undodir=~\vimfiles\undodir

无论哪个环境都要自动创建该文件夹,所以可以加上:

1
2
3
if !isdirectory(&undodir)
call mkdir(&undodir, 'p', 0700)
endif

中文支持

在windows下,使用vim打开utf-8编码的文件,通常会产生乱码,解决方法为在配置文件_vimrc(用户目录下的)中,添加如下设置:

1
2
set fileencodings=utf-8,ucs-bom,cp936,big5  
set fileencoding=utf-8

vim关于文件编码常用的命令

1
2
3
:set fileencoding    查看文件编码
:set fileformat 查看文件格式
:set fileencoding=utf-8 转换文件编码为utf-8

启用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

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道