VIMはファイルの終わりで自動改行を無効にする


250

そのため、私はPHPショップで働いており、私たちは全員、さまざまなエディターを使用しており、すべてWindowsで作業する必要があります。私はvimを使用しており、店内の誰もが、ファイルを編集するたびに下部に改行があると不平を言っています。私は周りを検索しましたが、これはvi&vimの文書化された動作であることがわかりました...しかし、この機能を無効にする方法があるかどうか疑問に思っていました。(私が特定のファイル拡張子に対してそれを無効にすることができればそれは最善でしょう)。

誰かがこれについて知っているなら、それは素晴らしいでしょう!


23
ばかげていると彼らに伝えてください-vimがそれをするのには、実際には正当な理由があります:stackoverflow.com/questions/729692/…。ただし、UNIXライクなサーバーにデプロイする場合にのみ関係があると思います。
hdgarrood 2013年

5
公式のPHP推奨プラクティスは?>、この理由だけで、最後の終了タグを省略することです。
セバスティアンGrignoli

この質問は恐らくスーパーユーザーより前のことです...しかし、そこにあるはずです。
gcb 2013年

20
質問は本当にする必要があります:私たちはあなたのお店の人が、ファイルの最後の行を確実にするために使用している他のエディタのすべてを伝えるにはどうすればよい EOLと終わりを。;-)
TJクラウダー2014

回答:


360

そしてvim7.4以降では、(できれば.vimrcで)使用できます(最後のちょっとしたニュースを罗泽轩に感謝します!):

:set nofixendofline

古いバージョンのvim

ファイルが最後に新しい行で既に保存されている場合でも:

vim -b file そして一度vimに:

:set noeol
:wq

完了しました。

あるいは、vimでファイルを開くことができます :e ++bin file

さらに別の選択肢:

:set binary
:set noeol
:wq

6
あなたはまた、追加することができますset binaryし、set noeolあなたの.vimrcに
dryobs

17
注意binaryオーバーライドexpandtab。ソースでリテラルタブを取得します。
Ciro Santilli郝海东冠状病六四事件法轮功

4
@CiroSantilliありがとうございます!私はバイナリの副作用を永遠に探していて、なぜそれがデフォルトではないのか疑問に思っています!私は自分のタブが大好きなので、その追加のメリットを検討すると思います:)
gcb

11
set nofixendoflineVim 7.4以降の問題を解決するために追加できます
罗泽轩

1
@TrevorBoydSmithはい、歴史的にPOSIX(私は実際の標準では間違っている可能性があります)は、テキストファイルで、行の最後に新しい行を想定しているためです。これが、ほとんどのソリューションでバイナリとして処理する必要がある理由です。当時はとても便利だったと思いますが、今日は逆になっているので、今では便利な設定があります。vimrcに追加するだけです。とにかく、他の編集者にはもっと悪い問題があります:)
gcb

23

次のコマンドを.vimrcに追加して、行末オプションをオフにします。

autocmd FileType php setlocal noeol binary fileformat=dos

ただし、PHP自体はその最後の行末を無視します。問題にはなりません。私はあなたの場合、最後の改行文字を追加している何かがあるか、おそらくウィンドウ/ Unixの行末タイプ(\nまたは\r\nなど)との混同があると確信しています。

更新:

別の解決策は、次の行を.vimrcに追加することです。

set fileformats+=dos

私はphpが間違って解析していないことを知っています...同僚にそれを示しましたが、winmergeはそれらが異なるものと見なしています...私はそれを試してみて、結果がどのようになるかをお知らせします。
Boushley 2009

これを行うと、最終的な行がないという望ましい影響がありますが、ファイルがUNIXの行末に変換されます...(Windowsボックス上でも)...したがって、以前はバイナリモードに切り替えることでそれを行っていました...しかし、その後行末がメモ帳に表示されない...すべてが1行だけです。
Boushley 2009

