Найти тему
Блокнот математика

Рубрика "Секреты Вим". Автообновление даты последней правки

Привет, коллеги. Часто бывает, что в файле записаны дата и время последнего обновления файла. Конечно, система сама запоминает время обращения к файлу, но это не слишком надежно. Лучше записать эту информацию в файл. А еще лучше, если бы Вим делал это за нас.

А как бы сделать так, чтобы дата сама обновлялась... (Вообще же, именно такое - вандализм, и мы не одобряем! А в Виме - одобряем всецелейше!)
А как бы сделать так, чтобы дата сама обновлялась... (Вообще же, именно такое - вандализм, и мы не одобряем! А в Виме - одобряем всецелейше!)

А в Виме всё для этого есть. Автокоманды, срабатывающие тогда, когда происходит событие. Глобальная замена. Функции для работы с датой и временем.

Вот короткое решение:

km|%s/^\s*!\s*Last modified:\s*\zs.*/\=strftime("%c")/| normal m

Эта команда обновит дату/время в файле. Вставим это в определение автокоманды:

autocmd BufWritePre *.f90 km|%s/^\s*!\s*Last modified:\s*\zs.*/\=strftime("%c")/| normal m

Давайте разберем, что это значит и как работает.

Автокоманды срабатывают на события, в данном случае мы хотим среагировать на запись файла. Причём нам надо сначала внести изменения, а потом уж пусть сохраняется. Для этого предусмотрено событие BufWritePre, которое наступает перед фактической записью буфера в файл (но когда команда на запись уже поступила).

Автокоманды срабатывают не для всех файлов, а только для указанных. Можно указать и все (*), но мы сужаем выбор. В данном случае - только фортран.

Сама команда составная, отдельные части разделены "палкой" |. Их (частей) три: km, команда замены %s/^\s*!Last modified:\s*\zs.*/\=strftime("%c")/ и возврат на метку.

Давайте обсудим сначала работу с метками. Мы запоминаем позицию курсора, положив закладку-метку. В нормальном режиме это делается командой m, а из командной строки есть команды :mark или :k. Вот последнюю мы и применили.

Метки помечаются буквами латинского алфавита, мы выбрали m, но это на ваш вкус. Я часто запоминаю текущую позицию командой mm, поэтому под буквой m ничего долгохранящегося нет.

В конце мы возвращаемся на позицию, выполнив в нормальном режиме (доступ к нему через normal) команду `m.

Теперь самое сложное: команда замены. Мы ищем по всему файлу (то может быть и долго, и небезопасно в общем случае) фразу "!Last modified:" от начала строки. Допускаются пробелы перед фразой, после символа комментария (восклицательный знак) и после. Далее начинается совпадение, которое и подлежит замене. И это все до конца строки.

Выражение замены вычисляемое, о чём говорит символ \= в начале. То есть текст будет заменен на результат вычисления выражения. А выражение состоит из одой функции strftime("%c"), которая возвращает дату и время в системном формате. Можно дать другие параметры, чтоб получить, например, дату и время без русских букв: они не всегда хорошо выдерживают перекодировки. Например, strftime("%H:%m %d.%m.%y")

Можно таким же образом обработать событие BufWritePost, среагировав на факт записи файла. Это может быть полезно, например, для фиксации изменений в git.

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022