Apakah mungkin membuat Vim menyimpan otomatis file?

32

Beberapa pengolah kata dan editor teks secara otomatis menyimpan file yang sedang kami edit dari waktu ke waktu, yang sangat nyaman untuk selamat dari kecelakaan parah, dll.

Apakah ada cara untuk membuat Vim menyimpan otomatis file kami setelah interval tertentu?

thameera
sumber

Jawaban:

30

Tidak ada opsi :help 'autosave'bawaan , meskipun (dalam todo.txt) merujuk pada deskripsi tentang apa yang bisa dilakukan opsi semacam itu.

Salah satu cara yang mungkin untuk mengimplementasikan ini adalah dengan menggunakan CursorHoldacara perintah otomatis . Peristiwa ini dipicu ketika pengguna belum menekan tombol selama 'updatetime'milidetik.

autocmd CursorHold * update

The :updateperintah hanya menghemat buffer jika dimodifikasi. Jika Anda juga menginginkan ini terjadi saat mode insert aktif, CursorHoldIdapat ditambahkan ke daftar acara.

autocmd CursorHold,CursorHoldI * update

Alternatif lain adalah 'autowrite'opsi, yang akan menyimpan buffer sebelum menjalankan perintah eksternal (berguna untuk menyimpan sebelum menjalankan :make) atau beralih ke buffer yang berbeda.

jamessan
sumber
Bagaimana Anda bisa melihat jika itu berfungsi?
nilon
@nilon Ini akan mencetak ke bilah status yang telah disimpan, sama seperti jika Anda telah menekan: w sendiri.
MaudPieTheRocktorate
12

Vim memang memiliki fitur simpan otomatis, tetapi menyimpannya ke file "pemulihan".

Ketika Anda mengedit dokumen, misalnya MyFile.txtvim akan membuat file revovery .MyFile.txt.swp. Jika sistem Anda mogok, atau sesi Anda mati, maka Anda dapat menyambung kembali, dan memulihkan dari tempat Anda tinggalkan, dengan mengetik:

vim -r MyFile.txt

Ini akan membuka file untuk diedit, dan memulihkan perubahan terakhir yang Anda buat.

Anda kemudian dapat menyimpan versi yang dipulihkan dengan cara biasa :w.

Sayangnya, ketika Anda keluar dari vim, itu akan meninggalkan .MyFile.txt.swpsekitar, dan Anda harus menghapusnya secara manual:

rm .MyFile.txt.swp

Lihat halaman Man "Pemulihan" Juga Bab 11

rolfl
sumber
1
Ketika Anda keluar dari Vim dengan benar (yaitu dengan :wqatau :q!atau ZZatau dll.), Swap file secara otomatis harus dihapus.
Gagang pintu
4
@ Doorknob tidak ketika Anda keluar setelah pemulihan ... ;-)
rolfl
8

Saya membuat plugin vim-autosave yang menggunakan fitur Vim 8 dari Timers untuk secara berkala menyimpan buffer Anda.

Christian Brabandt
sumber
Woah, plugin Vim 8 sudah keluar. Tampak hebat, Kristen!
thameera
Terima kasih, Christian. Ini terlihat menjanjikan. Saya ingin tahu apakah plugin mendukung file baru / belum disimpan. Saya tidak dapat menemukan jawabannya di dokumentasi plugin. Komputer saya memutuskan untuk me-restart tadi malam dan saya memiliki beberapa catatan cepat tentang buffer baru. Vim tidak membuat atau menyimpan file swp.
JAponte
Tidak, saat ini, tidak mendukung file baru / belum disimpan. Jika Anda menginginkannya, silakan dan buat masalah whishlish.
Christian Brabandt
2

Saya membuat Vim saya menyimpan semuanya setiap kali fokus hilang.

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

Pola saya cukup panjang dan saya menggunakannya dalam beberapa autocmds tetapi untuk kelengkapannya seperti ini:

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
dash-tom-bang
sumber
1

Seperti yang telah ditunjukkan orang lain, vim memiliki file swap (.swp) yang akan dibuat di mana pun file asli Anda, tetapi dalam file .vimrc Anda, Anda dapat mengatur direktori .swp.

Anda harus membuat direktori dengan mkdirdan kemudian mengatur .vimrc Anda ke lokasi itu.

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp
Pengguna Terdaftar
sumber
1

The vim-kerja plugin memiliki fitur yang cukup disesuaikan auto-save yang mungkin sesuai dengan kebutuhan Anda. Secara default, ini memungkinkan penyimpanan otomatis ketika dalam sesi ruang kerja (fitur utamanya), tetapi Anda dapat mengaturnya untuk selalu menyimpan otomatis jika hanya itu yang Anda cari ( let g:workspace_autosave_always = 1).

Jaybay
sumber
1

Cobalah untuk menyimpan buffer setiap kali teks diubah:

autocmd TextChanged,TextChangedI <buffer> silent write

Ini bekerja untuk saya.

Sumber

simhumileco
sumber