您的位置:首页 > 数据库

命令行下的编辑工具 Vim(2)

2010-12-26 18:20 246 查看
vim的配色方案


之前给vim使用了几种网上的几种配色方案, 发现怎么都是黑白屏?

答:syntax on

打开syntax on之后, 配色方案是变成彩色了, 但是显示效果和网上的配置不一样呀?

答: 可能下载的配色方案是gui模式的, 如果你通过终端登录的, 那么配色方案是不适用的. 必须使用终端对应的配色方案才行.

推荐的终端可用的配色方案(dante提供):
http://www.vim.org/scripts/script.php?script_id=2465
还要修改vim的配置:

syntax enable

syntax on

colo wombat256mod

set t_Co=256

也可以参考如下的(未测试)
http://blog.csdn.net/linxxx3/article/details/6372755 http://snapshot.soso.com/snap.cgi?d=8385718277515009282&w=vim+%D6%D5%B6%CB+%C5%E4%C9%AB&u=http://linux.chinaunix.net/bbs/thread-947799-1-1.html tags的使用技巧

直接查看一个tag,跳到其定义处。
:tag snprintf 直接查看snprintf的原型

:tselect tagname 当有多个匹配的时候,查看所有匹配

:tnext 下一个匹配,更多查看帮助

:tags 查看跳转的栈

修改vimrc配置, 使ctrl+]变得智能.

"让CTRL-]只有一个选择时自动跳转,多个选择时,出现选择列表

 map <C-]> :tselect <C-R>=expand("<cword>")<CR><CR>

 map <C-]> g<C-]>

在刚才跳转过的地方跳转 (除了C-] 和 C-T之外的选择)

C-I C-O

助记  O:old,很久很久以前的跳往的地方

          I:来自的地方

为新项目生成tags


