Автокоманды в Vi и Vim: автоматически добавляем в файл заголовок
Метки: Linux | tips | vi | vim
Вторник, 31 марта 2009 г.
Просмотров: 9228
Подписаться на комментарии по RSS
Используя возмжность автоматического выполнения команд в Vi / Vim, вы можете указать определенные какие команды Vim будет выполнять автоматически в случае если произошло нужное событие: создан файл с определенным расширением, файл открыт или закрыт, и многое другое.
В данной статье, всего в три шага, мы используем функцию автокоманды для создания заголовка файла с именем файла, датой создания, датой последней модификации.
Синтаксис autocmd :
autocmd {event} {pattern} {cmd}
Events: Существует более 40 различных событий. Подробнее о них читайте в :help, здесь приведены просто некоторые примеры:
BufNewFile FileReadPre BufWritePre FileWritePre BufDelete BufWipeout BufNew BufEnter BufLeave
В данной статье мы рассматриваем такой пример: допустим вы программист на С и хотели бы, чтобы при создании файл с расширением .с автоматически в начало файла добавлялся заголовок с автором, именем файла и проче. Вы легко сделаете это, дочитав статью до конца. В конце мы получим следующий заголовок:
/* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : 1.c * Purpose : * Creation Date : 22-12-2008 * Last Modified : Mon 22 Dec 2008 10:36:49 PM PST * Created By : _._._._._._._._._._._._._._._._._._._._._.*/
Шаг 1: Создаем файл шаблона
Сохраните шаблон, выложенный ниже в текстовый файл c_header.txt. Обратите внимание, первой строкой идет ":insert", а в последней строке точка - ".":
$ cat c_header.txt :insert /* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : * Purpose : * Creation Date : * Last Modified : * Created By : _._._._._._._._._._._._._._._._._._._._._.*/ .
Шаг 2: Добавляем команды autocmd в ~/.vimrc
Добавьте следующие строки в файл ~/.vimrc. Пока оставим данные строки без пояснений и выясним их значение ниже в этой статье.
$ cat ~/.vimrc autocmd bufnewfile *.c so /home/jsmith/c_header.txt autocmd bufnewfile *.c exe "1," . 10 . "g/File Name :.*/s//File Name : " .expand("%") autocmd bufnewfile *.c exe "1," . 10 . "g/Creation Date :.*/s//Creation Date : " .strftime("%d-%m-%Y") autocmd Bufwritepre,filewritepre *.c execute "normal ma" autocmd Bufwritepre,filewritepre *.c exe "1," . 10 . "g/Last Modified :.*/s/Last Modified :.*/Last Modified : " .strftime("%c") autocmd bufwritepost,filewritepost *.c execute "normal `a"
Щаг 3: Создайте новый файл с расширением *.c
Теперь, если вы создаете новый файл с нужным расширением используя vim, в начало файла будет автоматически добавлен заголовок, определенный в шаге 1 и добавлены имя файла и дата создания.
$ vi myfile.c /* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : myfile.c * Purpose : * Creation Date : 20-12-2008 * Last Modified : * Created By : _._._._._._._._._._._._._._._._._._._._._.*/
После того как вы сохраните файл myfile.c, он будет автоматически обновлен в поле Last Modified.
$ vi myfile.c /* -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. * File Name : myfile.c * Purpose : * Creation Date : 20-12-2008 * Last Modified : Sat 20 Dec 2008 09:37:30 AM PST * Created By : _._._._._._._._._._._._._._._._._._._._._.*/
Пояснения по командам autocmd в ~/.vimrc
$ cat -n ~/.vimrc 1 autocmd bufnewfile *.c so /home/jsmith/c_header.txt 2 autocmd bufnewfile *.c exe "1," . 10 . "g/File Name :.*/s//File Name : " .expand("%") 3 autocmd bufnewfile *.c exe "1," . 10 . "g/Creation Date :.*/s//Creation Date : " .strftime("%d-%m-%Y") 4 autocmd Bufwritepre,filewritepre *.c execute "normal ma" 5 autocmd Bufwritepre,filewritepre *.c exe "1," . 10 . "g/Last Modified :.*/s/Last Modified :.*/Last Modified : " .strftime("%c") 6 autocmd bufwritepost,filewritepost *.c execute "normal `a"
- Строка 1 определяет где находиться файл шаблона. Она также указывает что данный шаблон используется для всех файлов с расширением *.c.
- Строка 2 ищет шаблон “File Name :” с первой строки по десятую. Если находит, то дописывает текущее имя файла.
- Строка 3 по аналогии с строкой 2 обновляет Creation Date.
- Строка 5 обновляет поле Last Modified текущей датой и временем когда вы сохраняете файл.
- Строки 4 & 6: когда вы сохраняете файл, курсор перемещается на поле “Last modified :” (потому что это последняя операция записи). Если вы хотите вернуть курсор назад на предыдущую позицию, вам необходимо добавить строки 4 и 6 в файл .vimrc.
- Строка 4 отмечает позицию курсора перед сохранением файла.
- Строка 6 возвращает позицию курсора на отмеченное в строке 4 место.
Полезные советы:
- Проверьте включена ли функция autocmd в Vi / Vim - Выполните :version в vi / vim. Если функция autocommand включена, отобразится +autocmd.
- Помощь по Autocommand - Выполните :help au из vi / vim.
Постовой
Делайте Бизнес с Орифлейм по новому. Теперь вы можете использовать все возможности интернета.
Лучшие шкафы купе на заказ в Москве. Купим продукцию в компании «АВ-Стиль» вы покупаете мебель от ведущих производителей по самым низким ценам.
Комментариев: 3
Ещё бы узнать, как переместиться внутрь функции main после автоматической вставки её заготовки, было бы вообще хорошо.
При попытке применить настройки получаю вот такую ошибку:
# source !$
source ../.vimrc
autocmd: команда не найдена
bash: ../.vimrc: строка 2: ошибка синтаксиса около неожиданной лексемы `('
bash: ../.vimrc: строка 2: `autocmd bufnewfile *.py exe "1," . 10 . "g/File Name :.*/s//File Name : " .expand("%")'
Подскажите, в чем проблема?
Спасибо! Всё работает. Единственная проблема: "с первой строки по десятую". Если в файле меньше 10 строк, то выдаётся ошибка "E16: Недопустимый диапазон" (например, это актуально для нового файла). Я решил проблему, добавив вместо 10 число строк заголовка (у меня это 7). Возможно, можно это как-то автоматизировать, но пока мне не требуется.