Как Vim может помочь мне запомнить запятые в файлах BibTeX?

11

Я редактирую довольно много файлов BibTeX и регулярно забываю запятые:

Например:

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

Вы увидите, что я забыл добавить запятую после keywords = {about}, что будет означать, что мне придется тратить время на отладку. Есть ли способ, которым Вим может заставить меня вспомнить? Кстати, у меня есть плагин bib_autocomp.vim ...

Кристиан Нордестгаард
источник
Не то, чтобы я знал, но вы можете попробовать что-то вроде этого, чтобы исправить это :%s/[^ ,]\zs\ze\n\s*[^ }]/,/.
Сато Кацура

Ответы:

6

Быстрое и грязное решение:

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

Вы также можете создать специальный синтаксис для файлов BibTeX, используя тот же шаблон.

Некоторые пояснения по используемому регулярному выражению:

  1. ^\s\+ ищет ключевые слова с отступом.
  2. \ze останавливает сопоставление с образцом, так что следующая строка не помечается.
  3. ,\@<!\n ищет строки, не заканчивающиеся запятой.
  4. \n\s\+\w гарантирует, что есть новая запись после текущего сканирования.

Тот же шаблон можно использовать для перехода между ошибочными строками, используя vimgrepследующее:

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

Если окно быстрого исправления не открывается автоматически, его можно открыть с помощью :copen. А :cnextи :cpreviousможет быть использовано для перехода между ошибками.

Витор
источник
Это хорошо! Можно ли как-нибудь заставить его перейти к следующей ошибке при нажатии n?
Кристиан Нордестгаард
Я обновил ответ, чтобы включить то, что вы просили. Посмотрите, работает ли это для вас.
Витор
0

Одной из возможностей является определение .vimrcярлыка для добавления отсутствующего,

Пример:

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

и использовать \qперед отъездом или при отладке.

JJoao
источник
Не работает для меня? Я понимаю E10: \ should be followed by /, ? or & 24,1 60%, но, возможно, я делаю это неправильно?
Кристиан Нордестгаард
@KristianNordestgaard, .vimrcмы должны удалить начальное ":". Пожалуйста, попробуйтеmap \q :%s/\v([}"])(\s*\n\s*\S+\s*\=)/\1,\2/e<CR><CR>
JJoao