# Vim (简体中文)

摘要 help replacing me
广为流行的文本编辑器VIM：安装、配置、使用。

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

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

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

## 安装

使用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-qt。

## 使用

这里只介绍基本的Vim操作。此外，可以使用`vimtutor`或`gvimtutor`学习这些内容，它大约花费你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系统中被广泛使用。虽然这些快捷键对你可能有点陌生，但以后你会明白其中的道理。

`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`）。

### 其他命令

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 <文件名>`。

## 其他资源

### 官方资源

- Vim主页
- Vim文档
- Vim Tips Wiki@wikia

### 教程

- 中文版《A Byte of Vim》
- vi教程和参考指南
- vi-vim图片作弊条
- Vimcasts - ogg格式的视频教程
- 教学视频 - 从入门到精通，各种视频教程
- Vim的介绍和教程

### 配置范例

- nion's
- A detailed configuration from Amir Salihefendic
- Bart Trojanowski

### 其他

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

Categories:

- Development (简体中文)
- Text editors (简体中文)
- 简体中文