Привет, коллеги. Часто бывает, что в файле записаны дата и время последнего обновления файла. Конечно, система сама запоминает время обращения к файлу, но это не слишком надежно. Лучше записать эту информацию в файл. А еще лучше, если бы Вим делал это за нас.
А в Виме всё для этого есть. Автокоманды, срабатывающие тогда, когда происходит событие. Глобальная замена. Функции для работы с датой и временем.
Вот короткое решение:
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.