Vim'in hata atmadan dosya yazmasını nasıl durdurabilirim?


10

Ben eksik dizini oluşturmadan önce onay istemek için bu cevap kodu geliştirmeye çalışıyorum , bu ne yazıyorum:

function! CreateDirectoryAskConfirmation(path)
    if !isdirectory(a:path)
        echohl Question
        echo "Create directory " . a:path . "?"
        echohl None

        let response = nr2char(getchar())
        if response ==? "y"
            call mkdir(a:path, "p")
        endif
    endif
endfunction

autocmd BufWritePre * call CreateDirectoryAskConfirmation(expand("<afile>:p:h"))

Ben eksik bir şey: ykomut isteminde basmadığımda Vim yazma iptal etmek istiyorum, bu yüzden hatayı E212: Can't open file for writingalmıyorum ve hata mesajı kaybolmak için başka bir tuşa ihtiyacım yok. Bunu başarmanın bir yolu var mı?

Yanıtlar:


9

Bunun yerine kullanmanın BufWritePreautocmd kullanabileceğiniz BufWriteCmd , autocmd dan :help BufWriteCmd:

'+' 'Cpo' ve başka bir dosyaya cpo- + yazmadıkça, dosyanın yazılması ve başarılı olması durumunda 'değiştirildi' olarak sıfırlanmalıdır.

Biz sadece :writeautocmd'den arayabiliriz. Bu ayarlarla ilgilenir modified.

Böylece, mantık :write, dizin zaten mevcut olduğunda çağrı yapacak şekilde değiştirilecek ve :writeeğer henüz mevcut değilse, dizini oluşturduktan sonra çağrılacaktır. Eğer basarsanız n, hiçbir şey yapmayız. Bu, arabelleği olduğu gibi bırakacak ve yeniden ayarlanmayacak modified, bu yüzden :qyine de size bir E37: No write since last changehata verecektir .

function! CreateDirectoryAskConfirmation(path, dir)
    silent doautocmd BufWritePre

    " Directory exists, :write and return
    if isdirectory(a:dir)
        execute 'write ' . a:path
        silent doautocmd BufWritePost
        return
    endif

    " Ask for confirmation to create this directory
    echohl Question
    echo "Create directory `" . a:dir . "' [y/N]?"
    echohl None

    let response = nr2char(getchar())
    " mkdir() and :write if we want to make a directory
    if response ==? "y"
        call mkdir(a:dir, "p")
        execute 'write ' . a:path
        silent doautocmd BufWritePost
    endif
endfunction

autocmd BufWriteCmd * call CreateDirectoryAskConfirmation(expand("<amatch>:p"), expand("<amatch>:p:h"))

2
VimScript dosyalarında, :komut satırları için satır aralığı hiçbir zaman gerekli değildir.
tommcdo

@tommcdo Teşekkürler. Nedense beynim bunu bazen unutuyor> _ <
Martin Tournoij

2
@ toro2k Teşekkürler. Bunu bilmiyordum. Cevabımı düzenledim, ayrıca ekledim, silenteğer bunu kullanmazsan bir mesaj almayacaksın autogroup. Ayrıca fark ettiğim başka bir sorunu düzelttim: :w another_nameişe yaramadı (işe yaramadı).
Martin Tournoij

2
@ toro2k Çünkü aksi writetakdirde sadece geçerli dosya adına yazacaksınız (tıpkı yazarken olduğu gibi :write) ve :write another_filenameçalışmayacak (orijinal dosya adını kullanmaya devam edecek).
Martin Tournoij

1
@whitesiroi bufypeBuffer tipini almak için ayarı kullanabilirsiniz . Gönderiyi bir düzeltme ile düzenlemekten çekinmeyin (veya istemezseniz, önümüzdeki hafta yapacağım).
Martin Tournoij
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.