vimで末尾の空白を自動的に削除する方法


197

gitでいくつかのファイルをコミットしようとすると、「末尾の空白」エラーが発生します。

Pythonファイルを保存する直前に、これらの末尾の空白文字を自動的に削除したいと思います。

これを行うようにvimを構成できますか?もしそうなら、どうですか?


3
これはpythonだけでは関係ありません

2
私のDeleteTrailingWhitespaceプラグインを使用します。
Ingo Karkat

回答:


208

ここで答えを見つけました。

以下を.vimrcファイルに追加するとうまくいきました。

autocmd BufWritePre *.py :%s/\s\+$//e

1
面白い!末尾の空白は仕事での戦いです。私はそれを嫌い、他の人はその理由を理解していません。私たちはvimと同じくらい多くのviを使用しています(私はvimを使用していますが、インストールする必要があるため、使用していません)。末尾の空白を取り除くためにstbを呼び出すプログラムがあり、それをフィルターとして使用しています。viでも動作します。これの方が良い。
ジョナサンレフラー、

16
これにより、保存するたびにカーソルの位置が変わります。それを避けることは可能ですか?
stepancheg

3
これはこの質問に対する事実上の答えなので、カーソル位置を維持するために更新する必要があるかもしれません。
エドゥフェリペ

2
これにより、複数行の文字列の末尾のスペースも削除されます。これは、場合によっては望ましくないことがあります。しかし、これを回避する簡単な方法はないと思いますか?
Luator、2015

3
e最後に、パターンが見つからなかった場合、viは置換コマンドが失敗したとは見なさないことを明確に示しているかもしれません
LLenain

169

上記のコンパイルとカーソル位置の保存:

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    keepp %s/\s\+$//e
    call cursor(l, c)
endfun

autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()

保存時にこれを任意のファイルに適用する場合は、2番目autocmdを省略してワイルドカードを使用します*

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()

9
最後の検索を保存して復元することで、関数を改善できます。let _s = @ / let @ / = _ s
xApple

3
autocmd FileType c,cpp,java,php,ruby,python パーツを削除して、すべてのファイルに適用できるようにしました。
swt83 2013

8
@xApple:関数の内部では、最後の検索を保存および復元する必要はありません。関数のコンテキストを残すことで処理されます。
トビアス

3
@ swt83あなたも交換する必要がある<buffer>*あなたはすべてのファイル上の仕事にそれをしたい場合は
cadlac

3
あなたは/ wの置換コマンドの前に付ける場合keepp、それはすなわち、検索履歴を変更しませんkeepp %s/\s\+$//e
jeberle

68

私は通常も持っています:

match Todo /\s\+$/

私の.vimrcファイルでは、行末の空白が強調表示されます。

Todo は、またはのようなキーワードを強調表示するために使用される構文強調表示グループ名です。それは、厄介な醜い黄色がかった背景色を持っています、そして私はあなたがあなたのコードで望まないものを強調するのが最善であると思います:-)TODOFIXMEXXX


7
または、listを設定してlistchars + = trail:を設定することもできます。
Oli、

優れている-これは、後続の空白を自動的に削除する(私が気付かない場合や、同じファイルでたまたま作業している他の人のコードである場合でも)と、何もしないことの間の完璧な中間点です。 。ありがとう。
Daniel Hershcovich

2
残念ながら、私のお気に入りの配色のゼンバーンはハイライトしていません
Peter Long

@ PeterLong、railscastsテーマでも機能しません。で確認してください:hi Todo。だから私は熟読:hi <Tab>しました:help hi。私はと考えCursorError、私は、私がしようと思いますmatch VisualNOS /\s\+$/ 。これをautocmd他の回答のsのいくつかとここで組み合わせるかもしれません。
ブレイディトレーナー2014

51

既存の末尾の空白を強調表示し、末尾の空白も削除します。

エディタ(vim)を設定して、最後に空白を表示します。

ここに画像の説明を入力してください

これを私の.vimrcの一番下に置きます:

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

そして、私はそれらを保存するときにファイルからそれを「自動ストリップ」します。私の場合、ルビーファイルの場合は* .rb、再び私の〜/ .vimrcに

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()

13

これは、複数のFileTypeでフィルタリングする方法です。

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e

すべてのファイル:autocmd FileType * autocmd BufWritePre <buffer>:%s / \ s \ + $ // e
JREAM

7

http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.htmlからコピーして貼り付けました(リンクは機能しなくなりましたが、必要なビットは以下のとおりです)

