211

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

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

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

4

14 に答える 14

217

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

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

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

最後のeフラグは、検索パターンが失敗した場合にコマンドがエラーメッセージを発行しないことを意味します。詳細については、を参照:h :s_flagsしてください。

于 2008-12-10T14:03:53.387 に答える
178

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

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()
于 2009-10-24T16:10:50.663 に答える
70

私も通常持っています:

match Todo /\s\+$/

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

Todo は、や などのキーワードをハイライトするために使用される構文ハイライトグループ名です。うんざりするほど醜い黄色がかった背景色があり、コードで不要なものを強調表示するのが最善だと思います:-)TODOFIXMEXXX

于 2008-12-10T14:23:20.897 に答える
53

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

最後に空白を表示するようにエディター (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()
于 2012-12-10T05:06:52.680 に答える
13

複数のFileTypeでフィルタリングする方法は次のとおりです。

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
于 2012-01-13T21:22:11.197 に答える
8

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\+$/
于 2011-08-31T10:33:18.970 に答える
8

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()
于 2017-03-13T06:31:08.783 に答える
5

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

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
于 2008-12-11T23:20:23.557 に答える
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

つまり、変更を隠して+から、作業ディレクトリに変更を再適用するときに、差分のすべての行をフィルター処理して末尾の空白を削除します。このコマンド パイプが成功した場合は、stash を削除します。

于 2014-03-16T17:30:17.273 に答える
1

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
于 2016-09-29T20:50:57.967 に答える
1

.vimrcここでの他のアプローチは、ファイルで使用された場合、MacVim ではうまくいきませんでした。したがって、末尾のスペースを強調表示するものは次のとおりです。

set encoding=utf-8
set listchars=trail:·
set list
于 2014-10-10T12:53:56.127 に答える
0

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

于 2015-06-01T16:37:44.993 に答える