
Для файлов в определенной папке я бы хотел, чтобы 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