web-dev-qa-db-ja.com

「noeol」が機能するために、バイナリモードでvimが必要なのはなぜですか?

この質問は 回避策 「ファイルの最後に改行を強制的に追加せずにファイルをvimに保存する」という面倒な問題のフォローアップです。

基本的に、set noeol.vimrcを使用することはできません。何もしないからです!

バイナリモードでファイルを編集する場合でも、本来の動作を実行します。 (vim -b fileの代わりにvim file

何故ですか?

とにかく.vimrcで単純な設定をして、編集するすべてのファイルに改行を追加しないようにするには?

また、バイナリモードですべてのファイルの編集を開始すると、どのような問題が発生しますか?これまでのところ、何の違いも見ていません。

41
gcb

Vimがファイルの最終行の最後に「追加」するのは「改行」文字です。これは「改行」と混同しないでください。

「改行」文字、またはより正確には「行末」文字(<EOL>)は、「このポイントの後に来るものはすべて、別の行にあると見なされなければならない」ことを意味します。この解釈では、<EOL>は行terminatorです—ファイルの最後の行は、実質的に<EOL>を持つ最後の行です。

問題は、ほとんどのエディターとIDEの解釈が異なることです。<EOL>は行separator—そして論理的にはデフォルトnot新しいファイルの最後の行の最後に<EOL>を追加し、<EOL>に出会ったときに余分な "実際の最終行の後の「改行」。

要するに、Vimは「改行」を追加しません。他のエディターは、その「改行」を「間違って」「改行」と解釈します。

ただし、次の操作を行うことでこの問題を回避できます。ファイルを書き込む前に、「:set binary noeol- free」のままにする場合は、<EOL>を実行します。

ただし、:h 'binary':set binaryの危険性について多くのことを言っているので、常に「オン」にすることは悪い考えのように思えます。

さまざまな動作を説明するために、2つのファイルを<EOL>で連結しようとすると、次のようになります。

$ cat file1    $ cat file2         $ cat file1 file2

lorem ipsum    Le tramway jaune    lorem ipsum
dolor sit      avance lentement    dolor sit
amet           dans le             amet
                                   Le tramway jaune
                                   avance lentement 
                                   dans le

<EOL>なしで2つのファイルを連結しようとすると、これが起こります。

$ cat file1    $ cat file2         $ cat file1 file2

lorem ipsum    Le tramway jaune    lorem ipsum
dolor sit      avance lentement    dolor sit
amet           dans le             ametLe tramway jaune
                                   avance lentement 
                                   dans le

最初の動作は、何らかの形で予想される動作と、Vimおよび多くの(ほとんどではないが)UNIX-yプログラムがterminator解釈および追加をデフォルトとする理由です。最後の行の最後に<EOL>文字。

以下の図は、<EOL>nano(Vimでも同じ)で作成され、Eclipse、TextMate、Sublime Text、Vim、XCode、およびTextEditで開かれた単純なファイルを示しています。

<EOL>

(編集)このファイルには行4はありませんそして、ファイルを正しく表示するバンチの唯一のエディターはVimです。行番号列の唯一の目的は、バッファに関する情報を提供することです。 3行しかない4行を表示するのは大きな間違いです。 (終了)

この図は、<EOL>なしの別の単純なファイルをSublime Textで作成し、同じエディター/ IDEで開いたものを示しています。

No <EOL>

94
romainl

バージョン7.4.785から、vimにはfixendofline設定があります。 binary(いくつかの副作用があります)を避け、単に設定することができます

set noendofline
set nofixendofline
15
mrajner

編集するすべての単一ファイルに改行を追加しないように、.vimrcに簡単な設定をします

そのために、私の PreserveNoEOLプラグイン を使用できます。この簡単な設定で、完了です。あるいは、バッファごとにこれに影響を与えることもできます。

:let g:PreserveNoEOL = 1
3
Ingo Karkat

Vimdocによると、 noeolbinaryモードがオンでない限り何もしません。

            *'endofline'* *'eol'* *'noendofline'* *'noeol'*
'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.  Normally you don't have to set or reset this
    voption.  When 'binary' is off the value is not used when writing the
    file.  When 'binary' is on it is used to remember the presence of a
    <EOL> for the last line in the file, so that when you write the file
    the situation from the original file can be kept.  But you can change
    it if you want to.
3
FDinoff