1 调用gcc
过去在使用vim编写程序时,时不时需要保存退出,然后使用gcc去编译程序。如果这个切换的频率比较高,那么就非常的麻烦。今天开始,这个问题就不在是问题啦。
根据参考资料[1]的提示,vim可以直接调用linux的其它命令,比如cd、ls、gcc......下面是具体操作实例。
(1) 为了使得vim能自动转到当前目录,在.vimrc中添加
set autochdir
(2)通过"!"调用linux命令
在vim中,可以通过"!"来调用任何linux命令(包括vim!):
:!ls "显示当前目录下的文件
:!vim filename " 使用vim打开filename文件(原来打开的那个文件还没有关闭,关闭这个新打开的文件,就可以返回到原来打开的那个)。
使用下面的命令可以编译当前目录下的test.c:
:!gcc test.c
使用下面的命令可以执行上面生成的可执行文件a.out(在当前目录下):
:!./a.out
2 分屏幕显示
(1) 打开/关闭一个分屏[5][8]
:split/vsplit " 创建一个新屏,并且显示前一个屏的内容
:new/vnew " 创建一个分屏,并且在新窗口创建文件
:e filename "关闭原来的文件,打开一个新的文件filename(可以和split/vsplit结合使用,先创建一个分屏,然后在分屏中打开一个新文件)
:split/vsplit filename " 创建一个新屏,并且在新屏中打开名为filename的文件(相当于split/vsplit和e filename的组合)
(2) 关闭/取消分屏[5][6]
:close "退出当前分屏
:q "退出当前分屏
:only " 取消所有其它分屏
(3) 分屏间切换(”Ctrl“表示键盘上的Ctrl键)[5]
<Ctrl - W> + k/h "跳转到上/左边的窗口(若为大写H,则是把当前窗口调至左方)
<Ctrl - W> + j/l "跳转到下/右边的窗口(类似于上)
<Ctrl - W> + w "在窗口之间跳转
说明:
a) 先同时按下Ctrl键和W键,然后松开,再单独按k/h、j/l、w即可(并非同时按住3个键!)。
b) 关于在窗口中切换,可以使用4个方向键分别代替字母k,h,j和l。
(4) 分屏大小设置
方法一:resize命令
:resize number
说明:number为一个整型数字。
方法二:快捷键[19][20]
<Ctrl - W> + =" 所有分屏一样高[19]
<Ctrl - W> + +" 增加分屏高度[19]
<Ctrl - W> + -" 减少分屏高度[19]
<Ctrl - W> + _" 分屏最大化[20]
3 Quickfix
在vim中使用下面命令可以打开Quickfix窗口:
:cope
QuickFix窗口可以显示make过程中的输出信息(错误、警告、提示)[10]。在vim中执行下面命令可以解析当前目录下的Makefile文件:
:make " 不需要感叹号"!"
关闭Quikfix窗口的方法和上述关闭分屏的方法一样,Quikfix也就是一个分屏而已。
:q “ 退出Quikfix窗口
:close ”关闭Quikfix窗口
4 多行注释[8]
(1)在Normal模式下(非编辑模式),按下以下快捷键将进入Visual Block模式(直接按v(小写)进入Visual,按V(大写)进入Visual Line模式[11]):
<Ctrl-v/V>
(2)在Visual Block模式中,使用方向键可以控制选择的区域。
(3)选择好区域后,按下I键(大写状态下,否则要同时按下Shift键),即可对块进行编辑(光标移到块的第一个字符)。
(4)按Esc键,即可完成对整块的操作。
使用这个方法可以在选定区域的行首添加注释符,从而实现多行注释。
5 缩进
(1)行缩进[15]
> + Enter "Visual模式下缩进1行,Normal模式下,缩进2行
> + 右 "Normal模式下,先按>键,然后按->键(右方向键),则只缩进当前光标所在行缩进行
> + 下 "Normal模式下,先按>键,然后按下方向键,则当前光标所在行和下一行都缩进
(2) 块缩进[15]
按v键(小写)进入Visual模式(不是Visual Line,也不是Visual Block),然后选中要缩进的行,接着按:
> "同时按Shift键和>键,增加缩进
< "同时按Shitf键和<键,减少缩进
(3)多行缩进[15]
5> "当前光标以下的5行都增加缩进
5< "当前光标以下的5行都减少缩进
(4) 设置缩进的宽度
默认情况下tab键和>键都是缩进8个空格的宽度,但是编程时通常使用的是4个空格的宽度,在~/.vimrc中添加:
set ts=4 " tab 键的默认宽度是8,要改为4
set shiftwidth=4 " > 键和自动缩进的宽度,默认为8,这里该为4,编程需要
6 同时显示编辑页面和程序执行结果
程序编译好后,可以运行看输出结果,但这是如果关闭了程序源文件,那么结果和程序之间的对应关系就不用容易分析。上面介绍Quickfix的时候,只能看到编译的信息,而不能看到程序执行的结果。参考资料[9]介绍了一种使用gdb的方法,但总感觉不够方便。下面是我根据网上的一些资料,总结出来的一个方法。
(1) 创建一个空白分屏
用第二节提到的方法,vim打开程序文件后创建一个空白分屏,用于显示程序的运行结果。
:new
(2) 执行程序
在将光标移动到空白分屏,然后以以下方式在vim中调用编译好的程序:
:r!./hello
这时候,hello程序的输出结果将会显示到空白分屏上[14]。
除了使用vim的分屏功能,还可以借助screen来进行终端分屏,可以达到更好的效果,详见《Ubuntu14.04中使用screen》。
7 移动光标[8]
0 "数字零,到行头
$ "到本行行尾
^ "到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
g_ "到本行最后一个不是blank字符的位置。
8 跳转与回跳[23]
借助ctags生成的tags,可以实现在函数之间跳转:
(1)快捷键
Ctrl + ] —— 跳转到当前光标处符号(函数/变量)的定义处;
g + ] —— 先按g键,然后按]键,列出当前光标处符号的所有标签,可通序号选择跳转到特定的位置;
Ctrl + T —— 回跳到前一个位置;
Ctrl + O —— 同上;
Ctrl+W + ]—— 新窗口显示当前光标下单词的标签,光标跳到标签处。当有多个定义时候,不会提示!需要通过tselect命令查询;
Ctrl+W + } —— 预览窗口显示当前光标下单词的标签,光标跳到标签处;
(2)命令
:tselect TagName —— 显示符号的定义列表,可通过其前面标号进行选择,然后跳转到该定义处。
:tags —— 当一个标签有多个匹配项时(函数 (或类中的方法) 被多次定义)该命令会跳转到第一处,如果在当前文件中存在匹配,那它将会被首先使用。
:tfirst —— 到第一个匹配
:[count]tprevious —— 向前 [count] 个匹配
:[count]tnext —— 向后 [count] 个匹配
:tlast —— 到最后一个匹配
:ptag TagName —— 预览窗口显示TagName标签,光标跳到标签处
:pclose —— 关闭预览窗口
:pedit file.h —— 在预览窗口中编辑文件file.h(在编辑头文件时很有用)
:psearch atoi —— 查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配,在使用没有标签文件的库函数时十分有用。
9 记录上次浏览位置
打开一个文件,自动定位到上次的浏览位置[16]。在~/.vimrc中添加:
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
其实上面的内容在/etc/vim/vimrc中,只是被注释了而已,将它复制到~/.vimrc中,去掉注释符即可。
10 Taglist_函数、变量和宏的清单
在阅读大型的程序时,涉及的函数、变量和宏非常多,这时候就需要有个列表。Taglist这时可以帮得上忙。在使用之前,先要安装Taglist插件。安装方法在《Ubuntu10.04的vim插件扩展》的参考资料中有提到,单都是在没有使用Vundle进行插件管理的情况下进行安装的。这里主要说一下如何使用Vundle管理Taglist插件。
首先在~/.vimrc中添加:
Bundle 'Taglist'
这时候,如果使用Vundle的自动更新插件的功能,会提示在gighub中找不到Taglist。这时别慌,到
这里下载Taglist.zip即可。
然后在~/.vim/bundle(Vundle管理的插件都放在这里)中创建一个目录Taglist,然后将Taglist.zip解压到这里即可。这时候使用Vundle的自动更新功能,依然会提示一些错误信息(如Taglist目录不为空...)。但是没有关系,我们现在不用更新,而且Taglist已经可以正常工作了。
使用vim打开一个*.c文件,在vim的命令输入模式下,输入一下命令,即可在窗口的左侧显示当前*.c中的函数、变量和宏的清单。
:Tlist
需要提示的是,Taglist并不需要ctags生成的tags。另外,在Taglist窗口和程序窗口之间的切换,同第二小节中说的分屏之间的切换。
11 跳转到指定行
在命令模式下,直接输入数字,然后回车,即可跳转到指定的行[18]。
:n
12 设置字体大小[19]
<Ctrl - -> " 减小字体
<Ctrl - +> " 增大字体
13 多文件切换[21]
:ls "查看当前打开的buffer(文件)
:b num "切换文件(其中num为buffer list中的编号)
:bn " -- next buffer in the buffer list
:bp " -- previous buffer in the buffer list
:b# " -- previous buffer you was in
14 多标签切换[22]
:tabnew [++opt选项] [+cmd] file “建立对指定文件新的tab
:tabc ”关闭当前的tab
:tabo “关闭所有其他的tab
:tabs ”查看所有打开的tab
:tabp “前一个标签
:tabn ”后一个标签
:tabs "列举所有标签
参考资料
[1]gcc配置和vim编程
[2]vim开两个窗口,一个看程序,一个gcc编译,调试怎么弄? 谢谢
[5]vim分屏显示
[6]Vim的分屏技巧的使用
[7]vimbook
[8]简明 Vim 练级攻略
[9]使用VIM开发软件项目 - (15) 在VIM中使用GDB调试 (一)
[10]vi/vim使用进阶: 剑不离手 – quickfix
[11]Vim块操作
[12]vim visual block
[13]vim-可视化操作
[15]vim多行增加缩进
[16]vim自动打开跳到上次的光标位置
[17]打造自己的vim界面--用winmanager合并显示NERDTree和TagList
[18]vim跳转到指定的行
[20]VIM操作命令
[21]Vim多文件切换
[23]将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)
[24]vim查看函数原型