2012-09-18 6 views
6

Frecuentemente abro conjuntos completos de archivos a la vez desde dentro de MacVim. Para ello, me suelen utilizar los comandos:El resaltado de sintaxis no está activado en vim al abrir varios archivos usando argdo

args *PATTERN* 
argdo tabedit 

Esto carga todos los archivos en el directorio de trabajo que coinciden con el patrón en la lista de argumentos, y luego todos ellos se abre en pestañas separadas. El resaltado de sintaxis no se activa automáticamente cuando hago esto y tengo que configurarlo manualmente. ¿Cómo puedo arreglar esto?

Respuesta

6

Ya tuve posted a workaround para :bufdo en una pregunta similar; aquí hay una versión extendida que maneja su caso de uso también. Trabajando en todo el ajuste automático de 'eventignore' es bastante complicado, por lo tanto se ha comentado ampliamente:

" Enable syntax highlighting when buffers are displayed in a window through 
" :argdo and :bufdo, which disable the Syntax autocmd event to speed up 
" processing. 
augroup EnableSyntaxHighlighting 
    " Filetype processing does happen, so we can detect a buffer initially 
    " loaded during :argdo/:bufdo through a set filetype, but missing 
    " b:current_syntax. Also don't do this when the user explicitly turned off 
    " syntax highlighting via :syntax off. 
    " The following autocmd is triggered twice: 
    " 1. During the :...do iteration, where it is inactive, because 
    " 'eventignore' includes "Syntax". This speeds up the iteration itself. 
    " 2. After the iteration, when the user re-enters a buffer/window that was 
    " loaded during the iteration. Here is becomes active and enables syntax 
    " highlighting. Since that is done buffer after buffer, the delay doesn't 
    " matter so much. 
    " Note: When the :...do command itself edits the window (e.g. :argdo 
    " tabedit), the BufWinEnter event won't fire and enable the syntax when the 
    " window is re-visited. We need to hook into WinEnter, too. Note that for 
    " :argdo split, each window only gets syntax highlighting as it is entered. 
    " Alternatively, we could directly activate the normally effectless :syntax 
    " enable through :set eventignore-=Syntax, but that would also cause the 
    " slowdown during the iteration Vim wants to avoid. 
    " Note: Must allow nesting of autocmds so that the :syntax enable triggers 
    " the ColorScheme event. Otherwise, some highlighting groups may not be 
    " restored properly. 
    autocmd! BufWinEnter,WinEnter * nested if exists('syntax_on') && ! exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') == -1 | syntax enable | endif 

    " The above does not handle reloading via :bufdo edit!, because the 
    " b:current_syntax variable is not cleared by that. During the :bufdo, 
    " 'eventignore' contains "Syntax", so this can be used to detect this 
    " situation when the file is re-read into the buffer. Due to the 
    " 'eventignore', an immediate :syntax enable is ignored, but by clearing 
    " b:current_syntax, the above handler will do this when the reloaded buffer 
    " is displayed in a window again. 
    autocmd! BufRead * if exists('syntax_on') && exists('b:current_syntax') && ! empty(&l:filetype) && index(split(&eventignore, ','), 'Syntax') != -1 | unlet! b:current_syntax | endif 
augroup END 
+0

¡Gracias! Este es el ganador porque hace exactamente lo que necesito. También aprecio la exhaustiva documentación de cómo funciona. –

+0

Genial; me alegro de poder ayudar. Sin la documentación completa, no podría recordarla y extenderla yo mismo. Siempre es bueno mejorar la propia configuración basada en preguntas de desbordamiento de pila. –

0

No estoy familiarizado con args o argdo pero si es necesario abrir los archivos que coinciden con un patrón en diferentes pestañas que puede usar algo como:

:next * 
:tab ball 

:next * abre todos los archivos Maching el patrón con resaltado de sintaxis correcta Sin embargo, :tab ball abre todos los archivos en la memoria, lo que puede ser un problema si tiene búferes que no necesita abrir en pestañas.

+0

