原 文: http://www.vim.org/tips/tip.php?tip_id=94 翻 译: Pengxiaoyu peng.xiaoyu@gmail.com 修 订: 更新日期: 2006-05-30 VimTip 94: FAQ: 在vim中使用标签 --------------------- 这个文档会告诉你如何利用vim提供的各种功能来使用标签帮助阅读程序源代码。 你可以通过:help tagsearch.txt(已过时?)阅读vim的在线文档, 里面更加详细的说明了对标签的支持。你也可以使用文档中提到的help关键词来获得更加详细的命令和选项帮助,比如在vim中输入:help 。 1. 我怎么创建标签文件? 你使用ctags可以生成一个标签文件,或者是通过定制的工具和脚本。 help keyword(s): tags 2. 我在哪里可以下载生成标签文件的工具? 有很多这样的工具。针对所使用的语言,你可以选择其中的某一个。 1) Exuberant ctags能够生成下列编程语言的标签文件 Assembler, AWK, ASP, BETA, Bourne/Korn/Zsh Shell, C, C++, COBOL, Eiffel, Fortran, Java, Lisp, Make, Pascal, Perl, PHP, Python, REXX, Ruby, S-Lang, Scheme, Tcl, and Vim 下载地址:http://ctags.sourceforge.net/ 2) 在Unix上,你可以使用/usr/bin/ctags。它被安装在大多数的Unix主机中。 3) 使用jtags,可以为java程序生成标签文件。 下载地址:http://www.fleiner.com/j标签/ 4) 使用ptags,可以为Perl程序生成标签文件。 下载地址: http://www.eleves.ens.fr:8080/home/nthiery/Tags/ 5) 使用下面的脚本生成verilog文件的标签: http://www.probo.com/vtags.htm http://www.cs.albany.edu/~mosh/Perl/veri-tags http://www.verilog.net/vrtags.txt 6) 使用Hdrtags http://www.erols.com/astronaut/vim/index.html#Tags 它可以生成下面编程语言的标签文件: assembly, c/c++, header files, lex, yacc,LaTeX, vim, Maple V 7) 使用vim内置的脚本: pltags.pl - 生成Perl代码的标签 tcltags - 生成TCL的标签 shtags.pl - 生成shell脚本的标签 help keyword(s): ctags 3.我怎么使用ctags来生成标签文件? 为当前目录下的所有c程序文件生成一个标签文件: $ ctags *.c 为当前目录和其子目录下的所有文件生成标签文件(仅在exuberant ctags下有效): $ ctags -R . 为在一个文件列表中的所有文件生成标签文件: $ ctags -L flist 4.我怎么设置vim使用某个标签文件? 你通过设置'tags'参数来指定标签文件 set tags=/my/dir/tags help keyword(s): tags, tags-option 5.我怎么设置vim来使用多个标签文件? 'tags'参数可以指定多个文件,通过逗号或者空格分隔。 set tags=/my/dir1/tags, /my/dir2/tags 6.我怎么设置vim来使用目录树里的标签文件? 注意:这只在vim6.0或以后版本中使用。设置'tags'参数,比如: set tags=tags;/ vim将会搜索当前目录,然后再层层往上搜索其上层目录,直到找到一个标签文件为止,或者到了根目录'/'下。 help keyword(s): file-searching 7.我怎样跳转到某个标签? 有很多方法可以 1)你可以使用'tag' ex命令,例如:tag 会跳到名为的标签处。 2)你把光标移动到所要跳转到的标签名字上,然后按Ctrl-]。 3)你可以在visual模式下选中一段文字,然后按Ctrl-],就会跳到匹配选中文字的标签处了。 4)你可以按下键同时用鼠标左键单击标签的名字。 5)先按下g,然后用鼠标左键单击标签的名字。 6)你可以使用stag命令,可以将在一个新窗口中打开标签。比如: :stag func1 将会在一个新的窗口中打开func1的定义。 7)将光标移动到标签名字处,然后按下Ctrl-W ]。这样会将新窗口中打开函数的定义。 help keywords: :tag, Ctrl-], v_Ctrl_], g, :stag, Ctrl-W_] 8.我怎么从一个标签跳回来? 也有很多的方法从一个标签跳回到原先的位置 1)你可以是用pop ex命令。 2)你可以按下Ctrl-t。 3)你可以按着Ctrl的同时单击鼠标右键。 4)你可以按下g,然后单击鼠标右键。 Help keywords: :pop, Ctrl-t , g 9.怎么样跳回到上次跳转到的标签位置? 你可以使用'tag' ex命令跳回上次的标签位置,它被自动存储在标签堆栈里了。 help keywords: tag 10.怎么查看存放标签的堆栈? Vim在标签堆栈中记录了你每次标签跳转的位置。你可以通过'tags'命令来列出标签堆栈中的内容。 help keyword(s): tags tagstack 11.怎么在有多个匹配的标签的情况下,跳到某个特定的标签? 在有些情况下,对于某个标签存在有多个匹配。比如说,一个c函数或者定义可能在同一源码树中出现多于一次。有很多方法使你能够在一组匹配的标签中选择某一个标签。 1)你可以使用'tselect'命令得到标签匹配列表。比如:tselect func1将会列出所有的func1的定义。然后你可以输入相应的数字来跳到想去的位置。 2)你可以将光标移动到标签名字上,然后按下g]得到标签的匹配列表。 3)你在visual模式下选中一段文字,然后按下g]得到标签的匹配列表。 4)你可以使用'stselect' ex模式得到标签的匹配列表。 5)你可以移动光标到标签名上,然后按下Ctrl-W g],相当于执行:stselect。 help keyword(s): tag-matchlist, :tselect, g], v_g], :stselect, Ctrl-W_g] 12.我想当只有一个匹配的标签时就跳转过去,而有多个匹配时就列出匹配标签列表? 有很多方法可以使vim在只有一个匹配标签时直接跳转,其他情况就列出所有匹配情况。 1.你可以使用'tjump' ex命令。例如: :tjump func1 2. 你可以将光标移动到标签下,然后按g Ctrl-]。 3. 你可以在Visual模式下选中一段文本,然后按下g Ctrl-]得到所选中文字的标签定义或者标签列表。 4. 你可以使用'stjump' ex命令。这样将会在一个新窗口中打开标签定义或者标签列表。 5. 你可以按下Ctrl-W g Ctrl-]来执行:stjump操作。 help keyword(s): :tjump, g_Ctrl-], v_g_Ctrl-], :stjump, Ctrl-W_g_Ctrl-] 13.怎样浏览匹配标签列表? 如果有多个匹配的标签,你可以通过Vim多种多样的ex命令来浏览他们。 1.用'tfirst'或者'trewind' ex命令来查看第一个标签。 2.用'tlast' ex命令来查看最后一个匹配标签。 3.用'tnext' ex命令查看下一个匹配标签。 4.用'tprevious'或者'tNext' ex命令来查看前一个匹配标签。 help keyword(s): :tfirst, :trewind, :tlast, :tprevious, :tNext 14.我怎样预览一个标签? 你可以在预览窗口里预览标签,而不用离开当前窗口。 1.你可以使用'ptag' ex命令在预览窗口里打开标签。 2.你可以将光标移动到标签名上,然后按下Ctrl-W }在预览窗口中打开标签。 3.你可以使用'ptselect' ex命令做和'tselect' ex命令相同的事,不过这次是在新窗口中打开。 4.你可以使用'ptjump' ex命令做和'tselect'相同的事情,只不过是在新窗口中打开。 5.你可以将光标移动到标签上,然后按下Ctrl-W g}来执行:ptjump。 help keyword(s): :preview-windows, :ptag, Ctrl-W_} :ptselect, :ptjump, Ctrl-W_g } 15.我怎么在预览窗口里浏览标签列表? 如果有多个标签匹配,你可以在预览窗口中查看他们。 1.使用'ptfirst'或者'ptrewind' ex命令在预览窗口中查看第一个匹配标签。 2.使用'ptlast' ex命令在预览窗口中查看最后一个匹配的标签。 3.使用'ptnext' ex命令在预览窗口中查看下一个匹配的标签。 4.使用'ptprevious'或者'ptNext' ex命令查看上一个匹配标签。 help keyword(s): :ptfirst, :ptrewind, :ptlast, :ptnext, :ptprevious, :ptNext 16.我怎么启动vim去编辑匹配指定标签的文件? 在启动vim的时候,带上命令行参数'-t'和一个标签名。Vim将会直接跳转到该标签位置处。 Help keyword(s): -t 17.我怎么列出匹配一个模式匹配串的所有标签? 1.你可以列出所有匹配一个给定的正则表达式的标签,只需要在标签名前加上表示搜索的'/'。例如: :tag / :stag / :ptag / :tselect / :ptselect / :ptjump / 2.如果你选中了'wildmenu'选项,你就可以按键在状态栏列出所有匹配的标签。可以使用方向键在标签之间移动,按键选中。 3.如果你没有选中'wildmenu'选项,你也能通过键来浏览所有匹配的标签。 Help keyword(s): tag-regexp, wildmenu 18.有些怎样的参数来控制vim处理标签文件? 你可以使用下列的参数来控制vim对标签文件的处理。 1.'tagrelative'-控制标签文件中的文件处理。如果选项是on,则文件名都是相对路径。 2.'taglength'-控制用于识别标签的字符长度。 3.'tabbsearch'-控制搜索标签的方法。如果选项是on,则使用二分搜索,否则的话就是线性查找了。 4.'tagstack'-控制标签堆栈的使用。 help keyword(s):'tagrelative', 'taglength', 'tagbsearch', 'tagstack' 19.是不是可以高亮当前文件中所有的标签? 显然可以。参考vim的关于'tag-highlight'的在线文档。 20.是不是可以为当前文件中的所有标签创建一个菜单? 可以的。使用下面的这个脚本可以为当前文件中的所有标签创建一个菜单。使用下面的链接: http://members.home.net/jayglanville/tagsmenu/TagsMenu.html 21.是不是有什么办法使得在某些环境下,ctrl-]不被认为是telnet的转义字符? 在Unix系统中,标准的telnet转义字符是ctrl-]。当你在telnet会话中使用ctrl-]来跳转标签时,你只会得到一个telnet提示符。有两种办法避免这个问题: 1.将telnet的转义字符映射到其他的字符上去,使用telnet的"-e "的telnet命令。 2.用"-E"的telnet命令行参数来禁止telnet转义字符。 help keyword(s): telnet-CTRL-] 相关评论: *可以配合使用cscope :help cscope http://cscope.sourceforge.net/ 相关文档http://cscope.sourceforge.net/cscope_vim_tutorial.html