Vim'in dosyaları otomatik kaydetmesi mümkün müdür?


32

Bazı kelime işlemciler ve metin editörleri zaman zaman düzenlediğimiz dosyaları otomatik olarak kaydeder, bu da kötü kazalardan kurtulmak için çok uygundur.

Vim'in belirli bir aralıktan sonra dosyalarımızı otomatik kaydetmesini sağlamanın bir yolu var mı?

Yanıtlar:


30

:help 'autosave'Yerleşik bir seçenek yoktur, ancak (todo.txt içinde) böyle bir seçeneğin neler yapabileceğini açıklar.

Bunu yapmanın olası bir yolu CursorHoldautocommand olayını kullanmaktır . Bu olay, kullanıcı 'updatetime'milisaniye için bir tuşa basmadığında tetiklenir .

autocmd CursorHold * update

:updateO değiştirilirse komut sadece tampon kaydeder. Eğer ekleme modu aktifken bunun olmasını istiyorsanız CursorHoldI, etkinlik listesine eklenebilir.

autocmd CursorHold,CursorHoldI * update

Başka bir alternatif, 'autowrite'harici bir komut çalıştırmadan önce arabelleği kaydedecek (çalıştırmadan önce kaydetmek için yararlı olan :make) veya farklı bir arabelleğe geçme seçeneğidir.


Çalışıp çalışmadığını nasıl fark edebilirsiniz?
nilon

@ nilon Bastığınız gibi durum çubuğuna yazdırmalıdır: tıpkı kendiniz.
MaudPieTheRocktorate

12

Vim otomatik kaydetme özelliğine sahiptir, ancak onu "kurtarma" dosyasına kaydeder.

Bir belgeyi düzenlediğinizde, örneğin MyFile.txtvim revovery dosyasını yaratacaktır .MyFile.txt.swp. Sisteminiz kilitlendiyse veya oturumunuz ölecekti, yazarak yeniden bağlanıp esasen kaldığınız yerden kurtarabilirsiniz:

vim -r MyFile.txt

Bu dosyayı düzenlemek için açar ve üzerinde yaptığınız son değişiklikleri kurtarır.

Kurtarılan sürümü daha sonra normal şekilde kaydedebilirsiniz :w.

Maalesef, vim'den çıktığınızda .MyFile.txt.swpetrafından ayrılacak ve manuel olarak çıkarmanız gerekecek:

rm .MyFile.txt.swp

Bkz. "Kurtarma" Man sayfası Ayrıca Bölüm 11


1
Vim'den düzgün bir şekilde çıktığınızda (yani :wqveya :q!veya ZZveya vb.), Takas dosyaları otomatik olarak kaldırılmalıdır.
Doorknob

4
@Doorknob bir iyileşmeden sonra çıkarken yok ... ;-)
rolfl

8

Tamponlarınızı periyodik olarak kaydetmek için Zamanlayıcıların Vim 8 özelliğini kullanan bir eklenti vim-autosave yaptım .


Vay, Vim 8 eklentileri çoktan çıkıyor. Harika görünüyor, Christian!
thameera 13:16

Teşekkürler Christian. Bu umut verici görünüyor. Eklentinin yeni / kaydedilmemiş dosyaları destekleyip desteklemediğini merak ediyorum. Eklenti belgelerinde cevap bulamıyorum. Bilgisayarım dün gece yeniden başlatmaya karar verdi ve yeni tamponlarla ilgili birkaç kısa not aldım. Vim, swp dosyalarını yaratmadı veya koruyamadı.
JAponte

Hayır, şu anda yeni / kaydedilmemiş dosyaları desteklemiyor. Bunu istiyorsan, devam et ve bir whishlish sorunu yarat.
Christian Brabandt

2

Odak kaybolduğunda Vim'imin her şeyi kurtarmasını sağlıyorum.

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

Kalıplarım oldukça uzun ve onları birkaç otomatik cmcmde kullanıyorum, ancak bütünlüğü sağlamak için şöyle görünüyor:

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

Diğerlerinin de belirttiği gibi, vim, orijinal dosyanızın bulunduğu yerde oluşturulacak bir takas dosyasına (.swp) sahiptir, ancak .vimrc dosyanızda .swp dizinini ayarlayabilirsiniz.

Dizini oluşturmanız mkdirve ardından .vimrc'nizi bu konuma ayarlamanız gerekir.

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

1

Vim-çalışma alanı eklentisi cevap verecek duruma oldukça özelleştirilebilir otomatik kaydetme özelliğine sahiptir. Varsayılan olarak, bir çalışma oturumu oturumundayken (ana özelliği) otomatik kaydetmeyi etkinleştirir, ancak aradığınız tek şeyse bunu otomatik olarak kaydetmeye ayarlayabilirsiniz ( let g:workspace_autosave_always = 1).


1

Her metin değiştirildiğinde tamponu kaydetmeyi deneyin:

autocmd TextChanged,TextChangedI <buffer> silent write

Bu benim için çalışıyor.

Kaynak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.