如何在vim中使用ctags进行自动补全

13

我尝试在vim中开发android项目,但发现使用ctags查找方法有点无聊。是否有一种方法可以在vim中使用ctags显示自动完成列表呢?

谢谢。

我的ctags版本如下:

Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Mar 21 2011, 10:34:51
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex

以及 Vim 的版本:

Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Mar 21 2011, 10:34:51
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex
ccheng@ccheng-desktop:~$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Mar 24 2011 07:10:07)
Included patches: 1-35
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Huge version without GUI.  Features included (+) or not (-):
+arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent 
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
+conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs 
-dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path 
+find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv 
+insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent 
+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape 
+mouse_dec +mouse_gpm -mouse_jsbterm +mouse_netterm -mouse_sysmouse 
+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype 
+path_extra -perl +persistent_undo +postscript +printer +profile +python/dyn 
+python3/dyn +quickfix +reltime +rightleft -ruby +scrollbind +signs 
+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary 
+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title
 -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo 
+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp
 -xterm_clipboard -xterm_save 
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
      user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: 
gcc -c -I. -Iproto -DHAVE_CONFIG_H     -Wall -g -O2 -D_FORTIFY_SOURCE=1      
Linking: 
gcc   -Wl,--as-needed -o vim       -lm -lncurses -lselinux   -lacl -lgpm

我的 .vimrc 文件:

   1 set autochdir
  2 filetype plugin indent on
  3 set nu
  4 set tags=./tags
  5 set path=.,..,../..
  6 set tabstop=4
  7 set hlsearch
  8 set cscopequickfix=s-,c-,d-,i-,t-,e-
  9 set tags=$HOME/gingerbread/frameworks/tags,$HOME/gingerbread/packages/provid    ers/ContactsProvider/tags
 10 
 11 :" Only do this part when compiled with support for autocommands.
 12 :if has("autocmd")
 13 :  autocmd Filetype java setlocal omnifunc=javacomplete#Complete
 14 :endif 
 15 setlocal completefunc=javacomplete#CompleteParamsInfo

不要引发编辑器之争,但是你为什么不使用像Eclipse这样的集成开发环境呢?别误会,我是一个忠实的Vim粉丝,但是在我尝试使用Eclipse进行Java开发后,我坚信一个好的IDE胜过一个文本编辑器,无论哪一天。特别是当你使用Google的Eclipse插件时,你还可以获得项目生成器和其他针对Android的工具。 - exclipy
7
是的,Eclipse加速了,但是用简单的编辑器管理整个项目会迫使你几乎要了解项目本身的所有内容。我曾经在C/C++的大型遗留项目上工作过,没有什么比一个好的makefile和一个好的编辑器(VI或EMACS或其他你喜欢的编辑器)更好了。如果你可以用记事本/vi做到,那么你可以用任何东西做到。当然,这需要花费更多时间。 - BigMike
1
谢谢你的建议,我会考虑的。之前我用过 Eclipse,但它的效率太低了,而且当我修改 Android 源代码时,经常要在 Eclipse 和终端之间切换,感觉不太好。 - Frank Cheng
对于像Java(和C#)这样的语言,我发现使用集成开发环境非常值得。你可能可以为Eclipse获取一个扩展程序,让你在其中使用Vim(我曾经在Visual Studio中使用过viEmu,效果非常好,但是我没有在Eclipse插件上的使用经验)。 - Nick Knowlson
根据我的经验,Eclipse中允许VIM编辑的插件只提供了简单的VIM功能。如果你是一个更有经验的VIM用户,它们只会带来挫败感。当然,除非我错过了什么新的东西... - eugenevd
“:h 'complete'” 对我很有用 - 在我设置 haskell 标签之前,我已经配置了它,并需要将其更改以再次包括“t”。 - JonnyRaa
3个回答

13

我想澄清一下:你似乎已经设置了ctags,并想知道如何使用它来自动完成方法名,是这样吗?

正如romainl所提到的,<C-n><C-p>就是你要找的。它们分别是complete using next matchcomplete using previous match

但它们并非vim唯一支持的自动完成方式,请参阅:he ins-completion了解其他方式(包括拼写和文件名)。还有一种特定的自动完成方式是<C-x><C-o>(omni-completion),你可能会觉得它很有用。

如果你不仅关心自动完成:在类似的Stack Overflow问题中,richq的回答对ctags有一些很好的信息。


1
有趣的是,<C-n> 对你不起作用。<C-]><C-o> 也不起作用吗?听起来好像 ctags 的设置有些问题。我不确定你的第二句话是什么意思,请重新表达一下。 - Nick Knowlson
1
ctags --version的输出可能是相关的,你能否编辑问题并附上它?另外,你是否使用类似于http://blog.vinceliu.com/2007/08/vim-tips-for-java-2-using-exuberant.html的方式使用ctags? - Nick Knowlson
"<C-]>,<C-o>" 的效果非常好。我怀疑是因为它是 Java,所以 ctags 的自动完成无法正常工作。 - Frank Cheng
我不确定是因为它是Java,所以ctags的自动完成无法正常工作。我仍然不理解那句话,恐怕你是在说你认为ctags不能与Java一起使用?Java在ctags支持的语言页面上有列出:http://ctags.sourceforge.net/languages.html - Nick Knowlson
是的。当我按下Ctrl]时,它会进入光标下的类。 - Frank Cheng
显示剩余4条评论

1

1
是的,<C-n><C-p> 默认情况下也会扫描标签文件。<C-x><C-]> 仅扫描标签文件。这可能会减少建议的数量。 - romainl
@romainl,你应该把 <C-x><C-]> 发布为完整的答案,因为它真的帮了我很多。 - Ainar-G

1
您可以在vimrc中使用[TAB]来完成所有操作。 我们使用[char][char][dot][tab]触发标签自动完成, 另请参见https://dev59.com/W1wX5IYBdhLWcg3wvBhj#46645434,了解如何集成拼写、同义词和字典。
   :inoremap <Tab>   <C-R>=MoshTabOrComplete()<CR>
    function!               MoshTabOrComplete()
      if col('.') > 3 
        \ && strpart( getline('.'), col('.')-3, 4 ) =~ '^[a-zA-Z]\+[.]' "  prev 2 char are alpha+dot?
        " Tag-completion eg. print.<tab> will complete to printf or println
        return "\<BS>\<C-x>\<C-]>"
      endif
      " if exists("g:MoshThesaurusOmniCompleter") && col('.') > 3 
        " \ && strpart( getline('.'), col('.')-3, 4 ) =~ '^[a-zA-Z]\+[!%?~-]' "  prev 2 char are alpha+punct?
        " Calls MoshThesaurusOmniCompleter 
        " Test: qieut!<tab> will spell correct to quiet, more tests in ./thesaurus-omni.vim
        " return "\<C-x>\<C-o>"
      " endif
      if col('.') > 1 && strpart( getline('.'), col('.')-2, 3 ) =~ '^\w' " prev char is alphabet?
        " Usual omni-completion
        return "\<C-N>"
      endif
      " Insert regular TAB
      return "\<Tab>"
    endfunction

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接