记录了vi编辑器的各种常用命令,方便查询使用。

vi的三种工作模式

  1. 命令行模式
    默认进入编辑器的模式,可以进行查看、复制、粘贴、其他快捷键等,如果从其他模式激活命令行模式则按以下Esc。
  2. 插入模式 对内容继续增删改等操作,按下i激活该模式。
  3. 底行模式 光标位于底部,以输入命令进行vi操作,命令行下输入冒号(:),即可激活。

简单命令

1. 保存

1
:w

2. 退出

1
2
:q   #没有修改过
:q! #修改过不想保存

3. 保存并退出

1
2
:wq  #二者等效
:x

高效的命令

1. 插入命令(从命令行模式进入插入模式)

1
2
3
4
5
6
7
8
9
#小写组
i #在当前光标插入内容,实际上是从光标前面一位开始插入
a #在当前光标后面追加内容,即会从当前位置后一位追加
o #在当前光标的下一行开始插入,即会自动空出一行

#大写组
I #在光标行字符首部进行插入
A #与I相反,会去到光标行尾部进行插入
O #在当前光标的上一行开始插入,也会自动空出一行

2. 运行Linux的原生命令

有时候我们在vi编辑器中,如果想运行linux命令,一般需要多开一个终端或者保存退出当前编辑器再运行,而实际上也支持在vi中运行linux命令,例如查看当前文件路径等,省去了很多麻烦。

1
:!cmd
for example:
1
:!pwd #文件中查看当前路径

3. 复制/粘贴/删除/撤销操作命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
数字yy #从当前行光标开始复制指定数字行(数字默认为1,即当行)

块复制:
:.,$y #.代表当前行,$代表末行
:N1,N2y #从N1行到N2行全部复制
:%y #全文复制

数字dd #从当前行光标开始删除指定数字行(数字默认为1,即当行)

块剪切:
:.,$d #.代表当前行,$代表末行
:N1,N2d #从N1行到N2行全部删除
:%d #全文剪切

p #小写,粘贴到当前光标所在行的下一行
P #大写,粘贴到当前光标所在行的上一行

u #撤销上一次操作

4. 另存为/读入File文件

1
2
w file #保存当前文件为file文件
r file #读入file文件并粘贴到当前行

5. 光标命令

1
2
3
4
5
6
:set nu   #显示行号
:set nonu #取消显示

1G #移动光标到首行
G #移动光标到末行
:N #移动到第N行

6. 查找字符

1
2
3
4
5
:/str       #查找str字符串
:/正则表达式 #查找匹配的字符串

n 切换下一个匹配结果
N 从最后开始反向切换结果

7. 替换字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
基本格式
:[范围]s/旧字符/新字符/[optional]

常用:
:s/str1/str2/ #不指定范围则默认当前行,且换1
:s/str1/str2/g #不指定范围则默认当前行,g当前行全部替换
:.,$s/str1/str2/g #.代表当前行,$代表末行
:N1,N2s/str1/str2/g #从N1行到N2行全部替换
:%s/str1/str2/g #%全文替换,相当于1,$

如果字符中包含/如何替换呢?如路径等:
答案是用其他符号作为分隔符,如#;或者使用转义字符\;
etc:
:%s#/str1#/str2#g

其余细节
如果你需要预览再确认替换,可以使用c

一些利于开发的配置

缩进、自动补全、行高亮等

把vim配置成VsCode那么好用也麻烦,简单配置vim即可,在/usr/share/vim/vimrc配置中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
set nu   #显示行数
set tabstop=4 #缩进为4(默认8)
set autoindent #自动缩进
set cindent #自动缩进
set cursorline #当前行高亮
syntax on #关键字高亮,颜色不同
set completeopt=preview,menu #函数等名字自动补全(ctrl+n)

#括号、引号等自动补全
inoremap ( ()
inoremap [ []
inoremap { {}<ESC>i
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
set mouse=a #支持鼠标操作

set et #自动将tab转成空格,对排版友好
set et! #取消tab替换

set shiftwidth=2 #用于排版,自动缩进宽度为2

ctags查看宏定义

在查看头文件时,没法像Vscode等IDE直接跳转,给宏定义查看带来不便,ctags插件能解决这个问题;

1
sudo apt-get install ctags

在头文件位置(不清楚就locate xxx.h)生成标签,生成速度嘎嘎块

1
ctags -R
查看强度大的可以配置如何在vim跳转,不大的直接运行
1
vi -t  xxxx(宏定义、变量名、自定义数据类型等)
使用ctrl+]或者ctrl+左击可以进一步跳转查找,使用ctrl+t可以回跳;

但注意,ctrl+左键原始是用于块选中,引入ctags后只能使用ctrl+shift+左键来进行块选择(可忽略行号),或者使用shift+左键来整行选择(会复制行号);

注意该命令只能在tags所在目录运行,如果需要全局运行,需要在vimrc(自行确定vim配置文件位置,我的是/usr/share/vim/vimrc)中添加配置

1
set tags=tags的路径
注意请谨慎设置这项,因为在不同工作区,vimrc是同样生效的。一个取巧的命令是:
1
2
set tags=tags
set autochdir
这样工作区切换时,就从当前目录向上到根目录递归地查找tags文件,无需手动设置,但是一些情况下我们的ctags不仅需要索引工作区的函数和定义,还要索引一些系统库,例如/usr/include下的一些c文件,因此这个方法也不是那么无敌。vim中多定义的查找:
1
ts + 查找内容

换行续上一行

行末尾空格+\可以直接将下一行续上;

vim与系统粘贴板

虚拟机和Windows、Linux跨终端字符复制都需要用到系统粘贴板,这时候就不是yy和p可以解决的了,首先查看vim是否支持系统粘贴板:

1
vim --version | grep clipboard
如果clipboard前面有+号,说明系统粘贴板是可用的,如果不可以,就用一个轻量插件:
1
sudo apt-get install vim-gtk

配合vim命令

假如需要全文复制到别的终端、或者Windows系统,在vim中则使用多一个+号代表是系统粘贴板:

1
:%y+
在终端中使用shift+ctrl+v,在Windows下就使用ctrl+V进行粘贴。

可视化模式

可视化模式可以进行跨系统的传输,可视化选择字符,ctrl+y可以复制对应字符,在Windows下可以粘贴;(这种方法的跨终端我还没找到)

块选择模式

块选择模式可以避免把行号也一并复制了;ctrl+左键可以进行块选择,如果和ctags冲突就是ctrl+shift+左键选择;这种情况可以使用shift+ctrl+c复制文本,跨终端、跨系统都可以使用shift+ctrl+v粘贴。这个也是最常用的用法;

Vscode SSH与系统粘贴板

其他SSH软件暂时没有试过,如果是VsCode,可以安装Vim插件按照上面的说法操作;

另外一种方法,在Vs终端使用Vim的话:块选择就变成了alt+shift,然后shift+ctrl+c可以进行复制,Windows下粘贴就是ctrl+v,如果复制回Linux就是加多个shift(但估计没人要)。