Vim

vim

适用于:纯文本文件编辑(代码、markdown文件、LaTeX源码)

优势:

  • 高效的移动
  • 高效的编辑

主要4种模式:

  • Normal模式:默认模式,也是最常用的模式
  • Insert模式:插入模式,像正常的文本编辑器一样输入
  • Command模式:命里模式,在底部输入命令
  • Visual模式:可视模式,对文本进行选择

Normal模式

基本移动

  • hjkl:上下左右
  • gg:跳到第一行(类似Home键)
  • G:跳到最后一行(类似End键)
  • Ctrl-u / Ctrl-b:往上翻半页/一页(类似键 PageUp
  • Ctrl-d / Ctrl-f:往下翻半页/一页(类似键 PageDown
  • {lineno}gg:跳到第lineno
  • zz / zt / zb:光标行设置为屏幕居中/屏幕第一行/屏幕最后一行

Insert模式

  • i :代表"insert",当前光标之前开始输入
  • a :代表"append",当前光标之后开始输入
  • I :在本行的开头开始输入
  • A :在本行的末尾开始输入
  • o :下方插入新的一行,然后开始输入
  • s :删除当前光标的字符,然后开始输入
  • O :上方插入新的一行,然后开始输入
  • S :删除当前行,然后开始输入

进入Command模式

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

  • :w:保存当前文件
  • :q:退出
  • :q!:放弃当前更改,然后退出
  • :wq:保持当前更改,然后退出
  • :x:类似于:wq,保持并退出
  • :h{command}:显示关于命里的帮助
  • <Esc:回到Normal模式

进入Visual模式

  • v:Normal模式下进入可视模式,选择字符
  • V :Normal模式下进入可视模式,选择行
  • x / y:剪切/复制

基于单词的移动

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

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

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

基于搜索的移动

(1) 行内搜索:

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

(2) 文件中搜索:

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

(3) 基于标记的移动

  • m{mark}:把当前位置标记为mark
  • ``{mark}:跳转到名为 mark` 的标记位置
  • mark:为 a-z 的字符

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

内置标记:

  • `` :上次跳转前的位置
  • `. :上次修改的地方
  • `^:上次插入的位置

(4) 其它实用的跳转

  • ^ / $ :跳转到本行的开始/结尾
  • % :跳到匹配的配对符(括号等)处

编辑

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

"操作符 + 移动" 是非常重要的操作逻辑,它运行你组合处各种动作

常见操作符:

  • c:代表"change",修改,删除内容并进入插入模式
  • d:代表"delete",删除
  • y:代表"yank",复制
  • v:代表"visual",选中文本,进入可视模式
  • r:代表"replace",替换光标所在的字符(r替换单个字符)
  • R:替换多个字符,ESC退出。
  • p:粘贴
  • x:剪切光标所在字符

例子:

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

重复操作:. 命令

  • .:重复上一次修改
  • u:撤销上一次修改
  • <Ctrl-r>:重做上一次修改

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

批量操作:数字+动作

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

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

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

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

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

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

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

:set relativenumber :开启

:set norelativenumber :关闭

文本对象操作

textobjects:语义化的文本片段

格式:i / a + 对象

常见的对象:

  • w / Wsp:单词、句子、段落
  • ( / )[ / ]{ / }< / >' / ":配对符定义的对象

i :代表"inner",内部;

a:代表"a",额外包括周围的空格或配对符

操作符与命令补充

  • gu / gU / g~ :操作符,转小写/转大写/翻转大小写
  • J:join,连接两行
  • <Ctrl-a> / Ctrl-x:增加数字/减少数字
  • g<Ctrl-A> :创建递增序列
  • < / > :左/右缩进

寄存器与宏

寄存器

Vim提供了许多寄存器用于存放内容,可以理解为剪切板,一个字符对应一个寄存器(如a-z0-9

特别的寄存器:

  • " :默认寄存器,平时复制、删除的内容都放在里面
  • % :当前文件名
  • . :上次插入的内容
  • : :上次执行的命令

通过:reg {register} 查看对应寄存器的内容

指定寄存器

在复制/删除/粘贴等操作前加上{register} 就可以指定本次操作所用的寄存器

只要涉及寄存器操作的都可以这样指定

  • "ayy :将这一行复制到a寄存器中
  • "bdiw :将单词删除,保存到b寄存器中
  • "cp :将c寄存器中的内容粘贴出来

常见用途:将想要持久保持的文本放到制定寄存器里,随时进行粘贴,避免被覆盖

寄存器字符大写:添加(append)而并非覆盖

宏(Macro):录制一系列键盘操作,并允许我们重放这些操作

操作序列存储在指定的寄存器中

  • q{register} :开始录制宏,存在寄存器register

  • 录制过程中按q退出录制

  • @{register}:重放寄存器register中的操作

  • @@:重放上一次宏操作

    常见用法:q{register}录制一段操作,@{register}重复,然后一直@@重放

    注意:.命令对宏不生效,.命令只记录上一次修改,而宏可能包含多次修改

命令模式

命令模式的操作对象以"行"为基本单位

normal和global命令提供了强大的批量行操作

Ex命令格式

:[range] {excommand} [args]

  • range:作用的范围,不给的话默认是本行
  • excommand:特殊的命令,适用于Command模式
  • arg:后续的参数,视命令而定

一些Ex Command([x]为寄存器,是可选项):

  • :[range] delete [x]:删除range中的行(到寄存器x),delete可简写为d
  • :[range] yank [x]:复制range中的行(到寄存器x),yank可简写为y
  • :[range] print:将range中的行打印出来,print可简写为p

rangeaddres:指定范围

range由一个或两个address构成,即{address}{address},{address}

addres可以是:

  • {lineno}:行号,如3代表第三行(0代表第一行上面的虚拟行)
  • $:最后一行
  • .:光标所在行
  • /{pattern}:下一个pattern所在的行

address可以做加减法,.+3代表光标下第三行,$-3代表倒数第 4 行

行的复制、移动、粘贴

  • :[range] copy {address}:把range中的行复制到address后面
  • :[range] move {address}:把range中的行移动到address后面
  • :[address] put [x]:把寄存器x的内容粘贴到address后面

normal命令

格式::[range] normal {commands}

含义:对range中的所有行执行Normal模式下的命令commands

  • range设置为%,可以对整个文件的所有行执行

  • :[range] normal .:配合.命令,效果拔群

    常用做法:先做一次修改操作,再用normal命令在指定的行上完成操作

  • .命令只能记录一次修改,用宏可以实现记录多个操作

    :[range] normal @{register}

    常用做法:先把想要的操作录制成宏,再用normal命令在指定的行上重放宏

global命令

格式::[range] global/{pattern}/[cmd]

含义:对range中包含pattern的所有行执行Command模式下的Ex命令

[cmd]:Ex命令,不给的话默认打印(print

注意,normal命令也是Ex命令!

例子:

  • :% global /TODO/delete

替换命令

格式::[range]s/{pattern}/{string}/[flags]

含义:将pattern替换为string

flags

  • g:替换每一行的所有匹配
  • i:忽视大小写
  • c:替换前进行确认
  • n:计数而不是替换

例子:

:%s/Vim//gn:统计文件中所以Vim出现的次数(此时替换为什么无所谓,加了n就不会执行替换操作)

posted @ 2025-07-07 15:36  星空丶star  阅读(9)  评论(0)    收藏  举报