Bedingtes Laden von Plugins

14

Ich habe nach einer Antwort gesucht, aber noch nichts gefunden. Wenn ich etwas Offensichtliches verpasst habe, bitte ich um Entschuldigung. Ich dachte, es wäre eine schnelle Google-Suche, also ist es vielleicht komplizierter als ich dachte.

Ich möchte Plugins basierend auf dem Dateityp, den ich bearbeite, bedingt laden können. Wenn ich beispielsweise Python bearbeite, möchte ich nicht, dass die Keybindings vim-sexpinstalliert werden, aber wenn ich an Clojure arbeite, möchte ich, dass das Plugin geladen wird.

Ich verwende derzeit Neovim und Pathogen, aber wenn es einen anderen Plugin-Manager gibt, der dies für mich erledigt, wäre ich offen für einen Wechsel. Auch, wenn dies existiert, :set syntax whateverwerden die Plugins gewechselt? Da wäre das super :)

Vielen Dank im Voraus für jede Hilfe / Richtung!

Hoopes
quelle
1
Sie stellen eine Frage, aber Sie beschreiben tatsächlich eine andere: Wenn ein Plugin globale Tastenkombinationen installiert, deaktivieren Sie diese (lesen Sie die Plugin-Dokumentation) und aktivieren Sie sie lokal (z. B. mithilfe von autocmds) nur für die von Ihnen angegebenen Dateitypen wollen. Wenn das Plugin gut geschrieben ist, gewinnen Sie nicht zu viel, wenn Sie seine Initialisierung verzögern. Wenn Sie jedoch die von einem Plugin aktivierten unerwünschten globalen Tastenkombinationen nicht deaktivieren , wirken sie sich auch nach dem Laden des Plugins auf Sie aus .
VanLaser

Antworten:

18

Sie können dies mit Vim-Plug tun. Lesen Sie die README :

" On-demand loading
Plug 'scrooloose/nerdtree', { 'on':  'NERDTreeToggle' }
Plug 'tpope/vim-fireplace', { 'for': 'clojure' }

Ich denke , Sie verwenden müssen , :set filetype whateveranstatt set syntax whateverdas Plugin zu aktivieren.

(Möglicherweise können Sie dies in einem anderen Plug-in-Manager tun. Weitere Informationen finden Sie unter Was ist der Unterschied zwischen den VIM-Plug-in-Managern? )

statox
quelle
8

Anstatt aufzurufen execute pathogen#infect(), um alle Plugins zu laden, rufen Sie pathogen#interposejedes Plugin auf, dh:

execute pathogen#interpose('bundle/unicode.vim')
execute pathogen#interpose('bundle/AnsiEsc.vim')

Die Pathogen-API wird nicht außerhalb der Quelle dokumentiert , ist jedoch einfach genug (obwohl die Funktionsnamen unklar und nicht beschreibend sind). Sie können auch pathogen#surround()für absolute Pfade verwenden.

Sie können Plugins unter folgenden Bedingungen laden autocmd:

" Always use this plugin
execute pathogen#interpose('bundle/unicode.vim')

" Only for Python
autocmd FileType python execute pathogen#interpose('bundle/vim-sexp')

Wenn Sie feststellen, dass Sie viele dieser Fälle haben, können Sie sie sogar in verschiedene Pfade aufteilen:

  • ~/.vim/bundle/always für Plugins, die Sie immer wollen
  • ~/.vim/bundle/<filetype> nach Plugins für einen bestimmten Dateityp
  • Und dann lade es so:

    " Always use this plugin
    execute pathogen#infect('bundle/always/{}')
    
    " Load filetype plugins if they exist
    autocmd FileType * if isdirectory('/home/martin/.vim/bundle/' . &ft) | execute pathogen#infect('bundle/' . &ft. '/{}') | endif
    

Auf diese Weise müssen Sie nicht autocmdfür jeden Dateityp / jedes Plugin eine ganze Reihe von s hinzufügen.

Wenn dies existiert, :set syntax whateverwerden die Plugins gewechselt? Da wäre das super :)

  • Sobald ein Plugin geladen ist, wird es geladen. Ein „Plug -in “ ist einfach eine Sammlung von function, commandund mapdefinitons. Ich kenne keinen einfachen Weg, dies zu "entladen".

  • Es tut Last - Plugins für eine Datei des Typs iff Sie verwenden :set filetype; Im Allgemeinen sollen Sie immer verwenden , :set filetypeund nicht :set syntax , wie es syntaxnur die Syntax - Hervorhebung festgelegt und nicht die Vertiefung und andere Einstellungen (zB iskeyword, formatexprusw.).

Martin Tournoij
quelle