ファイル内のすべての行から末尾の空白を削除する最も簡単な方法は何ですか?


139

テキストファイルをプログラミングまたは開いて、行の末尾に空白が続くファイルに遭遇することは非常に一般的です。vimには、trailオプションでオプションを設定してlistcharsからオンlistにすることでこれを表示する方法があります。

しかし、ファイル全体でグローバルに末尾の空白を削除する最も簡単な方法は何ですか(理想的にはプラグインなし)?



トピックに関するドキュメントエントリを次に示します。
フィリップW.

あなたがインストールしている場合のvim-よくある質問を、あなたがオフラインで答えを得ることができます:h vim-faqし、検索します/trailing。覚えにくいタグは:h faq-12.1です。
ホッチェク

回答:


72

キーバインドを使用して、末尾の空白をすべて削除します

編集するページには実際に末尾の空白(例:マークダウン)が必要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が散在するファイルがある場合に便利です。


6
:keeppatternsオーバーライドしないようにしてください@/。また、を見てください:keepjumps
ボーア

@Bohrどのバージョンのvimを使用していますか?試した:help keeppatternが何も得られなかった。
クリストファーボトムズ

@ChristopherBottoms少なくともバージョン7.4.155
ボーア

@ボーア。ありがとう!まだ7.4.0を使用していたことがわかります。最新バージョンをインストールしました。
クリストファーボトムズ

2
そして、最後の検索用語は自動的にあなたが、約マックする必要はありません。この道:-)に復元されているのであなたは、関数の中で次のコマンドをラップすることにより、同じ効果を得ることができ:nohl、あなたが何かを強調したならば、それは強調し続ける場合は、どちらかそれ(私の更新された答えを参照)。
マーティントゥルノイジュ

175

「最も簡単な」方法は、単に使用すること:substituteです:

:%s/\s\+$//e
  • :%s:substitute範囲%全体(バッファ全体)を実行します。
  • \s tはすべての空白文字に一致します。
  • \+ それらを1回以上繰り返します。
  • $ 行末に固定します。
  • e一致(ファイル、すなわち、末尾の空白をせずにすでにある)がない場合はエラーを与えないためのフラグ。

ただし、これは2つの副作用を引き起こすため、おそらく「最良の」方法ではありません。

  1. カーソルを最後の一致に移動します。
  2. コマンドを履歴と検索履歴に追加します。
  3. 最後の検索語をリセットします。

これを関数に変えることで両方の項目を修正できます:

fun! TrimWhitespace()
    let l:save = winsaveview()
    keeppatterns %s/\s\+$//e
    call winrestview(l:save)
endfun

そして、それを次のように使用します:

:call TrimWhitespace()
  1. winsaveview()など、カーソルの位置を含む現在の「ビュー」を、保存襞、ジャンプしますwinrestview()最後には、保存された変数からこれを復元します。
  2. これ:keeppatternsにより、\s\+$パターンが検索履歴に追加されなくなります。
  3. 最後に使用した検索語は、関数を離れると自動的に復元されるため、これに対して他に何もする必要はありません。

これは:call常に入力するのがやや面倒なので、コマンドを定義できます。

command! TrimWhitespace call TrimWhitespace()

なしで使用できます:call

:TrimWitespace

もちろん、キーにバインドすることもできます。

:noremap <Leader>w :call TrimWhitespace()<CR>

次のように、ファイルをディスクに書き込む前に自動的にこれを行うことを好む人もいます。

autocmd BufWritePre * :call TrimWhitespace()

一部の形式には末尾の空白(Markdownなど)が必要なため、コード内の末尾の空白も必要な場合(電子メールの書式設定--<Space>、署名の開始を示すマーカーの使用など)が気に入らない)。


恥知らずなプラグモード:少し前に、プロジェクト全体の空白を一度にクリーンアップするための小さなPythonスクリプト作成しました。


1
前の位置に移動する関数を作成したくない場合​`​は、置換が完了した後に2回押すだけで済みます。これにより、次のようなワンライナーを作成できるようになります。%s/\s\+$//e | exe "normal ``"
NeaţuOvidiu Gabriel

1
@NeaţuOvidiuGabriel、もちろん、ワンライナーが実行された後、二重バックティックは同じように機能しません。;)
ワイルドカード

類似:stackoverflow.com/a/1618401。しかし、私はマーティンのコードがより好きです。
ジョンcj

11

(各行の末尾にある)末尾の空白をすべて削除するには、次のコマンドを使用できます。

:%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プラグインもあります。


空白の強調表示

末尾のスペースがすべてなくなったかどうかを再確認するには、次を使用します。

  1. 入力/ $してそれらを見つけます。いくつかある場合、vimはそれらを強調表示します。

  2. 色を使用してそれらを強調表示します。

    :highlight ws ctermbg=red guibg=red
    :match ws /\s\+$/
    
  3. 目に見える文字を使用する(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

ユーザーが保存するすべてのファイルから末尾の空白を削除するため、推奨されません(空白が必要な場合でも)。


こちらもご覧ください:


5

上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)関数は便利なツールであることがわかりました。


2
関数を終了するときに、最後に使用した検索語は自動的に保持されるはずです。そのため、with @/をいじる必要はありません(この場合はとにかく)。
マーティントゥルノイジュ

3
winsaveview()そしてwinrestview()はるかに優れています。
ダッシュトムバン

まったく正しい!フィードバックに基づいて更新されました。
アレックス

0

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の投稿から来ました。

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