vim-csupport
vim-csupport
软件版本:
ubuntu10.04
Linux version 2.6.32-42-generic
VIM - Vi IMproved 7.2
目录:
1. 简介
2. 安装
3. 使用
4. 配置
5. BUG?
1. 简介
如果你还在为编写 c/cpp 过程中添加注释而烦恼的话,那么 vim 插件 csupport 就将会是你的好朋友了。csupport 除了提供快捷键添加注释块以外,还能够快速插入定义函数、预处理、当前日期等。
2. 安装
名称: | csupport |
下载地址: | |
安装: |
将下载下来的文件解压后放到 $HOME/.vim 目录下。 |
帮助: | :help csupport |
3. 使用
现在创建一个 c 文件试一下吧。
$vim test.c
是不是有什么不一样呢?是的,他已经帮你添加了文件头说明。
1 /* 2 * ===================================================================================== 3 * 4 * Filename: test.c 5 * 6 * Description: 7 * 8 * Version: 1.0 9 * Created: 09/14/2012 03:00:35 PM 10 * Revision: none 11 * Compiler: gcc 12 * 13 * Author: YOUR NAME (), 14 * Organization: 15 * 16 * ===================================================================================== 17 */
当然,你可以预设置 |Author| 等参数。
$vim ~/.vim/c-support/templates/Templates
========================================================== User Macros ========================================================== SetMacro( 'AUTHOR', 'YOUR NAME' ) SetMacro( 'AUTHORREF', '' ) SetMacro( 'COMPANY', '' ) SetMacro( 'COPYRIGHT', 'Copyright (c) |YEAR|, |AUTHOR|' ) SetMacro( 'EMAIL', '' ) SetMacro( 'LICENSE', 'GNU General Public License' ) SetMacro( 'ORGANIZATION','' )
如果你还不满意,那就请修改 c.comments.template 这个文件吧。
一个程序不能没有 main 函数吧,输入 \im :
1 #include <stdlib.h> 2 3 /* 4 * === FUNCTION ====================================================================== 5 * Name: main 6 * Description: 7 * ===================================================================================== 8 */ 9 int 10 main ( int argc, char *argv[] ) 11 { 12 return EXIT_SUCCESS; 13 }
你看,main 函数就这样出来了。
自定义一个函数,输入 \if,再输入函数名。
1 /* 2 * === FUNCTION ====================================================================== 3 * Name: Definefunction 4 * Description: 5 * ===================================================================================== 6 */ 7 void 8 Definefunction ( <+argument_list+> ) 9 { 10 return <+return_value+>; 11 } /* ----- end of function Definefunction ----- */
还有插入注释块、头文件、预处理等等功能就不在这里一一列举了。一个比较常用的是快速注释(\cc)和反注释(\co),无论光标处在任何位置,都能自动(反)注释当前行,很方便。
4. 配置
"\" 这个键有时候不是很好按,请不同的键盘放置的位置不一样,所以我们需要把他设置到别的按键上,在 .vimrc 文件中加入:
let g:C_MapLeader=';'
let g:C_Ctrl_j_mode='i'
这样,原来的 \cc 就变成 ;cc 。
至于第二句的作用就是修改源码的结果,原来在普通模式下按 <C+j> 就会跳到下一个 <+word+> 进行输入,但是我比较喜欢在普通模式下使用 <C+j> 实现向下滚屏,而这与 g:C_Ctrl_j 的实现发生冲突,所以我加入变量 g:C_Ctrl_j_mode 以控制在何种模式下支持 g:C_Ctrl_j 的功能。
let g:C_Ctrl_j_mode='n' 代表普通模式;
let g:C_Ctrl_j_mode='i' 代表插入模式。
修改的方法很简单,就在 c.vim 的 s:CreateAdditionalMaps 的最后加入:
1 if !exists("g:C_Ctrl_j") || ( exists("g:C_Ctrl_j") && g:C_Ctrl_j != 'off' ) 2 "Modify by Eddy, because I want to use <C-j> to roll down screen." 3 if !exists("g:C_Ctrl_j_mode") || ( exists("g:C_Ctrl_j_mode") && g:C_Ctrl_j_mode == 'ni' ) 4 nmap <buffer> <silent> <C-j> i<C-R>=C_JumpCtrlJ()<CR> 5 imap <buffer> <silent> <C-j> <C-R>=C_JumpCtrlJ()<CR> 6 elseif exists("g:C_Ctrl_j_mode") && g:C_Ctrl_j_mode == 'n' 7 nmap <buffer> <silent> <C-j> i<C-R>=C_JumpCtrlJ()<CR> 8 elseif exists("g:C_Ctrl_j_mode") && g:C_Ctrl_j_mode == 'i' 9 imap <buffer> <silent> <C-j> <C-R>=C_JumpCtrlJ()<CR> 10 endif 11 endif
5. BUG?
我不知道你配置完之后,会不会遇到类似于这里这样的问题。设置之后,仍然要输入 “\” 才起作用。反正我就非常不幸的遇到了这个问题,而且 google 了一大论,也没有找到问题所在。于是乎,我就硬着头皮去研究并调试他的源码。
csupport 使用 <LocalLeader> 映射他的快捷键,影响 <LocalLeader> 行为的变量是 maplocalleader 。毫无悬念,我在 $HOME/.vim/plugin/c.vim 中找到它的定义。
if exists("g:C_MapLeader") let maplocalleader = g:C_MapLeader endif
并且也能找到全局变量 g:C_MapLeader的定义。
let g:C_MapLeader = '\'
第一个问题在于既然我们在 .vimrc 中设置了全局变量 g:C_MapLeader,而 c.vim 中又设置了一次。这是否会出现覆盖?谁覆盖谁?调试证明 [g]vim 首先加载 .vimrc 然后再加载其它插件。所以最后 g:C_MapLeader 还是老样子。我把它改成:
if !exists("g:C_MapLeader") let g:C_MapLeader = '\' endif
如果变量已经存在,就不再设置了。
但是这还没有解决问题,因为 maplocalleader 的设置也是有问题,细心观察一下,maplocalleader是定义在一个函数里面的,所以,他其实就是一个函数的本地局部变量,我把他改成全局变量。
if exists("g:C_MapLeader") let g:maplocalleader = g:C_MapLeader endif
OK!现在就好了。
6. 参考资料
[1]. VIM: C程序员插件C.vim
[2]. vim help