Vimが改行を追加するのはなぜですか?これは慣習ですか?


22

Vimを開いて入力すると、Vimにitest<Esc>:wq改行はないが、コードに改行が含まれているように見えるファイルが表示されます。

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005

Vimを開いて入力すると、Vimにitest<Return><Esc>:wqは1 つの改行がありますが、コードには2つの改行があるファイルが取得されます。

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006

Vimを開いている-u NONEので、ローカル設定は使用されていません。また、これは私の以前の質問に関連しているかもしれないことに注意してください。

これは私のシステム情報です:

$ 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 pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

このシステムでもまったく同じ動作を確認できます。

$ 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 pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@

Vimが改行を追加するのはなぜですか?これは慣習ですか?

hdUbuntu Serverにインストールされたコマンドに関する説明を次に示します。

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump

8
それは慣習のようです。ここだあなたがしたい場合は、それを無効にする方法。ここだ、このの歴史が。
jliv902 14

回答:


28

UNIXテキストファイルの規則では、すべての行は改行で終了し、改行は行区切り記号ではなく行終端記号であるということです。

Vimはバッファーをファイルとして保存するとき、そのファイル形式の行末シーケンス(Unixの場合は改行)ですべての行を終了します。見る

:help 'fileformat'

Unixテキスト処理ツールを使用している場合は、この規則に従うことをお勧めします。ただし、ファイルの最終行の最後に改行を入れないようにする必要がある場合は、そうすることができます。Vimはそのようなファイルを「バイナリ」と見なします。見る

:help 'binary'
:help edit-binary

1
面白いですね。それで有名な\ r \ n対\ nのほかに。Windowsは行区切り記号を使用し、unixは行終端記号を使用しますか?それはどこにでも文書化されていますか?おそらくunixに適用されるとここで定義されていることを知っています。 -line文字」
barlop

しかし、ウィンドウは行区切り文字を使用することが文書化されていますか?
barlop 14

2

Vimは、自分でそこに置いていないものは何も追加しません。

「改行」文字は「改行」ではなく、両方の例は完全に正常です。

  • 最初のファイルでは、ファイルには1行しか含まれていないため、「改行」文字を1つ取得します。
  • 2番目の行では、ファイルに2行が含まれているため、2つの「改行」文字が取得されます。

2
改行は追加されます。次のようにテストします。printf "\x41" > /tmp/test.txt次に、「A」文字が1つだけであることを確認しxxd /tmp/test.txtます。今vim /tmp/test.txt<ENTER>:wq。2バイトのファイル「A \ n」をもう一度確認してください。
ルスラン14

行は改行文字で終わります。1行なので、改行文字が1つあります。
ロメイン14

さて、printfここ以降、整形式の「線」はありませんでした。vimの後に1つあります。だから、私がそこに入れなかったものを追加します。
ルスラン14

printfを追加しない限り、あなたは行ではありません\n。テキストエディタなので、Vimはデフォルトで行を扱う、そして任意のファイルに挿入するテキストがある、あなたが明示的にそれをしないためにVimを指示しない限り、非常に少なくとも、ライン上。
ロメインル14

2

終了していないテキストファイルは、さまざまな理由で悪意があります。ここに私がまだ言及していないものがあります:

末尾に改行がないテキストファイルが許容される仮想世界では、0行を含むファイルと1行の空白行を含むファイルに違いはありません。どちらも0バイトのファイルで表されます。

ファイル内の行数を決定できないのは悪いことです。


非UNIXシステムのテキストファイルには、0個以上の完全な行と、0個以上の文字の不完全な行が含まれます。空のファイルには空白行は含まれません。ゼロの完全な行とゼロ文字の部分的な行が含まれています。あいまいさはどこにありますか?
supercat

この「部分的な線」は不快な概念です。ファイルの終わり以外にファイルを置くことはできません。また、「部分的な行」を持たないファイルを作成することはできません。ファイルの連結にさらに破損を追加します-ファイル間に改行を挿入しても、元のファイルのペアと意味的に同等ではないものになります(2つのファイルには2つの部分的な行があり、そのうちの1つは何かになりました異なる。)非上品な提案。

ファイルを連結すると、最初の最後の部分行が次のファイルの先頭に追加されるという事実は、両方のファイルに完全な行が含まれる場合に一般的に厄介です(完全な行を含まないファイルを連結すると便利な場合があります)が、それはそれが何であるかです。Unixは、部分的な行で終わるテキストファイルの作成を禁止していません。このようなファイルを連結すると、MSDOSのように動作すると思います。私が思うの違いは、多くのDOSベースのエディタは、歴史的に...読み込み、すぐにファイルを保存すると、新しいファイルを生成する必要があるという見解をとっているということである
supercat

...これは古いものと少し同一です(PC-Writeの初期バージョンの登録ユーザーは、それを使用して実行可能ファイルのコピーを開き、上書きモードに切り替え、特定の文字列を見つけて、シリアルナンバー!)。ファイルを保存するときにファイルを強制的に改行で終了させると、その制約に違反します。
supercat

2

Vim 8.0では、これにfixeolオプションが提供されています。具体的には:

:set nofixeol

ファイルにまだ改行文字が含まれていない場合、Vim 最後の行の末尾に改行文字を追加しません。

それは、ファイルタイプのプラグイン、または場合によってはあなたの.vimrc

(これは:set binary最終的な改行文字にのみ影響するため、これは改善されていbinaryますが、実際にはバイナリファイルを編集していない限り、おそらく望まない他の一連の動作も変更します。)

新しく作成されたファイルには、デフォルトで末尾の改行文字が残ります。さらに変更することで、それを変更できます(そして、すでに最終改行があるファイルを改行なしにする)。

:set noeol

変更するファイルごとに個別に設定する必要があります。ファイルをバッファにロードすると、常にeolファイルの現在の状態に一致するように設定されます。


1

「j」コマンドを使用すると、すべての行を1つに結合できます。

最後の行のLFまたはCRLFも削除する場合は、viで次の手順を実行します。

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.