0

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。

4

2 回答 2

3

您对 ftplugins 正在做什么以及它们应该包含什么是错误的。

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

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

  • :map <buffer> keybinding action
  • :iab <buffer> keybinding expanded sequence
  • :setlocal option[=value]
  • :command -b CommandName :Action
  • :let b:option = value
  • 设置本地领导者(但要确保它在任何其他 ftplugin 之前完成相同文件类型)(编辑:localleader 实际上是一个全局设置,我的错误)

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

它们绝对不意味着像您定义的那样包含全局定义。它不是真正加载全局插件的地方,这些插件会在之后保持激活状态。

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

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

于 2016-09-08T00:15:39.170 回答
0

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

call vundle#begin()

" :Plugin commands go here

call vundle#end() 

如果您绝对需要延迟加载,请尝试使用另一个插件管理器。

于 2016-09-08T05:27:36.490 回答