想法子记忆Vi/Vim常用操作及指令
本笔记有特殊目录,点击开启:
在Linux系统中编辑文本总是离不开一位老帮手——Vi。而因为其诞生的年代有些久远,有些操作在现在看来可能有点“反直觉”。
于是我决定写这样一篇小笔记,记录一下我记忆Vi的这些这些 常用 操作和指令的方法(主要靠的是英语和图示了)。
当然,正如“好记性不如烂笔头”所言,多实践才是熟练掌握技能的王道。

关于Vi/Vim名词本身
-
Vi代表的可能是Visual Instrument(可视工具),Visual Interface(可视界面)亦或就是Visual(可视化的)单词本身。 -
Vim倒是很明显,代表的是Vi IMproved(Vi改进版)。
编辑器模式
对Vi而言:
-
命令模式 (
Commandmode) ,刚进入Vi编辑器时的默认模式。在此模式下能输入Vi的合法指令(通常是一些字符)来进行操作。 -
插入(输入)模式 (
Insertmode) ,顾名思义,是直截了当地编辑文本的模式。 -
末行(底线)模式 (
Last-linemode) ,也是接受指令的一种模式,更偏向于文件的管理。
之所以叫 “末行” 是因为指令的输入在窗口最下方:
Vim是Vi的增强版,因此Vim完全可以兼容Vi的操作,不过它的模式名可能略有差别:
-
正常模式 (
Normalmode) ,是启动Vim后的默认模式。 -
插入模式 (
Insertmode) ,这个和Vi的一致。 -
命令(行)模式 (
Command-linemode),类似Vi的末行模式。 -
可视模式 (
Visualmode) ,和普通模式类似,不同的是可以高光选择文字的一部分进行命令操作。包括上述几种模式,Vim总共有
12种模式(这个说法来自Wikipedia)。但最常用的还是上面这四种,一般情况下够用了。
模式切换
展开阅读
就Vi的三种模式而言,要在其间互相切换,需要借默认模式——命令模式作为一个中转(对于Vim来说就是正常模式)。
-
命令模式
“剪切一行”这一节中也提到了。
-
基本光标移动(上下左右)
缩进操作后,标记的位置仍然在文本的相应位置,无需担心。
末行模式/命令行模式下可以查看标记信息::marks -
翻页
单词尾部的部分,
而
y^能复制光标所在位置到行首第一个非空白符的单词部分,再者
y↓或yj能实现同2yy一样的功能:复制光标所在行以及下一行,甚至
y(都是可以的,复制光标所在位置到光标所在句开头。也就是说
y{,y},yk,yl,y$,yg^,y`a等等其实都是可以的!
另外还可以复制多行,比如3ygj。
模式切换这一节里面写了
??记忆方法:
dd中的d记为delete [v]删除;
cc中的c记为change[v]改变,亦可记成Chi 吃;
S可以记成Shift [v]转移,剪切就像是在转移文本的位置,亦可记成Shan 删。 -
剪切多行
多行复制了,肯定是会剪切多行的。
2dd剪切光标所在行和下面一行,共2行
6dd剪切光标所在行及下面5行,共6行
3cc剪切光标所在行及下面2行,并进入插入模式
3S同上?? -
剪切一个字符
切换到插入模式服务!

dj或d↓的效果就等同于2dd
cj或c↓的效果就等同于2cc,会进入插入模式
5x能剪切光标右边的5个字符
5s能剪切光标右边5个字符且进入插入模式
3cgj能剪切从当前光标到3个屏幕可见行后的相应位置部分
dw剪切从当前光标位置到下一个单词前的部分
cw在进行上面的操作??后,会进入插入模式
d^剪切从当前光标位置到本行头部一个不是空白符的字符的部分
c^在进行上面的操作??后,会进入插入模式
d`a剪切从当前光标位置到a标记位置的部分
??演示了一下
3dgj。从光标所在位置语开始,到执行了3gj之后的光标位置为止作为选区,进行剪切。也就是这一部分:语人曰:“此当有大手 笔事。”俄而帝崩,哀册说议皆淘所草。释义用来赞誉写作才 能极高,并用来称颂着名的作家和作品、故事东晋的文士王玖 从小才思敏捷,胆量很大,散文和诗
:reg[isters]
-
缩进
nrformats配置一节。
-
字母大小写切换
双引号指定寄存器一起记。
? 直接使用
:registers或:reg时会展示所有的寄存器 ??
也可以在后面指定要查询的寄存器名,这些名称可以用空格分开,也可以连在一起写:
? 比如
:reg[isters] a b c或:reg[isters] abc,可以筛选查询a,b,c寄存器 ??
关于寄存器更多用法这里就不多赘述了~

-
:marks查看标记信息自定义跳转标记一起记。
? 直接使用
:marks能查询到所有现有的标记和:registers一样,在后接查询的标记名,能筛选结果:
? 比如
:marks a b c或:marks abc,可以筛选查询a,b,c标记 -
:set设置项快捷减增数字。不过呢,Vim怎么识别增减的类型呢? 这就涉及到下面这个配置项了:
-
:set nrformats或:set nf能识别的增减类型。这里的
octal,hex则代表会尝试识别八进制,十六进制以及十进制的数字。(十进制是默认支持的) -
使用
+=或-=进行配置自定义跳转标记)
上述符号±相对行数比如 'a+2就代表a标记所在行的下面第二行;.-1就代表光标所在行的上面一行上述符号1,上述符号2代表从 上述符号1代表的行到上述符号2代表的行。比如.,$代表从光标所在行到最后一行。%代表从第一行到最后一行(整个文本),和 1,$相同'<,'>在可视模式下输入 :进入末行模式/命令行模式会自动填充,代表**可视模式下选定的范围
?? 示例:
.,+3代表从光标所在行到光标所在行的下面第三行作为范围进行替换 -
搜索模式
搜索模式。
?? 值得一提的是这里可以留空。如果留空的话默认使用上一次搜索的匹配。
比如我先搜索了
/\,然后我想替换全文的 /\为 pepper,在替换时可以这样写::%s//pepper/g(省略了搜索模式)。 -
替换模式
搜索模式中提到过在模式中加入
\c能忽略大小写进行搜索,而这里替换也是用的搜索模式,
因此在这里就算不用修饰符i,转而在搜索模式中加入\c也是完全可以的。
?? 不使用修饰符而是在搜索模式中使用了
\c

