Всем привет! Сегодня мы научимся использовать автокоманды для того, чтобы при создании нового файла получать не пустышку, а уже что-то.
Ведь всякий почти файл в ТеХ должен содержать кучу команд:
\documentclass{article}
\inputencoding{utf8}
\usepackage[english,russian]{babel}
\begin{document}
\end{document}
А файл на Перле:
#!/usr/bin/perl
use warnings;
use strict;
use 5.10.0;
На Фортране, Питоне, С++, Яве, да на чем угодно.
Насоздавать таких шаблонов несложно, выберите для них местечко. Можно в каталоге Вим (переменная окружения $VIMRUNTIME), можно просто в домашнем каталоге: создайте папку templates и туда сложите файлы вида язык.template.
Автокоманду мы уже делали:
:autocmd BufNewFile *.tex 0r $VIMHOME/templates/tex.template
Эта автокоманда срабатывает на событие BufNewFile (создание нового файла), с заданным шаблоном имени (у нас расширение .tex должно быть), и читает после строки номер 0 (то есть просто наверх, да файл же все равно пуст) указанный файл.
Такую автокоманду надо создать на каждый тип файла: на каждый язык.
Можно создать одну автокоманду:
:autocmd BufNewFile * 0r $VIMHOME/templates/%:e.template
Она срабатывает на все файлы (*) и ищет шаблон, "откусывая" от имени текущего файла (%) расширение (:e). Оно станет именем файла-шаблона, а уж его расширение .template мы добавим. Если нету файла-шаблона, то появится пустой файл, как обычно.
Если вы читаете эту рубрику, друзья, напишите в комментариях что-нибудь: мне будет приятно.
Кстати, модификаторы имен файлов — штуки малоизвестные и небесполезные. Они ставятся после % (текущий файл), решетки (можно с номером — прочие файлы из списка открытых), выражений <cfile>, <afile>, (имя файла под курсором и имя файла, на который сработала автокоманда) и кое-чего еще. В их числе:
- :p — полный путь, раскрывается также и символ ~ (домашний каталог)
- :8 — имя в DOS-формате 8.3 (вам точно это надо??)
- :~ — имя относительно домашего каталога
- :. — то же относительно текущего
- :h — откусывает "хвост", то есть последний элемент пути. По сути, оставляет каталог, отцепляя имя файла. Можно повторить, отцепляя каталоги по одному
- :t — наоборот, отделяет путь, оставляя чистое имя файла
- :r — удаляет расширение, если есть "тело" имени, то если файл не начинается с точки. Перед этим модификатором разумно поставить :t, то есть :t:r
- :e — удаляет тело имени, оставляя расширение.
- :s?регэксп?выражение? — аналог оператора замены Вим, заменяет в файле совпадение с регулярным выражением заданным текстом. Потом можно опять применять модификаторы. Так можно заменить расширение, например, или пробелы на _. Вместо знака вопроса можно другой разделитель, но он не должен входить ни в выражение поиска, ни в выражение замены.
- :gs тоже заменяет, но все вхождения. Глобальная замена.
- :S — экранирует спецсимволы в именах файла, например, пробелы. Без этого нельзя передавать файл командам bash. Должен стоять последним.
Внизу примеры из справки Вим.
Это позволяет делать сложные вещи, например, разбирать по имени файла, какой шаблон нужен. Ведь в ТеХе может быть статья (с "шапкой" как выше), глава диссертации (а вот тут "шапка" не нужна), презентация в Beamer ("шапка" другая) и т.п. В фортране может быть программа, а может быть модуль. И так далее.
Если разным типам разные расширения, как в перле (.pl, .pm), то все понятно, а если нет? Можно придумать свою систему. У меня, например, все презентации имеют суффикс .slides.tex. Так что автокоманда
:autocmd BufNewFile * 0r $VIMHOME/templates/%:e:e.template
успешно находит файл-шаблон slides.tex.template, а для других файлов работает так же, как и предыдущая (одиночное расширение находится один раз!).
Не забываем, что автокоманды лучше собирать в группы и первым делом удалять уже существующие автокоманды из группы во избежание дубликатов:
augroup Templates
au!
...
augroup END
Удачи, коллеги!
Приложение. Примеры модификации имени файла.
Из справки Вим. Пусть текущий файл src/version.c, а текущий каталог /home/mool/vim. Тогда:
:p /home/mool/vim/src/version.c (полный путь)
:p:. src/version.c (полный путь приведен к пути относительно текущего каталога)
:p:~ ~/vim/src/version.c (полный путь приведен к пути относительно домашнего каталога)
:h src (отцепили имя, оставив путь)
:p:h /home/mool/vim/src (отцепили имя от полного пути)
:p:h:h /home/mool/vim (отцепили еще один каталог)
:t version.c (чистое имя, отцепили путь)
:p:t version.c (оно же. Отцепили полный путь)
:r src/version (без расширения)
:p:r /home/mool/vim/src/version (полный путь, но без расширения)
:t:r version (чисто имя, без расширения и пути)
:e c (расширение)
:s?version?main? src/main.c (заменили имя)
:s?version?main?:p /home/mool/vim/src/main.c (заменили имя и сделали полный путь)
:p:gs?/?\\? \home\mool\vim\src\version.c (в полном пути заменили разделители каталогов на DOS)
Вот еще примеры, файл с двойным расширением: src/version.c.gz:
:p /home/mool/vim/src/version.c.gz
:e gz
:e:e c.gz
:e:e:e c.gz
:e:e:r c
:r src/version.c
:r:e c
:r:r src/version
:r:r:r src/version