ViとVimで保存時に末尾のスペースを自動的に削除する方法は?


22

.vimrcファイルを保存するときに末尾の空白を自動的に削除する設定はありますか?

理想的には(安全のために)特定のファイルに対してのみこの機能を使用したい、例えば *.rb

回答:


25

これはすべてのファイルに対して(.vimrcファイルで)動作します:

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

これは(.vimrcファイルで)ruby(.rb)ファイルに対してのみ機能します:

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

6
このソリューションは素晴らしいですが、カーソルを正しく再配置するため、以下の@Sukminderのソリューションの方が優れていると思います。
hlin117

ラストは何をe使用していますか?
アクティラント

19

カーソルの位置を維持するには、次のようなものを使用します。

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

そうでない場合、カーソルは保存後の最後の置換の行の先頭になります。

:行末にスペース122があり、オンライン982で入力し:wます。位置を復元しないと、カーソルが行の先頭で終了し、122ワークフローが中断されます。

を使用して関数の呼び出しを設定しますautocmd。いくつかの例を示します。

" Using file extension
autocmd BufWritePre *.h,*.c,*.java :call <SID>StripTrailingWhitespaces()

" Often files are not necessarily identified by extension, if so use e.g.:
autocmd BufWritePre * if &ft =~ 'sh\|perl\|python' | :call <SID>StripTrailingWhitespaces() | endif

" Or if you want it to be called when file-type i set
autocmd FileType sh,perl,python  :call <SID>StripTrailingWhitespaces()

" etc.

次の方法でgetpos()を使用することもできますが、この場合は必要ありません。

let save_cursor = getpos(".")
" Some replace command
call setpos('.', save_cursor)

" To list values to variables use:
let [bufnum, lnum, col, off] = getpos(".")

2

私のDeleteTrailingWhitespaceプラグインはこれを行い、さまざまな単純な:autocmdsフローティングとは対照的に、特殊なケースも処理し、ユーザーにクエリを実行したり、末尾の空白で書き込みを中止したりできます。

プラグインページには、代替へのリンクが含まれています。Vim Tips Wikiでも大きな議論があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.