Câu trả lời của Sato sẽ đúng trên một dẫn xuất Unix tiêu chuẩn, ctime
thường bị nhầm với thời gian tạo nhưng thực sự là thời gian thay đổi, và "bảo tồn" nó không thực sự có ý nghĩa. Tuy nhiên, tôi đã hỏi người đăng đang sử dụng hệ điều hành nào vì Mac OS X duy trì thời gian tạo riêng biệt là ngày và giờ tạo thực tế và không được cập nhật bằng cách sửa đổi tệp tại chỗ hoặc thay đổi chế độ của tệp hoặc bất cứ điều gì tương tự trong đó làm cập nhật ctime
.
Bạn có thể thấy thời gian tạo bằng cách thực hiện Nhận thông tin trên một tệp trong Finder hoặc GetFileInfo <file>
từ một dòng lệnh ( GetFileInfo
yêu cầu các công cụ dành cho nhà phát triển được cài đặt). Thời gian có thể được sửa đổi bằng cách sử dụng SetFile -d <datetime> <file>
(cũng yêu cầu các công cụ dành cho nhà phát triển).
Vì vậy, có vẻ hợp lý (với tôi, không biết về Bram :-)) để yêu cầu vim duy trì thời gian tạo trên Mac OS X, bằng cách sao chép thời gian tạo từ tệp gốc sang tệp mới, nhưng rõ ràng là không ', và liếc qua các nguồn vim, tôi không thấy bất cứ nơi nào nó làm như vậy. Vì vậy, thật không may, nó xuất hiện câu trả lời cho câu hỏi của người đăng là "Hiện tại không thể." Vì Mac OS X (với các công cụ dành cho nhà phát triển) cho phép nhận và thiết lập thời gian tạo từ dòng lệnh, nên có thể kết hợp một tập lệnh vim thực hiện điều đó, mặc dù điều đó (hiện tại) vượt quá khả năng kịch bản vim của tôi.
Biên tập
Tôi quyết định chơi xung quanh với kịch bản một cái gì đó và thực sự làm cho nó hoạt động!
Thêm phần sau vào .vimrc của bạn:
autocmd BufReadPre * call SaveFileCreateTime()
autocmd BufWritePost * call RestoreFileCreateTime()
function! SaveFileCreateTime()
let l:path = expand('%:p')
if l:path != ''
let b:created = system("GetFileInfo -d " . shellescape(bufname("%")))
endif
endfunction
function! RestoreFileCreateTime()
if exists('b:created')
execute system(
\ 'SetFile -d ' .
\ shellescape(b:created) .
\ ' ' .
\ shellescape(bufname("%")))
endif
endfunction
Điều đó đặt các lệnh tự động chạy trước khi đọc tệp (để chỉnh sửa trong bộ đệm, không phải cho những thứ như :read
) và sau khi nó được viết. Các cuộc gọi đầu tiên SaveFileCreateTime
sử dụng GetFileInfo -d
để lấy thời gian tạo tệp và lưu trữ nó trong biến cục bộ đệm b:created
. Sau khi một tập tin được viết, RestoreFileCreateTime
được gọi. Nếu b:created
tồn tại, nó được sử dụng trong một system
lệnh để sử dụng SetFile -d
để đặt thời gian.
Đây là một ví dụ:
$ echo hello >file.txt
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:04.000000000 -0800
11/07/2015 11:44:04
$ vim file.txt
a earth<esc>:wq
$ cat file.txt
hello earth
$ stat -c%z file.txt;GetFileInfo -d file.txt
2015-11-07 11:44:24.000000000 -0800
11/07/2015 11:44:04
Bạn có thể thấy thời gian thay đổi inode (như được hiển thị bởi stat
) đã thay đổi, nhưng thời gian tạo tệp (như được hiển thị bởi GetFileInfo
) thì không. Sự thành công!
Như đã lưu ý ở trên, điều này đòi hỏi các công cụ dành cho nhà phát triển phải được cài đặt để có được GetFileInfo và SetFile. Ngoài ra, đây là kịch bản thực sự đầu tiên của tôi, vì vậy hãy thoải mái chỉ ra tất cả các lỗi ghê tởm tôi đã mắc phải!