편집 후 수정된 타임스탬프 유지

편집 후 수정된 타임스탬프 유지

특정 폴더에 있는 파일의 경우 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)?

다행스럽게도 이 문제는 쉽게 고칠 수 있었습니다. 타임스탬프를 복원한 후 파일을 다시 로드하기 위해 원래 함수에 "edit" 명령을 추가했기 때문에 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>

노트:date이 기능은 , stat및 의 GNU 버전에 따라 다릅니다 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

관련 정보