zxc-cppnb

导航

 

vim模式介绍

在vim 9.1版本中,模式非常多除了经常说的visual,normal,insert模式,还有更多模式,比如command,terminal,language等模式
不过有些模式用处比较少,像language模式


vim的命令行操作方式

vim file

打开file文件

vim file1 file2 file3

一次性打开file1 file2 file3 三个文件,此时vim会创建三个流(buffer),但是窗口(window)只有一个,一个窗口只能显示一个buffer。
这里先不介绍如何切换buffer

vim -o file1 file2

把终端上下分割为两个window,并且file1,file2的流都在不同的窗口上。这里先不介绍如何跳转窗口。

vim -O file2 file2

和-o选项类似,但是是左右分割终端。

vim -u file

指定vim的配置文件,vim在启动时会自动加载~/.vimrc配置文件,你可以通过-u选项指定其他的文件为配置文件。如果指定文件为NONE则不使用
配置文件(vim -u NONE),不加载配置文件一般用处是安装插件

vim --cmd "cmd"

在vim没加载配置文件之前执行cmd指令,cmd为vim的指令

vim -c "cmd"

在vim加载第一个文件之后执行cmd指令,cmd为vim的指令
选项先介绍到这里以后会单开一篇详细说

normal 模式

当使用命令进入vim以后,vim默认就会进入normal模式。此时vim会把键入的任何字符当作操作,所以你是不能像正常文本编辑器那样操作的。
因此你需要按下i此时进入insert模式,进入insert模式以后就可以正常编辑了。当进入insert模式以后可以按esc回到normal模式
但是现在的主角不是insert模式。
如果你编辑完文件想保存你可以在normal模式下输入:w<cr>其中<cr>表示回车,退出是:q<cr>,保存并退出是:wq<cr>
强制写入是:w!<cr>,强制退出是:q!<cr>,但是强制写入并推出并不是:w!q<cr>这个命令是把当前缓冲区强制写入到q文件里面
如果需要更多文件操作命令请看教学4

normal模式下光标移动(motion操作)

h 光标向左移动一字符(如果已经在行首vim会发出的声音这个是提示错误)
j 光标向下移动一行
k 光标向上移动一行
l 光标向右移动一字符

是的,这看起来很反人类,但是仔细观察你会发现hjkl在键盘上是连在一起的而且右手打字通常放在jkl;上,熟练后操作非常方便
并且motion操作还涉及一些和其他的操作联用,所以强烈建议多加练习

w 光标跳转到下一个单词开头。
b 光标跳转到单词开头,如果已经在单词开头跳转到上一个单词开头
e 光标跳转到单词末尾,如果已经在单词末尾就跳到下一个单词末尾
ge 光标跳转到上一格单词末尾

值得一提的是单词的边界是由iskeyword选项定义的
这些motion操作都可以使用数字表示重复操作次数,例如:
3j 向下移动3行

f{char} 光标跳转到下一个{char}上,例如fa光标跳转到下一个a的字符上
F{char} 光标跳转到上一个{char}上
t{char} 光标跳转到下一个{char}左边
T{char} 光标跳转到上一个{char}右边
; 重复上一次的f,F,t,T操作
, 反向重复上一次的f,F,t,T操作

你也可以指定数量表示重复次数如3fa这会执行三次fa操作,但是更推荐使用fa之后按;重复

gg 光标跳转到buffer第一行的行首
G 光标跳转到buffer最后一行的行首

值得一提的是这数字加这两个操作是跳转到指定的行开头,例如10G跳转到第10行

} 光标跳转到下一个空行
{ 光标跳转到上一个空行

normal模式下的文本操作

d{motion} 删除{motion}范围内的文本
dd 删除光标所在行
y{motion} 复制{motion}范围内的文本
yy 复制光标所在行
c{motion} 删除{motion}范围内的文本,并进入insert模式
cc 删除光标所在行,并进入insert模式
p 把上一次删除或者复制的内容粘贴出来(这里实际上涉及到vim的寄存器概念,以后再说)
x 删除当前光标下的字符
gu{motion} 将{motion}范围内的字母变为小写
gU{motion} 将{motion}范围内的字母便为大写
~ 将当前光标下的字母反转大小写

例如:
dw 删除到下一个单词开头,不包含下一个单词开头
d2j 删除当前行和下两行
dG 从当前行删除到最后一行
在vim官方手册中包不包含某个字符是用exclusiveinclusive描述的,wbexclusive的,而egeinclusive
d,c,y操作除了和{motion}结合还有一些特殊的用法:

i)i( 光标所在的一对括号里面的范围,不包含括号
a)a( 光标所在的一对括号里面的范围,包含括号
i]i[ 光标所在的一对方括号里面的范围,不包含方括号
a]a[ 光标所在的一对方括号里面的范围,包含方括号
i}i{ 光标所在的一对花括号里面的范围,不包含花括号
a}a{ 光标所在的一对花括号里面的范围,包含花括号
i' 光标所在的一对单引号里面的范围,不包含单引号
a' 光标所在的一对单引号里面的范围,包含单引号
i" 光标所在的一对双引号里面的范围,不包含双引号
a" 光标所在的一对双引号里面的范围,包含双引号
iw 当前光标下的一个单词不包含单词后面的空格
aw 当前光标下的一个单词包含单词后面的空格

其实在按了d,y,c这种指令之后vim会等待你输入范围,这其实也是一种模式叫operator-pending模式,以上的操作都是operator-pending模式的映射
例如:
yaw 复制当前光标下的单词,包含后面的空格
diw 删除当前光标下的单词,不包含后面的空格
值得一提的是dwdaw并不一样,前者是从光标开始的地方删除到下一个单词开头,后者无论光标在这个单词的哪个位置都会删除当前光标下的整个单词。

posted on 2025-09-15 14:13  Cpp_Nb  阅读(13)  评论(0)    收藏  举报