Jak warunkowo ładować wtyczki

14

Szukałem odpowiedzi na to pytanie, ale niczego jeszcze nie znalazłem, więc jeśli coś przeoczyłem, przepraszam. Myślałem, że będzie to szybkie wyszukiwanie google, więc może to bardziej skomplikowane niż myślałem.

Chciałbym móc warunkowo ładować wtyczki na podstawie typu pliku, który edytuję. Na przykład podczas edytowania Pythona nie chcę, aby vim-sexpinstalowane były skróty klawiszowe , ale podczas pracy z clojure chcę, aby wtyczka została załadowana.

Obecnie używam neovim i patogenu, ale jeśli istnieje inny menedżer wtyczek, który robi to za mnie, byłbym otwarty na przełączanie. A jeśli tak, to czy :set syntax whateverprzełącza wtyczki? Bo to by było super :)

Z góry dziękuję za wszelką pomoc / kierunek!

Hoopy
źródło
1
Zadajesz pytanie, ale tak naprawdę opisujesz inne: jeśli wtyczka instaluje globalne skróty klawiszowe, wyłącz je (przeczytaj dokumentację wtyczek o tym, jak to zrobić) i włącz je ponownie lokalnie (na przykład używając autocmds) tylko dla typów plików, które Ty chcieć. Jeśli wtyczka jest dobrze napisana, nie zyskujesz zbyt wiele, opóźniając jej inicjalizację. Ale jeśli nie wyłączysz niechcianych globalnych skrótów klawiszowych aktywowanych przez wtyczkę, będą one miały wpływ na ciebie po załadowaniu wtyczki.
VanLaser,

Odpowiedzi:

18

Możesz to zrobić za pomocą Vim-Plug. Zobacz README :

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

Myślę, że będziesz musiał użyć :set filetype whateverzamiast set syntax whateverwłączyć wtyczkę.

(Niektóre inne menedżery wtyczek mogą na to pozwolić, zobacz Jaka jest różnica między menedżerami wtyczek vim? )

statox
źródło
8

Zamiast wywoływać w execute pathogen#infect()celu załadowania wszystkich wtyczek, wzywaj pathogen#interposekażdą wtyczkę, tj .:

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

Interfejs API patogenu nie jest udokumentowany poza źródłem , ale jest dość prosty (nawet jeśli nazwy funkcji są niejasne i nie mają charakteru opisowego). Możesz także użyć pathogen#surround()do absolutnych ścieżek.

Wtyczki można ładować warunkowo za pomocą podstawowego autocmd:

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

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

Jeśli okaże się, że masz wiele takich przypadków, możesz nawet podzielić je na różne ścieżki:

  • ~/.vim/bundle/always dla wtyczek, których zawsze chcesz
  • ~/.vim/bundle/<filetype> dla wtyczek dla określonego rodzaju pliku
  • A następnie załaduj tak:

    " 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
    

W ten sposób nie musisz dodawać całej wiązki autocmds dla każdego rodzaju pliku / wtyczki.

jeśli to istnieje, czy :set syntax whateverprzełącza wtyczki? Bo to by było super :)

  • Po załadowaniu wtyczki jest ona ładowana. A „wtyczki” jest po prostu zbiorem function, commandi mapdefinicjami. Nie znam żadnego prostego sposobu na „rozładowanie” tego.

  • To robi wtyczek obciążenia dla typu pliku wtw użyć :set filetype; Ogólnie rzecz biorąc, zawsze chcesz używać :set filetype, a nie :set syntax , jak syntaxtylko ustawić podświetlanie składni, a nie wcięcia i inne ustawienia (np iskeyword, formatexpretc.).

Martin Tournoij
źródło