在vi编辑器中使用sudo命令
:w !sudo tee %
命令:w !{cmd},让vim执行一个外部命令{cmd},然后把当前缓冲区的内容从stdin传入。tee是一个把stdin保存到文件的小工具。 而%,是vim当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径。 所以执行这个命令,就相当于从vim外部修改了当前编辑的文件。
返回上次的位置
ctrl + o: 返回上次光标位置;ctrl + i: 前进到光标的位置;
排版对齐
ctrl +v:选择需要对齐的行,之后按=即可对齐。
字符串替换
:%s/aaaa/bbbb/g:替换每一行中所有aaaa为bbbb,http://www.cnblogs.com/tovep/articles/2715803.html。
快速选中单词
光标移动到要选中的单词开头,按v按e。
撤销
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之间;