Vim (简体中文)

From ArchWiki
Revision as of 12:14, 15 July 2012 by Cuihao (Talk | contribs) (更新翻译)

Jump to: navigation, search
摘要 help replacing me
广为流行的文本编辑器VIM:安装、配置、使用。
翻译状态: 本文是英文页面 Vim翻译,最后翻译时间:2012-07-15,点击这里可以查看翻译后英文页面的改动。

Vim是一个强大的文本编辑器,是UNIX文本编辑器‘vi’的加强版本。它不单是nano或pico那样简单的文本编辑器,需要通过一段时间的学习才能自如运用它的强大力量。

Vim的操作方式非常节约手指运动,操作时永远不必使用鼠标。虽然听起来有点奇怪,但精通Vim后,你就会明白其中的道理。

特色

  • Vim是非常强悍的文本处理工具,尤其是处理复杂的文本处理任务时
  • 可配置、可扩展
  • 简单、全面的快捷键关联
  • 代码高亮

安装

使用pacman安装vim软件包(仅命令行版本) ,或者gvim软件包(包含图形界面版本和命令行版本)。

注意: vim软件包编译时不再使用X服务器参数。这意味着,用户不能从图形界面复制文本并粘贴到Vim中。如果需要这样的功能,请使用gvim。详情参见FS#14609
注意: vim软件包非常精简,不包含Python、Lua、Ruby解释器支持。如果需要这些功能,请使用gvim。此外,非官方软件仓库herecura-stable提供了更多不同的vim/gvim版本:
$ pacman -Slq herecura-stable | grep vim
vim-cli
vim-gvim-gtk
vim-gvim-motif
vim-gvim-qt
vim-gvim-x11
vim-rt
vim-tiny

使用

这里只介绍基本的Vim操作。此外,可以使用vimtutor命令学习这些内容。Vim有以下四个基本的模式:

  • 命令行模式:键入的内容被解释为命令。
  • 插入模式:键入的内容被插入文件。
  • 可视模式:通过键盘选择、剪切、复制文本。
  • Ex模式:使用更多命令(例如:存储文件、替换文本……)。

简单的文本编辑

通过以下命令启动Vim:

$ vim somefile.txt

会看到一个空白文档(假定somefile.txt不存在,否则会看到其中的内容)。现在还不能进行编辑,因为Vim处在命令行模式。该模式下可以使用键盘执行Vim命令。

注意: Vim是典型的UNIX风格的软件——没有华丽丽的外表,没有内置的有趣游戏,怎么看都不吸引人。然而,它能帮你高效地搞定各种工作,这就够了。另外要注意,所有命令都区分大小写。某些命令对应的大写版本代表”激进版本“(s替换一个字符,S替换一整行),而另外一些大小写不同的命令可能完全没有联系(j代表光标下移,J代表插入两行)。

要插入文本,先定位光标到插入位置后,然后按i进入插入模式。此外,大写I命令在行首插入内容,a在光标位置后插入内容,A在行尾插入内容。

要退回命令行模式,按Template:Keypress即可。

光标移动

Vim中可以使用方向键移动光标,但外行人才这么做。你必须把右手从字母区移动到方向键,然后再移动回来,效率多低啊。严肃点,这不是胡扯。

地地道道的Vim方式是:使用j下移光标(j好像一个下垂的钩子),k上移光标(”j“右边),h左移光标(”j“左边),l右移光标(小写”L“,四个键最右边)。

^键定位光标于行首,$键定位光标于行尾。

注意: ^$通常在正则表达式中匹配行首和行尾。正则表达式是一种很强大的工具,在*nix系统中被广泛使用。虽然这些快捷键对你可能有点陌生,但以后你会明白其中的道理。

wW键用于跳过一个单词。不同之处在于,后者认定的单词通常比前者更长(例如:下划线和斜杠都会被认做单词的一部分)。bB将光标前移一个单词,区别同上。eE用于把光标移动到当前单词的末尾,区别同上。

(把光标移动到当前句子的句首,相反)把光标移动到句末。{}类似于前两个,用于把光标移动到自然段的开头和结尾。

H会把光标移动到当前屏幕上显示的第一行,M会把光标移动到屏幕中央,L则是跳到屏幕上的最后一行。gg把光标移动到文件的开始,到文件末端用G。用<ctrl>D可以一屏一屏地翻页。

重复命令

要重复执行某个命令,只需要在命令前键入重复次数即可(有些命令的行为可能有所不同,比如s )。例如,键入3i,输入“Help! ”,然后按下Esc,会发现“Help! Help! Help!“被输入到文件中。同理,2}将光标后移两个自然段。对下面将要讲到的命令,该技巧十分常用。

删除

