Bagaimana saya bisa menjalankan autocmd ketika memulai Vim tanpa file, file yang tidak ada, atau file kosong (tetapi tidak ketika memulai dengan file yang ada)?

11

Saya ingin menjalankan autocmd dalam skenario berikut ketika saya memulai Vim:

  • Tanpa nama file yang ditentukan.
  • Saat file baru.
  • Ketika file ada tetapi benar-benar kosong.

Dalam ketiga kasus di atas saya ingin menjalankan autocmd; khusus, saya ingin memulai mode penyisipan secara otomatis hanya untuk skenario di atas (dan tidak ketika saya membuka file yang sudah ada & tidak kosong).


MEMPERBARUI:

Saya sudah mencoba menempatkan berikut ini di saya _vimrc, tetapi tidak berhasil (ditambah saya tidak yakin apakah ada fungsi di vim yang menghitung jumlah karakter dalam file (untuk melihat apakah itu nol) sebelum membukanya:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif
John Sonderson
sumber
Tidak, ini bukan duplikat. Saya ingin vi untuk memulai dalam mode insert HANYA UNTUK TIGA SKENARIO YANG SAYA TELAH DISEBUTKAN.
John Sonderson
3
OKE, AKU MAAF, TAPI ITU SANGAT MENCARI SEPERTI DUPLICATE. ;-) Saya telah sedikit mengedit pertanyaan Anda untuk membuat perbedaan lebih jelas.
Martin Tournoij
2
@JohnSonderson tautan pertama memberi tahu Anda cara menemukan jika tidak ada nama file yang diberikan, yang kedua dapat disesuaikan dengan menggunakan normalalih-alih exec.
muru
1
File vimrc hanya dibaca sekali : ketika Vim dimulai. Isi autocmd dijalankan setiap kali dipicu. Jadi ifpernyataan itu tidak boleh berada di sekitar autocmd, jika harus di dalam autocmd, jadi itu akan dijalankan setiap kali autocmd dipicu.
Martin Tournoij

Jawaban:

10

Ini berfungsi untuk ketiga kasus Anda untuk saya:

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()

Ini mungkin bisa diringkas menjadi hanya pemeriksaan terakhir untuk file yang kosong, karena tidak ada nama file atau file yang tidak ada biasanya mulai sebagai buffer kosong. Namun, mungkin saja beberapa plugin lain mengisi beberapa hal dalam salah satu dari dua kasus pertama (seperti beberapa templat plugin), jadi yang terbaik adalah memeriksa ketiganya.

Tes pertama yang sudah Anda miliki.

Tes kedua perlu memeriksa filereadableterhadap nilai nol (tidak ada) untuk memutuskan apakah itu baru (kebalikan dari apa yang Anda miliki).

Tes terakhir memeriksa bahwa jumlah baris terakhir dalam file adalah 1 (yang juga merupakan baris pertama, artinya hanya ada satu baris), dan bahwa jumlah kolom dari ujung baris (kolom setelah karakter terakhir dalam baris) adalah 1, yang berarti ada 0 karakter. Jika hanya ada 1 baris dengan 0 karakter di dalamnya, maka file tersebut harus kosong.

Satu catatan terakhir: Cara Anda menyampaikan pernyataan dalam pertanyaan dapat menghasilkan beberapa hasil yang mengejutkan. Yaitu, Anda menetapkan BufReaddan BufNewFilehanya jika kondisi dipenuhi pada saat startup, tetapi kemudian autocommands ada selama sisa sesi Anda. Jadi, jika Anda memulai pada file kosong, yang menetapkan perintah ini, setiap file berikutnya dibuka (baru atau tidak, kosong atau tidak) akan mulai dalam mode insert.

Perintah otomatis VimEnterdijalankan pada akhir startup Vim dan hanya sekali untuk seluruh sesi. Dengan cara ini, tes Anda hanya berjalan ketika Anda memulai Vim dan tidak pada waktu lainnya.

John O'M.
sumber