在ftplugin中声明的Vim插件不起作用

时间:2016-09-07 22:16:10

标签: vim plugins vundle

Gvim表现得很奇怪,我无法找到原因。我使用Vundle,我.vimrc中声明的所有插件都运行正常。我在.vim/after/ftplugin/java.vim中声明了一些其他设置和插件。

映射工作正常,但插件不起作用。如果我在当前的gvim会话中选择了不同的文件,我会收到以下错误消息:

Error detected while processing function vundle#config#bundle[2]..<SNR>14_check_bundle_name:
line 2:
Vundle error: Name collision for Plugin Raimondi/delimitMate. Plugin Raimondi/delimitMate previously used the name "delimitMate". Skipping Plugin Raimondi/delimitMate.
Vundle error: Name collision for Plugin artur-shaik/vim-javacomplete2...
[comment: same error message for all plugins declared in the ftplugin]

我注意到,如果我运行:VundleInstall,插件突然工作(当我更改文件时,错误消息仍然存在,当我使用该命令时没有安装插件)。

以下是.vimrc的开头:

syntax on
set guifont=Inconsolata\ Medium\ 12
set nocompatible
set t_Co=256

filetype off

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

"[comment: all plugins I use for every filetype]

call vundle#end()            " required

filetype plugin indent on

这是我的java.vim文件:

filetype off
"to automatically close brackets
Plugin 'Raimondi/delimitMate'

"omni-complete for Java
Plugin 'artur-shaik/vim-javacomplete2'

"use tab to navigate through insert completion
Plugin 'ervandew/supertab'
filetype plugin indent on

"needed to make javacomplete2 working properly
autocmd FileType java setlocal omnifunc=javacomplete#Complete

我的操作系统是Ubuntu 16.04。

2 个答案:

答案 0 :(得分:2)

你误解了ftplugins正在做什么以及它们应该包含什么。

每次创建/打开新缓冲区时,每个缓冲区加载一次Ftplugins。

它们旨在包含缓冲区本地定义:

  • :map <buffer> keybinding action
  • :iab <buffer> keybinding expanded sequence
  • :setlocal option[=value]
  • :command -b CommandName :Action
  • :let b:option = value
  • 设置localleader(但要确保它在任何其他ftplugin之前完成相同的文件类型)

然后他们可以使用:runtime:so加载其他以相同方式工作的内容。它们可能包含函数,但最好将它们定义为自Vim7以来的自动加载插件。它们可能包含缓冲区本地菜单定义,但这需要plugin,因为这不是标准的。

它们最终并不意味着包含您定义的全局定义。它不是真正加载全局插件的地方,之后会保持激活状态。

我知道有些插件管理器会根据我们处理的文件类型动态加载插件。当我们使用正确定义的ftplugins和轻量级插件时,我从未分享过这种需求,这些插件只定义了一些映射并将其功能保存到自动加载插件中。

最后,ftplugins应该包含反加强防护。在典型情况下,这不是那么有用。许多人为了这个目的使用b:did_ftplugin,但是我避免使用这个变量,因为我更喜欢拥有与主题一样多的ftplugins(对于相同的文件类型)(一个专门用于括号对,one that定义自动映射从变量类型扩展switch语句,one that定义控制语句的缩写,依此类推)。因此,我不能对所有文件使用相同的防护。

答案 1 :(得分:0)

所有:Plugin命令都应该在这两行之间

call vundle#begin()

" :Plugin commands go here

call vundle#end() 

如果您绝对需要延迟加载,请尝试another plugin manager