¿Cómo puedo probar complementos y solo incluirlos si existen en .vimrc?


14

En mi .vimrc, estoy tratando de usar ftpluginy obviamente uso algunos comandos relacionados con eso bajo el supuesto de que se cargó correctamente. Sin embargo, ahora me he encontrado con algunas máquinas antiguas que no tienen el complemento instalado. ¿Puedo hacer que la carga de este complemento sea condicional y agregar filetype ondirectivas similares en el mismo bloque condicional?

He visto que existen condiciones para los esquemas de color y la versión de Vim, pero no he visto un ejemplo que verifique el complemento (o no lo reconozca).

NB: Sé gentil, soy un principiante de VimScript.


1
Tenga en cuenta que los complementos se cargan después de su ~/.vimrc, por lo que no podrá probar los efectos de un complemento dentro de su a ~/.vimrcmenos que pruebe la existencia del archivo de complemento o difiera la prueba hasta que los complementos se hayan cargado con un comando automático como VimEnter.
garyjohn

@garyjohn: aha, eso es interesante. Porque este tipo de contradice la respuesta existente. ¿Podrías escribirlo como respuesta?
0xC0000022L

He editado mi respuesta para abordar ese problema.
qqx

Mi comentario no contradecía la respuesta de qqx; estaba destinado a llamar la atención sobre un punto que podría haberse pasado por alto si uno no leyera cuidadosamente la respuesta de qqx o hiciera inferencias incorrectas. La respuesta fue buena para empezar y ahora es aún más clara.
garyjohn

Respuestas:


19

Puede ajustar ese bloque en un condicional que utiliza la exists()función para verificar si vim conoce una variable, comando o función definida por el complemento.

Aquí hay un par de bits que tengo en los archivos bajo ~ / .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

Tenga en cuenta que los bits anteriores están en archivos que se evalúan después de los complementos normales, aquí un ftplugin y un archivo en el after/plugindirectorio.

Otra opción sería usar bloques try / catch, aunque esto requiere al menos vim 7.0:

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

Una vez que algo en la trysección de ese bloque falla, saltará a la catchsección. Como la catchsección está vacía, continuará con el resto del archivo de inicialización después de la endtrydeclaración.

Dado que esto es cargar manualmente el código en lugar de depender de que un complemento ya esté cargado, esto se puede hacer en el archivo .vimrc.


¿Podría agregar los requisitos de versión para la tryconstrucción? ¿Lo entendería el viejo Vim? Es decir, cuándo fue presentado. Gracias y +1 por ahora.
0xC0000022L

1
He agregado información sobre la versión requerida.
qqx

Creo que la última solución con la verificación de versión que envuelve trydebería funcionar. Muchas gracias. Veamos si aún llegará otra respuesta. De lo contrario, por supuesto, aceptaré el tuyo.
0xC0000022L

Ah, por supuesto, esto deshabilita el complemento en las versiones 6.x. Hmmm ... necesito encontrar algo mejor, pero esto funcionará mientras tanto. Gracias.
0xC0000022L

Se está utilizando otra alternativa :silent! {cmd}, que suprime el error cuando {cmd}no existe. Esto incluso funciona en Vim 6.
Ingo Karkat

7

Mi método preferido es simplemente verificar la existencia del archivo de complemento. Esto me parece más simple.

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

4

Quería lograr esto mientras mantenía mi configuración de Vim dentro .vimrc, en lugar de en un montón de after/directorios. Esta es la solución que se me ocurrió:

  1. Verifique la existencia de cada complemento verificando cualquier comando único que proporcione exists()y configure sus opciones si es que existe. (Esto es como en la respuesta aceptada).

  2. Ponga todas las opciones establecidas de la manera anterior dentro de una función (llamada SetPluginOptionsNow()en mi código).

  3. Llame a esta función en el VimEnterevento, que se activa al ingresar a una nueva sesión de Vim, pero de manera crucial, después de que todos los complementos se hayan cargado. Debido a este hecho, nuestras exists()comprobaciones pueden verificar las funciones del complemento sin ningún problema.

Aquí hay una muestra de esa parte de mi .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

esta respuesta no es agradable con vim-airline. En particular, esperar que el evento VimEnter especifique cosas como airline_themeparece inducir un montón de errores ... No estoy realmente seguro de por qué.
StevieP

3

Se está utilizando otra alternativa :silent! {cmd}, que suprime el error cuando {cmd}no existe. El principal beneficio es que es un comando único corto. Esto incluso funciona en Vim 6, y es ideal para cosas opcionales.

Por ejemplo, es utilizado por complementos que usan el archivo repeat.vim de Tim Pope para hacer que las asignaciones sean repetibles.


¿Le gustaría !silent runtime ftplugin/man.vim | filetype on | filetype plugin on | filetype indent ontrabajar para callar todos los comandos que siguen al !silento es siempre específico para el siguiente comando?
0xC0000022L

Es :silent!, no !silent, y se aplica a todos los comandos contenidos, excepto cuando :unsilentse usa en algún lugar dentro. (Pero eso es raro.)
Ingo Karkat

Uy, difícil de arreglar ahora en el comentario. Pero lo tengo. Gracias.
0xC0000022L

1

Inicialmente publicado en otra pregunta: /programming//a/48178537/2843583

Como alternativa, también puede usar una expresión regular para decidir si el complemento en cuestión está en su runtimepath:

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

Esto tiene la ventaja de que funciona con complementos que solo tienen código vimscript en el autoloaddirectorio, que a su vez no se puede detectar cuando .vimrc se analiza inicialmente ya que los fragmentos de carga automática se cargan en el momento de una llamada de función.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.