Giữ dấu thời gian tạo sau khi sửa đổi


8

Tôi muốn sửa đổi các tập tin vimmà không thay đổi tem thời gian tạo.

Các tài liệu dường như không đề cập bất cứ điều gì về khả năng đó.

Tôi muốn đạt được điều này mà không cần tắt tính năng trao đổi / khôi phục.

Một cách khác là lưu trữ thời gian ở đâu đó và sau đó ghi đè lên khi thoát ra, tôi đoán vậy.


2
Bạn đang dùng hệ điều hành nào? Một số HĐH 'không lưu trữ thời gian tạo, vì vậy nó có thể tạo ra sự khác biệt.
blm

Tôi đang dùng OS X 10.8.5.
1.61804

Câu trả lời:


2

Câu trả lời của Sato sẽ đúng trên một dẫn xuất Unix tiêu chuẩn, ctimethườ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 ( GetFileInfoyê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 SaveFileCreateTimesử 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:createdtồn tại, nó được sử dụng trong một systemlệ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!


Tập lệnh vim có phải là trình bao bọc hoặc thay đổi vimthời gian chạy bằng các công cụ mà tôi đã cài đặt btw để giữ ngày tạo không?
1.61804 7/11/2015

Nó sẽ là một số chức năng bạn đặt trong .vimrc của bạn. Tôi quyết định chơi xung quanh nó và thực sự có một cái gì đó hoạt động! Tôi sẽ chỉnh sửa câu trả lời của tôi để bao gồm điều đó.
blm

@ 1.61804 Ok, chỉnh sửa câu trả lời của tôi để bao gồm vimscript để lưu và khôi phục thời gian. Hãy cho tôi biết nếu nó làm việc cho bạn.
blm

Tôi đã thử nghiệm nó trong khi vimdiffing các tập tin thuộc sở hữu của root và người dùng. Càng xa càng tốt. Bạn nên đăng bài này trong wiki Vim Tips . Đó là một câu trả lời tuyệt vời, cảm ơn.
1.61804

Btw, statlệnh của bạn là dành cho Linux, tôi đoán vậy. Trong OS X 10.8.5 bạn sẽ sử dụng stat -f %Sc.
1.61804


1

Những gì bạn muốn là không thể thực hiện trong UNIX bằng các hàm không gian người dùng chuẩn. Các ctimecủa một tập tin được cập nhật tự động bởi hạt nhân khi của tập tin inodethay đổi . Không giống như atimemtime, không có chức năng người dùng có thể truy cập để đặt ctimethành một giá trị tùy ý.


Có thể vim, thay vì trao đổi tập tin, chỉ cp test.swp test.txt?
1.61804

@ 1.61804, less test.swpnên trả lời câu hỏi của bạn.
romainl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.