在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之间;