Difference between revisions of "Vim (简体中文)"

From ArchWiki
Jump to: navigation, search
m
Line 9: Line 9:
 
[[ru:Vim]]
 
[[ru:Vim]]
 
[[zh-TW:Vim]]
 
[[zh-TW:Vim]]
{{Article summary start|摘要}}
 
{{Article summary text|广为流行的文本编辑器VIM:安装、配置、使用。}}
 
{{Article summary end}}
 
 
{{TranslationStatus (简体中文)|Vim|2014-06-01|212653}}
 
{{TranslationStatus (简体中文)|Vim|2014-06-01|212653}}
  

Revision as of 21:15, 5 July 2014

翻译状态: 本文是英文页面 Vim翻译,最后翻译时间:2014-06-01,点击这里可以查看翻译后英文页面的改动。

Vim是一个强大的文本编辑器,是UNIX文本编辑器vi的加强版本。

Vim专攻全键盘操作,与此同时提供了许多功能,例如语法高亮与脚本。Vim并非如nanopico一样的简单编辑器,需要耗费大量的时间才能熟练使用。

安装

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

注意: vim软件包以轻量化为目标,所以它不包含Python、Lua和Ruby的解释器支持,也不支持X的功能(即无法使用X的剪贴板)。如果你需要这些功能,请安装gvim(包含vim)。非官方源herecura-stable提供了如下不同的vim包:
$ pacman -Slq herecura-stable | grep vim
vim-cli
vim-gvim-common
vim-gvim-gtk
vim-gvim-qt
vim-rt
vim-tiny
注意: 从官方源安装的gvim在KDE下的GUI可能有些瑕疵,这种情况下你可自herecura-stable仓库安装vim-gvim-qt或者AUR中的vim-qtAUR

使用

这里只介绍基本的Vim操作。此外,可以使用vimtutorgvimtutor学习这些内容,它大约花费你25至30分钟。

Vim有以下四种模式:

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

简单的文本编辑

如果通过以下命令启动Vim:

$ vim somefile.txt

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

注意: Vim是典型的UNIX风格的软件——其学习曲线非常陡峭,但是掌握之后便能体会到其功能之强大。另外要注意,所有命令都区分大小写。某些命令对应的大写版本代表「激进版本」(如s替换一个字符,S替换一整行),而有时大小写则是完全不同的命令(如j代表光标下移,J代表合并两行)。

要插入文本,将光标定位至插入位置(在光标之前),然后按i进入插入模式。如果用大写(I)的命令就会在行首插入内容,a在光标位置后,A在行尾。

Esc即可返回命令行模式。

光标移动

Vim中的确可以使用方向键移动光标,然而这并非Vim的本意。如果这么做,你就要把右手从字母区移动到方向键,然后再移动回来,太慢了

在Vim中,以h左移光标,j键向下移动光标,k上移光标,l右移光标:

  k
h l
j

^移动光标至行首,$则移至行尾。

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

wW键用于跳过一个单词,其区别在于后者认定的单词通常比前者更长(例如:下划线和斜杠都会被认做单词的一部分)。bB将光标前移动一个单词,eE用于将光标移至当前单词的末尾,这两个操作区别同上。 (将光标移至当前句子的句首,)至句末。如果需要移动更远的距离,{可移至段首,}至段尾。 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)。

其他命令

  1. s删除光标处字符并进入插入模式,S删除当前行并进入插入模式。
  2. o在当前行后插入空行并进入插入模式,O在当前行前插入空行并进入插入模式。
  3. yy复制当前行。
  4. cc删除当前行并进入插入模式。
  5. *#可以搜索当前光标下的单词,后者是向前搜索。

配置

用户配置文件为~/.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

拼写检查

set spell

设置后Vim会高亮拼写错误的单词。将光标移至错误单词,输入z=查看建议拼写。

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为相应语言代码即可。
  • 如果需要针对两种语言进行拼写检察(例如英语与德语),在~/.vimrc/etc/vimrc中添加set spelllang=en,de并重启Vim即可。
  • 利用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

使用鼠标

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 建议

一些实用技巧。

显示行号

  1. 使用:set number显示行号。
  2. 使用:<行号>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

alias vi=vim

疑难解答

行末的"^M"

打开MS-DOS或Windows下创建的文本文件时,经常会在每行行末出现一个「^M」。这时由于MS-DOS/Windows换行符与UNIX的不同导致的。

解决方案: 使用下列命令替换掉「^M」:

:%s/^M//g

注意,「^」代表控制字符。输入「^M」的方法是:Ctrl+Q

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

其他资源

官方资源

教程

配置范例

其他

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