vi常用命令

在vi编辑器中使用sudo命令

:w !sudo tee %
命令:w !{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。tee是一个把stdin保存到文件的小工具。 而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。 所以执行这个命令,就相当于从vim外部修改了当前编辑的文件。

返回上次的位置

ctrl + o: 返回上次光标位置;
ctrl + i: 前进到光标的位置;

排版对齐

ctrl +v:选择需要对齐的行,之后按=即可对齐。

字符串替换

:%s/aaaa/bbbb/g:替换每一行中所有aaaabbbbhttp://www.cnblogs.com/tovep/articles/2715803.html。

快速选中单词

光标移动到要选中的单词开头,按ve

撤销

u: 撤销;
ctrl + r: 取消撤销;

16进制显示

:%!xxd

16进制修改

:%!xxd -r可以反向写入,以下内容为测试验证过程:
使用下面的dd语句,可以将/dev/zero产生的八进制\000(0x0)转换为八进制\377(0xff)并写入temp文件中,如下:
dd if=/dev/zero bs=1 count=4 | tr "\000" "\377" > temp

vi查看temp文件得到:ÿÿÿÿ,总共4个字节,[noeol]不包含EOL
使用16进制%!xxd查看得到如下,可以看到最后多了一个字节0a表示EOL

1
0000000: ffff ffff 0a                             .....

比如说我要将这里修改成a0a1 a2a3,可以直接用vi编辑。然后:%!xxd -r反向写入再:x保存退出。但是查看大小变为5个字节了,莫名其妙多出1个字节,如下:

1
-rw-rw-r-- 1 victor victor    5 11月  2 09:52 temp

具体原因详见:https://superuser.com/questions/745111/why-is-vim-adding-a-newline-is-this-a-convention
要解决这个问题,就是在反向写入后保存前执行:set binary:set noeol

高亮所匹配的单词

:set hlsearch

光标所处单词查找

g + d: 快速选中光标所在单词,按n可查找。

快速跳到下个单词

w

删除光标所在单词

c + w

快速跳转到文件尾

G: 大写的G,通常情况下,在kernel中,很多初始化动作都是在文件尾做的,该命令可以快速跳转到文件尾。

匹配括号

%: 比如一个很长的if语句,里面有多个括号,可以使用%找到与之相匹配的括号,当然也包括#ifdef#endif

列替换一个字符

ctrl + v: 选中需要替换的列,按r + 输入你想要替换的一个字符即可。

列替换多个字符

ctrl + v: 选中需要替换的列,按大写I,插入你想要的多个字符,按q回到正常模式,按回车即可。

删除包含特定字符的行

:g/pattern/d

删除不包含指定字符的行

:v/pattern/d:g!/pattern/d

定义跳转

ctrl + ]来跳转到变量或者函数定义的地方。ctrl + t返回到跳转前的位置;

自动补全

在vim的insert模式下,可以使用ctrl + n来实现自动补全,使用上下键进行切换;

设置高亮

vi配置:set hlsearch高亮所有匹配的字符串;

立即生效

修改了配置文件.vimrc并保存后,如果希望不重启vim而让配置立即生效,可以在打开的vim中执行:source ~HOME/.vimrc;

切换窗口

taglist中,按ctrl + ww(2次w),可以切换到函数列表区,移动到函数名称行后按ENTER即可查看函数代码。再次按ctrl + ww可回到编辑区;

选择单词

vi选中单词并查找:g + d高亮显示光标所属单词,n查找;

删除单词

vi 快速删除当前光标所在的单词:c + w;

复制单词

yaw可以快速复制当前的单词;

快速跳转下一个单词

vi 快速跳转到下个单词w;

重新加载原文件

:e!命令可以重新装载原来的文件;

帮助

:help {主题}命令可以获得特定主题的帮助;

代码块匹配

命令行模式下:%命令的作用是跳到匹配处,比如括号之间,C的宏指令#if #else #endif之间;

Title:vi常用命令

Author:Victor Huang

Time:2019-04-07 / 14:04

Link:http://wowothink.com/5e60c079/

License: Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)