Mushyroom Blog

VIM Commands

July 20, 2019

tags:

命令模式中的基础命令

VIM有大量的命令可供你使用,这里我只主要介绍针对单个文件,尤其是代码文件的编辑中最有用的一些命令。我会根据以下编辑文件的逻辑顺序来介绍:

  1. 打开文件,以及关于整个文件编辑的设置
  2. 光标移动到需要编辑的位置
  3. 进行编辑
  4. 查找替换
  5. 使用图形化的选择帮助编辑

首先是打开文件,以及关于整个文件编辑的设置

目的 按键
打开新文件 :e 回车
退出 :q 回车
保存 :w 回车
另存为 :w 回车
查找帮助 :h <帮助主题>
设置搜索中忽略大小写 :set ignorecase 回车
设置搜索显示高亮 :set hlsearch 回车
设置增量查找。边输入边查找已输入的内容 :set incsearch 回车
设置支持方便编辑多文件 :set hidden 回车

:h用来查找帮助文档。VIM的文档很全面,不过从我的经验来看,初学者使用谷歌搜索效果会跟好一些。

:set是在命令行中进行VIM的设置。你也可以把他们写到自己的用户目录下的.vimrc文件里面。

进入文件之后,下一步编辑操作就到了

移动光标

VIM提供了非常细粒度的光标移动命令。在水平移动方面,有一下常用命令:

目的 按键
向左移动一个字符 h
向右移动一个字符 l
向左移动到上一个单词 b
向右移动到下一个单词开头 w
向右移动到下一个单词的末尾 e
向左移动到上一个大单词(空格分开的叫大单词) B
向右移动到下一个单词开头 W
向右移动到下一个单词的末尾 E
向右移动到下一个字母x,光标放到x上 fx
向右移动到下一个字母x,光标放到x前 tx
向左移动到本行开头 0
想左移动到本行第一个不是空格的字符 ^
向右移动到本行结尾 $

下面列举常用的上下移动的光标命令:

目的 按键
向上移动一行 k
向下移动一行 j
向上移动到文件开头 gg
向下移动到文件结尾 G
移动到第n行 nG
向上翻页 CTRL+B
向下翻页 CTRL+F

另外还有一些是跟文字单元相关的命令:

目的 按键
跳转到对应的括号 %
移动光标到上一个空行 {
移动光标到下一个空行 }

这些命令都可以用来组合命令。举一个基础的例子:我在编辑一个比较长的代码块,代码块里面没有空行,这时”{”和”}”帮不了忙,我常使用命令5k快速上移5行,用5j快速下移5行。

移动好了光标,下一步是

进行编辑

目的 按键
删除当前字符 x
删除当前字符 X
删除通用命令 d
修改通用命令 c
拷贝通用命令 y
删除当前行 dd
拷贝当前行 yy
删除当前行并进入编辑模式 cc
取消上一个编辑命令 u
重做上一个编辑命令 CTRL+r
重复上一个编辑命令 .

其中d,c,y三个是通用修改命令,虽然只有三个,但VIM通过组合的方式使得具体操作非常多样化。以下是一些例子:

目的 按键
删除到行尾 d$
删除到文件末尾 dG
删除到这一行开头第一个不是空格的字符 c^
修改光标所在位置的单词 ciw (这个iw是特殊而强大的文件对象定义方法。我在后面会介绍)
删除到当前行字符串结尾的地方 ct“

最后面的这个ct”我稍微讲解一下。它是编辑命令c和光标移动命令t的组合。比如在下面的一行代码里面,

  console.error("No more round to run")
                          ^   

光标位于“round”的r字母处后面。ct”这个组合命令中c是命令,前面没有数字部分。后面的文字对象部分是t”的,表示从当前位置到最后的双引号。组合起来的操作就是是把r往后直到双引号的部分全部进行修改。 执行之后,文本变为

  console.error("No more r")
                          ^   

因为写代码的过程中我常常要修改从当前位置到括号、引号之类的边界,所有类似的常用组合命令还有dt},cT{等。简单三个字母就完成了我想进行的操作。相信你也看出来命令组合的威力了吧。

第四组常用命令是查找/替换命令

目的 按键
向下搜素 /
查找当前光标所在单词 *
把abc替换成xyz :%s/abc/xyz/g

进行查找的过程中,使用n查找下一个,N查找上一个。

这个替换命令,有一些复杂,我稍微讲解一下。这是一个ex风格的命令。前面提到过,ex是对一行文本使用命令进行编辑的工具,是VI的前身。命令中的百分号%后面的部分就是一个ex命令。下面是每一个部分的解释:

:%s/abc/xyz/g
:---------------> 命令行模式
 %--------------> 针对所有行运行后面的命令
  s-------------> 这个一个Substitute(替换)命令。格式为s///g
    abc---------> 被替换串
        xyz-----> 新串
            g---> s命令的选项,表示在当前行如果有多个被替换传的话,每个都替换                          

最后一组是可视模式(Visual Mode)

可视模式是VIM中除了命令模式和编辑模式之外的另一个模式。进入这种模式后,当前字符会高亮显示,表示已经被选择,然后你可以使用光标移动命令来调整你选择的文字范围,选择完成之后再使用编辑命令对所选内容进行操作。再次使用上面t”命令为例。我们可以先用命令v进入可视模式,这时字母n被高亮显示。

                          _
console.error("No more round to run")
                          ^   
// 注:字幕上面有横线表示高亮显示。

然后,我输入t”,这时从n到结尾的双引号全部被高亮显示,让我可以确认我的选择是正确的:

                          _________
console.error("No more round to run") // 字符上面的横线表示该字符高亮显示
                                  ^

最后,我再输入编辑命令c,将选择的字符删除并进入编辑模式。最终实现了和ct”一样的效果。这个通过视觉模式进行的操作虽然按键较多,但是让我在进行修改之前有了确认的机会,让我安心了许多。

事实上可视模式一共有三种,v只是其中一种。

命令 按键
基于字符的可视模式 v
基于行的可视模式 V
基于列的可视模式 CTRL+v

Jason Ge 葛俊