uranuslei

链接

VIM使用技巧拾遗

2009年3月03日 00:30 | Comments(0) | Category:开发工具 | Tags:

使用VIM一年多了,零零星星地学习了它的一些用法。常用的一些命令和快捷键都还记着,但是很多技巧性很强的快捷键和用法有时候用过就忘了。特此记下一些,以便今后查找。本文长期更新中。


在代码间跳转

在函数中移动光标
[[ 转到上一个位于第一列的“{”

]] 转到下一个位于第一列的“{”

{ 转到上一个空行

} 转到下一个空行

gd 转到当前光标所指的局部变量的定义

* 转到当前光标所指的单词下一次出现的地方

# 转到当前光标所指的单词上一次出现的地方

括号的匹配
% 用来进行小括号、中括号和大括号的匹配。这要看当前光标指向的是什么符号了。


多文件编辑和跳转

当你使用gVim的时候,你当然可以用":tabe newfile.txt"在新的标签页中打开一个文件,然后用"gt"或者"3gt"跳转到下一个或者第3个标签页。但是如果你是在终端中使用VIM,而同时又想编辑多个文件的话,有三种方法可以选择:

1. 如果你在打开VIM之前就知道自己要编辑哪些文件的话,只要输入"vim file1.txt file2.txt file3.txt",然后用":n" ":previous"在文件间跳转。你还可以用"Ctrl+^“在文件间循环跳转。

2. 分割窗口: 如果你打开了VIM之后才想到要编辑另一个文件,可以用":split newfile.txt",这样VIM会在当前窗口中分割出一个小窗口,你可以同时看到两个文件的内容。这一点很适用于同时查看头文件和源文件,或者源文件和测试文件。你可以用"Ctrl+w Ctrl+w"或者"Ctrl+w some_key"在不同的窗口间跳转,其中some_key可以是h,j,k,l或者你的键盘上的上下左右键。

3. 如果你想用当前的VIM编辑多个文件,又不想分割窗口的话,可以用":hide edit newfile.txt",这个命令还有一个好处就是允许你在不保存当前文件改动的基础上编辑另一个文件。当然,在退出VIM的时候,如果你还有未编辑的文件,VIM会提醒你。

4. 咦,不是说了只有三种方法可以选择吗,怎么又跳出来第四种?呵呵,因为俺最近发现,即使是在终端中运行VIM,同样可以用":tabe newfile.txt"来编辑多个文件,并且终端的上方会模拟一个类似标签页的东东出来,很牛阿,可惜不能用鼠标点击。你只要用"gt" "3gt"或者"Ctrl+^"在文件中跳转就可以了。


vimgrep

      用于在工程的多个文件中搜索你想要的字符串,如

:vimgrep /foo_bar/ include/*.cpp
:vimgrep foo_bar include/*.cpp
:vimgrep /\<foo_bar\>/ include/*.cpp

      当你需要递归搜索某目录的时候,用"**“

:vimgrep MyClass ~/workspace/myproject/**
:vimgrep MyClass myproject/**/*.h

假如你有如下几行代码:

CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, v43.compressData_[0], RENDER_TOLERANCE);
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, v43.compressData_[1], RENDER_TOLERANCE);
CPPUNIT_ASSERT_DOUBLES_EQUAL(3.0, v43.compressData_[2], RENDER_TOLERANCE);
CPPUNIT_ASSERT_DOUBLES_EQUAL(4.0, v43.compressData_[3], RENDER_TOLERANCE);

你想把他们改成:

CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, v43.getData(0), RENDER_TOLERANCE);
CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, v43.getData(1), RENDER_TOLERANCE);
CPPUNIT_ASSERT_DOUBLES_EQUAL(3.0, v43.getData(2), RENDER_TOLERANCE);
CPPUNIT_ASSERT_DOUBLES_EQUAL(4.0, v43.getData(3), RENDER_TOLERANCE);

你当然可以一行一行地改,但是这里不能用"."来重复你的操作,因为要达到最终效果,每行的操作都不止一次;同样的原因,列模式似乎也不能很好的完成这个任务,当然如果你不介意用两次列操作的话还是可以的。如果用VIM里面的自定义宏操作,则可以快速完成。操作步骤如下:

先把光标移动到第一行的compressData首字母处;
qa 开始记录操作宏;
vew 选中"compressData_["
s 切到替换模式
getData( 输入替换的字符
Esc 跳出到命令模式
ww 让光标跳到残留的"]"处
s 切到替换模式
) 输入替换的后括号
Esc 跳出到命令模式
j 跳到下一行
b 跳到compressData_的首字母处,为下一个宏操作做准备
q 宏录制结束

在录制宏的过程中,你已经把第一行改好了,而且现在光标位于第二行的compressData_首字母处。此时,你只需要按下"3@a",剩下的三行就一下搞定了。