Gitでいくつかのファイルをコミットしようとすると、「末尾の空白」エラーが発生します。
pythonファイルを保存する直前に、これらの末尾の空白文字を自動的に削除したいです。
これを行うようにvimを構成できますか?もしそうなら、どのように?
上記のコンパイルとカーソル位置の保存:
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()
私も通常持っています:
match Todo /\s\+$/
私の.vimrc
ファイル。これにより、行末の空白が強調表示されます。
Todoは構文ハイライト group-name で、TODO
、FIXME
、またはXXX
などのキーワードをハイライトするために使用されます。それは迷惑なほどyellowい黄色がかった背景色を持っています、そして私はあなたがあなたのコードで欲しいしないことを強調することが最善であるとわかります:-)
既存の末尾の空白を強調表示し、末尾の空白を削除します。
最後に空白を表示するようにエディター(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 for Ruby files、again〜/ .vimrc
function! TrimWhiteSpace()
%s/\s\+$//e
endfunction
autocmd BufWritePre *.rb :call TrimWhiteSpace()
複数のFileTypeでフィルタリングする方法を次に示します。
autocmd FileType c,cpp,python,Ruby,Java autocmd BufWritePre <buffer> :%s/\s\+$//e
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\+$/
VIM Wikia-不要なスペースを削除する のコメントでこの解決策を見ました
本当に好きだった。不要な空白に.
を追加します。
.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()
これが私がやっている方法です。どこから盗んだのか思い出せません。
autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
%s/[ \t]\+$//ge
%s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
ファイルから末尾の空白を単純に取り除くソリューションは、すべての状況で受け入れられるわけではありません。それは最初からこのポリシーを持っていたプロジェクトで動作するので、今後のコミットに自分を追加しただけのような空白はありません。
コミットに作業に関係のない変更がないようにするために、編集していない行の既存の空白に影響を与えずに、末尾の空白の新しいインスタンスを単に追加したくないと仮定します。
その場合、gitを使用すると、次のようなスクリプトを使用できます。
#!/bin/sh
set -e # bail on errors
git stash save commit-cleanup
git stash show -p | sed '/^\+/s/ *$//' | git apply
git stash drop
つまり、変更を隠してから、すべての+
の行を変更して、作業ディレクトリに変更を再適用するときに末尾の空白を削除します。このコマンドパイプが成功すると、スタッシュが削除されます。
ここでのその他のアプローチは、MacVimで.vimrc
ファイル。末尾のスペースを強調表示するものは次のとおりです。
set encoding=utf-8
set listchars=trail:·
set list
autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>
空白を削除する場合は、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
特定のファイルタイプに対して実行する場合(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