¿Cómo puede ayudarme Vim a recordar las comas finales en los archivos BibTeX?

11

Edito bastantes archivos BibTeX, y regularmente olvido las comas finales:

Por ejemplo:

@Book{cooke2015british,
 author = {Cooke, Lez},
 title = {British Television Drama},
 publisher = {Palgrave on behalf of the British Film Institute},
 year = {2015},
 keywords = {about}
 address = {London},
 isbn = {978-1844576234}
 }

Verá que olvidé agregar la coma después keywords = {about}, lo que significa que tengo que pasar tiempo depurando. ¿Hay alguna forma en que Vim pueda hacerme recordar? Por cierto, tengo el complemento bib_autocomp.vim ...

Kristian Nordestgaard
fuente
No que yo sepa, pero se puede intentar algo como esto para solucionarlo: :%s/[^ ,]\zs\ze\n\s*[^ }]/,/.
Sato Katsura

Respuestas:

6

Solución rápida y sucia:

:match Error /^\s\+.*,\@<!\ze\n\s\+\w/

También puede crear una sintaxis especial para archivos BibTeX utilizando el mismo patrón.

Algunas explicaciones sobre la expresión regular utilizada:

  1. ^\s\+ busca palabras clave sangradas.
  2. \ze detiene la coincidencia de patrones de modo que la siguiente línea no esté marcada.
  3. ,\@<!\n busca líneas que no terminen con una coma.
  4. \n\s\+\w garantiza que haya una nueva entrada después del escaneo actual.

Se puede usar el mismo patrón para saltar entre líneas erróneas usando vimgreplo siguiente:

:vimgrep /^\s\+.*,\@<!\ze\n\s\+\w/ %

Si la ventana de revisión rápida no se abre automáticamente, se puede abrir con :copen. Y :cnexty :cpreviousse puede utilizar para saltar entre los errores.

Vitor
fuente
¡Esto es bueno! ¿De alguna manera puedo hacer que salte al siguiente error cuando presiono n?
Kristian Nordestgaard
He actualizado la respuesta para incluir lo que pediste. Mira si te funciona.
Vitor
0

Una posibilidad es definir un .vimrcatajo para agregar lo que falta,

Ejemplo:

:map \q  :%s/\v([}"])(\s*\n\s*\S+\s*\=)/\1,\2/<CR>

y usar \qantes de salir o al depurar.

JJoao
fuente
¿No me funciona? ¿Entiendo E10: \ should be followed by /, ? or & 24,1 60%, pero tal vez lo estoy haciendo mal?
Kristian Nordestgaard
@KristianNordestgaard, en .vimrctenemos que eliminar ":" inicial. Por favor, intentemap \q :%s/\v([}"])(\s*\n\s*\S+\s*\=)/\1,\2/e<CR><CR>
JJoao