Comment Vim peut-il m'aider à me souvenir des virgules de fin dans les fichiers BibTeX?

11

J'édite pas mal de fichiers BibTeX, et j'oublie régulièrement les virgules de fin:

Par exemple:

@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}
 }

Vous verrez que j'ai oublié d'ajouter la virgule après keywords = {about}, ce qui signifie que je dois passer du temps à déboguer. Y a-t-il un moyen pour Vim de me rappeler? Au fait, j'ai le plugin bib_autocomp.vim ...

Kristian Nordestgaard
la source
Pas que je sache, mais vous pouvez essayer quelque chose comme ça pour le corriger: :%s/[^ ,]\zs\ze\n\s*[^ }]/,/.
Sato Katsura du

Réponses:

6

Solution rapide et sale:

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

Vous pouvez également créer une syntaxe spéciale pour les fichiers BibTeX en utilisant le même modèle.

Quelques explications sur l'expression régulière utilisée:

  1. ^\s\+ recherche des mots clés en retrait.
  2. \ze arrête la correspondance du motif de sorte que la ligne suivante ne soit pas marquée.
  3. ,\@<!\n recherche les lignes ne se terminant pas par une virgule.
  4. \n\s\+\w garantit qu'il y a une nouvelle entrée après la numérisation en cours.

Le même modèle peut être utilisé pour sauter entre des lignes erronées en utilisant vimgrepcomme suit:

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

Si la fenêtre de correction rapide ne s'ouvre pas automatiquement, elle peut être ouverte à l'aide de :copen. Et :cnextet :cpreviouspeut être utilisé pour sauter entre les erreurs.

Vitor
la source
C'est bon! Puis-je faire en quelque sorte passer à l'erreur suivante lorsque j'appuie sur n?
Kristian Nordestgaard
J'ai mis à jour la réponse pour inclure ce que vous avez demandé. Voyez si cela fonctionne pour vous.
Vitor du
0

Une possibilité consiste à définir un .vimrcraccourci pour ajouter les éléments manquants,

Exemple:

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

et utiliser \qavant de quitter ou lors du débogage.

JJoao
la source
Vous ne travaillez pas pour moi? Je comprends E10: \ should be followed by /, ? or & 24,1 60%, mais je me trompe peut-être?
Kristian Nordestgaard du
@KristianNordestgaard, .vimrcnous devons supprimer le ":" initial. Veuillez essayermap \q :%s/\v([}"])(\s*\n\s*\S+\s*\=)/\1,\2/e<CR><CR>
JJoao