「これには、ファイルを開いたとき、または挿入モードを終了したときだけ、行末で入力した各スペースが強調表示されないという利点があります。非常にきちんとしています。」

highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/

1
ブログのリンクが切れたようです。
トビアス

同じ解決策は、「matchコマンドの使用」のこのリンクにあります。
ryanjdillon

6

VIM Wikiaのコメントでこの解決策を見た -不要なスペースを削除する

わたしはそれが本当に気に入った。.不要な空白にa を追加します。

ここに画像の説明を入力してください

これをあなたの中に入れて .vimrc

" Removes trailing spaces
function TrimWhiteSpace()
  %s/\s*$//
  ''
endfunction

set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()

5

これが私のやり方です。どこから盗んだのか思い出せない。

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun

2
"*"でそれを行うのはかなり危険です。もし最終的にバイナリファイルを開くと、かなり悪い形になる可能性があります。
マット

おそらく、おそらく最も賢くはありません。その場合も、16進数エディターにvimを使用しません。保存しない限り、実行されません。
gregf 2009

これは、作業する可能性のあるすべてのファイルタイプをリストする代わりの方法に勝ると思います。私はrb、php、cs、html、sass、css、js、coffee、xml、xslt、plなどに取り組んでいます...幸せな媒体はありますか?
Derek Prior

4
vimでバイナリファイルに書き込んでいない限り、これはおそらく問題にはなりません。
gregf 2011年

最初に表示されるのは%s、グローバル(g)フラグがEOLのスペースと同じくらい役に立たない:-)
Jens

3

ファイルから末尾の空白を単に取り除くソリューションは、すべての状況で受け入れられません。最初からこのポリシーが適用されているプロジェクトで機能するため、次のコミットに自分を追加しただけではないような空白はありません。

作業に関係のない変更をコミットせずにコミットを維持するために、編集していない行の既存の空白に影響を与えずに、末尾の空白の新しいインスタンスを追加したくないだけだとします。

その場合、gitを使用すると、次のようなスクリプトを使用できます。

#!/bin/sh

set -e # bail on errors

git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop

つまり、変更を隠しておき、+diffのすべての行をフィルタリングして、作業ディレクトリに変更を再適用するときに、末尾の空白を削除します。このコマンドパイプが成功した場合、スタッシュを削除します。


1

ここで使用されている他のアプローチは、MacVimでは.vimrcファイルで使用した場合、どういうわけか機能しません。したがって、末尾のスペースを強調表示するものを以下に示します。

set encoding=utf-8
set listchars=trail:·
set list

set listchars=trail:·と言って実行しますE474: Invalid argument: listchars=trail:·。例を検証できますか?
ケノーブ2015

1
@kenorbは、stackoverflow.com
questions

0

autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>


0

特定のファイルタイプに対して実行したい場合(FileTypeは必ずしも信頼できるとは限りません):

autocmd BufWritePre *.c,*.cpp,*.cc,*.h,*.hpp,*.py,*.m,*.mm :%s/\s\+$//e

またはvim7で:

autocmd BufWritePre *.{c,cpp,cc,h,hpp,py,m,mm} :%s/\s\+$//e

0

空白を削除する場合は、既にクリーンなファイルに対してのみ行う必要があります。「ローマにいるとき...」。これは、誤った変更が望ましくないコードベースで作業する場合の良いエチケットです。

この関数は、末尾の空白を検出し、既にクリーンな場合にのみトリミングをオンにします。

このアイデアの功績は、ここのコメントの逸品に行きます:https : //github.com/atom/whitespace/issues/10 (これまでで最も長いバグチケットコメントストリーム)

autocmd BufNewFile,BufRead *.test call KarlDetectWhitespace()

fun! KarlDetectWhitespace()
python << endpython
import vim
nr_unclean = 0
for line in vim.current.buffer:
    if line.rstrip() != line:
        nr_unclean += 1

print "Unclean Lines: %d" % nr_unclean
print "Name: %s" % vim.current.buffer.name
cmd = "autocmd BufWritePre <buffer> call KarlStripTrailingWhitespace()"
if nr_unclean == 0:
    print "Enabling Whitespace Trimming on Save"
    vim.command(cmd)
else:
    print "Whitespace Trimming Disabled"
endpython
endfun

fun! KarlStripTrailingWhitespace()
    let l = line(".")
    let c = col(".")
    %s/\s\+$//e
    call cursor(l, c)
endfun

検索レジスタlet _s=@/を保持し、最後にそれを復元することもできます`let @ / = _ s`。この場合、ブラックホールレジスタを使用しています
SergioAraujo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.