Vim'i dosya, var olmayan bir dosya veya boş bir dosya ile başlatırken autocmd'yi nasıl çalıştırabilirim (ancak varolan bir dosyayla başlarken nasıl çalışamaz)?


11

Vim'i başlattığımda aşağıdaki senaryolarda bir autocmd çalıştırmak istiyorum:

  • Dosya adı belirtilmedi.
  • Dosya yeni olduğunda.
  • Dosya mevcut ancak tamamen boş olduğunda.

Yukarıdaki üç durumun hepsinde bir autocmd çalıştırmak istiyorum; özellikle, yalnızca yukarıdaki senaryolar için ekleme modunu otomatik olarak başlatmak istiyorum (ve zaten var olan ve boş olmayan bir dosyayı açtığımda değil).


GÜNCELLEME:

Benim yerleştirme denedim _vimrc, ama hayır şans (artı vim bir dosyada karakter sayısını (sıfır olup olmadığını görmek için) sayar bir fonksiyon olup olmadığını emin değilim: açmadan önce:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

Hayır, bu bir kopya değil. Vi'nin SADECE DAHİL OLDUĞUM ÜÇ SENARYO İÇİN ekleme moduna girmesini istiyorum.
John Sonderson

3
Tamam, ben üzgünüm ama gerçekten bir çift gibi görünüyor. ;-) Farklılıkları daha net hale getirmek için sorunuzu biraz düzenledim.
Martin Tournoij


2
@JohnSonderson ilk bağlantı size herhangi bir dosya adı verilmemişse nasıl bulunacağınızı söyler, ikincisi normalyerine kullanılarak uyarlanabilir exec.
muru

1
Vimrc dosyası yalnızca bir kez okunur : Vim başladığında. Autocmd içeriği her tetiklendiğinde çalıştırılır. Yani ifdeyim olmamalı etrafında autocmd, eğer olmalıdır içeride o autocmd tetiklenir her zaman çalıştırılacak böylece, autocmd.
Martin Tournoij

Yanıtlar:


10

Bu benim için 3 vakanın tamamında işe yarar:

function InsertIfEmpty()
    if @% == ""
        " No filename for current buffer
        startinsert
    elseif filereadable(@%) == 0
        " File doesn't exist yet
        startinsert
    elseif line('$') == 1 && col('$') == 1
        " File is empty
        startinsert
    endif
endfunction

au VimEnter * call InsertIfEmpty()

Dosya adı veya varolmayan bir dosya genellikle boş arabellek olarak başladığı için, bunlar büyük olasılıkla bir dosyanın boş olup olmadığına dair son denetime yoğunlaştırılabilir. Bununla birlikte, muhtemelen diğer bazı eklentilerin ilk iki durumdan birinde (bazı şablon eklentileri gibi) bazı şeyleri önceden doldurması mümkündür, bu nedenle üçünü de kontrol etmek en iyisidir.

Zaten yaptığınız ilk test.

İkinci testin filereadableyeni olup olmadığına (sahip olduğunuzun tersine) karar vermek için sıfır (mevcut değil) değerine karşı kontrol etmesi gerekir .

Son test, dosyadaki son satır sayısının 1 (aynı zamanda ilk satır olduğunu, yani yalnızca bir satır olduğunu gösterir) ve satır sonunun sütun numarasının (son karakterden sonraki sütun) olup olmadığını kontrol eder. satır) 1'dir, yani 0 karakter vardır. İçinde 0 karakter olan yalnızca 1 satır varsa, dosya boş olmalıdır.

Son bir not: Sorunuzdaki ifadelerinizi alma şekliniz şaşırtıcı sonuçlar doğurabilir. Yani, ayarlıyorsunuz BufReadve BufNewFileyalnızca başlangıçta koşullar karşılanıyorsa, ancak bu oturumun geri kalanı için bu otomatik komutlar var. Bu nedenle, bu komutları ayarlayan boş bir dosyaya başlarsanız, açılan her dosya (yeni veya değil, boş veya değil) ekleme modunda başlar.

Otomatik komut VimEnter, Vim'in başlangıcında ve tüm oturum için yalnızca bir kez çalıştırılır. Bu şekilde, testleriniz başka hiçbir zaman değil, sadece Vim'i başlattığınızda çalışır.

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.