Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Вставка шаблонных конструкций

Всем привет, давайте применим полученные знания для облегчения работы с библиографией: bib-файлами. Нам пригодятся автокоманды, привязки и режим классического выделения текста, который вот для таких целей и полезен. Итак, биб-файлы содержат записи вида @ARTICLE{ident,
author = {Einstein, A. and others},
...
} Есть разные типы записей: @article, @book, @inproceedings и другие. Наиболее часто, пожалуй, нужна первая: для статей. Можно создать файл-шаблон и автокоманду, чтобы подгружала его всякий раз, когда мы создаем новый bib-файл. Но нам нужен не каркас, а возможность попроще создавать новые записи. Повесить вставку нужного текста на клавишу не проблема, но зачем нам тратить клавишу на специфическую задачу, которая вне биб-файлов не нужна? Поэтому эту привязку мы тоже возложим на автокоманду и сделаем ее локальной для буфера: au BufNewFile *.bib map <buffer> Q i<CR>@ARTICLE{**ID**,<CR>author = {**AUTHOR**},<CR>}<ESC>?@<CR> Здесь только часть вставляемоготекста. Автокоманда срабатывает

Всем привет, давайте применим полученные знания для облегчения работы с библиографией: bib-файлами. Нам пригодятся автокоманды, привязки и режим классического выделения текста, который вот для таких целей и полезен.

Итак, биб-файлы содержат записи вида

@ARTICLE{ident,
author = {Einstein, A. and others},
...
}

Есть разные типы записей: @article, @book, @inproceedings и другие. Наиболее часто, пожалуй, нужна первая: для статей.

Можно создать файл-шаблон и автокоманду, чтобы подгружала его всякий раз, когда мы создаем новый bib-файл. Но нам нужен не каркас, а возможность попроще создавать новые записи.

Повесить вставку нужного текста на клавишу не проблема, но зачем нам тратить клавишу на специфическую задачу, которая вне биб-файлов не нужна? Поэтому эту привязку мы тоже возложим на автокоманду и сделаем ее локальной для буфера:

au BufNewFile *.bib map <buffer> Q i<CR>@ARTICLE{**ID**,<CR>author = {**AUTHOR**},<CR>}<ESC>?@<CR>

Здесь только часть вставляемоготекста. Автокоманда срабатывает при создании нового файла с расширение .bib и навешивает на клавишу Q вставку некоторого текста. Обратите внимание на параметр <buffer>, который делает команду локальной: вне этого файла ваши привязки не изменятся. Еще обратите внимание на вставку концов строки <CR> и подсказки: что вставлять. Подсказки имеют вид **AUTHOR**. Зачем они? Сейчас пригодятся. Можете их и убрать, никаких проблем. Наконец, обратите внимание на поиск символа @ вверх (?@): это переход на начало новой записи.

Это уже сильно упростит нам работу: нажатие Q вставит нам шаблон записи. Но нам придется перемещать курсор на нужные места и что-то туда впечатывать. Давайте еще немного упростим работу.

Сделаем еще одну привязку:

au BufNewFile *.bib map <buffer> n /\*\*\w\{-1,}\*\*<CR>vf*f*f*<C-G>

Мы переопределили команду n (обычно она повторяет поиск вниз по тексту): теперь она ищет подсказку. Обратите внимание на ленивый квантифиатор \{-1,}: это "один или более", но как можно меньше. В принципе, здесь бы подошел и жадный, так как символ * в класс \w не входит. Но так лучше. Если у вас в подсказке может быть что-то еще, вы можете заменить \w на . без всяких проблем.

Найдя подсказку и встав на ее начало (первая *), команда выделяет ее посредством v и движения по строке к данному символу: f*. Три раза, то есть как раз на последнюю *. И, наконец, преобразует выделение в классическое: командой <C-G>.

Классически выделенный текст замещается первым же введенным символом: этого мы и ожидаем. То есть, нажатие n выделит нам подсказку, которую тут же можно заменить содержательным текстом. Это уже не подсказка, а поле для заполнения.

Аналогично можно и N переопределить для поиска вверх по тексту.

Наконец, можно определить Q после n и добавить уже новую команду n в конец выражения для Q, чтобы сразу и выделить первое поле. В итоге получаем следующую группу:

augroup bib
au!
au BufNewFile *.bib map <buffer> n /\*\*\w\{-1,}\*\*<CR>vf*f*f*<C-G>
au BufNewFile *.bib map <buffer> N ?\*\*\w\{-1,}\*\*<CR>vf*f*f*<C-G>
au BufNewFile *.bib map <buffer> Q i<CR>@ARTICLE{**ID**,<CR>author = {**AUTHOR**},<CR>title={**TITLE**},<CR>}<ESC>?@<CR>n
au BufNewFile *.bib normal Q
augroup END

Группировка позволяет легче управлять командами. Первая команда au! удаляет все автокоманды в группе во избежание дубликатов. Далее определены команды поиска и команда вставки шаблона.

Я добавил вызов новой команды Q при открытии файла. Вместо загрузки шаблона: теперь сразу в новом файле появится шаблон записи с выделенным первым полем.

Внизу файл bib.vim, который можно запустить с помощью :source или перенести эту группу в .vimrc. Вверху свежесозданный test.bib, в котором выставлен шаблон и выделено первое поле. Подсветка остальных полей - приятный бонус.
Внизу файл bib.vim, который можно запустить с помощью :source или перенести эту группу в .vimrc. Вверху свежесозданный test.bib, в котором выставлен шаблон и выделено первое поле. Подсветка остальных полей - приятный бонус.

Разумеется, можно добавить полей (year= и т.п.), а также сделать еще привязок для @BOOK и других типов. Можно сделать меню. Можно по Q переходить предварительно в конец файла... Да много чего можно, главное - начать.

Вставьте этот блок в .vimrc и работа с библиографией станет куда проще!

Удачи, коллеги!

Оглавление рубрики

Путеводитель по каналу