?? 使用
n修饰符,并不会实际替换文本,而是显示匹配的数量

?? 使用
c修饰符,在替换前让用户确认。其中提示输入的
(y/n/a/q/l/^E/^Y)中,分别代表:输入指令 说明 记忆 y确认替换当前光标所在匹配 yes [v]确认n不替换当前匹配 no [v]不a确认替换所有匹配 all [v]所有q不进行替换并退出 quit [v]退出l替换当前匹配并退出 instead [adv]顶替(另还有
Ctrl+E和Ctrl+Y,是光标移动指令)
-
-
打开新窗口
:q 退出 -
模式切换->可视模式
-
基本搜索替换->作用范围
-
拷剪粘三件套
行连接指令几乎是一样了。
-
J将所选文本对应的行连接成一行,用空格间隔 (Join)
-
gJ将所选文本对应的行连接成一行,没有间隔
-
-
执行
末行模式/命令行模式指令基本搜索替换->作用范围
-
代码缩进
大小写转换指令是很类似的:
-
u将所选文本转换为小写 -
U将所选文本转换为大写 (UPPERCASE) -
~将所选文本中的大写和小写分别转换为小写和大写

?? 演示了一下使用
~进行大小写转换 -
上面这些按键指令都是在命令模式/正常模式下输入的,通过在指令前附加数字,能重复这个指令的操作:
模式切换
除了这些,搜索替换可能还有一些其他的用法尚未提到,另外还有:g这种末行指令。这里就主要记录一下基础的用法啦~

简单多窗口编辑
一个文件一个文件地打开编辑老累了,幸运的是,Vim支持多窗口编辑。
可视模式
前面的笔记有几个地方涉及到了可视模式:
可视模式下的操作可谓是简化版的命令模式/正常模式了,显而易见,“简化”的就是“选择文本”的操作了。
在高光选择了文本后可以进行以下操作:
可视模式还有很多用法,这里就不再写更多了(再写更多就成语法手册了喂!)
In the end
回过头来...我又写了这么长一篇笔记...稍后我会完善一下目录功能以增加阅读体验。
这篇笔记虽然写得多,但是涉及的内容实际上还是比较浅层的,毕竟这篇笔记主要目的是为了记忆常用方法。也就是说,Vi/Vim的使用技巧远不止这么一点,更多高级的操作还需日常多加使用才能更加熟练!
因个人能力极其有限,可能文章中会出现部分错误。如果有写错的地方,也请大家多指教!
最后...感谢你读到这里,再会~
