SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【vim】No newline at end of file

問題

gitで差分を確認するときなどに、以下のメッセージが出ます。

\ No newline at end of file

見た目には何も違わないように見えるのですが、なぜ?

答え

vimでテキストファイルを編集すると、「改行(\n)が付与される」。

POSIX的にはテキストファイル末尾には改行があるべきらしく、vimでテキストファイルを開いて保存すると改行が付く。

この挙動をしないようにするには、以下のコマンドを実行してからファイルを保存するとよい。

:set binary
:set noeol

まとめて書くとこう。

:set binary noeol

混乱のもとは、ファイル末尾に改行を付与するエディタ(vim)とファイル末尾に改行を付与しないエディタ(他のエディタ)混在しているからかと思われる。

vimの挙動を確認

EmEditorで7文字入ったファイルを作る。末尾に改行はない。容量は7byte。

16進ダンプを確認。改行はない。

$ od -c test.txt
0000000   t   e   s   t   1   2   3
0000007

vimで開いて何もしないで保存して終了(:wq)すると、容量が8byteになった。

16進ダンプを確認。改行が付与された。

$ od -c test.txt
0000000   t   e   s   t   1   2   3  \n
0000010

:set binary noeol してから保存して終了(:wq)すると、容量は7byteになった。

改行は消えた。

$ od -c test.txt
0000000   t   e   s   t   1   2   3
0000007

vimでは末尾の改行が見えないのも混乱の原因でしょうか。(noeolと表示はあるものの)

末尾に改行あり
末尾に改行なし[noeol]
末尾に改行あり
末尾に改行なし

対策は……

テキストなのに、「バイナリだよ」と設定するのももやもやするところ。

vim的にはテキストファイルは「改行までが1行です」なのでしょう。

vimに合わせるなら、他のエディタでも行末に改行を入れるのがよいかもしれません。

他のエディタでは「行番号2」が見えても気にしないこと。

メモ

vscodeだとファイル末尾に改行を入れる設定がある。

"files.insertFinalNewline": true

関連するメモ

コメント