web-dev-qa-db-ja.com

Vimがファイルの最後に新しい行を追加するのはなぜですか?

私はwordpress=を頻繁に使用し、特にデバッグの際に何が起こっているのかを理解するために一時的にwordpressコアファイルを変更しました。今日は変更をgitリポジトリにコミットする準備ができたとき、git statusは、wordpressのファイルの1つをコミット用にステージングされていないとマークしていました。ファイルを閉じる前に行ったすべての変更を元に戻したことを覚えているので、diffを使用して変更内容を確認することにしました。プロジェクトのファイルと、ダウンロードディレクトリに保持しているwordpressコピーのファイルとを比較しました。ファイルが最後に異なることがわかりました。diffは、元のファイルの最後に改行がありません:

1724c1724
< }
\ No newline at end of file
---
> }

私もそのラインに触れたことはありません。大きなファイルの途中のどこかで行った変更。これは、vimがファイルの最後に改行文字を追加したと思うようになります。なぜそうなるのでしょうか?

36
Buzu

私がここで見たすべての答えは、質問が「どうすればVimがファイルの終わりに改行文字を追加するのを防ぐことができますか?」ですが、質問は「Vimがファイルの最後に新しい行を追加するのはなぜですか? "私のブラウザの検索エンジンが私をここに連れてきたのですが、その質問に対する答えが見つかりませんでした。

POSIX標準が行を定義する方法に関連しています( なぜファイルは改行で終わるべきなのでしょうか? を参照)。したがって、基本的に、行は次のとおりです。

3.206 Line
0個以上の<newline>以外の文字と、終了する<newline>文字のシーケンス。

したがって、すべて改行文字で終わる必要があります。 Vimが常にデフォルトで改行を追加するのはそのためです(POSIXによれば、常にそこにあるはずです)。

それを行う唯一のエディターではありません。 Gedit[〜#〜] gnome [〜#〜] のデフォルトのテキストエディターは、まったく同じことを行います。


編集

他の多くのツールでも、その改行文字が必要です。例を参照してください:

また、興味があるかもしれません: ファイルの最後に改行を表示する

41
Peque

vimtextエディターであるため、ファイルを「クリーンアップ」できる場合があります。末尾の改行なしで記述する方法の詳細については、 http://vimhelp.appspot.com/vim_faq.txt.html#faq-5.4 を参照してください。

ファイルの最後に改行なしでファイルを書くにはどうすればよいですか?

eolオプションをオフにし、binaryオプションをオンにして、ファイルの最後にEOLを付けずにファイルを書き込むことができます。
:set binary
:set noeol
:w

または、次を使用できます。
:set noeol
:w ++bin

13
paxdiablo

改行の追加は、Vimのデフォルトの動作です。必要ない場合は、次のソリューションを使用してください。 VIMはファイルの終わりで自動改行を無効にする

無効にするには、これを.vimrcに追加します

set fileformats+=dos
6
ATOzTOA

次の行を.vimrcに追加できます

autocmd FileType php setlocal noeol binary

これでうまくいくはずですが、実際にはあなたのアプローチはやや間違っています。まず第一にphpで終わりますが、第二に変更を保存したくない場合はuを押さないでください。さらに悪い場合は手動でファイルの状態を再作成してください。 、ただし保存せずに終了するq!。何らかの理由でエディタを終了して保存した場合は、git checkout <file>

3
Max

3.206行0個以上の非文字と終了文字のシーケンス。

興味深いことに、vimを使用すると、新しいファイルを開いてファイルを書き込むことができ、ファイルは0バイトになります。新しいファイルを開き、「o」を使用して行を追加した場合、ファイルを書き込むと2文字の長さになります。上記のファイルを開いて2行目「dd」を削除し、ファイルを書き込むと、1バイトの長さになります。ファイルをバックアップして開き、残っている唯一の行を削除して、ゼロバイトになるファイルを書き込みます。そのため、vimでは、完全に空である限り、ゼロバイトファイルを書き込むことができます。上記のPOSIX定義を無視するようです。私は推測する...

0
Dr. Wolfe