Come posso testare i plugin e includerli solo se esistono in .vimrc?


14

Nel mio .vimrcsto cercando di usare ftplugine ovviamente usare alcuni comandi relativi a quello presupponendo che sia stato caricato con successo. Tuttavia, ora ho incontrato alcune vecchie macchine che non hanno installato il plugin. Posso in qualche modo subordinare il caricamento di questo plugin e aggiungere filetype ondirettive simili nello stesso blocco condizionale?

Ho visto che ci sono condizioni per le combinazioni di colori e la versione di Vim, ma non ho visto un esempio che verifichi il plugin (o non lo riconosca).

NB: Sii gentile, sono un principiante di VimScript.


1
Nota che i plug-in vengono caricati dopo il tuo ~/.vimrc, quindi non sarai in grado di testare gli effetti di un plug-in all'interno del tuo a ~/.vimrcmeno che tu non provi l'esistenza del file del plug-in o rinvii il test fino a dopo che i plug-in sono stati caricati con un autocommand come VimEnter.
Garyjohn,

@garyjohn: aha, è interessante. Perché questo tipo di contraddice la risposta esistente. Potresti scriverlo come una risposta?
0xC0000022L

Ho modificato la mia risposta per risolvere in qualche modo quel problema.
qqx

Il mio commento non ha contraddetto la risposta di qqx; aveva lo scopo di attirare l'attenzione su un punto che sarebbe potuto mancare se non si fosse letto attentamente la risposta di qqx o se ne fosse dedotta erroneamente. La risposta è stata buona per cominciare ed è ancora più chiara ora.
Garyjohn,

Risposte:


19

Puoi avvolgere quel blocco in un condizionale che usa la exists()funzione per verificare se una variabile, un comando o una funzione definita dal plugin è noto per vim.

Ecco un paio di bit che ho nei file in ~ / .vim:

" after/plugin/speeddating.vim
if exists(':SpeedDatingFormat')
    SpeedDatingFormat %-d %B %Y
endif

" ftplugin/ruby.vim
if exists('g:loaded_surround') && !exists('b:surround_'.char2nr(':'))
  let b:surround_{char2nr(':')} = ":\r"
endif

Si noti che i bit di cui sopra sono nei file che vengono valutati dopo i normali plug-in, qui un ftplugin e un file nella after/plugindirectory.

Un'altra opzione sarebbe quella di utilizzare i blocchi try / catch, sebbene ciò richieda almeno vim 7.0:

if v:version >= 700
    try
        runtime bundle/pathogen/autoload/pathogen.vim
        call pathogen#infect()
    catch
    endtry
endif

Una volta che qualcosa nella trysezione di quel blocco fallisce, salterà alla catchsezione. Poiché la catchsezione è vuota, continuerà con il resto del file di inizializzazione dopo l' endtryistruzione.

Poiché questo sta caricando manualmente il codice piuttosto che fare affidamento su un plug-in già caricato, ciò può essere fatto nel file .vimrc stesso.


Potresti aggiungere i requisiti di versione per il trycostrutto? Il vecchio Vim lo avrebbe capito? Cioè quando è stato introdotto. Grazie e +1 per ora.
0xC0000022L

1
Ho aggiunto informazioni sulla versione richiesta.
qqx

Penso che l'ultima soluzione con il controllo della versione che avvolge trydovrebbe funzionare. Molte grazie. Vediamo se arriverà ancora un'altra risposta. Altrimenti ovviamente accetterò il tuo.
0xC0000022L

ah, questo ovviamente disabilita il plugin nelle versioni 6.x. Hmmm ... devo trovare qualcosa di meglio, ma nel frattempo funzionerà. Grazie.
0xC0000022L

Ancora un'altra alternativa sta usando :silent! {cmd}, che sopprime l'errore quando {cmd}non esiste. Questo funziona anche in Vim 6.
Ingo Karkat,

7

Il mio metodo preferito è solo per verificare l'esistenza del file plugin. Lo trovo più semplice.

if !empty(glob("path/to/plugin.vim"))
   echo "File exists."
endif

4

Volevo raggiungere questo obiettivo mantenendo la mia configurazione di Vim insieme .vimrc, piuttosto che in un mucchio di after/directory. Questa è la soluzione che mi è venuta in mente:

  1. Controlla l'esistenza di ogni plugin controllando ogni singolo comando che fornisce exists()e imposta le sue opzioni se esiste. (Questo è proprio come nella risposta accettata.)

  2. Inserisci tutte le opzioni impostate nel modo sopra in una funzione (chiamata SetPluginOptionsNow()nel mio codice).

  3. Chiamare questa funzione VimEntersull'evento, che viene attivato durante l'accesso a una nuova sessione di Vim, ma soprattutto, dopo che tutti i plugin sono stati caricati. Per questo motivo, i nostri exists()controlli possono verificare senza problemi le funzioni del plug-in.

Ecco un esempio da quella parte del mio .vimrc.

""" PLUGIN-SPECIFIC OPTIONS
" These are "supposed to be" set in after/plugin directory, but then
" cross-platform synchronization would get even messier. So, au VimEnter it is. 

function! SetPluginOptionsNow()


    " NERDTree Options
    if exists(":NERDTree")
        map <F10> :NERDTreeToggle<CR>
    endif

    " Syntastic Options
    if exists(":SyntasticCheck")
        let g:syntastic_stl_format = '[Syntax: line:%F (%e+%w)]'
        set statusline+=%#warningmsg#
        set statusline+=%{SyntasticStatuslineFlag()}
        set statusline+=%*
        " and so on...

endfunction

au VimEnter * call SetPluginOptionsNow()
""" END OF PLUGIN-SPECIFIC OPTIONS

questa risposta non va bene con vim-compagnia aerea. In particolare, aspettare che l'evento VimEnter specifichi cose come airline_themesembra indurre un mucchio di errori ... Non sono proprio sicuro del perché.
StevieP

3

Ancora un'altra alternativa sta usando :silent! {cmd}, che sopprime l'errore quando {cmd}non esiste. Il vantaggio principale è che si tratta di un breve comando singolo. Funziona anche con Vim 6 ed è ottimo per le cose opzionali.

Ad esempio, viene utilizzato dai plug-in che utilizzano repeat.vim di Tim Pope per rendere ripetibili i mapping.


Sarebbe qualcosa come !silent runtime ftplugin/man.vim | filetype on | filetype plugin on | filetype indent onlavorare per chiudere tutti i comandi che seguono !silento è sempre specifico del comando successivo?
0xC0000022L

Non lo :silent!è !silent, e si applica a tutti i comandi contenuti, tranne quando :unsilentviene utilizzato da qualche parte all'interno. (Ma è raro.)
Ingo Karkat,

oops, difficile da risolvere ora nel commento. Ma capito. Grazie.
0xC0000022L

1

Inizialmente pubblicato in un'altra domanda: /programming//a/48178537/2843583

Proprio come alternativa puoi anche usare un regexp per decidere se il plugin a portata di mano è nel tuo runtimepath:

if &rtp =~ 'plugin-name'
    ...
endif

Questo ha il vantaggio che funziona con plugin che hanno solo il codice vimscript nella autoloaddirectory, che a sua volta non può essere rilevato quando .vimrc viene inizialmente analizzato poiché gli snippet di caricamento automatico vengono caricati al momento di una chiamata di funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.