Viết bộ đệm đã sửa đổi vào một tệp tạm thời


7

Tôi muốn viết bộ đệm đã sửa đổi Tôi hiện đang chỉnh sửa thành một tệp tạm thời. Trong nền tôi có thể, ví dụ, sử dụng các công cụ bên ngoài để phân tích tệp.

Tôi không muốn ghi tệp vào vị trí thực trong quy trình này - Tôi muốn người dùng chịu trách nhiệm về điều đó thông qua :wlệnh thông thường .

Làm thế nào tôi có thể làm điều này trong một vimscript được gọi bởi CursorHoldautocommand? Vim 7.4 trở lên là ổn.


Bạn có thể chạy các công cụ bên ngoài trực tiếp trên nội dung (hoặc các phần) của bộ đệm :[range]w !command.
romainl 20/03/2015

Câu trả lời:


8

Điều này khá đơn giản:

:autocmd CursorHold *
\   let save_modified = &modified |
\       silent! execute 'write' fnameescape(tempname()) |
\   let &modified = save_modified

Tuy nhiên, điều này có tác dụng phụ của việc đặt tên :newbộ đệm vào lần kích hoạt đầu tiên. (Nó không ảnh hưởng đến các tệp hiện có; đây là sự khác biệt giữa :write:saveas.) Bạn có thể thêm một kiểm tra khác ( empty(bufname(''))) và hoàn tác thông qua đó :0filehoặc chuyển sang các chức năng cấp thấp hơn hoàn toàn:

:autocmd CursorHold * call writefile(getline(1, '$'), tempname())

Thông báo trước cho phương pháp này là nội dung tệp sẽ luôn được duy trì

  • với 'encoding'cài đặt của Vim , tức là bạn mất bất kỳ tùy chỉnh nào 'fileencoding'của bộ đệm ban đầu và
  • với các kết thúc dòng Unix (LF) (mà bạn có thể khôi phục với một map()danh sách được trả về bởi getline()).
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.