Vim 全向自动完成问题

Vim omni autocomplete issue

我将下一行代码放入 ~/.vimrc 文件:

filetype plugin on                                                                                                                                  
set omnifunc=syntaxcomplete#Complete

但什么也没发生,当我创建一个扩展名为 .c 的文件并按下 <Ctrl-X><Ctrl-O> 时,vim 编辑器弹出一条“未找到模式”消息。 在这里可以看到我的 .vimrc:

语法代码完成使用当前语言关键字来完成文本。如果文本不匹配任何关键字,它会显示“未找到模式”。例如,在 .c 文件中

func| -> function
abc| -> "pattern not found"

详情见:h ft-syntax-omni

你有两个问题。

第一个问题

命令filetype plugin indent on告诉Vim:

  • 检测每个缓冲区的文件类型,
  • 为检测到的文件类型获取适当的文件类型插件,
  • 为检测到的文件类型获取适当的缩进脚本。

当您加载新缓冲区时,这些事情会自动发生。在这种特定情况下(和其他情况下),C ftplugin 包含这一行:

setlocal ofu=ccomplete#Complete

这有效地覆盖了你的:

set omnifunc=syntaxcomplete#Complete

有几种方法可以解决这个问题,但最明智的方法是制作自己的文件类型插件:

  1. 创建~/.vim/after/ftplugin/c.vim

  2. 加上setlocal omnifunc=syntaxcomplete#Complete

参见 :help filetype-plugin

第二题

:help ft-syntax-omni 中所述,syntaxcomplete#Complete 从当前语法定义中提取建议。由于默认情况下不启用语法突出显示并且您没有明确启用它,因此没有“当前语法”,因此没有基于语法的完成。

您应该在 vimrc:

中明确启用它
syntax on

结论

你的 vimrc 应该是这样的:

filetype plugin indent on
syntax on

这是您全新的 C:

自定义文件类型插件
" ~/.vim/after/ftplugin/c.vim
setlocal omnifunc=syntaxcomplete#Complete