x命令删除光标所在处的字符,X删除光标前的字符。删除六个字符,使用上面的技巧,只需要键入6x即可。用.(句号)重复前一个修改性命令(包括复制命令)。所以,假如你输入了多个"foobar",但想了一下,你觉得应该修改为"foo",那么,移动光标到第一个错误单词,输入3x修改之,然后用b移动到下一个错误单词后,按下.即可。

d是删除命令,后面跟上若干字符(大多是表示移动的命令),表示删除的内容。dW删除下一个单词,d^表示删除到行首。这些命令同样可以重复,如3dW删除三个单词。D等同于d$,表示删除到行尾(但不删除该行)。dd会删除一整行。

cw会删除光标处的单词并切换到插入模式。r命令用于替换单个字符。

撤销与恢复

Vim内置了剪贴板(也叫缓冲区)。使用u撤销命令,Ctrl+r恢复之前撤销的命令。

可视模式

命令行模式按v进入可视模式。该模式下通过光标移动选择文本,选取后按y即可把文本提取到缓冲区(即复制),按c剪切文本。之后可以使用p在光标后粘贴,P在光标前粘贴。V是行选取模式,以行为单位进行选取。Ctrl-v是块选取模式,可以选取一块矩形区域中的文本。

注意: 删除文本后,被删除的文本会存储进缓冲区,可以使用粘贴命令提取。

搜索和替换

输入/后面加上要搜索的字符串,然后回车即可搜索需要的字符串。n是查找下一个字符串,Template:Keypress 是上个匹配。

替换文本要使用Ex模式命令: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)。

其他命令

  1. s是删除光标处字符并进入插入模式,S是删除当前行并进入插入模式。
  2. o是在当前行后插入空行并进入插入模式,O是在当前行前插入空行并进入插入模式。
  3. yy是复制当前行。
  4. cc是删除当前行并进入插入模式。
  5. *是高亮显示光标处单词,然后按下n即可搜索该单词。

配置

Vim的全局配置文件为/etc/vimrc,用户配置文件为~/.vimrc,合适的配置使Vim更加易用。文件中的内容相当于Vim的Ex模式命令。变量$VIM定义了Vim脚本的路径,默认为/usr/share/vim/。用户自定义的全局脚本应存放在该路径中。

Arch Linux默认的Vim全局配置十分简陋,可以使用配置文件范例替换之:

cp /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会高亮拼写错误的单词。将光标移至错误单词,输入Template:Keypress查看建议拼写。

Vim默认只安装了英语字典,其他字典需要从官方软件仓库安装。检查可用语言包:

# pacman -Ss vim-spell

此外,还可以从 Vim FTP archive 获取字典。把下载的字典文件存入~/.vim/spell,然后将以下内容加入配置文件::setlocal spell spelllang=LL

小贴士:
  • 如果想只对 LaTeX(或 TeX)文档起用拼写检查,在 ~/.vimrc/etc/vimrc 添加 autocmd FileType tex setlocal spell spelllang=en_us,重启 vim 即可。至于非英语语言,替换上述语句中的 en_us 为相应语言代码即可。
  • 利用 FileType 插件和自建规则,可以对任意文件类型开启拼写检查。例如,要开启对扩展名为 txt 的文件的拼写检查,创建文件 /usr/share/vim/vimfiles/ftdetect/plaintext.vim,添加内容 autocmd BufRead,BufNewFile *.txt setfiletype plaintext,然后在 ~/.vimrc/etc/vimrc 添加 autocmd FileType plaintext setlocal spell spelllang=en_us,重启 vim 即可。

代码高亮

Vim支持许多语言的代码高亮:

filetype plugin on
syntax on

vimrc 范例

一个配置文件范例:Vim/.vimrc

更多范例参见#其他资源

文件合并(Vimdiff)

Vim自带了一个文件差异编辑器(用来合并文件差异的工具)。从终端中调用它的命令为:vimdiff 文件1 文件2。基本操作:

]c :        - 下一差异
[c :        - 上一差异
Ctrl+w +w   - 切换窗口
do          - 差异导入(修改当前窗口的文件)
dp          - 差异导出(修改另一个文件)
zo          - 展开文本
zc          - 折叠文本
:diffupdate - 重新检查文件差异

Vim 建议

一些实用技巧。

显示行号

  1. 使用:set number显示行号。
  2. 使用:<行号>跳到指定行。

跨行替换

下面的命令可以替换特定行中的内容:

: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” 的方法是:Template:KeypressTemplate:Keypress

另一个方法是,安装 dos2unix,然后执行 dos2unix <文件名>

其他资源

官方资源

教程

配置范例

其他

  • HOWTO Vim -- Gentoo Wiki的Vim介绍,本文基于该文修改而来。
  • Vivify - Vim 颜色编辑器 ColorScheme Editor for Vim