vim

vim常用笔记

Posted by Suzeyu on 2016-12-27

介绍

vi编辑器是Unix系统最初的编辑器. 它使用控制台图形模式来模拟文本编辑窗口, 允许查看文件中的行, 在文件中移动, 插入, 编辑和替换文本.

尽管可能是世界上最复杂的编辑器, 但其用用的大量特性使其成为Unix管理员多远来的支柱性工具.

GNU项目将vi编辑器移植到开源世界时, 他们就决定对其做一些改变. 由于它不再是以前Unix中那个原始的vi编辑器, 所以开发人员对其进行了重命名vi improved, 或 vim

vim基础

vim编辑器在内存缓冲区中处理数据. 只要键入vim命令和要编辑的文件的名字就可以启动vim编辑器.

例如

# 新建一个 Hello.java
$ vim Hello.java

如果在启动 vim时未指定文件名, 或者这个文件不存在, vim会开辟一段新的缓冲区域来编辑. 如果在命令行下指定了一个已有文件的名字. 那么vim会将文件的整个内容都读到一块缓冲区域来准备编辑.

vim编辑器会检测会话终端的类型, 并用全屏模式将整个控制台窗口作为编辑器区域.

最初的vim编辑窗口显示了文件的内容, 并在窗口的底部显示了一条消息行. 如果文件内容并未占据整个屏幕, vim会在非文件内容行放置一个波浪线. 如下图

底部显示了文件的状态, 以及所编辑的文件的信息. 如果是新建的文件那么会出现[New File]


Vim编辑器有两种操作模式

  • 普通模式
  • 插入模式

通过vim进入的时候就是普通模式

  • 在普通模式中, vim编辑器会将按键解释成命令.
  • 在插入模式下, vim会将你在当前光标位置输入的每个键都插入到缓冲区. 在普通模式下通过i键就可以进入插入模式. 要退回到普通模式只需要按esc键

光标的控制

在普通模式中, 可以通过方向键来移动光标. 同样如果方向键都没有, 你也可以通过字母键来控制. 如下

  • h: 左移一个字符
  • j: 下移一行
  • k: 上移一行
  • l: 右移一个字符

当然不可能只能一行一行的移动. 下面就提高移动速度的命令

  • PageDown(Ctrl + F): 下翻一屏
  • PageUp(Ctrl + B): 上翻一屏
  • G: 移动到缓冲区的最后一行
  • num G: 移动到缓冲区中的第 num
  • gg: 移动到缓冲区的第一行

命令行模式

在普通模式下有一个特别的功能就是命令行模式. 命令行模式提供了一个交互式命令行, 可以输入额外的命令来控制vim的行为. 要进入到命令行模式, 在普通模式下按冒号键. 光标会移动到消息行, 然后出现冒号, 等待输入命令.

在命令行模式下有几个命令可以将缓冲区的数据保存到文件中并对出vim

  • q: 如果未修改缓冲区数据, 退出.
  • q!: 取消所有对缓冲区数据的修改并退出.
  • w filename: 将文件保存到另一个文件中
  • wq: 将缓冲区数据保存到文件中并退出.

缺点命令较多, 但是只要了解了一些基本的vim命令, 无论什么环境, 你都能快速在命令行下直接修改文件. 一旦使用了敲入命令, 在命令行下将数据和编辑命令一起输入就跟第二天性一样的自然, 而需要使用鼠标就显得比较多余了.

编辑数据

普通模式下, vim提供了一些命令来编辑缓冲区的数据.

命令 描述
x 删除当前光标所在位置的字符
dd 删除当前光标所在行
dw 删除当前光标所在位置的单词
d$ 删除当前光标所在位置到行尾的内容
J 删除当前光标所在行行位的换行符(拼接行)
u 撤销前一个编辑命令
a 在当前光标后追加数据
A 在当前光标所在行行尾追加数据
r char 用char替换当前光标所在位置的单个字符
R text 用text覆盖当前光标所在位置的数据, 直到按下esc键

有些编辑命令允许使用数据修饰符来指定重复该命令多少次. 例如:

  • 2x : 删除从光标位置开始的两个字符
  • 5dd: 删除从光标当前行为为起始行下面的5行

复制和粘贴

剪切和粘贴相对容易一些. 在前面说过删除数据的命令, 但vim在删除数据时, 实际上会将数据保存在单独的一个寄存器中. 可以使用p命令取回数据.

例如: dd命令删除了一行文本, 然后移动光标到其他行, 使用p命令. 就会将之前删除的文本插入到当前的光标所在行之后. 可以将它和任何删除文本命令一起搭配使用.


复制文本稍微复杂一点. vim中的复制命令是y代表yank. 可以在y后面使用和d命令相同的第二个字符(yw表示复制一个单词, y$表示复制到行尾). 在复制文本后, 把光标移动到想要复制的位置, 输入p命令. 复制的文本就会出现在该位置.

复制的复杂之处在于, 由于不会影响到你复制的文本, 无法知道到底要发生什么. 也就无法得知具体到底复制了什么内容. 知道将它粘贴到可以看到的地方才会了解到具体复制的内容.但vim还有另外一个功能来解决这个问题.

可视模式会在你移动光标时高亮显示文本. 可以用可视模式选取要复制的文本. 要进入可视模式, 应移动光标到要开始复制的位置, 并按下v键. 这时就会光标所在位置已经被高亮显示. 下一步, 移动光标来覆盖你想要复制的文本(也可以向下移动几行来复制更多). 在移动光标时, vim会高亮显示复制区域的文本, 在覆盖了要复制的文本后, 通过y键来激活复制命令. 现在寄存器已经有了要复制的文本, 移动光标到你要放置的位置, 使用p命令来粘贴.

查找和替换

可以使用vim查找命令来轻松查找缓冲区的数据. 要输入一个查找字符串, 就按下斜线/. 光标会报道消息行, 然后vim会显示出斜线. 在输入你要查找的文本后, 就按下回车键. vim编辑器会采用以下三种回应的一种.

  • 如果要查找的文本出现在光标当前位置之后, 则光标会跳到该文本出现的第一个位置.
  • 如果要查找的恩本未出现在光标当前位置之后出现, 则光标会绕过文件末尾, 出现在该文本所在的第一个位置(并用一条消息指明)
  • 输出一条消息, 说明在文件中没有找到查找的文本.

要继续查找同一个单词, 按下斜线键, 然后按回车键. 或者使用n键, 表示下一个(next).

替换命令允许你快速用另一个单词来替换文本的某个单词. 必须进入命令模式才能使用替换命令. 替换命令的格式是:

:s/old/new

vim编辑器会调到old第一次出现的地方, 并用new来替换. 可以对替换命令做一些修改多处文本.

  • :s/old/new/g : 一行命令替换所有old
  • :n,ms/old/new : 替换行号nm之间所有old
  • :%s/old/new/g : 替换整个文件中的old
  • :%s/old/new/gc : 替换整个文件中的所有old, 但在每次出现时提示.

对一个命令行文本编辑器而言, vim包含了不少高级功能. 讲过的也只是一小部分.