残念ながら、これらの提案はどちらも機能しません。autocmdにfileformat = dosを追加しても効果はありません。setfiletype + = dosを使用しても、
最後に

申し訳ありませんが、私は間違っている、使用「設定ファイルタイプ+ =ドス」、ない「設定fileformats ...」だ
あまりにも多くのPHPの

17

ソース管理にGitを使用している場合、これに対処する別の方法があります。ここの回答に触発され、私はgitattributesファイルで使用するための独自のフィルターを作成しました。

このフィルターをインストールするには、フィルターをのnoeol_filterどこかに保存し、$PATH実行可能にして、次のコマンドを実行します。

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat

自分だけにフィルタを使用するには、次の行をに入れます$GIT_DIR/info/attributes

*.php filter=noeol

これにより.php、Vimが何をしても、ファイルのeofで改行をコミットしないようになります。

そして今、スクリプト自体:

#!/usr/bin/python

# a filter that strips newline from last line of its stdin
# if the last line is empty, leave it as-is, to make the operation idempotent
# inspired by: /programming/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __name__ == '__main__':
    try:
        pline = sys.stdin.next()
    except StopIteration:
        # no input, nothing to do
        sys.exit(0)

    # spit out all but the last line
    for line in sys.stdin:
        sys.stdout.write(pline)
        pline = line

    # strip newline from last line before spitting it out
    if len(pline) > 2 and pline.endswith("\r\n"):
        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("\n"):
        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)

それは素晴らしい解決策です...残念ながら私はgitを使用していませんでした。私はsvnを使用していましたが、同様のアプローチを取ることができたのではないかと思います。とにかく、私はその立場から
先に進ん

12

私はこのオプションを試していませんが、次の情報はvimヘルプシステム(つまり、help eol)で提供されています。

'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.  

通常、このオプションを設定またはリセットする必要はありません。'binary'がオフの場合、ファイルの書き込み時に値は使用されません。'binary'がオンの場合、ファイルの最後の行のの存在を記憶するために使用されるため、ファイルを書き込むときに元のファイルの状態を維持できます。ただし、必要に応じて変更できます。

あなたは前の質問への答えにも興味があるかもしれません:「なぜファイルは改行で終わるべきなのか」。


私もeolの設定に出くわしました...しかし、それはこのタスクを達成しません。ファイルの最後にすでに配置されているかどうかを決定するのは、変数の詳細です。また、テキストファイルには影響せず、バイナリファイルにのみ影響します。
ブッシュリー2009年

3
vimのヘルプには、「 'binary'がオフの場合、値はファイルの書き込み時には使用されません。」とも記載されています。eolについて
Boushley 2009年

1
その質問に対するVonCの回答の+1は、「改行」とEOLが融合していることを強調しています。劣ったエディターはEOLのために余分な改行を誤って表示します、vimは「改行」を追加していません!
12

9

Vim wikiに同様の(異なるものの)問題のヒントを追加しました。

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF


5
「Vim 7.4.785にはfixeol、ファイルの最後に欠落しているEOLを自動的に保存するように無効にできるオプションが追加されています。このスクリプトはVim 7.4.785以降では不要になります。」(出典:同じwikiページ。)ありがとう、私はその新しいオプションを認識していませんでした。
アミール

1
私は両方を設定しなければならなかったnoeolし、nofixeol望ましい結果を達成するために。
selurvedu 2016

8

OK、Windowsを使用していると状況が複雑になります;)

'binary'オプションは 'fileformat'オプションをリセットするため(そして 'binary'セットで書き込むと常にUNIXの行末で書き込まれます)、大きなハンマーを取り出して外部で実行しましょう!

BufWritePostイベントの自動コマンド(:help autocommand)を定義するのはどうですか?この自動コマンドは、バッファ全体を書き込むたびに実行されます。この自動コマンドで、小さな外部ツール(php、perlまたはその他のスクリプト)を呼び出します。このツールは、書き込んだファイルの最後の改行を削除します。

したがって、これは次のようになり、.vimrcファイルに入ります。

