Git でいくつかのファイルをコミットしようとすると、「末尾の空白」エラーが発生します。
Python ファイルを保存する直前に、これらの末尾の空白文字を自動的に削除したいと考えています。
これを行うように Vim を構成できますか? もしそうなら、どのように?
Git でいくつかのファイルをコミットしようとすると、「末尾の空白」エラーが発生します。
Python ファイルを保存する直前に、これらの末尾の空白文字を自動的に削除したいと考えています。
これを行うように Vim を構成できますか? もしそうなら、どのように?
ここで答えを見つけました。
私の.vimrcファイルに以下を追加するとうまくいきました:
autocmd BufWritePre *.py :%s/\s\+$//e
最後のe
フラグは、検索パターンが失敗した場合にコマンドがエラーメッセージを発行しないことを意味します。詳細については、を参照:h :s_flags
してください。
上記のコンパイルとカーソル位置の保存:
function! <SID>StripTrailingWhitespaces()
if !&binary && &filetype != 'diff'
let l:save = winsaveview()
keeppatterns %s/\s\+$//e
call winrestview(l:save)
endif
endfun
autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
保存時にこれを任意のファイルに適用する場合は、2 番目autocmd
を省略してワイルドカードを使用します*
。
autocmd BufWritePre,FileWritePre,FileAppendPre,FilterWritePre *
\ :call <SID>StripTrailingWhitespaces()
私も通常持っています:
match Todo /\s\+$/
私の.vimrc
ファイルでは、行末の空白が強調表示されるようにします。
Todo は、や などのキーワードをハイライトするために使用される構文ハイライトグループ名です。うんざりするほど醜い黄色がかった背景色があり、コードで不要なものを強調表示するのが最善だと思います:-)TODO
FIXME
XXX
既存の末尾の空白を強調表示し、末尾の空白も取り除きます。
最後に空白を表示するようにエディター (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()
そして、ファイルを保存するときにファイルから「自動ストリップ」します。私の場合、Rubyファイルの場合は *.rb 、再び ~/.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のコメントでこのソリューションを見ました -不要なスペースを削除します
本当に好きだった。.
不要な空白に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()
これが私がやっている方法です。どこから盗んだのか覚えていません。
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
つまり、変更を隠して+
から、作業ディレクトリに変更を再適用するときに、差分のすべての行をフィルター処理して末尾の空白を削除します。このコマンド パイプが成功した場合は、stash を削除します。
If you trim whitespace, you should only do it on files that are already clean. "When in Rome...". This is good etiquette when working on codebases where spurious changes are unwelcome.
This function detects trailing whitespace and turns on trimming only if it was already clean.
The credit for this idea goes to a gem of a comment here: https://github.com/atom/whitespace/issues/10 (longest bug ticket comment stream ever)
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
.vimrc
ここでの他のアプローチは、ファイルで使用された場合、MacVim ではうまくいきませんでした。したがって、末尾のスペースを強調表示するものは次のとおりです。
set encoding=utf-8
set listchars=trail:·
set list
autocmd BufWritePre * :%s/\s\+$//<CR>:let @/=''<CR>