【问题标题】:VIM+ctags+omnicppcompletevim+ctags+omnicpp完成
【发布时间】:2023-06-14 03:12:02
【问题描述】:

我是 linux 新手,但我最终决定尝试一个,我最近安装了 openSUSE。在 Windows 7 上,我使用 Visual Studio 进行 c/c++ 编程。我试图在linux下找到任何IDE,尝试了KDevelop但不喜欢它,所以我决定尝试将VIM设置为我的源代码编辑器。

首先,我需要找到一些自动完成功能。我读了一些关于 GCCSense 和 clang_complete 的东西,但是现在安装这些东西对我来说有点复杂,所以我选择了omnicpp 和 ctags。

我下载了omnicpp并将这些文件放在〜/ .vim文件夹中,我安装了ctags。我的 .vimrc 看起来像这样:

set number

" --- OmniCppComplete ---  
" -- required --  
set nocp " non vi compatible mode
filetype plugin on " enable plugins

" -- optional --
" auto close options when exiting insert mode
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
set completeopt=menu,menuone

" -- configs --
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype (i.e. parameters) in popup window

" -- ctags --
" map F8 to generate ctags for current folder:
map <F8> :!/usr/bin/ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
" add current directory's generated tags file to available tags

set tags=./tags,tags,/home/andrzej/vim/commontags

为了尝试,我制作了简单的 .c 文件

struct str
{
    int aaa;
};

int main()
{
    str *wsk;
    wsk->aaa=5;
    return 0;
}

我不在输入模式时按F8,当.c文件被定位时它应该生成标签文件(map :!/usr/bin/ctags -R --c++-kinds=+p --fields =+iaS --extra=+q .) 但没有生成这样的文件。我做错了什么?

【问题讨论】:

  • 其实我觉得clang_complete 更简单,但效果也更好。

标签: c++ c vim ctags omnicppcomplete


【解决方案1】:

编辑:

默认情况下,vim 和 gvim 都不会为您更改当前目录。因此,命令将在您环境的当前工作目录中执行。简而言之,如果你跑了:

cd / && vi ~/prog/c/file.c

你在使用 vi 时会遇到与在 gvim 中相同的“问题”。这就是我在评论中显示的绑定中使用绝对路径的原因。如果这是您所期望的行为,使用 autochdir 是一个合理的解决方案。

原文:

问题似乎出在+ 字符上。我建议将您的 ctags 参数放入 ~/.ctags:

$ echo -e "--c++-kinds=+p\n--fields=+iaS\n--extras=+q" > ~/.ctags
$ cat ~/.ctags
--c++-kinds=+p
--fields=+iaS
--extra=+q

然后将您的映射更改为:

map <F8> :!/usr/bin/ctags -R<CR>

否则,您可以转义“+”字符:

map <F8> :!/usr/bin/ctags -R --c\+\+-kinds=\+p --fields=\+iaS --extra=\+q .<CR>

【讨论】:

  • 什么都没变,我按F8时没有创建标签文件,但是当我手动进入这个文件夹并使用ctags时,创建了标签文件,可能是VIM的问题?
  • 当您按下F8 时会发生什么?你确定你在正确的目录中吗?老实说,我现在只在做一个项目,所以我只使用map &lt;F9&gt; :!ctags -f ~/prj/tags -R ~/prj&lt;CR&gt;,这样我就可以在任何地方运行它。
  • F8 也可能与另一个 vim 绑定冲突,或者与您的窗口管理器或终端中的一个绑定冲突。您可以尝试使用nmap &lt;silent&gt; ;c :!/usr/bin/ctags -R&lt;CR&gt; 绑定到;c
  • 正如我所写的,我认为问题出在 GVIM,因为它总是向我显示(使用 :!pwd)同一个目录,我添加了 autochdir,它似乎工作正常(但是 w /o autochdir 在终端 VIM 中一切正常)。为什么?
  • 您可能在 vim 中打开之前更改了 C 文件的目录,因此它可以工作。在gvim中,你的目录和C文件的目录不一样,所以失败了。
【解决方案2】:

好的,感谢您的所有回答,我找到了问题的根源。当我从终端 F8 运行 VIM 时工作正常,当我输入 !pwd 时,它显示我的 .c 文件所在的目录(例如 ~/prog/C),但是当我使用 GvIM 并打开相同的 .c 文件并输入!pwd 它显示 ~/dokumenty,所以我认为问题出在 VIM/GVIM 的某个地方。我想知道为什么无论我打开什么文件,GVIM 都无法识别该文件夹?

---编辑--- 我将 set autochdir 添加到我的 .vimrc 中,现在一切正常,问题已解决,但如果有人能回答我,我将不胜感激,为什么当我从终端运行 VIM 时一切正常(即使 autochdir 已关闭)但它不适用于 GVIM。

【讨论】:

    【解决方案3】:

    全方位

    有人看过或引用过这个吗?

    https://llvm.org/svn/llvm-project/llvm/trunk/utils/vim/vimrc

    标签

    从臀部拍摄(阅读:未经测试和未经验证)尝试 CD'ing 到当前目录。

    map <F8> :cd %:p:h <Bar> :!/usr/bin/ctags -R --c\+\+-kinds=\+p --fields=\+iaS --extra=\+q .<CR>
    

    【讨论】: