Jika saya membuka Vim dan mengetik itest<Esc>:wq
maka saya mendapatkan file yang tidak memiliki baris baru di Vim tetapi tampaknya memiliki baris baru dalam kode:
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
Jika saya membuka Vim dan mengetik itest<Return><Esc>:wq
maka saya mendapatkan file yang memiliki satu baris baru di Vim tetapi dua baris baru dalam kode:
$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a 0a |test..|
00000006
Perhatikan bahwa saya membuka Vim -u NONE
sehingga tidak ada konfigurasi lokal yang digunakan. Perhatikan juga bahwa ini mungkin terkait dengan pertanyaan saya sebelumnya .
Ini info sistem saya:
$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:25:35)
Included patches: 1-429
Modified by [email protected]
Compiled by buildd@
Saya dapat mengkonfirmasi perilaku yang sama persis pada sistem ini juga:
$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by [email protected]
Compiled by buildd@
Mengapa Vim menambahkan baris baru? Apakah ini sebuah konvensi?
Berikut adalah beberapa klarifikasi tentang hd
perintah yang diinstal di Ubuntu Server:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Jawaban:
Konvensi untuk file teks Unix adalah bahwa setiap baris diakhiri oleh baris baru, dan bahwa baris baru adalah terminator baris, bukan pemisah baris.
Ketika Vim menyimpan buffer sebagai file, ia mengakhiri setiap baris dengan urutan end-of-line untuk format file itu, yang untuk Unix adalah baris baru. Lihat
Jika Anda menggunakan alat pemrosesan teks Unix, yang terbaik untuk tetap dengan konvensi ini. Namun, jika Anda perlu untuk tidak meletakkan baris baru di akhir baris terakhir file, Anda dapat melakukannya. Vim menganggap file tersebut sebagai "biner". Lihat
sumber
Vim tidak menambahkan apa pun yang tidak Anda taruh di sana sendiri.
Karakter "baris baru" bukan "baris baru" dan kedua contohnya sangat normal:
sumber
printf "\x41" > /tmp/test.txt
lalu periksa apakah hanya memiliki karakter 'A' tunggalxxd /tmp/test.txt
. Sekarangvim /tmp/test.txt<ENTER>:wq
. Periksa lagi untuk melihat file yang memiliki dua byte: 'A \ n'.printf
sini saya tidak punya "garis" yang terbentuk dengan baik. Setelah vim saya punya satu. Jadi, itu menambahkan sesuatu yang saya tidak taruh di sana.printf
bukan garis kecuali Anda menambahkan\n
. Menjadi editor teks, Vim penawaran dengan garis-garis secara default, dan setiap teks yang Anda masukkan dalam file adalah pada, setidaknya, garis, kecuali Anda secara eksplisit memberitahu Vim untuk tidak melakukan itu.File teks yang dihapuskan jahat karena berbagai alasan; ini salah satu yang belum saya lihat disebutkan:
Dalam dunia hipotetis di mana file teks tanpa baris baru dapat diterima, tidak akan ada perbedaan antara file yang berisi 0 baris dan file yang berisi 1 baris kosong. Keduanya akan diwakili oleh file 0-byte.
Ketidakmampuan untuk memutuskan berapa banyak baris dalam file akan menjadi buruk.
sumber
Vim 8.0 sekarang menyediakan
fixeol
opsi ini. Khususnya jika Anda melakukannya:maka Vim tidak akan menambahkan karakter baris baru di akhir baris terakhir jika file belum memilikinya.
Itu bisa masuk dalam plugin tipe file, atau bahkan mungkin plugin Anda
.vimrc
.(Ini merupakan peningkatan pada
:set binary
karena itu hanya mempengaruhi karakter line-break terakhir, sedangkanbinary
juga mengubah banyak perilaku lain, yang mungkin tidak Anda inginkan kecuali Anda benar-benar mengedit file biner.)File yang baru dibuat masih akan memiliki karakter line-break trailing secara default. Anda dapat mengubah itu (dan mengganti file yang sudah memiliki baris terakhir untuk tidak memilikinya) dengan tambahan melakukan:
Itu harus ditetapkan secara khusus untuk setiap file yang ingin Anda ubah: memuat file ke buffer akan selalu diatur
eol
agar sesuai dengan keadaan file saat ini.sumber
Menggunakan perintah 'j' Anda dapat menggabungkan semua baris menjadi satu.
Jika Anda juga ingin menghapus LF atau CRLF pada baris terakhir, lakukan hal berikut di vi.
sumber