Có thể tạo tập tin tự động Vim không?


32

Một số trình xử lý văn bản và trình soạn thảo văn bản tự động lưu các tệp mà chúng tôi chỉnh sửa theo thời gian, rất thuận tiện để sống sót sau các sự cố khó chịu, v.v.

Có cách nào để Vim tự động lưu tệp của chúng tôi sau một khoảng thời gian cụ thể không?

Câu trả lời:


30

Không có tùy chọn dựng sẵn, mặc dù :help 'autosave'(trong todo.txt) đề cập đến một mô tả về những gì một tùy chọn như vậy có thể làm.

Một cách có thể để thực hiện điều này là sử dụng CursorHoldsự kiện autocommand. Sự kiện này được kích hoạt khi người dùng chưa nhấn phím trong một 'updatetime'phần nghìn giây.

autocmd CursorHold * update

Các :updatelệnh chỉ tiết kiệm bộ đệm nếu nó được sửa đổi. Nếu bạn cũng muốn điều này xảy ra trong khi chế độ chèn được kích hoạt, CursorHoldIcó thể được thêm vào danh sách sự kiện.

autocmd CursorHold,CursorHoldI * update

Một lựa chọn khác là 'autowrite'tùy chọn, sẽ lưu bộ đệm trước khi thực hiện lệnh bên ngoài (hữu ích để lưu trước khi chạy :make) hoặc chuyển sang bộ đệm khác.


Làm thế nào bạn có thể nhận thấy nếu nó đang làm việc?
nilon

@nilon Nó sẽ in ra thanh trạng thái mà nó đã lưu, giống như bạn đã nhấn: w mình.
MaudPieTheRocktorate

12

Vim có tính năng tự động lưu, nhưng nó lưu nó vào tập tin "recovery".

Khi bạn chỉnh sửa tài liệu, vd MyFile.txtsẽ tạo tệp phục hồi .MyFile.txt.swp. Nếu hệ thống của bạn gặp sự cố hoặc phiên của bạn bị chết, thì bạn có thể kết nối lại và khôi phục từ cơ bản nơi bạn rời đi, bằng cách nhập:

vim -r MyFile.txt

Điều này sẽ mở tệp để chỉnh sửa và khôi phục những thay đổi cuối cùng bạn đã thực hiện với nó.

Sau đó, bạn có thể lưu phiên bản đã khôi phục theo cách thông thường :w.

Thật không may, khi bạn thoát vim, nó sẽ rời khỏi .MyFile.txt.swpxung quanh và bạn cần xóa nó bằng tay:

rm .MyFile.txt.swp

Xem "Recovery" Man Trang Cũng Chương 11


1
Khi bạn thoát khỏi Vim đúng cách (ví dụ với :wqhoặc :q!hoặc ZZhoặc vv), các file swap tự động cần được loại bỏ.
Doorknob

4
@Doorknob không phải khi bạn thoát sau khi phục hồi ... ;-)
rolfl

8

Tôi đã tạo một plugin vim-autosave sử dụng tính năng Vim 8 của Timers để định kỳ lưu bộ đệm của bạn.


Woah, plugin Vim 8 sắp ra mắt. Trông thật tuyệt, Christian!
thameera

Cảm ơn, Christian. Điều này có vẻ đầy hứa hẹn. Tôi tự hỏi nếu plugin hỗ trợ các tập tin mới / chưa lưu. Tôi không thể tìm thấy câu trả lời trong tài liệu plugin. Máy tính của tôi quyết định khởi động lại đêm qua và tôi đã có một số ghi chú nhanh về bộ đệm mới. Vim đã không tạo hoặc bảo tồn các tập tin swp.
JAponte

Không, hiện tại, nó không hỗ trợ các tệp mới / chưa được lưu. Nếu bạn muốn điều đó, hãy tiếp tục và tạo ra một vấn đề whishlish.
Christian Brabandt

2

Tôi làm cho Vim của tôi lưu mọi thứ mỗi khi mất tập trung.

autocmd FocusLost <your-patterns-here> silent! wall

Các mẫu của tôi khá dài và tôi sử dụng chúng trong một số autocmds nhưng để hoàn thiện thì đây là giao diện:

if exists(':keeppatterns')
    let s:keeppatterns = 'keeppatterns '
else
    let s:keeppatterns = ''
endif

augroup AutoSaveGroup
    " :help file-pattern has some info,
    " but some of it is is buried in the PATTERNS section of usr_40.txt
    let s:autoPattern = "*.{c,h,[ch]pp,[acjt]s,inl,cg,cgfx,fx,py,bat,cmd,jam,vim,yml,yaml,vsprops,erb,rb,html,htm},SCons*,*vimrc"

    autocmd!
    execute "autocmd FocusLost"     s:autoPattern   "silent! wall"
    execute "autocmd BufWritePre"   s:autoPattern   s:keeppatterns . 'call FixFormatting(expand("<afile>"))'

    execute "autocmd FileChangedRO" s:autoPattern "silent !p4 edit %:p"
    execute "autocmd FileChangedRO" s:autoPattern "write!"

    autocmd FocusLost   *.txt   silent! wall
augroup END

1

Như những người khác đã chỉ ra, vim có một tệp hoán đổi (.swp) sẽ được tạo ở bất cứ nơi nào tệp gốc của bạn, nhưng trong tệp .vimrc của bạn, bạn có thể đặt thư mục .swp.

Bạn sẽ cần tạo thư mục với mkdirvà sau đó đặt .vimrc của bạn đến vị trí đó.

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp

1

Các vim-workspace Plugin có một tính năng khá tùy biến tự động tiết kiệm mà có thể phù hợp với nhu cầu của bạn. Theo mặc định, nó cho phép tự động lưu trong phiên làm việc (tính năng chính của nó), nhưng bạn có thể đặt nó luôn tự động lưu nếu đó là tất cả những gì bạn đang tìm kiếm ( let g:workspace_autosave_always = 1).


1

Cố gắng lưu bộ đệm bất cứ khi nào văn bản được thay đổi:

autocmd TextChanged,TextChangedI <buffer> silent write

Điều này làm việc cho tôi.

Nguồn

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.