この質問は 回避策 「ファイルの最後に改行を強制的に追加せずにファイルをvimに保存する」という面倒な問題のフォローアップです。
基本的に、set noeol
で.vimrc
を使用することはできません。何もしないからです!
バイナリモードでファイルを編集する場合でも、本来の動作を実行します。 (vim -b file
の代わりにvim file
)
何故ですか?
とにかく.vimrc
で単純な設定をして、編集するすべてのファイルに改行を追加しないようにするには?
また、バイナリモードですべてのファイルの編集を開始すると、どのような問題が発生しますか?これまでのところ、何の違いも見ていません。
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で開かれた単純なファイルを示しています。
(編集)このファイルには行4はありませんそして、ファイルを正しく表示するバンチの唯一のエディターはVimです。行番号列の唯一の目的は、バッファに関する情報を提供することです。 3行しかない4行を表示するのは大きな間違いです。 (終了)
この図は、<EOL>
なしの別の単純なファイルをSublime Textで作成し、同じエディター/ IDEで開いたものを示しています。
バージョン7.4.785から、vimにはfixendofline
設定があります。 binary
(いくつかの副作用があります)を避け、単に設定することができます
set noendofline
set nofixendofline
編集するすべての単一ファイルに改行を追加しないように、.vimrcに簡単な設定をします
そのために、私の PreserveNoEOLプラグイン を使用できます。この簡単な設定で、完了です。あるいは、バッファごとにこれに影響を与えることもできます。
:let g:PreserveNoEOL = 1
Vimdocによると、 noeol
はbinary
モードがオンでない限り何もしません。
*'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.