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

From ArchWiki
Jump to: navigation, search
m (搜索和替换: remove needless attributes from wiki tables and/or use class="wikitable")
(配置)
Line 143: Line 143:
  
 
  # mv /etc/vimrc /etc/vimrc.bak
 
  # mv /etc/vimrc /etc/vimrc.bak
  # cp /usr/share/vim/vim73/vimrc_example.vim /etc/vimrc
+
  # cp /usr/share/vim/vim74/vimrc_example.vim /etc/vimrc
  
 
===文件备份===
 
===文件备份===

Revision as of 16:16, 2 April 2014

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

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

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

安装

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

注意: vim 软件包以轻量化为目标,所以它不包含 Python,Lua 和 Ruby 的解释器支持,也不支持 X 的功能(也即无法使用 X 的剪贴板)。如果你需要这些功能,请安装 gvim 包(在这之中包含了 vim)。herecura-stable 非官方源提供了如下不同的 vim 包:
$ pacman -Slq herecura-stable | grep vim
vim-cli
vim-gvim-gtk
vim-gvim-motif
vim-gvim-qt
vim-gvim-x11
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 中,j 向下移动光标(「j」就像一个下垂的钩子),k 上移光标(「j」右边),h 左移光标(「j」左边),l 右移光标(小写「L」,四个键最右边)。

^ 将光标移至行首,$ 至行尾。

注意: ^$ 通常在正则表达式中匹配行首和行尾。正则表达式是一种很强大的工具,在 *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,或 <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)。

其他命令

  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 or /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

执行下列命令:

# 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+VCtrl+M

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

其他资源

官方资源

教程

配置范例

其他

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