web-dev-qa-db-ja.com

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

だから私はPHPショップで働いており、私たちはすべて異なるエディターを使用しており、私たちはすべてウィンドウで作業しなければなりません。私はvimを使用していますが、ショップの全員が、ファイルを編集するたびに一番下に改行があると不平を言っています。私はあちこち検索して、これがviとvimの文書化された動作であることを発見しました...しかし、この機能を無効にする方法があるかどうか疑問に思いました。 (特定のファイル拡張子に対して無効にできれば最高です)。

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

230
Boushley

vim 7.4+の場合は(できれば.vimrcで)使用できます(ニュースの最後のビットをありがとう!):

:set nofixendofline

vimの古いバージョンに関して。

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

vim -b fileおよびvimで1回:

:set noeol
:wq

できた。

または、:e ++bin fileを使用してvimでファイルを開くことができます

さらに別の選択肢:

:set binary
:set noeol
:wq
324
gcb

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

autocmd FileType php setlocal noeol binary fileformat=dos

ただし、、PHP自体はその最後の行末を無視します-問題ではないはずです。あなたの場合、最後の改行文字を追加しているものがあるか、Windows/unixの行末タイプ(\nまたは\r\nなど)と混同している可能性がほぼ確実です。

更新:

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

set fileformats+=dos
23
too much php

ソース管理に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

これにより、Vimが何をしても、.phpファイルの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: https://stackoverflow.com/questions/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283

import sys

if __== '__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)
17
Amir

このオプションを試したことはありませんが、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.  

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

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

11
Tim Henigan

同様の(ただし異なる)問題について、Vim wikiにヒントを追加しました。

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

9
Jo Liss

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を削除することをお勧めします。

8
Blixtor

私は、Blixtorの提案をPerlとPython後処理で実装しました。Vim内で(そのような言語サポートでコンパイルされている場合)、または外部のPerlスクリプト経由で実行します。 vim.orgで PreserveNoEOLプラグイン として利用可能です。

6
Ingo Karkat

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

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

3
Ken

.vimrcに追加します

set binary

それが助けになります

2
IvanM

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

2
Jay Paroline

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

:set binary、:w、および:set nobinaryを実行すると、最初に何もなければファイルは改行なしで書き込まれます。

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

1
Blixtor

vim v7.4以降で使用できます

:set nofixendofline

その変更についての情報がここにあります: http://ftp.vim.org/vim/patches/7.4/7.4.785 .

0
Victor Yarema

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

Plugin 'vim-scripts/PreserveNoEOL'

または github で詳細を読む

0
Alan Dong