web-dev-qa-db-ja.com

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

Vimを開いてitest<Esc>:wqと入力すると、改行のないファイルin Vimが返されますが、コードに改行があるようです。

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

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

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

-u NONEでVimを開いているので、使用されているローカル構成はありません。これは 以前の私の質問 に関連している可能性があることにも注意してください。

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

$ 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@

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

$ 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@

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

Ubuntu Serverにインストールされたhdコマンドについて、以下に説明します。

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

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

Unixテキストファイルの規則では、すべての行が改行で終了し、改行は行の区切り文字ではなく、行の終了文字です。

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

:help 'fileformat'

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

:help 'binary'
:help edit-binary
29
garyjohn

Vim 8.0はfixeolオプションでこれを提供します。具体的には、次の場合:

:set nofixeol

次に、Vim しないファイルにまだ改行がない場合は、最終行の最後に改行文字を追加します。

それはファイルタイププラグイン、またはおそらくあなたの.vimrc

(これは:set binaryは、最後の改行文字にのみ影響を与えるため、binaryは、実際にバイナリファイルを編集している場合を除き、他の動作も変更する可能性があるためです。)

新しく作成されたファイルには、デフォルトで引き続き末尾改行文字が含まれます。さらに次のようにすることで、それを変更することができます(そして、最終改行が既にあるファイルを、改行がないように切り替えることができます)。

:set noeol

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

4
Smylers

終端されていないテキストファイルは、いくつかの理由で悪です。これは私がまだ言及していないものです:

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

ファイルに何行あるかを決定できないと悪いでしょう。

2
user240960

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

「改行」文字はnotが「改行」であり、どちらの例も完全に正常です。

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

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

最後の行のLFまたはCRLFも削除したい場合は、viで次のようにします。

$ vi file
:set binary
:set noeol
:w!
:f          look for [noeol] on the status line
:q
1
Robert