テキストファイルをプログラミングまたは開いて、行の末尾に空白が続くファイルに遭遇することは非常に一般的です。vimには、trail
オプションでオプションを設定してlistchars
からオンlist
にすることでこれを表示する方法があります。
しかし、ファイル全体でグローバルに末尾の空白を削除する最も簡単な方法は何ですか(理想的にはプラグインなし)?
:h vim-faq
し、検索します/trailing
。覚えにくいタグは:h faq-12.1
です。
テキストファイルをプログラミングまたは開いて、行の末尾に空白が続くファイルに遭遇することは非常に一般的です。vimには、trail
オプションでオプションを設定してlistchars
からオンlist
にすることでこれを表示する方法があります。
しかし、ファイル全体でグローバルに末尾の空白を削除する最も簡単な方法は何ですか(理想的にはプラグインなし)?
:h vim-faq
し、検索します/trailing
。覚えにくいタグは:h faq-12.1
です。
回答:
編集するページには実際に末尾の空白(例:マークダウン)が必要F5なものとそうでないものがあるため、キーバインドを設定して、自動化せずに簡単に実行できるようにします。これを行うには、以下のコード(vim.wikiaから)またはそのバリエーションをに追加します.vimrc
:
"Remove all trailing whitespace by pressing F5
nnoremap <F5> :let _s=@/<Bar>:%s/\s\+$//e<Bar>:let @/=_s<Bar><CR>
nnoremap <F5>
F5
通常モードでキーへの非再帰的なマッピングを行います :let _s=@/
(マクロからの@/
)最後の検索語を変数に保存します_s
<Bar>
|
ただし、コマンドを分離するパイプシンボルとして機能しますが、|
このコンテキストではコマンドが終了するため、<Bar>
代わりに使用する必要があります。:%s/\s\+$//e
末尾の空白を検索し、バッファ内のすべての場所で削除します(この式の詳細な内訳については、CarpetSmokerの回答を参照してください)let @/=_s
最後の検索用語をマクロ@/
に復元するので、次にヒットしn
たときに利用可能になります。<CR>
マッピングを終了します末尾の空白をすべて削除したくない場合は、パターンを使用してより選択的にすることができます。たとえば、次のコードは、セミコロン(ここでは)の後にある場合にのみ、末尾の空白を削除する方法を示していますF8。
nnoremap <F8> :let _s=@/<Bar>:%s/;\s\+$/;/e<Bar>:let @/=_s<Bar><CR>
これは、私のように、セミコロンで終了するプログラミングステートメントの間にマークダウンのようなheredocsが散在するファイルがある場合に便利です。
:keeppatterns
オーバーライドしないようにしてください@/
。また、を見てください:keepjumps
。
:help keeppattern
が何も得られなかった。
:nohl
、あなたが何かを強調したならば、それは強調し続ける場合は、どちらかそれ(私の更新された答えを参照)。
「最も簡単な」方法は、単に使用すること:substitute
です:
:%s/\s\+$//e
:%s
:substitute
範囲%
全体(バッファ全体)を実行します。\s
tはすべての空白文字に一致します。\+
それらを1回以上繰り返します。$
行末に固定します。e
一致(ファイル、すなわち、末尾の空白をせずにすでにある)がない場合はエラーを与えないためのフラグ。ただし、これは2つの副作用を引き起こすため、おそらく「最良の」方法ではありません。
これを関数に変えることで両方の項目を修正できます:
fun! TrimWhitespace()
let l:save = winsaveview()
keeppatterns %s/\s\+$//e
call winrestview(l:save)
endfun
そして、それを次のように使用します:
:call TrimWhitespace()
winsaveview()
など、カーソルの位置を含む現在の「ビュー」を、保存襞、ジャンプしますwinrestview()
最後には、保存された変数からこれを復元します。:keeppatterns
により、\s\+$
パターンが検索履歴に追加されなくなります。これは:call
常に入力するのがやや面倒なので、コマンドを定義できます。
command! TrimWhitespace call TrimWhitespace()
なしで使用できます:call
:
:TrimWitespace
もちろん、キーにバインドすることもできます。
:noremap <Leader>w :call TrimWhitespace()<CR>
次のように、ファイルをディスクに書き込む前に自動的にこれを行うことを好む人もいます。
autocmd BufWritePre * :call TrimWhitespace()
一部の形式には末尾の空白(Markdownなど)が必要なため、コード内の末尾の空白も必要な場合(電子メールの書式設定--<Space>
、署名の開始を示すマーカーの使用など)が気に入らない)。
恥知らずなプラグモード:少し前に、プロジェクト全体の空白を一度にクリーンアップするための小さなPythonスクリプトを作成しました。
`
は、置換が完了した後に2回押すだけで済みます。これにより、次のようなワンライナーを作成できるようになります。%s/\s\+$//e | exe "normal ``"
(各行の末尾にある)末尾の空白をすべて削除するには、次のコマンドを使用できます。
:%s/ \+$//
タブを含める\s
には、スペースの代わりに使用します。
コマンドラインから:
$ ex +'%s/\s\+$//e' -cwq file.c
現在のディレクトリ内のすべてのファイル(再帰的にを使用**/*.*
):
$ ex +'bufdo!%s/\s\+$//e' -cxa *.*
Pythonの方法:
:py import vim
:pydo vim.current.buffer[linenr - 1] = vim.current.buffer[linenr - 1].strip()
または:
:py import vim
:py for i, l in enumerate(vim.current.buffer): vim.current.buffer[i] = l.rstrip()
使用lstrip()
、左ストリップ(トレーリング)のためのrstrip()
(リーディング)右ストリップまたはstrip()
両端から除去します。
ここに追加できる行の終わりから余分な空白を削除する便利な関数があります.vimrc
:
" Removes superfluous white space from the end of a line
function! RemoveWhiteSpace()
:%s/\s*$//g
:'^
"`.
endfunction
そのためのDeleteTrailingWhitespaceプラグインもあります。
空白の強調表示
末尾のスペースがすべてなくなったかどうかを再確認するには、次を使用します。
入力/ $
してそれらを見つけます。いくつかある場合、vimはそれらを強調表示します。
色を使用してそれらを強調表示します。
:highlight ws ctermbg=red guibg=red
:match ws /\s\+$/
目に見える文字を使用する(source):
:set encoding=utf-8
:set listchars=trail:·
:set list
関連項目:不要なスペースを強調表示する
デフォルトで末尾の空白を強調表示するには.vimrc
、次のように構成できます。
highlight ws ctermbg=red guibg=red
match ws /\s\+$/
autocmd BufWinEnter * match ws / \+$/
デフォルトで空白を削除する
ファイル内のすべての末尾の空白が保存時に自動的に削除されるようにする場合、次のコマンドをに追加できます.vimrc
。
autocmd BufWritePre *.c,*.php :%s/ \+$//ge
ユーザーが保存するすべてのファイルから末尾の空白を削除するため、推奨されません(空白が必要な場合でも)。
こちらもご覧ください:
上Exapnding クリストファー・ボトムスの答えビット:ジョナサンPalardyは、この上で良い記事を書きました。その中で、彼はPreserve(command)
、任意のコマンドの実行中にエディターの状態(主にカーソル位置と最後の検索パターン)を保持する関数を書きます:
function! Preserve(command)
" Preparation: save window state
let l:saved_winview = winsaveview()
" Run the command:
execute a:command
" Clean up: restore previous window position
call winrestview(l:saved_winview)
endfunction
これには多目的という利点があります。たとえば、これを使用して、次のようにマッピングすることにより、末尾の空白をすべて置き換えることができます(ジョナサンが行うように)。
nnoremap <F5> :call Preserve("%s/\\s\\+$//e")<CR>
また、視覚モードのマッピングに使用して、視覚的に選択された行の末尾のスペースを削除することもできます。
xnoremap <F5> :call Preserve("'<,'>s/\\s\\+$//e")<CR>
そして、あなたは=
あなたの場所を保持しながら使用してドキュメント全体をフォーマットするなど、他の呼び出しにそれを使用することができます(競合しないように今回は別のキーを使用してください):
nnoremap <F6> :call Preserve("normal gg=G")<CR>
結局のところ、このPreserve(command)
関数は便利なツールであることがわかりました。
@/
をいじる必要はありません(この場合はとにかく)。
winsaveview()
そしてwinrestview()
はるかに優れています。
StripTrailingSpaces関数の別のバージョン:
if !exists('*StripTrailingWhitespace')
function! StripTrailingWhitespace() range
if !&binary && &filetype != 'diff'
call Preserve(":" . a:firstline . "," . a:lastline . "s/\\s\\+$//e")
endif
endfunction
endif
実際、この機能にはバグがあります(この機能):「範囲」オプションのため、ポジションは維持されません。それは削除され、非常にうまく機能しますが、いくつかの助けを得るためにコードを共有しています。
ご覧のように、上記のPreserve機能も使用しますが、少し異なります。
ここでの違いは、行の範囲または段落を選択できvip
、その範囲:'<,'>
がコマンドプロンプトに自動的に表示されることです。
このアイデアはBez Hermosoの投稿から来ました。