2011-01-09 18 views
30

Ben Odağı kaybettiklerinde dosyaları Otomatik kaydetmeyi benim editörler alışkınım. Kısa bir süre önce MacVim'e geçtim ve bu davranışı yeniden oluşturamıyorum. Bu çalıştı:nasıl Vim otomatik kaydetme dosyaları yapabilirsiniz?

autocmd BufLeave,FocusLost * wall 

ama pencere veya MacVim odağı kaybettiğinde bir tampon isimsiz ise, aşağıdaki gibi bir hata alıyorum:

Error detected while processing BufLeave Auto commands for "*": 
E141: No file name for buffer 1 

Ben, kafam karıştı :wall belgelerine çünkü adsız olarak adlandırılan arabellekleri atlamasını beklerim:

. Bunu yapmanın daha iyi bir yolu var mı?

Düzenleme:

Ben daha iyi bir yolu ben BufLeave kullanarak amaçlanan ne yapacağını eminim - Ben aralarında geçiş yaparken tampon tasarruf, bu yüzden "son beri hiçbir yazma alamadım Değiştir "- 'autowriteall' ayarlanmasıdır. sorusu hala MacVim diğer uygulamalar (FocusLost) için odağı kaybettiğinde kısaltmasıdır. wall için dokümanlar onlar = nofile buftype ile tampon atıfta olabilir "dosya adı olmadan" deyince

+0

içinde koymak: Yeterince dosyaları takas edilmez? – skippr

+2

Çalışmamı yedeklemeye çalışmıyorum; Bir test paketi gibi odağı değiştirdiğim herhangi bir araç için diskte olmak için dosyaya ihtiyacım var. – Peeja

cevap

38

Siz bu koşullarda hatalar umurumda değil. Dolayısıyla, sadece onları yutmak: bunu önlemek amacıyla bir hata olacağını nerede

autocmd BufLeave,FocusLost * silent! wall 

ayrıntılı bir dans daha çok daha basit

anlamaya.

+0

Bu iyi bir tanesi! –

+7

Bir *, gibi autocmd BufLeave, FocusLost * sessiz gerekir! duvar, en azından benim için öyle. – pvinis

+0

vim noob burada .. bu hat nereye gidiyor? içinde .vimrc? – thefonso

3

ben şüpheli. İstediğinizi elde etmenin bir yolu, autocmd'nin basit bir işlevi çağırmasıdır. Ör bazı denenmemiş kod fikir vermek için:

autocmd BufLeave,FocusLost * bufdo! call WriteFile() 

function WriteFile() 
    if (&buftype=="") && (expand("%:r") > "") && (&readonly==0) 
     write 
    endif 
endfunction 

Ben Vim autosave seçeneği ayarlamak olacaktır tamponların bu otomatik kaydetme gibi bir şey almanın standart bir yol olduğunu düşünüyorum. Özellikle odağı kaybetmeden - makul neyse onlar hakkında yapabileceği bir şey yoktur, çünkü

+0

'bufdo', arabellekleri geçerli pencerede değiştirecektir. Muhtemelen yazmalısınız: let s: curbuf = bufnr ('%') | deneyin yürüt 'bufdo! WriteFile() 'arayın sonunda | "buffer" çalıştırır.: curbuf | endtry'. Hala problemleri var: bir sebepten ötürü bu koddan sonra '' list '' yardım arabelleğinde '' '' '' '' sıfırlandı ve imleç merkezde konumlandı. endtry' daha iyi çalışır 'sonrasında try'' önce 'wincmd V' ve' wincmd q' ekleme. – ZyX

+0

Düz wincmd v | yürüt 'bufdo! WriteFile() 'arayın wincmd q' muhtemelen en iyi seçenek. – ZyX

+0

@ZyX - Düzeltme için teşekkürler; Bufdo önerdiğimde düşünmüyordum. İkinci çözümün iyi çalışıyor, yeni pencere açılıyor, arabelleklerden geçiyor, sonra pencereyi kapatıyor.Ben hala "autosave" ile gitmek en iyi çözüm, ya da muhtemelen bir pencere içinde bir "windo" komutu kullanan autocmd tarafından çağrılacak daha karmaşık bir işlev yazma düşünüyorum, böylece bir pencere içinde arabellek geçişi asla gerekli değildir. –

0
autocmd BufLeave,FocusLost * bufdo! call WriteFile() 

function WriteFile() 
    if (&buftype=="") && (expand("%:r") > "") && (&readonly==0) 
     write 
    endif 
endfunction 

Bu yöntem, yalnızca bir unamed tampon açık bir yan etkiye sahiptir. İkincisini açarsanız, otomatik olarak ilk değiştirilmemiş arabelleğin içeriğine senkronize edilir.

+0

Bu, Herbert Sitz'in yukarıdaki cevabının farklı yorumlarıyla bir kopyasıdır. cevabına bir yorum olarak? – Peeja

0

sadece VIM Otomatik kaydetmeyi Sadece açısından orada bu dışarı atma .vimrc

set updatetime=1000 
autocmd CursorHoldI * silent w 
+0

Bu çeşitli sorunlar var: Birincisi, kaydetmek için tam bir saniye sürüyor, bu zamana kadar diskte dosya istiyorum, ikincisi, sadece ekleme modunda kalırsanız çalışır; üçüncü, ': yazmak' onu kesmez.Aristotle Pagaltzis cevap benim için onu kapsar. – Peeja