2011-05-12 10 views
6

Utilizo el mismo vimrc en muchas máquinas, algunas de las cuales tienen fugitive.vim instalado y otras no. Me gusta incluir fugitive#statusline() en mi línea de estado, pero en las máquinas que no tienen el complemento instalado esto genera un error.Vim: utilice condicionalmente la función fugitive # statusline en vimrc

¿Hay alguna forma de verificar la existencia de esta función antes de llamar al set statusline? He intentado usar exists y, pero no funciona por alguna razón (orden de carga?)

if exists("*fugitive#statusline") 
    set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff) 
endif 

También he intentado silenciar el error anteponiendo el comando con silent! pero eso no parece trabajo tampoco

Respuesta

1

¿Podría intentar comprobar la variable cargada del complemento fugitivo?

if exists('g:loaded_fugitive') 
    set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff) 
endif 

aunque si la existencia de la línea de estado # fugitivo no está funcionando esto podría no ser tan eficaz!

+0

Esto no funciona. Lo intenté, pero la variable 'g: loaded_fugitive' está vacía o no existe en el momento en que se ejecuta' vimrc'. – Christopher

9

Éste sería un atajo:

set statusline+=%{exists('g:loaded_fugitive')?fugitive#statusline():''} 
+0

Esto no funciona. Lo intenté, pero la variable 'g: loaded_fugitive' está vacía o no existe en el momento en que se ejecuta' vimrc'. – Christopher

+0

@Christopher: compruebe su instalación 'vim-fugitive', porque' g: loaded_fugitive' se define en 'fugitive.vim', y este tipo de interpolación se realiza cada vez que se evalúa la línea de estado, no solo el tiempo' vimrc' es ejecutado. – tungd

+0

@tungd No hay ninguna razón para que 'g: loaded_fugitive' se cargue * antes de * vimrc a menos que se active manualmente la carga de alguna manera. – ZyX

4

Creo que he descubierto cómo lograr esto. La comprobación de la existencia de fugitive#statusline() debe ocurrir después de se cargan los complementos. Hasta entonces, no se cargan variables o funciones relacionadas con fugitivos.

Insertar este código en el camino $VIMRUNTIME/after/plugin:

" $VIMRUNTIME/after/plugin/fugitive-statusline.vim 
if has("statusline") && exists('*fugitive#statusline') 
    " git fugitive statusline 
    set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P 

    " show statusline always 
    set laststatus=2 

    " turn off ruler 
    set noruler 
endif 
+0

Explique. Los archivos en autocarga/se cargan automáticamente en exactamente un caso: cuando alguien intenta usar una función o variable indefinida. Cuando forzamos la carga, las funciones y variables que pueden haber desencadenado la carga automática se definen de forma efectiva eliminando las razones para cargar archivos automáticamente por segunda vez. No es un directorio de complementos que se obtendrá después de vimrc, no importa si el archivo ya está o no en su origen o en otro directorio como este. – ZyX

+0

F * cking fugitive plugin definió esta función en 'plugin/fugitive.vim' y no en' autoload/fugitive.vim' donde se supone que debe ubicarse (en función del nombre de la función) lo que significa que mi solución no funciona * (todavía no activa la ejecución fuera de orden: no está activando ninguna carrera) y tampoco lo hace la de Peter Rincker. Si la función se definió en 'autoload /', se aplica un comentario anterior y la respuesta de @Peter Rincker resulta ser buena. Todavía no hay forma de que cargar 'autoload/fugitive.vim' cause problemas, pero simplemente no existe. – ZyX

+0

^^^ Duplicando mis dos comentarios a mi respuesta (se eliminó) ya que no estoy seguro de si puede ver los comentarios de la respuesta eliminada. Para seguir una conversación: "¿Deberíamos realmente estar subvirtiendo el orden de procesamiento, pero ejecutando autocarga/fugitivo.vim fuera de servicio? Esto podría tener consecuencias no deseadas. - Christopher "es el comentario al que responde mi comentario. Mi respuesta fue cargar 'autoload/fugitive.vim' con': runtime' y luego verificar la existencia de la función. – ZyX

6

Como fugitivo no define fugitive#statusline en un directorio autoload que lamentablemente no pueden ser inhalados técnica de uso silent! call/exists (Gracias @Christopher). Sin embargo, hay algunas alternativas:

  • Ponga una rama ternaria en su opción 'statusline' como se sugirió @tungd.
  • Establezca 'statusline' en un archivo after/plugin como @Christopher sugiere. Esto resuelve el problema, pero significa que su línea de estado se define en un lugar poco probable, por lo que probablemente sería mejor poner un buen comentario en su archivo ~/.vimrc.
  • Simplemente defina la función en su archivo ~/.vimrc.

Ejemplo:

if !exists('*fugitive#statusline') 
    function! fugitive#statusline() 
     return '' 
    endfunction 
endif 
  • Otra opción es utilizar un evento Fugitiveautocmd que define fugitivo. Tenga en cuenta que esto solo se activará cuando Fugitive detecte un directorio de git.

poner algo como esto en su archivo ~/.vimrc:

augroup fugitive_status 
    autocmd! 
    autocmd user Fugitive set statusline=%<\ %f\ %{fugitive#statusline()} ... 
augroup END 

Personalmente creo que la solución @tungd es el más simple. Sin embargo, solo definir una función ficticia sería mi próxima opción. Fugitive lo anulará si Fugitive está instalado.La mejor parte es que esto mantiene su opción 'statusline' ordenada y limpia.

+0

La función ficticia debe contener 'return ''' Creo. De lo contrario, devuelve el número '0' que se mostrará. – ZyX

+0

@ZyX Gracias, buena captura. He agregado el 'return '''. –

Cuestiones relacionadas