常用到的vim技巧,整理记录在blog上,方便查找。
VIM中,移动光标到下一个单词的词首,使用命令"w",移动光标到上一个单词的词首,使用命令"b";移动光标到下一个单词的结尾,用命令"e",移动光标到上一个单词的结尾,使用命令"ge"。
上面这些命令都使用'iskeyword'选项中的字符来确定单词的分界,还有几个命令,只把空白字符当做"单词"的分界。当然,这里说的"单词"已经不是传统意义上的单词了,而是由非空白字符构成一串字串。命令"W"移动光标到下个字串的开始,命令"B"移动到上个字串的开始;命令"E"移动到下个字串的结尾,命令"gE"移动到上个字串的结尾。
使用H/M/L这三个键,可以让光标跳到当前窗口的顶部、中间、和底部,停留在第一个非空字符上。H命令和L命令前也可以加一个数字,但数字的含义不再是倍数,而是指距窗口顶部、底部的行数。例如,"3H"表示光标移动到距窗口顶部第3行的位置;"5L"表示光标移动到距窗口底部5行的位置
在阅读代码时,有时我们需要根据光标所在的位置滚屏,把光标所在行移动窗口的顶端、中间或底部,这时就可以用到"zt"、"zz"和"zb"。这种滚屏方式相对于翻页来讲,它的好处在于,你能够始终以当前光标位置做为参照,不会出现翻几次页后,发现自己迷失了方向。
^_^
********************************************************************************
1.
选取多个文件用vim打开,只用一个窗口,文件都列在buffer中(这个在windows找到办法了,我用的TC+F4menu,在F4menu设置中的调用vim的"打开方式"项选择"所有文件以列表方式打开",就会将选取的文件都读进buffer,但窗口只显示一个),
gvim --remote-tab-silent
如果在命令行中,直接加参数-p即可在多tab页中分别打开文件,如:vim -p
file1.c file2.c
2. vim用什么方法显示16进制?
:%!xxd
3. 怎样在vim中粘贴进桌面剪贴板里的内容?
比如我在opera里复制的内容粘贴到vim里.
"*p
"+p
4. 在文本wrap的时候怎样才能跳到上一行而不是上一段? 如同notepad里那样?
加个g,如:gj,gk.....
d:\soft
5. 请问vim在命令行上可以复制粘贴么?
Ctrl+r"或者Ctrl+r Ctrl+w可以粘贴到命令行 "
而对把编辑区到命令行,可以先拷贝到如a寄存器,然后在命令行ctrl-r a
6. 如何实现行之间的倒序排序
比如
a
c
b
变成
b
c
a
答案::g/./m0
解释:
:h :m
m->move <address>
m0->把匹配行移动到第一行之前
这是VIM帮助文档里一个tip
:h 12.4
7.怎么实现文本的自然排序。
比如
d
a
c
b
排成
a
b
c
d
答案::sort
8. 如何删除含有某些内容的行?
例如,想要删除含有console的行,怎么写呢?
:g/console/d
9.搜索到一行如何删除该行上面的5行?
:g/string/norm d5k
:g/搜索内容/normal d5k
10. 请问怎样每隔x行插入一个空行
答:
假设每隔5行吧,
qa4jo<Esc>jq
然后 @a就可以了
或者:
:%s/\(.*\n\)\{3}/\0\r/g
3换成你要的数字
11. 如何用vim的列操作加注释
用c-v选中了一列,输入大写I或者大写A,然后输入comment符号,然后esc
12.操作多个文件其实超级简单
o newfilename
:bn buffer Next
:bp Buffer Pervious
:bN The list number N of the buffers
:sp newfile // open a newfile with a splited window
:vs newfile // open a newfile with a vertical splited window
[ctrl] +j // down window (same with the key j)
[ctrl] +k // up window (same with the key k)
[ctrl] +h // left window (same with the key h)
[ctrl] +l // right window (same with the key l)
13.一组能让你爽出内伤的 Vim motion
用vim这么长时间,当看到下边几句,对vim的认识提高一个台阶。
ci[ 删除一对 [] 中的所有字符并进入插入模式
ci( 删除一对 () 中的所有字符并进入插入模式
ci< 删除一对 <> 中的所有字符并进入插入模式
ci{ 删除一对 {} 中的所有字符并进入插入模式
cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
ci" ci' ci` 删除一对引号字符 (" 或 ' 或 `) 中所有字符并进入插入模式
14. 统计关键字的个数
:%s/pattern/&/g
&代表的意思就是用来表示前面比对的字串,所以做这个指令其实对档案本身并不会有什么改变。但是由於做的是全域的取代置换,vim会告诉你有从多少行中多少个字串被取代。轻轻松松很漂亮地用一行命令解决这个问题。
输入只有一行的命令:结果就会出现在最后一行上,而且不会改变到档案本身.
15. 查找关键字
可按『*』来选取关键字。不过 vim 在这里搜寻边界是根据空白或者像「 { 」、「 (
」这些符号等来决定,所以对於中文来说,这个功能可能就不是那么好用。可以用『v』选取然后『y』复制。搜索时,在『/』后,按<
Ctrl-R >然后跟上数字键 0 ,就会出现刚刚复制进入register的字串。指令如下:
/<Ctrl-R>0<CR>
在 vim的register中,register 0是作删除或是 yank 动作时,预设使用的暂存器。
不过在前面可以发现,如果我们用「 * 」作搜寻的时候,字串的前后会被「 \< \>
」夹著。举例来说,如果你找的是 \<link\>,那么, min_links
就不会符合,同样,linknode也不会符合。这也就是说「 \<
」表示的是一个字的头,而 「 \>
」代表的是一个字的尾,当你写\<link的时候,表示你要找的字,是以link开头的,同理,link\>就是以link结尾的字,所以用两个夹起来,就代表要字串的的确确是所要的那个字。
而既然有了 「*」往下找的,就有往回找的,按键是「 # 」
,你懒得记那么多的话,就用 「*」 然后搭配 「 N 」 吧!
到这里,你可能会想,如果我不想打那么多字,可是我想要的又不要完全是一样的,怎么办?
vim 也有这样的东西,就是在你打「*」之前,先加一个 「g」,也就是
g*
这样 vim 在做搜寻的时候,就不会包含 \< \> 这两个东西在前后了。同样「 #
」的使用也可以变成「 g# 」
16. 查看符号定义
Vi提供了像Win32下IDE那样的功能,可以很方便的查看函数原型、结构声明、宏的定义等。只是它的功能相比之下,要弱一些,不过,结合其它一些技巧,完全可以满足你的需要。使用这个功能,需要做一些设置:
1.
安装ctags软件包。在安装光盘可以找到,也可以到网上下载源码包,自己编译。
2. 生成tags文件。进入到你的源代码所在的目录,运行ctags
-R命令,它会为当前目录及子目录下的源程序建立索引,并在当前目录下创建一个tags文件,里面保存的是符号索引信息。
3.
设置tags路径。在vi的起动脚本文件中(一般是~/.vimrc),告诉vi在哪里可以找到tags文件,一般尽量用相对路径。如:set
tags=./tags,../tags,../../tags,../../../tags
4. 跳到指定的符号。<ctrl> + ]
可以跳转到光标所在处的符号的符号的定义那里。
5. 返回到原来的位置。<ctrl> + t 或者<ctrl> + o可以返回原来的位置。
17. 查看系统函数的帮助
Vi也可以像VC那样,很方便的跳转到系统函数的帮助那里。原理很简单,在vi运行外部命令man就行了:!man
fopen,这样做,可能会觉得有些麻烦,vi提供了快捷的方式: <shift> +
k可以跳到光标所在处的符号的帮助那里。
18. 自动定位编译错误处
在VC里,编译时,如果出现编译错误,双击错误信息,编辑器自动切换到出现错误的地方,是不是很方便呢?其实不用羡慕,vi也有这种功能,在vi里,运行make命令后,如果有编译错误,你按一下回车,vi自动定位到第一个编译错误那里。记得,要用内置的make命令,即运行:make,不是外部命令:!make。
19.自动定位查找结果
在写程序时,我们常常想知道,有哪些地方使用了某个函数,怎么办呢,你可以在shell里,用grep查找,然后打开对应的文件,可以看到相关的上下文信息。但这样做比较麻烦,Vi有个内置的grep命令,用起来很方便:
1. 查找。用法和shell中的grep一致。
2. 跳到第一个查找结果处。直接回车就行了。
3.
列出所有的查找结果。:cl命令可以列出所有的查找结果,每个结果都有一个编号。
4. 跳到某项查找结果的文件中。:cc <编号>
命令可以跳到指定编号查找结果的文件中,<编号>是前面用:cc列出来的编号。
5. 返回到原来的位置。<ctrl> + o 可以返回原来的位置。