Vim

介绍

Vim 可能是很多人接触 Linux 后第一个文本编辑器。 它功能强大(对的,你没看错。只是大多数功能你没用过)可以不用鼠标、小键盘就可以实现很多高级的功能。相信我,学习了 Vim 后,可能它就是你的最后一个文本编辑器。

注解

给新手的几个建议:

  • 学习 Vim 开始时很痛苦,并且是需要时间的;
  • 使用时每一个操作都想一下怎么输入是最快的方法;
  • 建议在你的常用 IDE 安装 Vim 插件并打开。

安装

安装 Vim 很简单,只需要用你的 Linux 发行版中的包管理工具安装即可。

  • Debian:
apt-get install vim -y
  • Centos:
yum install vim -y

新手

Vim 很多地方跟 Windows 上的输入习惯不同,刚开始你甚至不知道怎么输入保存修改。这是因为 Vim 有三个不同的模式导致的:

  • 命令模式(Command mode):刚启动 Vim 时或在其他模式按下 Esc 进入的模式,敲击的键盘动作会识别为命令。
  • 插入模式(Insert mode):命令模式下按 i 进入输入模式,向文本中输入字符的模式。
  • 底线命令模式(Last line mode):命令模式下按 : 进入底线命令模式,可以输入单个或多个字符的命令。

Vim 之所以刚开始难学,是因为我们得记下许多命令模式以及底线命令模式的键盘动作以及命令才能开始使用。

以下是入门级的一些快捷键以及命令。不做特殊说明的情况下,本文全部命令都在命令模式下使用,: 开头的命令是切换到底线命令模式下执行的指令。

  • i:进入插入模式
  • Esc:其他模式进入命令模式
  • x:删除光标所在字符
  • dd:删除当前行,并把删除的行存到剪贴板里
  • p:粘贴剪切板
  • hjkl:移动光标,分别对应的是左、下、上、右。你可以使用方向键移动光标,但是建议你不要依赖方向键
  • w:存盘,后面跟文件名
  • q:在文件保存的情况下退出 Vim,所以通常跟 wq 一起用表示存盘加退出
  • q!:退出,并且不存盘

以上就是使用 Vim 必须知道的命令了,请务必练习到可以下意识打出。

入门

接下来会列出很多最常用的命令。

花式进入插入模式

  • i:在光标当前位置进入插入模式
  • I:在本行第一个不是 blank 字符的位置插入(所谓 blank 字符就是空格,tab,换行,回车等)
  • a:在光标后插入
  • A:在行尾插入
  • o:在当前行后插入一个新行
  • O:在当前行前插入新行

花式打开/保存/退出

  • :w:保存文件不退出
  • :wq:保存文件并退出
  • q!:不保存强制退出
  • e <path/to/file>:打开一个新文件
  • e!:放弃所有更改,从上次保存文件开始再编辑
  • :saveas <path/to/file>:另存为
  • bn:打开多个文件时,切换到下一个文件
  • bp:打开多个文件时,切换到上一个文件

撤销/重做

  • u:撤销
  • Ctrl + r:重做

花式移动光标

行内移动

  • 0:到行头
  • ^:到本行第一个非 blank 字符
  • $:到行尾
  • g_:到本行最后一个非 blank 字符
匹配字符移动

格式:

  • <count>f<char>:到本行后面第 countchar 处,count 是数字,char 是任意单个字符
  • <count>F<char>:到本行前面第 countchar 处,count 是数字,char 是任意单个字符
  • <count>t<char>:到本行后面第 countchar 前,count 是数字,char 是任意单个字符
  • <count>T<char>:到本行前面第 countchar 前,count 是数字,char 是任意单个字符

例子:

  • 2fa:到本行后面第二个 a
  • 2Fa:到本行前面第二个 a
  • 2ta:到本行后面第二个 a 前面一个字符处
  • 2Ta:到本行前面第二个 a 前面一个字符处
按单词分隔移动
  • w:到下一个单词开头(一个单词由字母,数字和下划线组成)
  • W:到下一个单词开头(由 blank 字符作为分隔符,一个单词可以包含特殊符号)
  • b:到上一个单词开头(一个单词由字母,数字和下划线组成)
  • B:到上一个单词开头(由 blank 字符作为分隔符,一个单词可以包含特殊符号)
  • e:到下一个单词结尾(一个单词由字母,数字和下划线组成)
  • E:到下一个单词结尾(由 blank 字符作为分隔符,一个单词可以包含特殊符号)

跨行移动

  • /pattern:搜索 pattern 字符串并移动,如果匹配多个,按 n 可以移动到下一个
  • :N:移动到第 N 行
  • ggH:移动到第一行
  • GL:移动到最后一行
  • %:匹配括号移动(括号包括:(,{,[),需要把光标现移到括号上。
  • *#:匹配当前光标所在单词,移动光标到下一个用 *,上一个用 #
  • (:跳转到句首
  • ):跳转到句尾
  • {:跳转到段首
  • }:跳转到段尾

进阶

连招

熟练了光标移动,每个常用按键都可以下意识地打出来后,光标的移动速度是不是比只按上下左右快很多呢。

不仅如此,你一定要好好学习光标移动的快捷键。因为光标移动还可以跟命令联动,形成所谓的“连招”,格式如下:

<start position> <command> <end position>

<start position><end position> 可以是任意一个光标移动的快捷键。如果光标一开始已经在合适的位置,<start position> 可以省略。

<command> 可以是下面的其中一个操作:

  • d:删除
  • y:复制
  • v:可视化选择
  • gU:变大写
  • gu:变小写

例子

1、删除一个文件全部内容:ggdG

2、复制所在括号内的所有内容(光标一开始位于括号上):y%

3、选择本行光标后两个 a 之间的字符:favfa

4、将这个文件后面两个 the 之间的字符变成大写:/the<回车>gU/the<回车>

5、将光标所在单词变成小写:bguw

区域选择

刚刚提到了可视化选择,那是一个很有趣的模式。先按v,然后移动光标,你就会看到文本被选择,然后,你可能d,也可y,也可以在底线命令模式中对这部分内容执行 sed 语句等。

然后接下来要提到更加强大的**区域选择**。格式是:

<command> a <object><command> i <object>

<command> 可以是刚刚提到的命令,如:dy

<object> 可以是:

  • w:一个单词
  • s:一句
  • p:一段
  • 特殊字符:"')}]

a 会选择包括 <object> 在内的字符,i 会选择不包括 <object> 在内的字符。

例子

一段代码:

{
    [
        (map (+) ("foo"))
    ]
}

我的光标位于 foo 中的 f 处`:

  • vi":会选择 foo
  • va":会选择 "foo"
  • vi(:会选择 "foo"
  • va(:会选择 ("foo")
  • v2i):会选择 map (+) ("foo")
  • v2a):会选择 (map (+) ("foo"))
  • va[ 会选择:
[
    (map (+) ("foo"))
]
  • va{ 会选择:
{
    [
        (map (+) ("foo"))
    ]
}

超神

块操作

Ctrl + v 可以进入块操作模式,然后选择矩形区域的东西。最常用的是在行尾跟行首添加一些东西: