VIM Nonaktifkan Otomatis Baris Baru Di Akhir File

250

Jadi saya bekerja di toko PHP, dan kita semua menggunakan editor yang berbeda, dan kita semua harus bekerja di windows. Saya menggunakan vim, dan semua orang di toko terus mengeluh bahwa setiap kali saya mengedit file ada baris baru di bagian bawah. Saya telah mencari-cari dan menemukan bahwa ini adalah perilaku vi & vim yang terdokumentasi ... tapi saya bertanya-tanya apakah ada cara untuk menonaktifkan fitur ini. (Akan lebih baik jika saya dapat menonaktifkannya untuk ekstensi file tertentu).

Jika ada yang tahu tentang ini, itu akan bagus!

Boushley
sumber
23
Anda harus memberi tahu mereka bahwa mereka konyol - sebenarnya ada alasan bagus mengapa vim melakukan itu: stackoverflow.com/questions/729692/… . Saya kira itu hanya relevan jika Anda menggunakan server unix-like.
hdgarrood
5
Praktek resmi yang disarankan PHP adalah menghilangkan ?>tag penutup terakhir , hanya untuk alasan ini.
Sebastián Grignoli
pertanyaan ini mungkin ada sebelum pengguna super ... tetapi seharusnya ada di sana.
gcb
20
Pertanyaannya seharusnya: Bagaimana kita memberi tahu semua editor lain bahwa orang-orang di toko Anda menggunakan untuk memastikan baris terakhir file tidak berakhir dengan EOL. ;-)
TJ Crowder

Jawaban:

360

Dan untuk vim7.4+ Anda dapat menggunakan (lebih disukai di .vimrc Anda) (terima kasih kepada 罗泽轩 untuk berita terakhir itu!):

:set nofixendofline

Sekarang tentang versi lama vim.

Bahkan jika file sudah disimpan dengan baris baru di akhir:

vim -b file dan sekali dalam vim:

:set noeol
:wq

selesai

atau Anda dapat membuka file dengan vim :e ++bin file

Alternatif lain:

:set binary
:set noeol
:wq
gcb
sumber
6
Anda juga dapat menambahkan set binarydan set noeol.vimrc
dryobs
17
Hati-hati : binarymengganti expandtab, yang akan mengarahkan Anda untuk mendapatkan tab literal di sumber Anda.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4
@CiroSantilli terima kasih! Saya telah mencari efek samping biner selamanya dan bertanya-tanya mengapa ini bukan default! karena saya suka tab saya, saya pikir saya akan mempertimbangkan manfaat tambahan :)
gcb
11
Sekarang Anda dapat menambahkan set nofixendoflineuntuk menyelesaikan masalah di Vim 7.4+
罗泽轩
1
@ TrevorBoydSmith ya, karena secara historis POSIX (saya mungkin salah pada standar aktual) mengharapkan baris baru di akhir baris, dalam file teks. Itu sebabnya sebagian besar solusi diperlukan memperlakukannya sebagai biner. Mungkin sangat nyaman saat itu, dan hari ini terbelakang, itu sebabnya sekarang ada pengaturan yang nyaman. Cukup tambahkan ke vimrc Anda. Bagaimanapun, ada masalah yang lebih buruk di editor lain :)
gcb
23

Tambahkan perintah berikut ke .vimrc Anda untuk mengubah opsi end-of-line:

autocmd FileType php setlocal noeol binary fileformat=dos

Namun , PHP sendiri akan mengabaikan end-of-line terakhir - seharusnya tidak menjadi masalah. Saya hampir yakin bahwa dalam kasus Anda ada sesuatu yang lain yang menambahkan karakter baris baru terakhir, atau mungkin ada mixup dengan windows / unix jenis akhir baris ( \natau \r\n, dll).

Memperbarui:

Solusi alternatif mungkin dengan menambahkan baris ini ke .vimrc Anda:

set fileformats+=dos
terlalu banyak php
sumber
Saya tahu bahwa php tidak salah paham ... Saya telah menunjukkan itu kepada rekan kerja saya, tetapi winmerge menganggapnya berbeda ... Saya akan mencobanya dan memberi tahu Anda bagaimana hasilnya.
Boushley
Melakukan ini memiliki pengaruh yang diinginkan dari tidak ada garis akhir, tetapi juga mengubah file menjadi akhiran baris unix ... (bahkan pada kotak windows) ... Jadi saya telah melakukan itu sebelumnya dengan beralih ke mode biner ... tapi kemudian akhir baris tidak muncul tulis di notepad ... semuanya hanya satu baris.
Boushley
Sayangnya kedua saran itu tidak berfungsi. Menambahkan fileformat = dos ke autocmd tidak berpengaruh, dan mengatur filetype + = dos masih menambahkan trailing \ n
Boushley
Maaf, saya salah, gunakan 'set filetypes + = dos', bukan 'set fileformats ...'
terlalu banyak php
17

Ada cara lain untuk melakukan pendekatan ini jika Anda menggunakan Git untuk kontrol sumber. Terinspirasi oleh jawaban di sini , saya menulis filter sendiri untuk digunakan dalam file gitattributes .

Untuk menginstal filter ini, simpan sebagai noeol_filtersuatu tempat di Anda $PATH, buat itu dapat dieksekusi, dan jalankan perintah berikut:

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat

Untuk mulai menggunakan filter hanya untuk Anda sendiri, masukkan baris berikut di $GIT_DIR/info/attributes:

*.php filter=noeol

Ini akan memastikan Anda tidak melakukan baris baru apa pun dalam suatu .phpfile, apa pun yang dilakukan Vim.

Dan sekarang, skrip itu sendiri:

#!/usr/bin/python

# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: /programming/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __name__ == '__main__':
    try:
        pline = sys.stdin.next()
    except StopIteration:
        # no input, nothing to do
        sys.exit(0)

    # spit out all but the last line
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # strip newline from last line before spitting it out
    if len(pline) > 2 and pline.endswith("\r\n"):
        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("\n"):
        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)
Amir
sumber
Itu solusi yang bagus ... walaupun sayangnya saya tidak menggunakan git. Saya menggunakan svn, meskipun saya curiga pendekatan yang sama bisa diambil.
Ngomong
12

Saya belum mencoba opsi ini, tetapi informasi berikut ini diberikan dalam sistem bantuan vim (yaitu help eol):

'endofline' 'eol'   boolean (default on)
            local to buffer
            {not in Vi}

When writing a file and this option is off and the 'binary' option
is on, no <EOL> will be written for the last line in the file.  This
option is automatically set when starting to edit a new file, unless
the file does not have an <EOL> for the last line in the file, in
which case it is reset.  

Biasanya Anda tidak perlu mengatur atau mengatur ulang opsi ini. Ketika 'biner' tidak aktif nilai tidak digunakan saat menulis file. Ketika 'binary' di atasnya digunakan untuk mengingat keberadaan dari untuk baris terakhir dalam file, sehingga ketika Anda menulis file situasi dari file asli dapat disimpan. Tetapi Anda dapat mengubahnya jika Anda mau.

Anda mungkin tertarik pada jawaban untuk pertanyaan sebelumnya juga: " Mengapa file harus diakhiri dengan baris baru ".

Tim Henigan
sumber
Saya juga telah menemukan pengaturan eol ... tetapi tidak menyelesaikan tugas ini. Ini lebih merupakan variabel yang menentukan apakah seseorang telah ditempatkan di akhir file atau tidak. Juga, itu tidak berpengaruh pada file teks, tetapi hanya pada file biner.
Boushley
3
Bantuan vim juga mengatakan "Ketika 'biner' tidak aktif nilai tidak digunakan saat menulis file." tentang eol
Boushley
1
+1 untuk jawaban VonC pada pertanyaan itu, yang menyoroti bahwa "baris baru" dan EOL sedang digabungkan. Editor inferior salah menampilkan baris baru tambahan karena EOL, vim tidak menambahkan "baris baru"!
ches
9

Saya telah menambahkan tip tentang Vim wiki untuk masalah yang serupa (walaupun berbeda):

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF

Jo Liss
sumber
5
“Vim 7.4.785 menambahkan fixeolopsi yang dapat dinonaktifkan untuk secara otomatis menjaga setiap EOL yang hilang di akhir file. Skrip ini menjadi tidak perlu untuk Vim 7.4.785 dan yang lebih baru. " (Sumber: halaman wiki yang sama.) Terima kasih, saya tidak mengetahui opsi baru itu.
Amir
1
Saya harus menetapkan keduanya noeoldan nofixeoluntuk mencapai hasil yang diinginkan.
selurvedu
8

OK, Anda menggunakan Windows mempersulit;)

Ketika opsi 'binary' me-reset opsi 'fileformat' (dan menulis dengan set 'binary' selalu menulis dengan akhiran baris unix), mari kita ambil palu besar dan lakukan secara eksternal!

Bagaimana dengan mendefinisikan autocommand (: help autocommand) untuk acara BufWritePost? Perintah otomatis ini dijalankan setelah setiap kali Anda menulis seluruh buffer. Dalam perintah otomatis ini panggil alat eksternal kecil (php, perl atau skrip apa pun) yang menghapus baris baru terakhir dari file yang baru saja ditulis.

Jadi ini akan terlihat seperti ini dan akan masuk ke file .vimrc Anda:

autocmd!   "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>

Pastikan untuk membaca seluruh dokumentasi vim tentang autocommand jika ini adalah pertama kalinya Anda berurusan dengan autocommands. Ada beberapa peringatan, misalnya disarankan untuk menghapus semua autocmds di .vimrc Anda jika .vimrc Anda mungkin bersumber beberapa kali.

Blixtor
sumber
Yah ... saya berharap ada solusi yang lebih baik dari ini ... tapi ini pasti berhasil!
Boushley
3
Ini sangat bagus! Yay! Namun saya punya satu pertanyaan ... apakah ada cara untuk membuatnya jadi saya tidak perlu menekan enter dua kali setelah setiap save. Saya harus menekan enter di jendela cmd yang muncul dan sekali lagi karena vim mengatakan kepada saya bahwa skrip dikembalikan berhasil ... Apakah ada cara untuk membuat mereka semua pergi?
Boushley
2
Untuk menghindari permintaan <Tekan Enter> hanya awali perintah dengan silent. Misalnya silent !your-script <afile>.
dash-tom-bang
6

Saya telah mengimplementasikan saran Blixtor dengan Perl dan Python pasca pemrosesan, baik berjalan di dalam Vim (jika dikompilasi dengan dukungan bahasa seperti itu), atau melalui skrip Perl eksternal. Ini tersedia sebagai plugin PreserveNoEOL di vim.org.

Ingo Karkat
sumber
Saya belum mengujinya secara menyeluruh, tetapi itu sepertinya solusi yang lebih baik.
Boushley
Plugin berfungsi, tetapi setelah instalasi saya harus memasukkan let g:PreserveNoEOL = 1ke .vimrcfile saya ! Harus belajar vimscript untuk mencari tahu dari deskripsi plugin! : D
DarthVanger
1
@DarthVanger: :help PreserveNoEOL-usageakan memberitahumu juga. RTFM :-)
Ingo Karkat
@IngoKarkat Oh, maaf. Sedang mencari ini di bawah INSTALLATIONdan CONFIGURATION. Bahkan tidak memperhatikan USAGEbagian dalam deskripsi, karena itu di atas instalasi :)
DarthVanger
3

Mungkin Anda bisa melihat mengapa mereka mengeluh. Jika file php memiliki baris baru setelah akhir?>, Php akan menampilkannya sebagai bagian dari halaman. Ini bukan masalah kecuali Anda mencoba mengirim header setelah file disertakan.

Namun,?> Di akhir file php adalah opsional. Tidak ada akhir?>, Tidak ada masalah dengan baris baru di akhir file.

Ken
sumber
2
Anda benar, tetapi kami sebagai toko memutuskan bahwa kelihatannya memiliki akhir yang lebih baik?> Saya tahu kami bisa berhenti menggunakannya ... tapi saya akan lebih suka menyesuaikan editor saya agar sesuai dengan gaya pengkodean saya daripada sebaliknya.
Boushley
1
Juga, agar Anda tahu php akan secara otomatis mem-parsing tag akhir Anda sebagai?> Atau sebagai?> \ N (karena di linux semua file yang valid harus diakhiri dengan a \ n) ... Jadi kode saya tidak menyebabkan masalah ini ... mereka hanya tidak suka tampilan.
Boushley
2

Saya menambahkan .vimrc

set binary

dan itu membantu, cobalah

IvanM
sumber
2

Saya pikir saya telah menemukan solusi yang lebih baik daripada jawaban yang diterima. Solusi alternatif tidak berfungsi untuk saya dan saya tidak ingin harus bekerja dalam mode biner sepanjang waktu. Untungnya ini sepertinya menyelesaikan pekerjaan saya dan saya belum menemukan efek samping yang buruk: mempertahankan end-of-line yang hilang di akhir file teks . Saya baru saja menambahkan semuanya ke ~ / .vimrc saya.

Jay Paroline
sumber
1

Apakah mungkin bagi Anda untuk menggunakan perintah khusus untuk menyimpan file-file ini?

Jika Anda melakukannya: set binary,: w dan: set nobinary file akan ditulis tanpa baris baru jika tidak ada yang memulai.

Urutan perintah ini bisa dimasukkan ke dalam perintah yang ditentukan pengguna atau pemetaan, tentu saja.

Blixtor
sumber
Sayangnya karena saya bekerja dengan windows, jika saya menyimpannya dalam mode biner, itu memaksa save berada dalam mode unix. Bahkan ketika saya melakukannya: set binary: set fileformat = dos: w: set nobinary Setelah saya berhenti, file itu disimpan dalam format unix ... Saya tidak percaya bahwa tidak ada cara untuk mematikannya.
Boushley
1

Dimulai dengan vimv7.4 yang dapat Anda gunakan

:set nofixendofline

Ada beberapa informasi tentang perubahan itu di sini: http://ftp.vim.org/vim/patches/7.4/7.4.785 .

Victor Yarema
sumber
0

Saya menemukan plugin vimscript ini bermanfaat untuk situasi ini.

Plugin 'vim-scripts/PreserveNoEOL'

Atau baca lebih lanjut di github

Alan Dong
sumber