Como carregar plugins condicionalmente

14

Eu estava procurando uma resposta para isso, mas ainda não encontrei nada, por isso, se perdi algo óbvio, peço desculpas. Eu pensei que seria uma rápida pesquisa no Google, então talvez seja mais complicado do que eu pensava.

Gostaria de poder carregar plugins condicionalmente com base no tipo de arquivo que estou editando. Por exemplo, ao editar python, não quero as combinações de teclas vim-sexpinstaladas, mas ao trabalhar no clojure, desejo que esse plug-in seja carregado.

Atualmente, estou usando neovim e patógeno, mas se houver um gerenciador de plugins diferente que faça isso por mim, eu estaria aberto a alternar. Além disso, se isso existir, :set syntax whateveros plugins são trocados? Porque isso seria super :)

Agradecemos antecipadamente por qualquer ajuda / direção!

Hoopes
fonte
1
Você está fazendo uma pergunta, mas na verdade descreve outra: se um plug-in instala combinações de teclas globais, desative-as (leia os documentos do plugin sobre como fazê-lo) e reative-as localmente (usando autocmds por exemplo) apenas para os tipos de arquivos que você quer. Se o plug-in estiver bem escrito, você não ganha muito atrasando a inicialização. Mas se você não desabilitar as combinações de teclas globais indesejadas ativadas por um plug-in, elas ainda o afetarão após o carregamento do plug-in.
21416 VanLaser

Respostas:

18

Você pode fazer isso com o Vim-Plug. Veja o README :

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

Eu acho que você terá que usar em :set filetype whatevervez de set syntax whateverativar o plugin.

(Alguns outros gerenciadores de plugins podem permitir que você faça isso, consulte Qual é a diferença entre os gerenciadores de plugins do vim? )

statox
fonte
8

Em vez de chamar execute pathogen#infect()para carregar todos os plug-ins, chame pathogen#interposetodos os plug-ins, ou seja:

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

A API do patógeno não está documentada fora da fonte , mas é bastante simples (mesmo que os nomes das funções sejam obscuros e não descritivos). Você também pode usar pathogen#surround()para caminhos absolutos.

Você pode carregar plugins condicionalmente com um básico autocmd:

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

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

Se você achar que tem muitos desses casos, poderá dividi-lo em diferentes caminhos:

  • ~/.vim/bundle/always para plugins que você sempre quer
  • ~/.vim/bundle/<filetype> para plugins para um tipo de arquivo específico
  • E, em seguida, carregue-o assim:

    " 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
    

Dessa forma, você não precisa adicionar um monte de autocmds para cada tipo de arquivo / plugin.

se isso existir, :set syntax whateveralterna os plugins? Porque isso seria super :)

  • Depois que um plug-in é carregado, ele é carregado. A "plug-in" é simplesmente uma coleção de function, commande mapdefinição dada. Não conheço nenhuma maneira direta de "descarregar" isso.

  • Ele faz plugins de carga para um filetype sse você usa :set filetype; Em geral, você sempre quer usar :set filetypee não :set syntax , como syntaxsó vai definir o destaque de sintaxe, e não o recuo e outras configurações (por exemplo iskeyword, formatexpr, etc.).

Martin Tournoij
fonte