文档章节

Ubuntu下创建vim+Taglist+cscope+ctags组合编辑器

贪睡猫仙mosen
 贪睡猫仙mosen
发布于 2014/06/17 12:03
字数 3584
阅读 169
收藏 7

有人抱怨Linux系统下没有类似于VC之类的方便快捷的编辑器,有人用gedit, 有人用vim,但是都不方便而且也没有自动补全之类的方便用户的功能。本文简单介绍使用vim中的几个插件(Ctags、Cscope和TagList) 实现一个强大的编辑器,希望可以帮助您学习、使用。

一、软件安装

Ubuntu给我们安装软件提供了很大的便利,比如说,安装vim我们可以直接使用"sudo apt-get install vim"即可安装!

同样,cscope和ctags也可以使用相同方法安装,这是多么畅快淋漓啊!感谢Ubuntu给我们用户如此便利!


对于Taglist使用这个方法安装不了,我们需要先下载,然后安装完成:

首先上网下载Taglist插件,下载完成后解压,再将文件下的taglist.vim使用cp命令拷贝到HOME/.vim/plugin文件夹下(cp -r taglist.vim ~/.vim/plugin)


这样,vim+Taglist+cscope+ctags四种工具我们是安装好了,但是如何使用呢?


二、Vim简介及配置

vim是一个非常好用的编辑工具,以下介绍几个常用的底行模式命令:

(1). 设置缩进

     :set    smartindent      // 设置缩进

      :set smartindent shiftwidth=4      // C语言自动缩进,缩进值为4个字符宽度

(2). 显示光标行列信息

      :set ruler             // 显示光标信息(右下角)

(3). 查看制表符

      :set list               // 显示制表符,以^符号显示制表符的位置

(4). 查看行数信息

     :set number        //显示行号(左边)

(5). 关键字高亮

    :syntax on                  //关键字高亮

(6).  多文件编辑 ,在编写程序时有可能需要同时编辑多个文件,在这种情况下,需要如下设置

    : split two.c             //  多文件编辑


当然,如果不嫌麻烦,可以在每次打开Vim时 输入如上命令,如我经常用的是:set  number :set ruler :syntax on :set smartindent  命令,如果将平时在底行模式下输入的命令直接写入配置文件,则以后使用Vim时不用再次输入这些命令。

首先,试着在Vi的底行模式下输入如下命令,如果不支持的话,去下载一个Vim的全版本,sudo apt-get install vim-full。

以下是修改配置文件的方法:

(1). 找到Vimrc文件。

(2) 查看文件的权限:

zhouyl@ubuntu :~$ cd /etc/vim
zhouyl@ubuntu :/etc/vim$ ls
vimrc   vimrc.tiny
zhouyl@ubuntu :/etc/vim$ ls -l vimrc
-rw-r--r-- 1 root root 3449  9月 11 17:30 vimrc

(3) 如果没有写权限的话,修改权限,使我们可以修改该配置文件

   sudo chmod a+w vimrc
 (4)根据个人需要将上诉命令写入配置文件
       比如,我个人的设置是: syntax on , set ruler ,set number , set smartindent shiftwidth=4

下面贴上我的vimrc文件的配置信息:

