web-dev-qa-db-ja.com

vimの末尾の空白を自動的に削除するにはどうすればよいですか

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

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

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

193
Paul D. Eden

私は答えを見つけました こちら

私の.vimrcファイルに次を追加すると、うまくいきました。

autocmd BufWritePre *.py :%s/\s\+$//e
202
Paul D. Eden

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

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    %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()
164
stepancheg

私も通常持っています:

match Todo /\s\+$/

私の.vimrcファイル。これにより、行末の空白が強調表示されます。

Todoは構文ハイライト group-name で、TODOFIXME、またはXXXなどのキーワードをハイライトするために使用されます。それは迷惑なほどyellowい黄色がかった背景色を持っています、そして私はあなたがあなたのコードで欲しいしないことを強調することが最善であるとわかります:-)

68
mat

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

最後に空白を表示するようにエディター(vim)を構成します。

enter image description here

これを私の.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 for Ruby files、again〜/ .vimrc

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

複数のFileTypeでフィルタリングする方法を次に示します。

autocmd FileType c,cpp,python,Ruby,Java autocmd BufWritePre <buffer> :%s/\s\+$//e
13
syvex

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\+$/
7
lazysoundsystem

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

本当に好きだった。不要な空白に.を追加します。

enter image description here

これを.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()
6
Diego Juliao

これが私がやっている方法です。どこから盗んだのか思い出せません。

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

ファイルから末尾の空白を単純に取り除くソリューションは、すべての状況で受け入れられるわけではありません。それは最初からこのポリシーを持っていたプロジェクトで動作するので、今後のコミットに自分を追加しただけのような空白はありません。

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

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

#!/bin/sh

set -e # bail on errors

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

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

3
Kaz

ここでのその他のアプローチは、MacVimで.vimrcファイル。末尾のスペースを強調表示するものは次のとおりです。

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

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

0
aemonge

空白を削除する場合は、onlyのみを削除する必要があります。 「ローマにいるとき...」。これは、誤った変更が好ましくないコードベースで作業する場合の良いエチケットです。

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

このアイデアの功績は、ここでコメントの宝石になります: 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
0
Karl Pickett

特定のファイルタイプに対して実行する場合(FileTypesは常に信頼できるとは限りません):

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
Mr_Pouet