2012-06-15 56 views
5

Thông thường, bạn không thực sự chỉnh sửa tệp trong vim. Nếu bạn chạy vim foo, chỉnh sửa, viết và thoát, vim unlinks foo và tạo tệp mới và liên kết mới có tên foo. Tuy nhiên, nếu tệp có nhiều liên kết thì vim thực sự sửa đổi tệp. Ví dụ:Chỉnh sửa tệp tại chỗ trong vim

$ ls -i foo 
19428852 foo 
$ vi foo 
$ ls -i foo 
19428857 foo 
$ ln foo bar 
$ vi bar 
$ ls -i bar 
19428857 bar 

Tôi đã tìm kiếm một cách để thực sự chỉnh sửa tệp và có vẻ như có hai lựa chọn. Sử dụng ed hoặc sử dụng vim nhưng đảm bảo rằng có ít nhất hai liên kết đến tệp trước khi tôi chỉnh sửa. Tôi cho rằng câu hỏi là học thuật, vì nó không thực sự quan trọng mà vim tạo ra một tập tin mới nếu chỉ có một liên kết, và vim dường như làm điều đúng nếu liên kết được tạo ra trong khi chỉnh sửa đang được tiến hành, nhưng tôi tò mò :

có thể làm cho vim luôn chỉnh sửa tệp và không tạo tệp mới không?

+0

Một số lý do tại sao nó tạo sự khác biệt ... lợi thế của việc tạo tệp mới và trao đổi liên kết: ngăn các chương trình khác nhìn thấy tệp được viết một phần. Lợi thế của việc ghi tập tin tại chỗ: chương trình fileschanged (sử dụng fam) dường như thấy sự thay đổi sớm hơn (ngay lập tức, so với 6 giây hoặc lâu hơn khi tập tin bị xóa và liên kết hoán đổi, vì lý do nào đó ... một tính không đồng nhất trong fam hoặc fileschanged) –

Trả lời

9

Kiểm tra trợ giúp cho tùy chọn backupcopy và ghi chú trên crontab nói riêng. Câu trả lời ngắn gọn là

:set backupcopy=yes 
+1

Cảm ơn. Tuy nhiên, tôi thấy tài liệu đó không rõ ràng. "Khi tệp là một liên kết, tệp mới sẽ không phải là một liên kết". WTF ?? !! Mỗi liên kết là một liên kết và cách duy nhất để truy cập tệp là thông qua một liên kết! –

2

Bí quyết là để nói với Vim sử dụng một backupfile để cho phép các tập tin ban đầu được ghi đè an toàn, nếu không Vim sẽ viết vào một tập tin mới và sau đó đổi tên nó để thay thế bản gốc.

Và sau đó yêu cầu Vim viết tệp sao lưu ở đâu đó. Bằng cách này, lệnh viết thường xuyên sẽ thất bại, và viết phải được buộc.

:set noswapfile 
:set backupcopy=yes 
:set backupdir='' 
:e big 
(hit Crtl-C to stopo line count and syntax highlight) 
(edit the file) 
:w! 

Để thực sự nhìn thấy những gì đang xảy ra ở cấp hệ thống tập tin, tôi sử dụng công cụ inotify:

inotifywait -m -r /path/to/my_test_dir/ 

Nhưng hãy cẩn thận, điều này không làm việc tốt cho các tập tin rất lớn, ví dụ, tôi đang cố gắng chỉnh sửa tệp 10G tại chỗ với phương pháp này và kết thúc bằng một tệp cắt ngắn 1,5 GB và phần còn lại của dữ liệu đã bị mất. Và Vim đã kết thúc bằng việc sử dụng gần 2GB RAM ...

Tùy chọn khác sẽ là sử dụng các chức năng MMAP, ví dụ: trong một dòng lệnh Python.

Các vấn đề liên quan