[html] view plaincopy

  1. "显示行号      

  2. "set number "或者set  nu  

  3. map <F5> <Esc>:set nu<CR>   "映射F5显示行号,参考"vim 按键映射"(http://www.pythonclub.org/vim/map-basic)  

  4. map <C-F5> <Esc>:set nonu<CR>   "映射Ctrl+F5为不显示行号  

  5.   

  6. "检测文件的类型      

  7. filetype on  

  8.   

  9. "记录历史的行数      

  10. set history=1000  

  11.   

  12. "自动对齐      

  13. set autoindent  

  14. set cindent  

  15.   

  16. "智能选择对齐方式      

  17. set smartindent  

  18.   

  19. "tab为4个空格      

  20. set tabstop=4  

  21.   

  22. "当前行之间交错时使用4个空格      

  23. set shiftwidth=4  

  24.   

  25. "设置匹配模式,输入做括号会出现右括号      

  26. set showmatch  

  27.   

  28. "编辑时显示光标状态      

  29. set ruler  

  30.   

  31. "高亮查找    

  32. set hlsearch  

  33.   

  34. "粘贴插入  

  35. set paste  

  36.   

  37. "快速匹配      

  38. set incsearch  

  39.   

  40. "修改文件自动备份      

  41. if has("vms")  

  42.     set nobackup  

  43. else  

  44.     set backup  

  45. endif  

  46. """""""""""""设置开启ctags"""""""""""""     

  47. map <F4> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR>  

  48.   

  49. "第一个命令里的分号是必不可少的。这个命令让vim首先在当前目录里寻找tags文件,如果没有找到  

  50. tags文件,或者没有找到对应的目标,就到父目录 中查找,一直向上递归。因为tags文件中记录的>路径总是相对于tags文件所在的路径,所以要使用第二个设置项来改变vim的当前目录。   

  51. set tags=tags;  

  52. set autochdir  

  53. "绝对路径  

  54. "set tags=/home/long/workstation/ganguio/uio-8139d-driver/V7/tags,/home/long/linux-3.7.3/drivers/uio/tags  

  55.   

  56.   

  57. """""""""""""""""Taglist设置"""""""""""""""""           

  58. map <F3> : Tlist<CR>  ""按下F3就可以呼出了  

  59. "let Tlist_Auto_Open = 1  "在启动VIM后,自动打开taglist窗口  

  60. let Tlist_Ctags_Cmd = '/usr/bin/ctags'  "设定ctags的位置  

  61. let Tlist_Use_Right_Window=0 " 1为让窗口显示在右边,0为显示在左边  

  62. let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表,设置为1时不同时显示>多个文件的tag,只显示当前文件的  

  63. let Tlist_File_Fold_Auto_Close=1 "同时显示多个文件中的tag时,taglist只显示当前文件tag,>其他文件的函数列表折叠隐藏  

  64. let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动退出vim  

  65. "let Tlist_Use_SingleClick= 1    " 缺省情况下,在双击一个tag时,才会跳到该tag定义的位置  

  66. "let Tlist_Process_File_Always=0  "是否一直处理tags.1:处理;0:不处理  

  67.   

  68.   

  69.   

  70. """""""""""""""""""""""cscope设置""""""""""""""""""      

  71. set cscopequickfix=s-,c-,d-,i-,t-,e-    

  72. if has("cscope")    

  73. set csprg=/usr/bin/cscope    

  74. set csto=1    

  75. set cst    

  76. set nocsverb    

  77. " add any database in current directory     

  78. if filereadable("cscope.out")    

  79.    cs add cscope.out    

  80. endif    

  81. set csverb    

  82. endif    

  83.   

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

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

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

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

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

  89. nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>  

  90. nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>  

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


因为我的文档中的原配置文件已经有了语法高亮:

" Vim5 and later versions support syntax highlighting. Uncommenting the next

" line enables syntax highlighting by default.

if has("syntax")

  syntax on

endif

所以我就没写了,您如果vimrc文件里面没有此项建议自己加上syntax on设置语法高亮


PS:在配置文件中"符号后的内容是注释,而且在配置文件中是不需要添加符号的 ,这里关于cscope、ctags和Taglist的设置可以先写上,后面将对这三个插件有介绍。好了,现在去开一个Vim,编辑一个程序看看,是不是感觉很不一般呢?

好了,下面顺便演示下,智能补全的用法,我分四种情况:1、前面申明过的变量或者函数名的补全;2、结构体等自建结构的补全;3、STL等标准库的补全;4、括号、引号等自动匹配补全。

对于第一种情况,写程序的过程中,直接用CTRL+p即可选择,对于第二种情况,如果想申明了结构体T,想在输入T.时弹出成员供选择,只需在用之前按一下:CTRL+F12,然后效果如图:


三、TagList插件简述及使用

TagList插件,是一款基于ctags,在vim代码窗口旁以分割窗口形式(如上图所示)显示当前的代码结构概览,增加代码浏览的便利程度的vim插件.Vim中加载代码文件后,可以使用以下命令控制taglist:

TlistOpen(直接Tlist也可)打开并将输入焦点至于标签列表窗口,效果如上图所示

TlistClose关闭标签列表窗口

TlistToggle切换标签列表窗口状态(打开←→关闭),标签列表窗口是否获得焦点取决于其他配置

ctl-wwctl-w+  方向键窗口切换(taglist本质上是一个vim分隔窗口,因此可以使用ctl-w系列快捷键对窗口进行切换操作)Taglist窗口主要有以下操作

F1:打开帮助回车键:跳到光标所在的标记的定义处(如将光标移到main函数,按回车键)

o:新建一个窗口,跳到标记定义处

p:预览标记定义(仍然在taglist窗口)

空格:显示标记的原型(如函数原型)

u:更新标记列表(比如源文件新增了一个函数,并在保存后,可在taglist窗口按u)

s:选择排序字段(暂时我也不知道什么意思)

d:删除光标所在的taglist文件(如用vi打开了两个文件f1.c,f2.c可以删除f1.c的标记)

x:n放大/缩小taglist窗口

+:展开(指标记)

-:折叠

*:全部展开

=:全部折叠

[[:将光标移到前一个文件的起点

]]:将光标移到后一个文件的起点

q:退出taglist窗口

F1:关闭帮助


四、Ctags插件简介及使用

ctags使用简介VIM简单易用,大家只要看看VIM自带的vitutor,大约只要20分钟就能掌握VIM的用法,上面也简单介绍了点vim的用法。但是对于Linux下的C/C++的程序员,使用VIM+Ctags的组合来写程序也许是最佳的选择。^_^尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。熟练的使用ctags仅需记住下面七条命令:(很简单吧,呵呵)

1$ctags –R * ($Linux系统Shell提示符)

2.$ vi –t tag (请把tag替换为您欲查找的变量或函数名)

3:ts(ts助记字:tagslist,  “:”开头的命令为VI中命令行模式命令)

4:tp(tp助记字:tagspreview)---此命令不常用,可以不用记

5:tn(tn助记字:tagsnext)  ---此命令不常用,可以不用记

6Ctrl+ ]跳到光标所在函数或者结构体的定义处

7Ctrl+ T返回查找或跳转

下面我们逐条的解释上面的命令:“$ctags –R*”:“-R”表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录。“*”表示所有文件。这条命令会在当前目录下产生一个“tags”文件,当用户在当前目录中运行vi时,会自动载入此tags文件。Tags文件中包括这些对象的列表:用#define定义的宏枚举型变量的值函数的定义、原型和声明名字空间(namespace)类型定义(typedefs)变量(包括定义和声明)类(class)、结构(struct)、枚举类型(enum)和联合(union)类、结构和联合中成员变量或函数VIM用这个“tags”文件来定位上面这些做了标记的对象。剩下的命令就是定位这些对象的方法:“$vi  –t tag” :在运行vim的时候加上“-t”参数,例如:[/usr/src]$vim  -tmain这个命令将打开定义“main”(变量或函数或其它)的文件,并把光标定位到这一行。如果这个变量或函数有多处定义,在VI命令行模式“:ts”命令就能列出一个列表供用户选择。“:tp”为上一个tag标记文件,“:tn”为下一个tag标记文件。

当然,若当前tags文件中用户所查找的变量或函数名只有一个,“:tp,:tn”命令不可用。

(最方便的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中,并把光标定位到这一行。用“Ctrl+T”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个变量,按N次“Ctrl+t”也能回到最初打开的文件,它会按原路返回  。 ^_^

注意:运行vim的时候,必须在“tags”文件所在的目录下运行。否则,运行vim的时候还要用“:settags=”命令设定“tags”文件的路径,这样vim才能找到“tags”文件。在完成编码时,可以手工删掉tags文件(帚把不到,灰尘不会自己跑掉^_^)。

有时候系统提示“找不到tag”时不要一味着急,有可能你想要查询的函数时系统函数,如果这样,那妳幸运勒,可以使用Shift+K来查询。如果不是没也可以自己找到tags文件,打开查询,如果还是找不到...哼哼,我也没辙了!

五、Cscope插件简介及使用

Cscope是一个类似ctags的工具。  你可以把它想作是超过频的ctags,因为它功能比ctags强大很多。 在Vim里,通过cscope查询结果来跳转就象跳转到其他的标签完全一样;它被保存在标签栈里。这样你就可以象使用tags一样在函数等等之间便捷的跳转。在VIM中使用cscope非常简单:

首先在目录下使用“cscope -kqb”生成cscope.out文件;

使用时先在VIM的命令行下调用“cscope add/../../cscope.out”(或cs add /../../cscope.out)命令添加一个cscope数据库,然后就可以调“cscope  find”(或 cs f )命令进行查找了。

VIM支持8cscope的查询功能,如下:

c:Find functions calling this function//查找调用本函数的函数

d:Find functions called by this function //查找本函数调用的函数

e:Find this egrep pattern//查找egrep模式,相当于egrep功能,但查找速度快多了

f:Find this file //查找并打开文件,类似vimfind功能

g:Find this definition//查找函数、宏、枚举等定义的位置,类似ctags的功能

i:Find files #including this file //查找包含本文件的文件

s:Find this C symbol //查找C语言符号,即查找函数名、宏、枚举值等出现的地方

t:Find assignments to //查找指定的字符串

例如,我们想在代码中查找调用work()函数的函数,我们可以输入:“:cs f c work”,回车后发现没有找到匹配的功能,可能并没有函数调用work()。我们再输入“:cs  f s work”,查找这个符号出现的位置,现在vim列出了这个符号出现的所有位置。我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能。

cscope在vim命令行下还可以执行下列操作

help: Show this message(Usage: help)

kill: Kill a connection(Usage: kill #)

reset:Reinit all connections(Usage: reset)

show: Show connections (Usage: show)


更详细的Cscope用法见:http://blog.csdn.net/longerzone/article/details/7788010


本文转载自:http://blog.csdn.net/longerzone/article/details/7789581

共有 人打赏支持
贪睡猫仙mosen
粉丝 2
博文 30
码字总数 6551
作品 0
松江
个人站长
私信 提问
GIMP 2.8.6 发布,免费开源 PS 软件

GIMP 被称为是开源免费的 PS 软件。GIMP是一款功能强大的图像编辑器,允许用户编辑、管理、处理、完善、更新和调整图片通过其大量的组合功能。 GIMP已经更新到2.8.6版本,相比2.8.4版本更稳定...

oschina
2013/06/29
2.5K
11
Ubuntu Linux系统下Gnome桌面快捷键配置

作为Ubuntu默认的桌面环境,GNOME 是一种支持多种平台的开发&桌面环境,并且 GNOME 拥有很多强大的特性,如高质量的平滑文本渲染,首个国际化和可用性支持等。好了,以下是我使用 Ubuntu 时发...

zt371
2009/05/08
1K
0
在 Ubuntu 上安装 LaTeX

LaTeX( LATEX,音译“拉泰赫”)是一种基于TeX的排版系统,由 美国 计算机学家 莱斯利·兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知...

红薯
2012/08/08
31.4K
15
在 Ubuntu 上安装 LaTeX

LaTeX( LATEX,音译“拉泰赫”)是一种基于TeX的排版系统,由 美国 计算机学家 莱斯利·兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知...

曾沙
2012/11/26
694
0
建立Ubuntu apt的本地Mirror

使用开源工具 apt-mirror 可以用于镜像 APT repository。 安装 : 创建apt镜像存储目录: 确定版本 which version of Ubuntu or Debian 。需要将其加入到apt-mirror config。 修改apt-mirror ...

openthings
2015/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

No transaction aspect-managed TransactionStatus in scope

No transaction aspect-managed TransactionStatus in scope 如果当前事务操作的实现所在方法没有开启事务,就会报出这样的异常。 例如你在A方法调用B方法,B方法开启了事务,A方法没有开启事...

嘴角轻扬30
12分钟前
1
0
SpringBoot整合Redis Lettuce

最近在准备集成的基础框架使用Spring Boot2搭建,其中Redis的支持不仅仅是丰富了它的API,更是替换掉底层Jedis的依赖,取而代之换成了Lettuce(生菜) jedis跟lettuce的区别 Lettuce 和 Jedis ...

lemonLove
19分钟前
1
0
mysqldumpslow 慢查询日志分析工具

首先得配置my.cnf: #====================================================================================================================##=====================================......

吴伟祥
19分钟前
2
0
如何基于阿里云搭建适合初创企业的轻量级架构?

----基于阿里云搭建的适合初创企业的轻量级架构 前言 在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变、快速部署、持续集成并可以适应多种情况的...

阿里云云栖社区
19分钟前
1
0
SpringBoot基础教程4-1-1 使用JdbcTemplate操作数据库及事务管理

1 概述 SpringBoot封装的JdbcTemplate,使用模板模式,去除JDBC繁琐的重复代码,并提供了基于注解的事务管理;下面详细介绍如何使用JdbcTemplate操作数据和事务管理。 2 添加依赖 <dependenc...

Mkeeper
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部