Vim (简体中文) - ArchWiki

# Vim (简体中文)

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

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的解释支持

注意: 非官方源herecura-stable 也提供许多Vim/gVim变种版本: `vim-cli` `vim-gvim-common` `vim-gvim-gtk` `vim-gvim-qt` `vim-rt vim-tiny`.

## 使用

这里只介绍基本的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

### 代码高亮

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

    :filetype plugin on
    :syntax on

### 使用鼠标

Vim可以使用鼠标：

    set mouse=a

注意:

- 这个方法在PuTTY中同样适用。
- 在PuTTY中，通常的高亮/复制行为有所不同，因为在使用鼠标时，Vim会进入可视模式。为了用能鼠标选中文本，需要同时按住`Shift`键。

### 跨行移动光标

默认情况下，在行首按`←`或者在行尾按`→`不能将光标移动至上一行或下一行。如果需要修改的话：

    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. 使用`:set relativenumber`显示相对行号。
3. 使用`:<行号>G`跳到指定行。

### 拼写检查

    set spell

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

    # pacman -Ss vim-spell

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

行为 | 快捷键
--- | ---
下一个拼写错误 | `]s`
上一个拼写错误 | `[s`
拼写纠正推荐 | `z=`
将单词添加到用户正确字典 | `zg`
将单词添加到内部正确字典 | `zG`
将单词添加到用户错误字典 | `zw`
将单词从用户正确字典删除 | `zug`

小贴士:

- 如果想只对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即可。

### 跨行替换

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

    :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

注意: 在Vim的7.x版本中，你可能需要在`~/.vim/plugin/cscope_maps.vim`中取消下列行的注释来使能cscope快捷键：

    set timeoutlen=4000
    set ttimeout

创建一个文件来包含你希望cscope索引的文件：

    cd /path/to/projectfolder/
    find . -type f -print | grep -E '\.(c(pp)?|h)$' > cscope.files

创建cscope会读取的数据文件：

    cscope -bq

注意: 你必须从当前出浏览工程文件，也可以设置$CSCOPE_DB变量并指向cscope.out文件。

默认快捷键：

     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-aftercolors包使能目录`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.

## 其他资源

### 官方资源

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

### 教程

- 中文版《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 - 从入门到精通，各种视频教程

#### 游戏

- Vim Adventures
- VimGolf

### 配置范例

- nion's
- A detailed configuration from Amir Salihefendic
- Bart Trojanowski
- Steve Francia's Vim Distribution
- W4RH4WK's Vim configuration
- Fast vimrc/colorscheme from askapache

### 其他

- HOWTO Vim -- Gentoo Wiki的Vim介绍，本文基于该文修改而来
- Vivify - Vim 颜色编辑器 ColorScheme Editor for Vim
- Usevim - 经常更新的高亮插件博客、提示等
- Vim Awesome - 该网站展示由Github用户评分的Vim插件
- Basic Vim Tips - 为新人准备的Vim文档

Categories:

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