Interesting-- este se abre todos los archivos con resaltado de sintaxis, que es lo que me gustaría. Pero abre todos los búferes cargados, que es un problema bastante grande.El punto de utilizar args y argdo es especificar un conjunto de archivos para abrir independientemente de lo que está actualmente cargado. Sin embargo, esta sigue siendo una respuesta decente. Creo que debería editarlo para dejar en claro que esto los abre con un resaltado de sintaxis completo, ya que de eso se trata la pregunta. –

2

argdo agrega Syntax a la configuración 'eventignore' (ver :h argdo). Esto significa que no tiene ningún resalte para esos archivos porque el evento de autocomando de sintaxis no se activa para ese búfer. Lo que hace que parezca que el 'filetype' no se está configurando. Esto no es verdad. Puede verificar haciendo :set ft?. Puede ejecutar :syntax on para volver a activar el resaltado de sintaxis. Pero esto no es realmente deseable y se siente kludgy.

Probablemente un mejor enfoque es desistir del uso de pestañas y en su lugar utilizar búferes y los comandos de búfer asociados. Los comandos de búfer relacionados con Arglist son: :next, :previous, :first y :last. Puede abrir archivos específicos con :b file.c o :sb file.c para abrir el búfer en una nueva división.

Me doy cuenta de que esta es una píldora difícil de tragar y ciertamente hay momentos en los que realmente puede querer cada buffer en su propia página de pestañas. Una vez que te fuerces a usar búferes más, encontrarás que la necesidad de pestañas es rara. Es posible que desee ver Drew Neil excelente Vimcast en How to use tabs. También recomiendo usar Tim Pope's unimpaired.vim para moverse por la lista de argumentos más fácilmente.

Si realmente debe tener cada uno en archivo en su propio uso pestaña :argdo tabe entonces usted probablemente debería seguir con una :syntax on o :tabdo doautocmd Syntax

Para obtener más ayuda, consulte:

:h :argdo 
:h arglist 
:h buffers 
:h :b 
:h :sb 
:h :next 
:h :tabdo 
:h :doa 
:h Syntax 
:h :syn-on 
+0

Gracias por el consejo Peter. Utilizo buffers la mayor parte del tiempo, pero a veces las pestañas están justo donde está. Es más fácil cambiar de un archivo a otro que con los almacenamientos intermedios cuando tienes buenos accesos directos para: tabp y: tabn. Incluso con algo así como unimpaired.vim, encuentro que el cambio de pestañas es superior porque tiene una buena visualización visual de los nombres de los búfers siempre en la pantalla. –

+0

Si las pestañas funcionan para usted, utilícelas, pero debo decir que cuando la cantidad de archivos comienza a escalar y luego hacer algo como '4gt' para obtener la pestaña adecuada parece ser un poco tonto. Entonces puede que te encuentres haciendo algo como 'set swb + = usetab' y comienza a usar': sb file'. Eventualmente, cuando obtienes 100 archivos, puede parecer inútil. Si alguna vez te encuentras aquí, te sugiero que deseches un buffer por ficha. Coloca 'set hidden' en tu archivo' vimrc', aprende la mayor cantidad de comandos de buffer que puedas, encuentra la alegría en los splits, apóyate en ctags/cscope y usa mayúsculas. –

5

Algo como esto debería funcionar :

:argdo set eventignore-=Syntax | tabedit 

que elimina Syntax desde el ajuste eventignore.

+0

Ya sabía que 'argdo' eliminaba el resaltado synatx pero TIL sobre' eventignore'. Gracias. – romainl

+0

Me gusta la simplicidad. Completé por completo la solución simple. Gracias por compartir. –

+0

Esto es bastante bueno pero no activa la sintaxis para el primer elemento en el arglist. Creo que es porque set eventignore- = La sintaxis no se ejecuta hasta que el comando argdo ya haya abierto ese búfer. Básicamente, esto repite tres pasos para cada elemento de arglist: (1) abrir el siguiente búfer en arglist (en la ventana actual); (2) set eventignore- = Sintaxis; (3) abra una nueva pestaña (con un nuevo buffer vacío). Luego, cuando se repite el ciclo, se abre el siguiente argumento en la lista en el búfer vacío. Un desafortunado efecto secundario es que terminas con un montón de buffers vacíos. –

Cuestiones relacionadas