本文为在使用vim过程中,自己归纳总结的vim常用操作技巧
1. I 定位到行首,并开始输入
2. A 定位到行尾,并开始输入
3. 输入$,定位到当前行倒数第二个数,默认最后一个为标点符号
4. 如果你的系统环境不是中文,而你想使用中文的vimtutor,就运行vimtutor zh
//******************* 文档操作***********************************
:e file --关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi会警告。
:e#或ctrl+^ -- 回到刚才编辑的文件,很实用。
:f或ctrl+g -- 显示文档名,是否修改,和光标位置当前百分比
:f filename -- 改变编辑的文件名,这时再保存相当于另存为。
:wq -- 保存并退出。
ZZ -- 保存并退出。
:x -- 保存并退出。
:Sex -- 水平分割一个窗口,浏览文件系统;
:Vex -- 垂直分割一个窗口,浏览文件系统;
:sp vim水平分割窗口(split)
快捷键 Ctrl ws
:vsp vim垂直分割窗口(vsplit)
快捷键 Ctrl wv
//*******************光标的移动***********************************
w: 前移一个单词,光标停在下一个单词开头;
e: 后移一个单词,光标停在下一个单词末尾;
gg: 到文件头部。
G: 到文件尾部。
ctrl+f: 下翻一屏。
ctrl+b: 上翻一屏。
ctrl+d: 下翻半屏。
ctrl+u: 上翻半屏。
ctrl+e: 向下滚动一行。
ctrl+y: 向上滚动一行。
n%: 到文件n%的位置。
i: 在光标前插入;一个小技巧:按8,再按i,进入插入模式,输入=, 按esc进入命令模式,就会出现8个=。 这在插入分割线时非常有用,如30i+<esc>就插入了36个+组成的分割线。
I: 在当前行第一个非空字符前插入;
gI: 在当前行第一列插入;
a: 在光标后插入;
A: 在当前行最后插入;
o: 在下面新建一行插入;
O: 在上面新建一行插入;
:r filename在当前位置插入另一个文件的内容。
:[n]r filename在第n行插入另一个文件的内容。
:0 r !sed '1,5p' read.txt 在第0行,插入read.txt文件的1-5行内容。 这里!使得能使用外部命令,下面的:r 理解为插入内容。
!command 执行命令
r!command 读入命令的输出
:!! 执行上一次的外部命令。
:r !date 在光标处插入当前日期与时间。同理,:r !command可以将其它shell命令的输出插入当前文档。
c[n]w: 改写光标后1(n)个词。
c[n]l: 改写光标后n个字母。
c[n]h: 改写光标前n个字母。
[n]cc: 修改当前[n]行。 单独一个cc,删除当前行,并且光标处于输入状态
[n]s: 以输入的文本替代光标之后1(n)个字符,相当于c[n]l。
[n]S: 删除指定数目的行,并以所输入文本代替之。 单独一个S,删除当前行,并输入文本代替
删除包含特定字符串的行
:g/str/d str为要特定字符串
[n]x: 剪切光标右边n个字符,相当于d[n]l。
[n]X: 剪切光标左边n个字符,相当于d[n]h。
y: 复制在可视模式下选中的文本。
yy or Y: 复制整行文本。
y$: 从光标当前位置复制到行尾。
y0: 从光标当前位置复制到行首。
:m,ny<cr> 复制m行到n行的内容。
[n] dd: 删除(剪切)1(n)行
p: 在光标之后粘贴。
P: 在光标之前粘贴。
/something: 在后面的文本中查找something。
?something: 在前面的文本中查找something。
//*******************grep***********************************
vimgrep /匹配模式/[g][j] 要搜索的文件/范围
g:表示是否把每一行的多个匹配结果都加入
j:表示是否搜索完后定位到第一个匹配位置
vimgrep /pattern/ % 在当前打开文件中查找
vimgrep /pattern/ * 在当前目录下查找所有
vimgrep /pattern/ ** 在当前目录及子目录下查找所有
vimgrep /pattern/ *.c 查找当前目录下所有.c文件
vimgrep /pattern/ **/* 只查找子目录
:vimgrep /flash/gj **/*.as 搜索当前目录以及所有子目录内as文件中的'flash'
:vimgrep /an error/gj *.c 在所有.c文件中搜索an error
:vimgrep /an error/gj * 在当前目录下的文件搜索an error,不包括子目录
cn 查找下一个
cp 查找上一个
copen 打开quickfix
cw 打开quickfix
cclose 关闭qucikfix
help vimgrep 查看vimgrep帮助
加数字限定搜索结果的上限
:1vim/pattern/ % 只查找那个模式在本文件中的第一个出现。
//*******************替换***********************************
:s/old/new - 用new替换当前行 第一个 old。
:s/old/new/g - 用new替换当前行 所有的 old。
:n1,n2 s/old/new/g - 用new替换文件n1行到n2行所有的old。
:%s/old/new/g - 用new替换 文件中所有的 old。
:%s/^/xxx/g - 在每一行的行首插入xxx, ^表示行首。
:%s/$/xxx/g - 在每一行的行尾插入xxx, $表示行尾。
所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上i则忽略大小写(ignore)。
还有一种比替换更灵活的方式,它是匹配到某个模式后执行某种命令,、SDF
语法为 :[range]g/pattern/command
例如 :%g/^ xyz/normal dd。
表示对于以一个空格和xyz开头的行执行normal模式下的dd命令。
如果不指定range,则表示当前行。
m,n: 从m行到n行。
0: 最开始一行(可能是这样)。
$: 最后一行
.: 当前行
%: 所有行
//*******************编辑***********************************
我们可以一次打开多个文件,如
vi a.txt b.txt c.txt
使用:next(:n)编辑下一个文件。
:2n 编辑下2个文件。
使用:previous或:N编辑上一个文件。
使用:wnext,保存当前文件,并编辑下一个文件。
使用:wprevious,保存当前文件,并编辑上一个文件。
使用:args 显示文件列表。
:n filenames或:args filenames 指定新的文件列表。
vi -o filenames 在水平分割的多个窗口中编辑多个文件。
vi -O filenames 在垂直分割的多个窗口中编辑多个文件。
vim -p files: 打开多个文件,每个文件占用一个标签页。
:tabe tabnew -- 如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区。
^w gf -- 在新的标签页里打开光标下路径指定的文件。
:tabn -- 切换到下一个标签。Control + PageDown,也可以。
:tabp -- 切换到上一个标签。Control + PageUp,也可以。
:tab split -- 将当前缓冲区的内容在新页签中打开。
:tabc[lose] -- 关闭当前的标签页。
:tabo[nly] -- 关闭其它的标签页。
:tabs -- 列出所有的标签页和它们包含的窗口。
:tabm[ove] [N] -- 移动标签页,移动到第N个标签页之后。 如 tabm 0 当前标签页,就会变成第一个标签页
//*******************关闭子窗口***********************************
:qall -- 关闭所有窗口,退出vim。
:wall -- 保存所有修改过的窗口。
:only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
:close -- 关闭当前窗口,CTRL-W c能实现同样的功能。 (象 :q :x同样工作 )
. --重复上一个编辑动作
//*******************宏***********************************
qa:开始录制宏a(键盘操作记录)宏的名字叫a
q:停止录制
@a:播放宏a
//*******************文件加解密***********************************
vim -x file: 开始编辑一个加密的文件。
:X -- 为当前文件设置密码。
:set key= 去除文件的密码。