vimにファイルの最後に改行を自動的に追加させる方法は?


16

Vimは通常<EOL>、元のファイルに1行があった場合にのみ最後の行に書き込みます。

常にファイルの最後に新しい行を書き込むようにvimを作成する方法(ファイルがバイナリではなく、まだない場合)?

eolオプションをテストしましたが、期待どおりに機能しませんでした。

関連項目:テキストファイルの終わりで行末の欠落を保持しますが、反対です。そして:なぜファイルは改行で終わる必要があるのですか?

回答:


17

基本情報

Vimはバッファーに最新の改行を表示しませんが、実際にはvimはファイルを書き込むときに常にEOLをファイルの最後に配置します。これはUnixシステムのテキストファイルの標準だからです。詳細については、こちらをご覧ください。要するに、vimのファイルの最後に新しい行がないことを心配する必要はありません。

実験1

この小さな実験を行って、この動作を確認できます。ターミナルで次を実行します。

$vim test_test

たとえば、文字のみを入力し、1ファイルを保存します:w

ファイルには1文字しかありませんよね?実際にはありません:)あなたは今あなたのファイル1LFキャラクターを持っています。hexdumpユーティリティで確認しましょう:

$hexdump test_test

出力:

0000000 31 0a
0000002

31文字のASCIIコードがあり1、かつ0a非印刷のASCIIコードでLFすでに行の終わりのためのコードを知っている可能性としてUNIXの文字。

実験2

しかしeol、ファイルの最後にシンボルがないファイルを開くとどうなりますか。それも確認しましょう。最後にeolなしでファイルを作成してみましょう。たとえば次のように:

$echo -n "1" > test_without_eol

そして、再びhexdumpで内部を見てみましょう。

$hexdup test_without_eol

出力は次のようになります。

000000 31
0000001

したがって、ここにはeol文字はありません。このファイルをvimで開きましょう:

$vim test_without_eol

エディターの下部に表示されます:

"test_without_eol" [noeol] 1L, 1C

このファイルを保存すると、eolキャラクターは自動的にパットされます。

これについて私たちにできることは何ですか?

ファイルの終わりを本当に見る必要がある場合。このコマンドを使用してみてください:

:set listchars=eol:$

すべてのeol文字が$記号として表示されます。


すごい。混乱の後、私は同じ結論に達しました。なぜなら、Vimはこの新しい行を実際には表示していなかったからです。
ケノーブ

1
あなたはこのCOMANDを使用して、すべてのEOLのcharachtersを表示することができる方法によって@kenorb:set listchars=eol:$
アレクサンダーMyshov

「実際にこの新しい行を表示していませんでした」-Unixには行がありません。行は「LF文字で終わる非LF文字の数」として定義されます。LFを「次の行に移動する」ではなく「行の終わり」と考えると、Vimが突然行う意味が大きくなります。
アマダン

8

Vimは唯一のファイルとして開かれた場合にEOLを省略'binary' し、'endofline'(とき開口部のバイナリファイルは、EOLを持っていなかった、または明示的にオプションをリセットする場合)オプションがリセットされます。言い換えれば、Vimはバイナリファイルの欠落したEOLのみを尊重します。テキストファイルの場合、常に(追加された)EOLで書き込みます。(だからこそ、EOLなしでテキストファイルを保持するために私のPreserveNoEOLプラグインのようなソリューションが必要です。)ですべての詳細を見つけることができます:help 'endofline'

そのため、VimにEOLを自動的に書き込ませるために、ファイルを非バイナリとして開くようにするだけです。


5

アレクサンダーが言及した、Vimはそのように(特にと混乱だ理由です、EOFでEOLを示していない空/ブランクの新しいライン、別のものである)ので、それは実際にファイルを保存上のすべての時間を書き込みます。

以下は、それが機能するかどうかをテストする簡単なテストです。

$ 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

EOLがない場合のシェルプロンプトの動作に注意してください(次の行と混在します)。Vimでファイルを再保存すると、追加されます。

使用wcすると、保存する前と保存した後の行、単語、文字をカウントできるため、実際に変更されていることがわかります。

なぜこれがとても重要なのですか?ファイルをPOSIX準拠に保つため。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.