Vim编辑器非常聪明吗?

时间:2009-09-19 18:46:12

标签: java c++ vim editor

我使用C ++或Java编程。所以我想使用Vim编辑器,因为它非常灵活。我听说我可以配置Vim编辑器以便能够

  1. 从对象到定义
  2. 从功能到定义
  3. 从类名到定义
  4. 我们是否有任何专业的Vim-er可以告诉我如何为此配置Vim?提前谢谢。

    P.S。如果读者会认为这个问题与编程无关,我会说这是在提高编程速度。所以它对程序员有帮助。所以请不要关闭这个问题。

    编辑:另外我想知道vim如何处理代码完成,并且可以提示提示某些对象可用的方法列表?如果是,那么我想知道如何配置这些选项?

8 个答案:

答案 0 :(得分:12)

您正在寻找的是ctags和标签/ TAGS文件。 Ctags(我推荐使用Exuberant Ctags)是一个程序,它扫描源文件中的标识符并创建索引它们的文件。然后,您可以使用^]跳转到光标下标记的定义。

可能需要一些额外的细节来告诉vim如何找到标签文件;我不确定他们是什么。但这是一般的想法 - 对源代码运行ctags然后使用^]。

或者,您可以查看GNU Global。它有点复杂。但是ctags将完成你所描述的内容。

答案 1 :(得分:2)

Vim毫无疑问,是世界上最好的编辑(快来找我emacs)。除了火焰之战,我发现对C ++和Java编程都非常有用的是eclipse(世界上最好的IDE,现在我正在戳Netbeans)和vrapper插件。您可以获得完全集成的开发环境和vim键盘快捷键的强大功能。

Vrapper并没有为你提供完整的vim仿真,但是你可以使用vim快捷方式在你的代码周围反弹,而且你不会失去日食的任何优点。

答案 2 :(得分:2)

使用ctags绝对是开始的地方,但不要忘记cscope。在这两种情况下,首先让cscope和ctags扫描源文件并在启动vim之前创建它们的数据库。随着代码的增长和变化,您还需要偶尔刷新数据库。

使用ctags,只需在代码目录中使用命令“ctags”即可。如果您有目录的层次结构,请从顶部开始并使用“ctags -R”来递归下面的所有目录。在与生成的标签文件相同的目录中启动vim,vim应该自动查找并加载它。当光标位于函数或变量名称的编辑器中时,可以键入“^]”,vim应该跳转到定义。

同样,使用cscope,使用“cscope -b”或“cscope -b -R”来获取更详细的标记信息。 Vim和cscope协同工作,为您提供更多信息,例如使用标识符的位置以及调用函数的位置。有一组宏可用于访问信息。您可以在vim cscope帮助信息中找到宏及其含义。

答案 3 :(得分:2)

上次我检查过,很久以前,ctags还可以,但它遗漏了一些标识符,cscope有一个更详尽的搜索选项,但它仍然遗漏了一些标识符。

我更喜欢

grep。它是详尽无遗的,但如果源代码库的大小合理或PC速度很快,它仍然非常快。您可以使用:grep从vim调用它。这是我自己的_vimrc的简化版本,以显示我如何配置它。我发表评论来解释什么键做什么。

" for Windows, replace with the location of `grep.exe'
" not needed for Unix/Linux
:set grepprg=c:\prog\cygwin\bin\grep.exe\ -n\ $*\ /dev/null


:function! RecursiveSearchIdentifierUnderCursor()
:   sp
:   let grep_cmd = "silent grep -r \"\\<" . expand("<cword>") . "\\>\" *"
:   exe grep_cmd
:endfunction


" CTRL-backslash to search for the identifier (or "word") under the cursor
"
" an identifier is in the form "xxx_123_yyy" but something in the form
" "xxx_123_yyy.aaa_999" would be two identifiers separated by a period
"
"
" this basically executes:
"
"       :grep -r "\<identifier\>" *
"
" for whatever `identifier' the cursor happens to be over
"
"
" to close the newly opened window, use:
"
"       :q
"
:map <C-\> :call RecursiveSearchIdentifierUnderCursor()<CR>


" cursor up/down to move to the previous/next search result
:map <Up> :cp<CR>zz
:map <Down> :cn<CR>zz


" jump up/down between horizontally split windows
:map <PageUp> <C-W>k
:map <PageDown> <C-W>j


" move to the previous/next enclosing brace
:map <Left> [{
:map <Right> ]}


" move to the previous/next enclosing parenthesis
:map <Home> [(
:map <End> ])


" move to the previous/next enclosing # preprocessor directive
:map <Insert> [#
:map <Del> ]#

另外,不要忘记*(SHIFT-8)和#(SHIFT-3)向前和向后搜索当前文件中光标下的当前标识符。我在通过代码跳转时发现这些非常宝贵,尤其是在搜索短变量名称时,比如'i'和'j',否则会在传统文本编辑器中盲目搜索其他变量名称的部分。

如果您想使用:make,也可以从vim调用make。它将在第一次编译错误时停止,然后您可以从vim内部再次编辑和启动构建。

一旦您熟悉定义自己的函数和键映射,有很多方法可以使vim更容易重复编程任务。

答案 4 :(得分:1)

vim中的代码完成可用作vim-scripts:http://www.vim.org/scripts/index.php

答案 5 :(得分:1)

正如Michael E.所说,一般来说,ctags就是答案。对于将所有文件都放在一个目录中的项目,ctags *.c *.h是一个简单的开始。然后,正如迈克尔所说,你可以使用^]来定义,然后使用^ T返回你来自的地方。这些是你用来在Vim帮助中移动的相同键。

在Java和C ++中,您可能有多个具有相同名称的方法。 :tn将转到下一个,:ts将列出备选方案。

对于Vim中的代码完成,我通常使用^ P和^ N.它不像Eclipse或MSVC中的等效项那样是上下文敏感的,但通常可以完成这项工作。

您可能考虑使用的其他工具是cscope和(当然)Emacs或Eclipse。

答案 6 :(得分:1)

正如其他人所说,你需要为vi(m)生成一个索引文件。

我只想说使用vim编程Java而不是现代IDE,就像使用vim加上计算器而不是数字电子表格。两者都可以用于小任务,但是在扩展时,您会达到电子表格刚刚离开文本编辑器的程度。

如果你以java编程为生,请自己和雇主帮忙,并学会使用电动工具。

答案 7 :(得分:-1)

是的,提供此符号索引的工具称为ctags,许多unix编辑器都可以使用它。 vim在命令行上很不错,但我建议你花点时间习惯KATE。它是一个非常漂亮,现代的GUI编辑器,具有类似IDE的文件浏览,良好的语法高亮,我曾经使用的最好的动态文字包装等等。对于java,eclipse和netbeans可能值得一看。