set tags+=/home/nemo/code/trunk_20101224/tags
追加tags
:set tags=./tags,./../tags,./*/tags  也可以直接设置多个tags

CTAGS的使用技巧 生成tags时的技巧


 

当前目录以及子目录的所以文件包好php,cpp,java等全生成tags

ctags -R * 

为特定的语言的文件生成tags (这样ctags不会为解析其他语言的文件) 

 eg --languages=c,c++

查看ctags程序默认的语言对应的扩展名
ctags --list-maps



生成tags,修改特定语言的的扩展名
eg 将.h识别为c语言文件

--langmap=c:+.h



指定生成的tags文件名字
-f ~/.vim/sys_tags



同时搜索多个目录下的文件
ctags [options] /usr/include /usr/local/include

man ctags 会得到 ctags [options] [file(s)], 可见最后面就是文件了,可以是多个文件。并且是可选的,如果没有提供文件,默认就是当前文件夹了。



查看ctags针对不同语言支持的生成tag的语法元素,
比如,对于c++,支持对宏,函数名,类名,结构体名等生成tag

ctags --list-kinds


C++

    c  classes

    d  macro definitions

    e  enumerators (values inside an enumeration)

    f  function definitions

    g  enumeration names

    l  local variables [off]

    m  class, struct, and union members

    n  namespaces

    p  function prototypes [off]

    s  structure names

    t  typedefs

    u  union names

    v  variable definitions

    x  external and forward variable declarations [off]
红色部分[off]是默认ctags 不生成tag的语法元素,也就是对于c++语言,默认不生成本地变量,函数原型,前置声明以及extern声明的变量。
如果要生成需指定参数:--<LANG>-kinds

为c++的函数原型也生成tag,对与extern变量以及前置声明变量也生成tag 
--c++-kinds=+px 

指定其他的一些扩展选项(有一些插件比如echofunc可能依赖此项)

--fields=+iaS :ctags要求描述的信息,其中

i表示如果有继承,则标识出父类;

a表示如果元素是类成员的话,要标明其调用权限(即是public还是private);

S表示如果是函数,则标识函数的signature。

--extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags

ctags使用的完整举例:

ctags为系统头文件目录生成tags

ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -R -f ~/.vim/systags /usr/include /usr/local/include

其关键是

1)-I __THROW部分和--c-kinds=+p部分。为了不让__THROW干扰ctags,需要在运行ctags时使用-I选项。我一般使用下面的命令生成系统头文件tags

设置-I后,ctags会在处理文件时,就会忽略-I后面写出来的符号。

2)而--c-kinds=+p则告诉ctags需要为函数原型的声明也生成tag。--langmap=c:+.h表示.h视为c文件而不是c++文件。

一个生成ctags的脚本

#! /bin/bash

ctags -I __THROW --file-scope=yes --fields=+iaS --extra=+q --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -R -f ~/.vim/systags /usr/include /usr/local/include

更多ctags参考:

1)ctags为系统头文件目录生成tags
http://hi.baidu.com/%B2%BB%D5%FD%D6%B1%B5%C4%C8%CB/blog/item/7f55080382c5a9e708fa93bf.html

2)man ctags

 

 

cscope以及在vim中使用cscope
我的vim版本7.2.330

我的cscope版本:15.7a

 

如何生成cscope索引数据库

1) 先通过find命令生成源文件名字列表my_cscope.files

    (如果有多个目录,可以分别为不同的目录生成源文件列表,然后在合并)

2) cscope -bkq -i my_cscope.files

如何让vim支持cscope,以及设定cscope生成的索引数据库?

网上下载cscope_maps.vim插件,放在.vim/plugin目录下即可。

如果你的vim默认不支持cscope,可能需要重新编译vim使其支持哦。

如何在vim中设置连接cscope的生成的数据库

1)

你需要在vim中连接cscope的索引数据库,使用命令:

:cs add /usr/src/linux/cscope.out 

2)默认vim会在工作目录下搜索是否有cscope.out文件存在。

3)您可以检查当前连接的索引数据库,确保设置ok

:cs show

4)您也可以重置索引数据库

:cs reset

 

 

cscope的用法举例

1)我想用cscope查看当前光标下的函数的调用信息

ctrl+/ s /是]符号右边的/ 就像ctags的ctrl+]一样 (cscope的快速查询方法)

同时按下ctrl和/, 然后按下s键. 

2)通过输入命令查询

查找符号snprintf的出现的地方

:cs find 0 snprintf

更多含义:

0 or s: Find this C symbol

                1 or g: Find this definition

 

                0 or s: Find this C symbol

                1 or g: Find this definition

                2 or d: Find functions called by this function

                3 or c: Find functions calling this function

                4 or t: Find this text string

                6 or e: Find this egrep pattern

                7 or f: Find this file

                8 or i: Find files #including this file

 

 

综合了cscope和ctags的命令 

:cstag snprintf

相当于 :cs find g snprintf 或 :tjump snprintf

当cscope查找失败时自动用ctags查找

 

cscope程序的更多选项的含义

-R: 在生成索引文件时,搜索子目录树中的代码

-b: 只生成索引文件,不进入cscope的界面

-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

-k: 在生成索引文件时,不搜索/usr/include目录

-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用“-”,表示由标准输入获得文件列表。

-I dir: 在-I选项指出的目录中查找头文件

-u: 扫描所有文件,重新生成交叉索引文件

-C: 在搜索时忽略大小写

-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

 

 

如何使用cscope的独立GUI模式

启动:cscope -d 

使用:tab在不同的选项间切换

退出:CTRL-D (我因为不知道这个快捷键,搞了好久退不出来)

 

 

问题:

为何我的cscope不能查找成员函数,甚至连snprintf, printf都查看不了?

我先生成文件列表,再通过文件列表生成索引数据库,在vim中我也正确的指定了cscope.out索引数据库,

可能的原因

1)我在生成cscope的时候,没有指定 -i参数,导致生成了错误的 cscope。out

   如果你的 源文件列表的文件名字不是 cscope.file, 那么需要带上-i参数

2) 在生成cscope.out时是否出现告警?

比如:

nemo@ubuntu:~/.vim$ cscope -b -q -k  -i cscope_trunk.file

cscope: cannot find file /home/nemo/code/trunk_20101224/outerlib/apppayclient/api/apppackage.cpp

上面的代码出现告警, 导致我生成的文件总是用不了。郁闷。

如果我的代码更新了,如果让cscope的索引数据库也更新?

重新执行一遍生成cscope的命令.cscope不会像souceinsight那样自动更新执行.

更多帮助:

1)Vim+cscope+ctags+tags阅读源代码

作者:许振文 
http://blog.csdn.net/amicablehj/archive/2010/07/10/5725981.aspx
 

直接把当前光标下的单词送到命令行里面!!

 nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

这个方法真的非常非常好用,可以扩展到其他插件的使用上,真的非常非常好用!!!!!!!
比如:查找当前光标下的函数的所有tag标签。 这样就省的手动输入tselect 函数名字了。自定义快捷键。牛XX。
153 nmap <C-@>d :tselect <C-R>=expand("<cword>")<CR><CR>

参考易水博客更详细的cscope的配置! http://easwy.com/blog/archives/advanced-vim-skills-cscope/ 
 

 

 

 

 

echofunc 自动提示函数原型

 

 

 

 

 

echofunc是这样的一个插件:当你输入函数名字,然后在输入(之后,自动的会在界面最下面提示函数的原型(signature)

安装方法:

1)下载echofunc.vim插件到.vim/plugin/目录下

2)生成echofunc.vim所必须的tags。 要求生成tags时必须加上 --fields=+iS 选项。

     否则可能无法显示函数原型。

参考:
http://edyfox.codecarver.org/html/vimplugins.html

 

 

 code_complete自动提示函数原型,自动输入代码模板

 

 

 

自动提示函数原型

code_complete也可以实现自动提示函数原型,类似于echofunc。当你输入函数名字,然后再输入(之后,然后按tab,自动的会提示函数原型让你选择。

使用方法类似与echofunc,但有所不同。

1)下载code_complete.vim插件到.vim/plugin/目录下

2)生成code_complete.vim所必须的tags。 要求生成tags时必须加上 --fields=+iS ,以及--c-kinds=+p选项。

     否则可能无法显示函数原型。

参考:
http://www.vim.org/scripts/script.php?script_id=1764

自动输入代码模版(代码片段)

1)当你直接输入函数名字,(此时不要输入‘(’)就按tab,就会自动的帮你输入代码片段,并且将光标定位在第一个参数处,可以直接修改参数。继续按tab,可以切换到不同的参数。

2)对与if,for,while等标准结果,也支持代码模版

 if( `<...>` )                          

  {                                      

      `<...>`                            

  }

--------------------------------------------------------------------------------------------------------------------------------

OmniCppComplete插件,自动提示成员函数,成员变量等
----------------------------------------------------------------------------------------------------------------------------------

强烈建议看OmniCppComplete的帮助文档,非常详尽的资料!!Omni支持那些特性,不支持哪些特性,讲的非常的详尽。
使用好omnifunc的关键点
1)生成合适的ctags.否则omni的功能无法使用或无法正常使用.

使用如下的方式可以正常使用omnifunc的功能.

ctags -I __THROW --file-scope=yes --fields=+iaS --extra=+q --languages=c++ --links=yes --c++-kinds=+p --c-kinds=+p -R -f ~/.vim/trun

ktags /home/nemo/code/trunk_20101224

 

官方推荐的方法是:

 ctags -R --c++-kinds=+px --fields=+iaS --extra=+q .
每个参数解释如下:
-R:ctags循环生成子目录的tags
--c++-kinds=+px :ctags记录c++文件中的函数声明和各种外部和前向声明
--fields=+iaS :ctags要求描述的信息,其中i表示如果有继承,则标识出父类;a表示如果元素是类成员的话,要标明其调用权限(即是public还是private);S表示如果是函数,则标识函数的signature。
--extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags

 
2)当omnifunc的功能无法正常使用时怎么办?

 比如在同样一个文件里面定义了 DevInfo,AppInfo,DBHelper. 对于DevInfo,AppInfo,都可以很好的智能提示,对于DBHelper却不能智能提示成员?
omnifunc的帮助手册上说: 如果无法智能提示,查看是否你的ctags生成的tags有问题, 可以用tselect DBHelper确定下是否可以找到标签.等多信息查看omnifunc的帮助.

 3)使用omnifunc的方法
 安装omnifunc很简单,查看帮助即可. 一般是解压后生成3个文件夹,放在.vim目录下即可.

 当输入AppInfo.的时候,一般会自动提示成员函数或成员变量,如果没有提示 C-X,C-O即可. 如果还没有提示,说明你生成的tags有问题,或没有设置好ctage.使用tselect确认下是否真的是ctags的问题.

 

--------------------------------------------------------------------------------------------------------------------------------

taglist插件,像IDE一样,在左侧窗口中显示类成员函数,成员变量列表等。
----------------------------------------------------------------------------------------------------------------------------------

按照方法以及注意事项,参考taglist的帮助文档。

:TlistToggle 调出窗口

:TlistClose 关闭窗口
如下设置可以保证当Tlist是最后一个窗口时可以自动关闭

let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1 

 
http://edyfox.codecarver.org/html/vimplugins.html
设置快捷键打开tlist

noremap <F4> :TlistToggle<CR>
--------------------------------------------------------------------------------------------------------------------------------

winManager插件,想windows的资源管理器一样,浏览文件夹的工具。
----------------------------------------------------------------------------------------------------------------------------------

:WMToggle 调出窗口
 // 当wmtoggle是最后一个窗口时,退出

 

let g:persistentBehaviour=0

:map <c-w><c-t> :WMToggle<cr>  设置按键映射调出该窗口。

 重复<c-w><c-t> 关闭窗口
 

--------------------------------------------------------------------------------------------------------------------------------

 NERD Tree插件,想windows的资源管理器一样,浏览文件夹的工具。(比winManager要好用)
----------------------------------------------------------------------------------------------------------------------------------
 

具有目录树的功能

傻瓜是安装。 把vimcopy到plugin目录即可。

:NERDTree 可以呼出界面。

--------------------------------------------------------------------------------------------------------------------------------

                              代码注释插件The NERD Commenter
----------------------------------------------------------------------------------------------------------------------------------
 

  简单介绍下NERD Commenter的常用键绑定,以C/C++文件为例,详析的使用方法,请:h NERDCommenter。在Normal或者Visual 模式下:

 

,ca,在可选的注释方式之间切换,比如C/C++ 的块注释/* */和行注释//
,cc,注释当前行 ========<常用 
,c,切换注释/非注释状态
,cs,以”性感”的方式注释
,cA,在当前行尾添加注释符,并进入Insert模式
,cu,取消注释 ========<常用
Normal模式下,几乎所有命令前面都可以指定行数
Visual模式下执行命令,会对选中的特定区块进行注释/反注释
注意,如上命令支持指定行数的注释与反注释,比如:num,cc 注释num行 

[count]<leader>cc |NERDComComment|

[b]Comment out the current line or text selected in visual mode.[/b] 
参考
http://www.dutor.net/index.php/2010/05/vim-the-nerd-commenter/ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息