初识 Vim

主要的四种模式:

  1. normal:默认进入的模式,最常用的模式
  2. insert:插入模式,像正常的文本编辑器一样输入
  3. command:命令模式,在底部输入命令
  4. visual:可视模式,对文本进行选择

normal 模式:基本的移动

  • hjkl:上下左右
  • gg:跳到第一行
  • G:调到最后一行
  • ctrl+u:向上翻半页
  • ctrl+d:向后翻半页
  • number+gg:跳到第几行
  • zzztzb:光标行设置为屏幕居中、首行(top)、末行(bottom)

insert 模式

i :代表“insert”,当前光标之前开始输入

a :代表“append”,当前光标之后开始输入

o:下方插入新的一行,然后开始输入

s :删除当前光标的字符,然后开始输入

I :在本行的开头开始输入

A :在本行的末尾开始输入

O :上方插入新的一行,然后开始输入

S :删除当前行,然后开始输入

command 模式

Normal 模式下输入 : 进入 Command 模式

  • :w :保存当前文件
  • :q :退出
  • :q! :放弃当前更改,然后退出
  • :wq :保存当前更改,然后退出
  • :h {command} :显示关于命令的帮助

<Esc> 回到 Normal 模式

visual 模式

  • normal 模式下按v可进入可视模式

  • 进入可视模式后可以用 Normal 模式下的移动命令选择文本

  • 可视模式下 x, y :剪切/复制;回到 Normal 模式下 p :粘贴

  • Normal 模式下按 V 进入行可视模式,一次选中一整行,在需要选中多行时很方便

    <Esc> 回到 Normal 模式

移动和编辑

基于单词的移动

简单的 hjkl 显然无法满足我们的需要

  • w :代表“word”,跳转到下一处单词的开头
  • b :代表“back”,跳转到上一处单词的开头
  • e :代表“end”,跳转到下一处单词的结尾
  • ge : e 的反向版本,跳转到上一处单词的结尾

wbe 大写版本 WBE 对应的单词是连续的非空字符

image-20240609155246236

基于搜索的移动

行内移动:

  • f{char}t{char}:跳转到本行下一个char字符出现处、出现前
  • ;,:快速向后、向前重复ft查找
  • F{char}T{char}:往前搜索而非往后

文件中搜索:

  • /{pattern} :跳转到本文件中下一个 pattern 出现的地方
  • ?{pattern} :跳转到本文件中上一个 pattern 出现的地方
  • pattern 可以是正则表达式
  • * :等价于 /{pattern} pattern 是当前光标下的单词
  • nN :快速重复 / 查找

基于标记的移动

  • m{mark} :把当前位置标记为 mark

  • `{mark} :跳转到名为 mark 的标记位置

mark 是 a-z 的字符

常用场景:当需要临时离开当前光标处,做一些事情后再快速地回来

我比较习惯用的标记是 mm

内置标记:

  • `` :上次跳转前的位置

  • `. :上次修改的位置

  • `^ :上次插入的位置

其他实用的跳转

  • ^$ :跳转到本行的开始、结尾

  • % :跳到匹配的配对符(括号等)处

Operator+Motion=Action

{operator}{motion} :一次编辑动作

常见操作符:

  • c:代表"change",修改,删除内容并进行插入模式
  • d:代表"delete",删除
  • y: 代表"yank",复制
  • v:代表"visual",选中文本,进入可视模式

例子:

  • dgg:删除到第一行
  • ye:复制到单词结尾
  • d$:删除到行尾
  • dt;:删除直到分号为止的内容

大部分操作符连续按两次( cc/dd/yy ):将其作用在这一行上

  • dd :删除这一行

重复操作:. 命令

  • .:重复上一次修改
  • u:撤销上一次修改
  • ctrl+r:重做上一次修改

.命令非常适合用于需要多次重复某一个修改动作的场景。省去了重复输入命令,大大提高效率

批量操作:数字+动作

{count}{action} :重复 count action 动作

动作可以是移动动作或是编辑动作

  • 4j:向下移动 4 行
  • 3dw:删除 3 个单词
  • 2yy:复制 2 行
  • 4p:粘贴 4 次

数字+动作 是一种重要的批量操作方式,命令直观,语义明确

  • .命令可以直观地看到每一次的变化,在合适的时候停止
  • 数字+动作则需要预先知道动作的次数

技巧:使用相对行号确定移动范围

当涉及行操作时,使用相对行号能够更直观地确定范围

:set relativenumber :开启

:set norelativenumber :关闭

文本对象操作

。。。

寄存器与宏

。。。

命令模式

。。。