Сохранять измененную временную метку после редактирования

Сохранять измененную временную метку после редактирования

Для файлов в определенной папке я бы хотел, чтобы vim вообще никогда не трогал временную метку «изменено».

Фон - это то, что я используюБлоксомдля ведения блога, который использует простые текстовые файлы в ~/bloxsomкачестве источника всех статей. Дата статьи (и, следовательно, порядок появления) основаны на дате изменения текстового файла. Я не хочу, чтобы статья всплывала, как будто этоновыйвсякий раз, когда я просто исправляю опечатку. (Я делаю этомного из них... :D)

Пока что vim меняет временную метку, а исходная метка теряется навсегда. Это нормально, и я хочу сохранить ее так для большинства файлов в системе. Но я не хочу этого для файлов блога — я всегда могу получить touchфайл, если мне это нужно.

Есть идеи, как настроить vim на такое же поведение?

решение1

Я не думаю, что в vim есть такая функция. Альтернативой может быть изменение копии и установка соответствующей временной метки, например:

cp -p post temp
vim temp
touch -r post temp
cp -p temp post

Или даже лучше:

touch -r post timestamp
vim post
touch -r timestamp post

решение2

Если вам хочется развлечься:

file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file"

Замените путь на фактический путь к файлу.

решение3

Я нашел отличное решение на эта веб-страница, которая создает функцию vim для сохранения текущего файла с сохранением существующего времени модификации и привязывает эту функцию к F4функциональной клавише:

Однако я обнаружил, что исходная функция содержит небольшую ошибку, вызывающую следующее предупреждение, если F4она используется дважды в одном и том же файле, поскольку vim путается при изменении времени модификации:

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

К счастью, это легко исправить: я добавил команду «редактировать» к исходной функции, чтобы перезагрузить файл после восстановления временной метки, поэтому vim знает, какое время изменения следует ожидать от файла.

Вот измененная функция vim с исправленной ошибкой, которую можно добавить в ~/.vimrc:

function! WriteSmall()
    let mtime = system("stat -c %.Y ".shellescape(expand('%:p')))
    write
    call system("touch --date='@".mtime."' ".shellescape(expand('%:p')))
    edit
endfunction
map <F4> :call WriteSmall()<CR>

Примечание:Эта функция использует версии GNU date, statи touch.

решение4

Попробуйте эту bashфункцию (на основеОтвет Шау Шака)

vi-preserve-time () {
    for file in "$@"; do
        local mtime=$(stat -c %y "$file")
        vi "$file"
        touch -d "$mtime" "$file"
    done
}

Теперь мы можем редактировать файл и сохранять измененное время, используя это

vi-preserve-time file1.txt file2.txt

Связанный контент