Vim (简体中文)
| 摘要 |
|---|
| 广为流行的文本编辑器VIM:安装、配置、使用。 |
Vim 是一个强大的文本编辑器,是 UNIX 文本编辑器 ‘vi’ 的加强版本。
Vim 专攻全键盘操作,与此同时提供了许多功能,例如语法高亮与脚本。Vim 并非如 nano 或 pico 一样的简单编辑器,需要耗费大量的时间才能熟练使用。
Contents |
安装
使用 pacman 安装 vim 软件包(仅命令行版本) ,或者 gvim 软件包(包含图形界面版本和命令行版本)。
使用
这里只介绍基本的 Vim 操作。此外,可以使用 vimtutor 或 gvimtutor 命令学习这些内容,大约花费 25 至 30 分钟。
Vim有以下四个基本的模式:
- 命令行模式:键入的内容被解释为命令。
- 插入模式:键入的内容被插入文件。
- 可视模式:通过键盘选择、剪切、复制文本。
- Ex 模式:使用更多命令(例如:存储文件、替换文本等)。
简单的文本编辑
如果通过以下命令启动Vim:
$ vim somefile.txt
你会看到一个空白文档(假定 somefile.txt 不存在,否则会显示其内容)。现在还不能进行编辑,因为 Vim 处在命令行模式。该模式下可以使用键盘执行 Vim 命令。
要插入文本,将光标定位至插入位置(在光标之前),然后按 i 进入插入模式。如果用大写 I 命令就会在行首插入内容,a 在光标位置后,A 在行尾。
按 Esc 即可返回命令行模式。
光标移动
Vim 中的确可以使用方向键移动光标,然而这并非 Vim 的本意。如果这么做,你就要把右手从字母区移动到方向键,然后再移动回来,太慢了。
在 Vim 中,j 向下移动光标(「j」就像一个下垂的钩子),k 上移光标(「j」右边),h 左移光标(「j」左边),l 右移光标(小写「L」,四个键最右边)。
^ 将光标移至行首,$ 至行尾。
w 和 W 键用于跳过一个单词,其区别在于后者认定的单词通常比前者更长(例如:下划线和斜杠都会被认做单词的一部分)。b 和 B 将光标前移动一个单词,e 和 E 用于将光标移至当前单词的末尾,这两个操作区别同上。
( 将光标移至当前句子的句首,) 至句末。如果需要移动更远的距离,{ 可以移至段首,} 至段尾。
H 将光标移至当前屏幕上显示的第一行,M 至屏幕中央,L 则是至屏幕上的最后一行。gg 将光标移至文件的开始,G 至文件结尾。Ctrl+D,或 <C-d> 可以一屏一屏地翻页。
重复命令
如果一个命令前缀了数字 n,那么这个命令就会执行 n 次(有些命令的行为可能有所不同,例如 s)。例如,按下 3i,输入「Help! 」,然后按下 Esc,会输入「Help! Help! Help! 」。2} 将光标后移两个自然段。对下面将要讲到的命令,该技巧十分常用。
删除
x 命令删除光标所在处的字符,X 删除光标前的字符。使用上面的技巧,6x 会删除 6 个字符。用 .(句号)可以重复前一个命令。所以,假如你有多个「foobar」,但决定将其修改为「foo」,那么,将光标移动至「b」处,键入 3x,移动至下一个单词的「b」处,按下 . 即可。
d 代表你将要删除一些内容,在按下 d 之后,你需要继续指定需要删除的内容。这时你可以搭配移动光标的命令。dW 可以删除至下一个单词,d^ 可以删至行首。删除命令也可以前缀数字,如 3dW 可以删除光标之后的三个单词。大写的 D 可以删除至行尾(等同于 d$),dd 可以删除整行。
cw 可以删除并替换当前单词,这个命令将删除单词并进入插入模式。r 可以替换单个字符。
撤销与恢复
Vim 内置了剪贴板(也叫缓冲区)。使用 u 撤销命令,Ctrl+r,或 <C-r> 可以恢复之前撤销的命令。
可视模式
命令行模式按 v 进入可视模式。该模式下通过光标移动选择文本,选取后按 y 可以把文本提取到缓冲区(即复制),c 可以剪切。之后可以使用 p 在光标后粘贴,P 在光标前。V 是行选取模式,以行为单位进行选取。Ctrl+v,或 <C-v> 是块选取模式,可以选取一块矩形区域中的文本。
搜索和替换
在文件中搜索单词或字母的话,按下 /,输入搜索内容,按下回车。n 查找下一处匹配,N 查找上一处。
替换文本需要使用 :s/命令(注意冒号),格式为:[范围]s/[原字符串]/[新字符串]/[参数]。例如:
| 命令 | 作用 |
|---|---|
| :s/xxx/yyy/ | 将当前行中的第一个「xxx」替换为「yyy」 |
| :s/xxx/yyy/g | 将当前行中的所有「xxx」替换为「yyy」 |
| :s/xxx/yyy/gc | 同上,但每次替换都会询问 |
| :%s/xxx/yyy/g | 将整个文件中的所有「xxx」替换为「yyy」 |
可以用 :g/ 命令匹配字符串(注意冒号),并对每个匹配执行同一操作。格式为:[范围]:g/[模式串]/[命令]。例如:
| 命令 | 作用 |
|---|---|
| :g/^#/d | 删除所有以「#」打头的行 |
| :g/^$/d | 删除所有空行 |
保存和退出
要在 Ex 模式执行保存和退出,Ex 模式命令都以 : 打头。:w 保存文件,:w [文件名] 可以指定文件名。:q 退出 :q! 放弃修改并退出。:x 保存并退出(等同于 :wq)。
其他命令
-
s删除光标处字符并进入插入模式,S删除当前行并进入插入模式。 -
o在当前行后插入空行并进入插入模式,O在当前行前插入空行并进入插入模式。 -
yy复制当前行。 -
cc删除当前行并进入插入模式。 -
*与#可以搜索当前光标下的单词,后者是向前搜索。
配置
用户配置文件为 ~/.vimrc,相关的文件位于 ~/.vim/;全局配置文件为 /etc/vimrc,相关的文件位于 /usr/share/vim/。
Arch Linux 默认的 Vim 全局配置十分简陋,与其它发行版的默认配置文件并不相同。如果需要常用的功能(如语法高亮、打开文件时回到上一次的光标位置等),可以使用配置文件范例替换之:
# mv /etc/vimrc /etc/vimrc.bak # cp /usr/share/vim/vim73/vimrc_example.vim /etc/vimrc
文件备份
编辑文件后,Vim 默认会在文件所在目录建立名为 文件名~ 的备份文件。为避免备份文件弄乱文件夹,许多用户在配置文件中加入下面内容,使Vim在指定文件夹生成备份:
set backupdir=~/.vim/backup,/tmp
也有人选择直接关闭该功能:
set nobackup set nowritebackup set noswapfile ! (additionally disable swap files)
环绕搜索
环绕搜索的意思是,搜索字符串时,从光标处向下搜索到文件尾后,返回文件头继续搜索(反之,向上搜索到文件头后,返回末尾搜索)。开启的命令为:
set wrapscan
拼写检查
set spell
设置后 Vim 会高亮拼写错误的单词。将光标移至错误单词,输入 z= 查看建议拼写。
Vim 默认只安装了英语字典,其他字典需要从官方软件仓库安装。检查可用语言包:
# pacman -Ss vim-spell
此外,还可以从 Vim FTP archive 获取字典。把下载的字典文件存入 ~/.vim/spell,然后将以下内容加入配置文件::setlocal spell spelllang=LL 。
代码高亮
Vim支持许多语言的代码高亮:
filetype plugin on syntax on
使用鼠标
Vim 可以使用鼠标:
set mouse=a
跨行移动光标
默认情况下,在行首按 ← 或者在行尾按 → 不能将光标移动至上一行或下一行。如果需要修改的话:
set whichwrap=b,s,<,>,[,]
vimrc 范例
一个配置文件范例:Vim/.vimrc。
更多范例参见#其他资源。
文件合并(Vimdiff)
Vim 自带了一个文件差异编辑器(diff,用来合并文件差异的工具)。vimdiff 可以打开多个窗口显示不同文件,按行高亮其差异。这时你只有两个模式:插入模式用以编辑文件,或者屏幕模式切换不同的窗口或行。从终端中调用它的命令为:vimdiff 文件1 文件2。基本操作:
]c- 下一差异
[c- 上一差异
Ctrl+w+w- 切换窗口
i- 进入插入模式
Esc- 退出插入模式
p- 粘贴一整行
do- 差异导入(修改当前窗口的文件)
dp- 差异导出(修改另一个文件)
zo- 展开文本
zc- 折叠文本
:diffupdate- 重新检查文件差异
yy- 复制一整行
:wq- 保存并退出当前窗口
:wqa- 保存并退出所有窗口
:q!- 不保存退出
编辑完成之后重命名:
mv file file.bck mv file.pacnew file
检察新文件是否正确,然后删除备份:
rm file.bck
Vim 建议
一些实用技巧。
显示行号
- 使用
:set number显示行号。 - 使用
:<行号>G跳到指定行。
跨行替换
下面的命令可以替换特定行中的内容:
:n,ns/one/two/g
例如,替换3、4两行中的'one'为'two':
:3,4s/one/two/g
记录光标位置
Vim可以记录上次打开某一文件时的光标位置,并在下次打开同一文件时将光标移动到该位置。要开启该功能,在配置文件~/.vimrc中加入以下内容:
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
endif
另见:Vim Wiki上的相关内容。
GVim窗口底部的空格
如果窗口管理器设置为忽略窗口大小渲染窗口,GVim会将空白区域填充为GTK主题背景色,看起来会比较难看。
一个解决方法是通过 .vimrc 禁用菜单栏,这样 gvim 窗口就能正常显示,填充整个空间:
set go-=m "remove menubar
解决办法是手动设置背景色。将以下内容加入~/.gtkrc-2.0:
style "vimfix" {
bg[NORMAL] = "#242424" # GVim Normal主题的背景色
}
widget "vim-main-window.*GtkForm" style "vimfix"
用 vim 替代 vi
执行下列命令:
# ln -s $(which vim) /usr/local/bin/vi # ln -s $(which vim) /usr/local/bin/view
另见:[1]。
疑难解答
行末的"^M"
打开 MS-DOS 或 Windows 下创建的文本文件时,经常会在每行行末出现一个 “^M”。这时由于 MS-DOS/Windows 换行符与 UNIX 的不同导致的。
解决方案: 使用下列命令替换掉 “^M”:
:%s/^M//g
注意,“^” 代表控制字符。输入 “^M” 的方法是:Ctrl+V、Ctrl+M。
另一个方法是,安装 dos2unix,然后执行 dos2unix <文件名>。
其他资源
官方资源
教程
- 中文版《A Byte of Vim》
- vi教程和参考指南
- vi-vim图片作弊条
- Vimcasts - ogg格式的视频教程
- 教学视频 - 从入门到精通,各种视频教程
- Vim的介绍和教程