web-dev-qa-db-ja.com

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

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

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

23
Michael Durrant

これはすべてのファイルに対して(.vimrcファイルで)機能します。

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

これは、Ruby(.rb)ファイルだけで(.vimrcファイルで)機能します。

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

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

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(".")
22
Runium

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

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

2
Ingo Karkat