autocmd!   "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>

初めてオートコマンドを扱う場合は、オートコマンドに関するvimのドキュメント全体を必ずお読みください。いくつかの注意点があります。たとえば、.vimrcが複数回ソースされる可能性がある場合は、.vimrc内のすべてのautocmdを削除することをお勧めします。


うーん...これよりも良い解決策があることを望んでいました...しかし、これは間違いなくうまくいきます!
Boushley 2009

3
これはうまくいきます!わーい!ただし、1つの質問があります...保存するたびにEnterキーを2回押す必要がないようにする方法があります。ポップアップが表示されたコマンドウィンドウでEnterキーを押す必要があります。スクリプトが正常に返されたことをvimが通知しているため、もう一度入力する必要があります。
Boushley 2009

2
<Press Enter>プロンプトを回避するには、コマンドの前にを付けsilentます。例えばsilent !your-script <afile>
ダッシュ

6

Vlix内で実行されている場合(そのような言語サポートでコンパイルされている場合)、または外部のPerlスクリプトを介して、PerlおよびPythonの後処理でBlixtorの提案を実装しました。これは、vim.org のPreserveNoEOLプラグインとして入手できます。


私はそれを徹底的にテストしていませんが、それはより良い解決策のようです。
Boushley 2013

プラグインは機能しますが、インストール後let g:PreserveNoEOL = 1.vimrcファイルに挿入する必要がありました。プラグインの説明からそれを理解するためにvimscriptを学ぶ必要がありました!:D
DarthVanger

1
@DarthVanger::help PreserveNoEOL-usageあなたにも言っただろう。
RTFM

@IngoKarkatああ、すみません。この下を探していたINSTALLATIONCONFIGURATIONUSAGEインストールの上部にあるため、説明のセクションにも気付かなかった:)
DarthVanger

3

多分あなたは彼らが不平を言っている理由を見ることができます。phpファイルの末尾に?>の後に改行がある場合、phpはそれをページの一部として出力します。ファイルがインクルードされた後にヘッダーを送信しようとしない限り、これは問題にはなりません。

ただし、phpファイルの末尾にある?>はオプションです。終了しない?>、ファイルの最後の改行に問題はありません。


2
あなたは正しいですが、私たちはショップとして、エンディングがある方が見栄えが良いと判断しました?>使用をやめることができることはわかっています...しかし、コーディングスタイルに合うようにエディターを調整する方がいいです。
Boushley 2009年

1
また、phpが終了タグを?>または?> \ nとして自動的に解析することを知っているので(Linuxでは、すべての有効なファイルは\ nで終わる必要があるため)...したがって、私のコードではこれらの問題は発生しません...見た目が気に入らないだけです。
Boushley

2

.vimrcに追加

set binary

それは役立ちます、それを試してください


2

私は受け入れられた答えよりも良い解決策を見つけたと思います。代替ソリューションが機能していなかったため、常にバイナリモードで作業する必要はありませんでした。幸いなことに、これで問題が解決したようで、私はまだ厄介な副作用に遭遇していません。テキストファイルの最後にある行末の行末を保持します。全部を〜/ .vimrcに追加しました。


1

これらのファイルを保存するために特別なコマンドを使用することは可能ですか?

:set binary、:w、:set nobinaryを実行すると、最初に何もない場合、改行なしでファイルが書き込まれます。

もちろん、この一連のコマンドは、ユーザー定義のコマンドまたはマッピングに含めることができます。


残念ながら私はウィンドウで作業しているため、バイナリモードで保存すると、強制的にUNIXモードで保存されます。:set binary:set fileformat = dos:w:set nobinaryを実行しても、終了するとファイルがUNIX形式で保存されます...これをオフにするだけの方法がないとは思えません。
Boushley 2009


0

このvimscriptプラグインがこの状況に役立つことがわかりました。

Plugin 'vim-scripts/PreserveNoEOL'

またはgithubで詳細を読む

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.