Bagaimana cara membuat vim secara otomatis menambahkan baris baru ke akhir file?

16

Vim biasanya menulis <EOL>untuk baris terakhir hanya ketika ada satu di file asli.

Bagaimana membuat vim untuk menulis baris baru di akhir file sepanjang waktu (ketika file tidak biner dan belum ada satu)?

Saya sudah menguji eolopsi, tetapi tidak berhasil seperti yang diharapkan.

Lihat juga: Mempertahankan end-of-line yang hilang di akhir file teks , tetapi sebaliknya. Dan: Mengapa file harus diakhiri dengan baris baru?

kenorb
sumber

Jawaban:

17

Info dasar

Vim tidak menampilkan baris baru terbaru dalam buffer tetapi sebenarnya vim selalu menempatkan EOL di akhir file ketika Anda menulisnya, karena standar untuk file teks dalam sistem Unix. Anda dapat menemukan informasi lebih lanjut tentang ini di sini . Singkatnya Anda tidak perlu khawatir tentang tidak adanya baris baru di akhir file di vim.

Eksperimen 1

Anda dapat melakukan percobaan kecil ini untuk memeriksa perilaku ini. Di terminal jalankan:

$ vim test_test

Masukkan karakter 1dan simpan file :wq.

Anda hanya memiliki satu karakter dalam file, bukan? Sebenarnya tidak :) Anda sekarang memiliki file 1dan LFkarakter Anda. Mari kita periksa, dengan utilitas hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31adalah kode ASCII untuk karakter 1, dan 0akode ASCII untuk LFkarakter non-cetak yang untuk UNIX karena Anda mungkin sudah tahu kode untuk end of line.

Eksperimen 2

Tetapi bagaimana jika kita akan membuka file yang tidak memiliki eolsimbol di akhir file. Mari kita periksa juga. Mari kita buat file tanpa eol di akhir, misalnya seperti ini:

$ echo -n "1" > test_without_eol

Kemudian lagi mari kita lihat di dalamnya dengan hexdump:

$ hexdump test_without_eol
000000 31
0000001

Jadi tidak ada eolkarakter di sini. Mari kita buka file ini dalam vim:

$ vim test_without_eol

Di bagian bawah editor Anda akan melihat:

"test_without_eol" [noeol] 1L, 1C

Dan jika Anda akan menyimpan eolkarakter file ini akan dimasukkan secara otomatis.

Apa yang bisa kita lakukan tentang ini?

Jika Anda benar-benar perlu melihat ujung file. Coba gunakan perintah ini:

:set listchars=eol:$

itu akan menampilkan semua eolkarakter sebagai $tanda.

Alexander Myshov
sumber
Bagus. Saya sampai pada kesimpulan yang sama setelah kebingungan saya, karena Vim tidak benar-benar menunjukkan kepada saya baris baru ini, tetapi itu ada setelah save.
kenorb
1
@kenorb dengan cara Anda dapat menunjukkan semua charachters EOL menggunakan perintah ini:set listchars=eol:$
Alexander Myshov
"sebenarnya tidak menunjukkan saya baris baru ini" - di Unix, tidak ada baris. Baris didefinisikan sebagai "jumlah karakter non-LF, yang diakhiri dengan karakter LF". Jika Anda berpikir tentang LF bukan sebagai "pergi ke baris berikutnya" tetapi "ujung jalur", apa yang dilakukan Vim tiba-tiba jauh lebih masuk akal.
Amadan
8

Vim hanya menghilangkan EOL jika file dibuka sebagai 'binary' dan yang 'endofline'pilihan adalah reset (ketika file biner tidak memiliki EOL saat pembukaan, atau Anda secara eksplisit mengatur ulang pilihan). Dengan kata lain, Vim hanya menghormati EOL yang hilang untuk file biner. Untuk file teks, selalu menulis dengan (ditambahkan) EOL. (Itu sebabnya Anda membutuhkan solusi seperti plugin PreserveNoEOL saya untuk menyimpan file teks tanpa EOL.) Anda dapat menemukan semua detail di :help 'endofline'.

Jadi, Anda hanya perlu memastikan untuk membuka file sebagai non-biner agar Vim secara otomatis menulis EOL.

Ingo Karkat
sumber
5

Seperti yang disebutkan Alexander , Vim tidak menunjukkan EOL di EOF, itu sebabnya ini sangat membingungkan (terutama dengan baris baru kosong / kosong yang merupakan hal lain), oleh karena itu ia benar-benar menulis setiap saat di file save.

Berikut ini adalah tes sederhana cara menguji apakah itu bekerja:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Perhatikan bagaimana shell prompt berperilaku ketika tidak ada EOL (itu tercampur dengan baris berikutnya). Saat menyimpan ulang file dengan Vim, ia menambahkannya.

Dengan menggunakan wckita dapat menghitung garis, kata dan karakter sebelum menyimpan dan setelah, sehingga kita dapat melihat bahwa itu benar-benar berubah.

Mengapa ini sangat penting? Untuk menjaga agar file kami tetap mematuhi POSIX .

kenorb
sumber