Vim (简体中文)
Vim是UNIX文本编辑器Vi的加强版本,拥有额外的功能来帮助编辑代码。一些Vim的增强功能包括比较文件(vimdiff),语法高亮,一个全面的帮助系统,本地脚本(Vimscript),和方便选择的可视化模式。
Vim专攻全键盘操作,并非如nano或pico一样的简单编辑器,需要耗费大量的时间才能熟练使用。
安装
为获得命令行版本,请安装:
- vim-minimal包是一个轻量级版本
- vim获得Python 2, Lua和Ruby解释支持,但没有GTK/X 支持
- vim-python3包比上面的
vim
包多了Python 3的解释支持
为获得图形界面版本,请安装:
- gvim包提供和
vim
一样的功能 - gvim-python3包比上面
gvim
包的多了Python 3的解释支持
使用
这里只介绍基本的Vim操作。此外,可以使用vimtutor
或gvimtutor
学习这些内容,它大约花费你25至30分钟。
Vim有以下四种模式:
- 命令模式:键入的内容被解释为命令。
- 插入模式:键入的内容被插入文件中。
- 可视模式:通过键盘选择、剪切、复制文本。
- Ex模式:使用更多命令(例如:存储文件、替换文本等)。
简单的文本编辑
如果通过以下命令启动Vim:
$ vim somefile.txt
你会看到一个空白文档(假定somefile.txt
不存在,否则会显示其内容)。现在还不能进行编辑,因为Vim处在命令行模式。该模式下可以使用键盘执行Vim命令。
要插入文本,将光标定位至插入位置(在光标之前),然后按i
进入插入模式。如果用大写(I
)的命令就会在行首插入内容,a
在光标位置后,A
在行尾。
按Esc
即可返回命令行模式。
光标移动
Vim中的确可以使用方向键移动光标,然而这并非Vim的本意。如果这么做,你就要把右手从字母区移动到方向键,然后再移动回来,太慢了。
在Vim中,以h
左移光标,j
键向下移动光标,k
上移光标,l
右移光标:
k
h l
j
而^
移动光标至行首,$
则移至行尾。
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
可恢复之前撤销的命令。
可视模式
命令行模式按v
进入可视模式。该模式下通过光标移动选择文本,选取后按 y
可以把文本提取到缓冲区(即复制),c
可以剪切。之后可以使用p
在光标后粘贴,P
粘贴在光标前。V
是行选取模式,以行为单位进行选取。Ctrl+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/vim74/vimrc_example.vim /etc/vimrc
文件备份
编辑文件后,Vim默认会在文件所在目录建立名为文件名~
的备份文件。为避免备份文件弄乱文件夹,许多用户在配置文件中加入下面内容,使Vim在指定文件夹生成备份:
set backupdir=~/.vim/backup,/tmp
也有人选择直接关闭该功能:
set nobackup set nowritebackup set noswapfile ! (additionally disable swap files)
环绕搜索
环绕搜索的意思是,搜索字符串时,从光标处向下搜索到文件尾后,返回文件头继续搜索(反之,向上搜索到文件头后,返回末尾搜索)。开启的命令为:
set wrapscan
代码高亮
Vim支持许多语言的代码高亮:
:filetype plugin on :syntax on
使用鼠标
Vim可以使用鼠标:
set mouse=a
跨行移动光标
默认情况下,在行首按←
或者在行尾按→
不能将光标移动至上一行或下一行。如果需要修改的话:
set whichwrap=b,s,<,>,[,]
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
显示行号。 - 使用
:set relativenumber
显示相对行号。 - 使用
:<行号>G
跳到指定行。
拼写检查
set spell
Vim默认只安装了英语字典,其他字典需要从官方软件仓库安装。检查可用语言包:
# pacman -Ss vim-spell
此外,还可以从Vim FTP archive获取字典。把下载的字典文件存入~/.vim/spell
,然后将以下内容加入配置文件::setlocal spell spelllang=LL
行为 | 快捷键 |
---|---|
下一个拼写错误 | ]s
|
上一个拼写错误 | [s
|
拼写纠正推荐 | z=
|
将单词添加到用户正确字典 | zg
|
将单词添加到内部正确字典 | zG
|
将单词添加到用户错误字典 | zw
|
将单词从用户正确字典删除 | zug
|
跨行替换
下面的命令可以替换特定行中的内容:
:n,ns/one/two/g
例如,替换3、4两行中的'one'为'two':
:3,4s/one/two/g
记录光标位置
Vim可以记录上次打开某一文件时的光标位置,并在下次打开同一文件时将光标移动到该位置。要开启该功能,在配置文件~/.vimrc
中加入以下内容:
augroup resCur autocmd! autocmd BufReadPost * call setpos(".", getpos("'\"")) augroup END
另见: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
alias vi=vim
DOS/Windows回车问题
打开MS-DOS或Windows下创建的文本文件时,经常会在每行行末出现一个「^M」。这时由于MS-DOS/Windows换行符与UNIX的不同导致的。
解决方案: 使用下列命令替换掉「^M」:
:%s/^M//g
注意,「^」代表控制字符。输入「^M」的方法是:Ctrl+Q
另一个方法是,安装 dos2unix,然后执行 dos2unix <文件名>
。
插件
使用插件来提高效率,它能改变Vim的界面,添加新命令,代码自动补全,整合其他程序和工具,添加其他编程语言等功能。
插件管理
通过plugin manager来跨平台安装和管理Vim的插件,安装plugin manager插件来方便管理其他插件。
- Vundle是目前最流行的Vim插件管理器。
- pathogen.vim可以用来管理runtimepath。
pacman
vim-plugins包里有很多插件可以选择。
pacman -Ss vim-plugins
cscope
Cscope是一个代码浏览工具。通过导航到一个词/符号/函数并通过快捷键调用cscope,能快速找到:函数调用及函数定义等。需要多个步骤来搜索代码库。
安装cscope包。
拷贝cscope预设文件,该文件会被Vim自动读为:
mkdir -p ~/.vim/plugin wget -P ~/.vim/plugin http://cscope.sourceforge.net/cscope_maps.vim
创建一个文件来包含你希望cscope索引的文件:
cd /path/to/projectfolder/ find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files
创建cscope会读取的数据文件:
cscope -bq
默认快捷键:
Ctrl-\ and c: Find functions calling this function d: Find functions called by this function e: Find this egrep pattern f: Find this file g: Find this definition i: Find files #including this file s: Find this C symbol t: Find assignments to
你可以定制你自己的快捷键:
#使用 ctrl-c 来找到调用当前函数的函数 nnoremap <C-c> :cs find c <C-R>=expand("<cword>")<CR><CR>
Taglist
Taglist提供源码文件的结构概览,使你能更高效的浏览不同语言的源文件。
安装vim-taglist包。
将下列设置添入文件~/.vimrc
:
let Tlist_Compact_Format = 1 let Tlist_GainFocus_On_ToggleOpen = 1 let Tlist_Close_On_Select = 1 nnoremap <C-l> :TlistToggle<CR>
AfterColors
vim-plugin-aftercolorsAUR包使能目录vim/after/colors
允许设置优先使用的彩色方案。
本地默认使用的目录~/.vim/after/colors
,若不存在可自行创建。
重写的色彩方案与其本身类似(在改变设置之前,最好先看一下原来的设置。有时作者会留下提示,可以对照检查自己的设置)。重写设置时,将创建的文件取一个相关的名字 (e.g. ~/.vim/after/colors/desert.vim
)并设置一个备用方案。例如:
~/.vim/after/colors/desert.vim
highlight CursorLine ctermbg=232
如果正在使用另一个方案, 可以通过重载颜色方案来进行测试:
colorscheme desert
备选方案在使用前可以通过Vim直接测试。例如,显示所有方案:
:highlight
查看某一方案: (tip: have wildmenu enabled to see tab-completions):
:highlight CursorLine
暂时改变某一设置:
highlight CursorLine ctermbg=234
知道要使用什么颜色,将需要获得终端下的色号。可以参考以下链接: link1, link2, link3.
其他资源
官方资源
教程
- 中文版《A Byte of Vim》
- vi教程和参考指南
- vim Tutorial and Primer
- vi Tutorial and Reference Guide
- Graphical vi-Vim Cheat Sheet and Tutorial
- Vim Introduction and Tutorial
- Open Vim - Vim教学工具集合
- Learn Vim Progressively
- know vim [dead link 2014-10-29]
- Learning Vim in 2014
视频
- Vimcasts - ogg格式的视频教程
- Vim Tutorial Videos - 从入门到精通,各种视频教程
游戏
配置范例
- nion's
- A detailed configuration from Amir Salihefendic
- Bart Trojanowski
- Steve Francia's Vim Distribution
- W4RH4WK's Vim configuration
- Fast vimrc/colorscheme from askapache
- Basic .vimrc
其他
- HOWTO Vim -- Gentoo Wiki的Vim介绍,本文基于该文修改而来
- Vivify - Vim 颜色编辑器 ColorScheme Editor for Vim
- Usevim - 经常更新的高亮插件博客、提示等
- Vim Awesome - 该网站展示由Github用户评分的Vim插件
- Basic Vim Tips - 为新人准备的Vim文档