Vimにすべての空白を文字として表示させる


772

Vimですべての空白を文字として表示する方法が見つかりません。私が見つけたすべては、タブ、末尾のスペースなどに関するものでした。


14
私もこの問題を正確に解決しようとしています。これに遭遇した場合は、に関する別の応答を行わないでください:set list。それは私たちの質問に答えません。(他のコーナーへ:以下のmrucciの回答は役に立ちますが、実際の解決策ではありません。)
ELLIOTTCABLE

1
スペースはで表示され、スペースがタブの直後にあるlistlistchars考えるすべての人にとって。この状況ではほとんど見えません。ほとんどの状況を把握できることに同意しますが、すべてのスペースを適切に強調表示できると便利です。
Kevin Cox

11
新規訪問者の場合:これは、新しいバージョンのvimで解決されています!以下のbrettanomyces回答を参照してください。
ELLIOTTCABLE 2016年

1
関連(その差スタック):vi.stackexchange.com/questions/422/...
Pureferret

回答:


693

他の人が言ったように、あなたは使うことができます

:set list

と組み合わせて、

:set listchars=...

非表示の文字を表示します。
現在、空白を表示するために使用できる明示的なオプションはありませんが、listcharsでは、すべての空白に対して表示する文字を設定できます。たとえば、私のように見えます

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<

だから、今、あなたが使用した後

:set list

それ以外のものとして明示的に示されていないものはすべて、実際には、単純な古い空白です。

いつものように、仕組みを理解するlistcharsには、ヘルプを使用してください。表示できる文字(末尾のスペースなど)とその方法に関する優れた情報を提供します。

:help listchars

編集中に変更を簡単に確認できるように、トグルを追加すると役立つ場合があります(ソース:VIM:set list!.vimrcのトグルとして):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>

4
「他のものとして明示的に示されていないものすべて」?範囲U + 2000..U + 200AのUnicodeスペースを試してください。固定幅フォントがそれらをサポートする場合、それらは通常の0x20スペースと同じように表示されます。
ZyX

2
@ZyX-私はUnicode全体ではなく、かなり一般的な文字セットを使用していました。答えに満足できない場合は、改善点を提案してください。
ルーク

20
@ckarbass-:set invlist
Rook

すばらしいヒントです。set listchars行を.vimrcファイルに追加することをお勧めします。これにより、この非表示の文字を表示する簡単な方法を:set listいつでも簡単に有効にできます(このページを再度グーグルする必要はありません)。
Melebius 14年

8
@ckarbass vimで何かをトグルするのと同じ方法-!最後まで。それで:set listになります!

275

パッチ7.4.710以降、listcharsを使用して、スペースの代わりに表示する文字を設定できるようになりました。

:set listchars+=space:␣

したがって、すべての空白文字を文字として表示するには、次のようにします。

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
:set list

メーリングリストに関するディスカッション:https : //groups.google.com/forum/?fromgroups#!topic / vim_dev / pjmW6wOZW_Q


2
これはかっこいいですが、なぜeolのキャラクターが他のキャラクターと違って色分けされないのか疑問に思っています。
CMCDragonkai 2016

3
私はこれを試しましたが、最初はエラーになりました。「スペース」は、私が使用していた少し古いバージョンのgvimでは有効なオプションではないことがわかりました。gvimをアップグレードすると問題が解決しました。エラーが発生している他のユーザーについて:help listcharsは、「space」が「listchars」の有効なオプションであるかどうかを確認するために入力します。そうでない場合は、指定した@brettanomycesのパッチにvimをアップグレードしてください。または、スペースを表示したくない場合は、「スペース」をsetコマンドから除外してください。
Niko Bellic

4
私は、スペース文字(Unicodeのための中ドット(U + 00B7)を使用するspace:·ことがなどMS Wordやメモ帳++、次のようになりますよう、)
Dinei

1
@ user5359531 <ctrl-v> u2334を試して、Unicodeのオープンボックス文字(␣)を入力してください。詳細はsanctum.geek.nz/arabesque/special-characters-in-vimを参照してください
Brett Y

3
<C-K>.Mvimと入力し·ます。詳細:h digraphについては、を参照してください。
johnchen902 2018

252

:set list 有効にする。

:set nolist 無効にします。


11
モードを切り替える方法をご紹介いただきありがとうございます。他の高度な答えがそれを教えてくれると思います。
Jonathan Komar 2016年

1
はい、これは役に立ちます。私がこの答えを自分で見つけただけで、それがトップサイトの答えであることを願っています。
Ejoso

8
: set list!:)
skippr

@Skipprどのような基準で?キーを押す回数と同じですが、Shiftとの!両方で入力するのが困難ですno。.vimrcに入れている場合は、exclamフォームの方が読みやすいことに同意します。
Dan Bechard 2017年

7
@Danこれを比較的短い時間でオン/オフに切り替えたい場合は、:set list!を入力する必要なしに切り替えますnolist!単純に現在設定されているものの反対を行います。特にを使用する場合は、これを常に使用し:set paste!ます。私は見つけるために、矢印キーを押す嫌い:set paste:set nopaste
skippr

188

ここでの他の答えはより包括的だと思いますが、タブとスペースを視覚的に区別するために通常使用するトリックを共有したいと思いました。

:syntax on
:set syntax=whitespace

これらは、Whitespaceプログラミング言語の構文強調表示ルールです。タブは緑で表示され、スペースは赤で表示されます。:)

:set list他の多くの回答で述べられているように組み合わせることができますが、タブは緑色のハイライトなしで^ Iとして表示されますが、スペースは赤色で表示されます。


7
私はこれが好きです。とても賢く、他のほとんどの答えよりも何とか気分が良くなります。ただし、実際にいつでも使用できるソリューションではありません。
ComputerDruid

4
私はもっ​​と従来の方法を好みますが、私は独創性のためにこれを+1しています。
Sietse van der Molen

28
言語が何かに役立つことは知っていまし
Dan Bechard、2015

1
強調表示に使用している.vim構文ファイルにリンクしてもかまいませんか
SeldomNeedy

2
@SeldomNeedy何もダウンロードする必要はありません。空白を強調するルールは何年もVimに同梱されています。奇妙なバージョンや本当に古いバージョンのVimを使用しているのでない限り、これらは本質的に組み込みでなければなりません。
Eliot

91

:set listすべての空白を文字として表示します。すべてが、スペースは、まだ昔ながらのスペースを見れば、それは本当に昔ながらのスペースの手段だと通常の状態よりも異なります。:)


35
これをオフに戻す:set nolist
Greg K

6
「show whitespace」をオンにしたSublime Text 2のように、スペース文字を表示したい場合はどうでしょうか。とても役に立った。
Olical

私がここに来た理由ではありませんが、とても役に立ちました。ありがとう。
harperville 2013年

4
またして切り替えることができていないとオプション!終わり:set list!
baldrs

私はこれのためにワンライナーを使います:se hls | /\_s。すべてを取得しますが、set listスペースは無視します。もう一度オフにし:se nohlsます。この記事にそれについての詳細:albertech.blogspot.com/2015/02/...

73

設定した場合:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none

次にスペースの検索を実行すると、すべてのスペース文字が下線文字として表示されます。

このコマンドは、スペースの「アンダースコア」を切り替える便利な関数で使用できます。

set hls
let g:HLSpace = 1
let g:HLColorScheme = g:colors_name
function ToggleSpaceUnderscoring()
    if g:HLSpace
        highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
        let @/ = " "
    else
        highlight clear
        silent colorscheme "".g:HLColorScheme
        let @/ = ""
    endif
    let g:HLSpace = !g:HLSpace
endfunction

次のコマンドを使用して、関数をショートカットキーにマッピングします。

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

注意:色スキームが設定された後、vimrcで関数を定義します。


1
まあ、それは少しハックですが、これまでのところ何よりも近いです。賞金が授与されました!:D
ELLIOTTCABLE

45

現在のバッファーの構文規則によっては、次のようなものが機能する可能性があります。

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv

これには、+ conceal機能を備えたvim 7.3が必要です。

2014 年10月24日更新少し拡大します。もちろん、conoredキャラクターの強調表示を定義することも可能です。

  • 隠された文字がどのように見えるかを構成できます。強調表示するには、少なくとも1回は「非表示」の強調表示グループ:h hl-Concealを設定する必要があります(これはカラースキームで行うことができ、再度設定する必要はありません。ただし、これはすべての隠された文字に影響します(たとえば、構文スクリプトはさらにいくつかの項目を隠します、それらは空白文字として表示されます。

    :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

  • 構文スクリプトがskipwhiteキーワードを使用する場合、Vimがスペースを強調表示しないという特殊性があるようです。回避策はありません(おそらくこれは修正されるでしょう、私はパッチを投稿しました)

  • listモードでスペースがどのように見えるかをカスタマイズできるパッチが周りに浮かんでいるようです。執筆時の最新のものはこれだそうです。(つまり、これを使用するには独自のVimを構築する必要があります)。
  • conceallevelそしてconcealcursor、ウィンドウローカルなオプションです。つまり、ウィンドウによって異なる場合があります(ファイルタイププラグインや他のプラグインスクリプトによっても設定される可能性があります)。
  • 構文強調表示グループは、構文定義ファイルが再ロードされるたびに実行する必要があります。これは、使用して行うことができるBufWinEnter可能性もかSyntax、あるいはFileTypeオートコマンド。(私は実際にどれが機能するかテストしていません)。

最後の2つの項目は、構文規則と対応するオプションをリセットするいくつかの自動コマンドをセットアップする必要があることを意味します。最初の例では、ColorScheme自動コマンドを使用して強調表示を設定することができます(隠された文字は、カラースキームが実際に設定するものとは関係なく、常に同じに見えるようにするためです)。完全なソリューションについては、romainlの回答を調べてください。機能を設定する場合、トグルコマンドを簡単に設定して、特別なハイライトの表示のオンとオフを切り替えることができます。

アップデート10/26/2014この質問からプラグインを作成しました。

更新2015年4月22日listオプションを使用してこれを可能にするパッチがVimに含まれています。単に設定するset list listchars+=space:␣ これはVim 7.4.711以降で機能します


これはうまくいきます!これをどのように追加でき.vimrcますか?
Eric Martindale 2013年

1
これは現在のバッファで機能するため、おそらくこれを自動コマンドにラップする必要があります。BufEnterあるいは構文自動コマンドあなたのためかもしれない作業:
クリスチャンBrabandt

3
Æこれは奇妙な性格の選択ですが、なぜ·ですか?
Marius Gedminas、2014年

1
これが正解です。このキャラクターに適切な構文強調表示を追加する方法についてのアイデアはありますか?それが非常に色あせていたら、私はそれを好みます・
空爆

@ChristianBrabandt、あなたはあなたのレポを汚染する末尾のnrrwrgn関連ファイルの束を持っています。
romainl 2014年

31

私はこれを使います

/\s
:set hlsearch

空白を強調表示します。すべての空白を検索し、ハイライトを有効にしてそれらを飛び出させます。ただし、特殊文字印刷されませ


最も単純なソリューションimho。検索をクリアするコマンドと組み合わせて使用​​(私はを使用nnoremap <leader><space> :noh<cr>
Lenna

24

空白によって「」文字を意味する場合、私の提案は検索/置換にすぎません。他の人が示唆したように、非印刷文字をで設定された表示文字にset list変更します。listchars

スペースを他の文字として明示的に表示するには、以下のようなものがうまくいくはずです。

:%s/ /█/g

次に、変更を元に戻し、再び元に戻します。

(█私はこの正確なキーシーケンスを押し取得します:%s/ /CTRL-KFB/g


2
私は他の回答よりもこれが好きです。これは:set list私に逆のように見え、可視文字( 'スペース')を_non priting_(??)に変更します。私はこれが内部のマッチを使うことができるかどうか疑問に思う例えば:match MyBlackBlockChar "appropriate_regexそれはトリックをするべきであるね?
スディ

他の回答も役に立ちますが、これは実際にOPの質問+1に実際に回答する最初の回答です
Alexx Roche 2013

1
または:%s/\s/█/g、すべての空白について。また、:set hlsearchplus :&s/\s//gnも役立ちます。

16

スペースを強調表示するには、それを検索するだけです。

/ <スペース>

ノート:

  • <space>は、スペース文字を入力することを意味します。
  • :set hlsearchで検索結果の強調表示を有効にする

    スペースとタブを強調表示するには:

    / [<space> <tab>]

    ハイライトを削除する簡単な方法は、他のものを検索することです:/ asdf

    (ランダムな文字の短いリストを入力するだけです)


  • 1
    これは、3年前に投稿された回答と同じです。また、:nohは、強調表示されていないテキストの/ asdfよりも高速です。または、f1を:nohに設定することもできます。

    @DrEvalは、あなたが参照していると仮定すると、ベネディクト・コッペルの答え、それは実際には微妙に違うのです/<space>/\s。ここでの提案を使用することは自明ではなく、より速いと思います。
    icc97 2017

    14

    以下のコードは、Christian Brabandtの回答に基づいており、OPが望むことを実行しているようです。

    function! Whitespace()
        if !exists('b:ws')
            highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE
            highlight link Whitespace Conceal
            let b:ws = 1
        endif
    
        syntax clear Whitespace
        syntax match Whitespace / / containedin=ALL conceal cchar=·
        setlocal conceallevel=2 concealcursor=c
    endfunction
    
    augroup Whitespace
        autocmd!
        autocmd BufEnter,WinEnter * call Whitespace()
    augroup END
    

    これらの行を自分に~/.vimrc追加し、新しいVimセッションを開始して、まだ不完全な魔法が発生することを確認してください。

    デフォルトの色を編集して、文字を隠してください。


    警告:*FuncBodyいくつかの言語の構文グループに何かがあると、中央のドットが表示されません。そのソリューションの信頼性を高める方法は(まだ?)わかりません。


    それが「構文グループに依存する」と私が言ったことです。これは、synキーワードとskipwhiteフラグの組み合わせの問題だと思います。
    クリスチャンブラバンド2014年

    @ChristianBrabandt、ええ、私はそれを「自動」にする以外に、あなたがすでにしたことを超えることはできませんでした。
    romainl 2014年

    1
    はい、これskipwhiteは構文ルールの引数であり、構文グループが一致しないようにします(ただし、すべてのグループに含めることが許可されている必要があります)。
    Christian Brabandt 2014年

    インデントに背景を追加するインデントガイドでこれをうまく機能させる方法はありますか?これを背景色を上書きしないようにすることの問題ではないかと思いますが、これは簡単なことではないようです。
    Mike

    空白の強調表示が不要な場合にこれを無効にする方法は?短いトグルコマンドの種類を探しています。
    yuvaeasy

    11

    私はこの質問に対する他のすべての答えに不満を感じました。なぜなら、それらのどれもスペース文字を有用な方法で強調していないからです。文字としてスペースを表示することは、タブとスペースを混在させることが有害な、空白でフォーマットされた言語で特に役立ちます。

    私の解決策は、タブを表示して複数のスペースに下線を引くことです。mrucciの回答このチュートリアルを借用したものです。構文の強調表示を使用するため、永続的です。

    set list listchars=tab:\|\ 
    highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    match Whitespace /  \+/
    

    これを使用すると、タブはとして表示され|、スペースはとして表示されるため、_コードスタイルを混合していることを簡単に識別できます。

    私が見つけた唯一の欠点は、このスニペットが(コメントのように)背景に合わせて背景色を調整しないことです。


    8

    上記のすべての答えは、vim内からスペースを見えるようにしようとするものです。目に見えるスペースをドットとして主張する場合は、別の方法があります...

    vimでそれができない場合は、フォントを完全に変更してください。Ubuntu One Monoフォントをコピーし、FontForgeを使用して編集しました。フォントのフルネーム、ファミリ、優先ファミリ、互換性のあるフル(FontFogeでは、フォント情報のTTF名の下にあります)を変更して、別のフォントとして使用することを忘れないでください。スペース文字を編集して、中央にドットを入れ、フォントを〜/ .fontsに保存します。これで、gvimまたはターミナル全体に使用できます...「!」をコピーしました 文字、行を削除し、ドットを中央に移動しました。5分ちょっとかかりました...

    注:スペース文字(0x20)を変更すると、vim画面全体にドットが表示されるという不都合が生じます...(ただし、スペースがタブから分離されます...)


    2
    これは、画面全体をドットで塗りつぶすことに関するメモを読むまでは、本当に良いアプローチのように思えました。:/
    friederbluemle 2015

    3
    創造性のためのポイント!:-)
    jpaugh

    7

    私は既存の答えから私が欲しかったものを正確に見つけることができませんでした。以下のコードは、すべての後続スペースを明るい赤で強調表示します。以下を追加するだけです.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()
    

    5
    :match CursorLine /\s\+/
    

    「スペースを表示するためにスペースを検索する必要があります」というビットは避けますが、スペースにハイライトしないことを実行するようにafaictを構成することはできません。CursorLineは任意のハイライトグループにすることができ、デフォルトのテーマではプレーンな下線です。


    この方法ではタブとスペースの違いがわからないので残念ですが、ワンライナーであるのが気に入っています。
    Rustavore 2013年

    5

    空白を表示するために特殊文字を使用するのが好きです。簡単に確認できるように、切り替えるマップも重要な機能です。

    この機能は、2004年以降更新されていない古いvimスクリプトにあります。

    vim-scripts/cream-showinvisibles@vim.org

    プロジェクトのvimスクリプトバンドルのおかげで、このプラグインを復活させることができます

    vim-scripts / cream-showinvisibles @ github

    さらに良いことに、これに対する私の2セントは、(事前定義されたの代わりに)構成可能なショートカットを追加することです。F4

    これを〜/ .vimrcに追加します

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    

    vimにプラグインをインストールする

    :PluginInstall
    

    そこに行く


    5

    Unicodeの空白文字をカバーするには:

    set list
    set listchars=tab:│\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from https://stackoverflow.com/a/37903645 (with `\t`, `\n`, ` `, `\xa0` removed):
    call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]')
    

    結果:

    • 序数スペース(U + 0020)のみがスペース( " ")のように見える
    • タブ(U + 0009)は「│ 」のように見えます(2文字:長いパイプと順序スペース;それらはで灰色になりますcolorscheme murphy
    • 通常の改行しないスペース(U + 00A0)は " ·"(1文字です。は灰色ですcolorscheme murphy
    • その他の空白文字は赤の「」のように見えます

    1
    「ctermbg = Red」を追加して、端末がカラーリングで機能するように編集しました。個人的に私set listchars=tab:»\ ,space:·はあなたの参照のために使用しました。
    ジョニーウォン

    @JohnnyWong更新ありがとうございます。最初はレビューアによって拒否されましたが、コードを確認しましたが、(当然のことながら)gvimとの両方で機能しvimます。
    Kirill Bulygin

    1
    すばらしい答えです。これは、SafariとFirefoxでレンダリングされない狭い非改行スペース(Hex 202f)をキャプチャするために私がまさに必要としたものです。
    Chris Kobrzak

    4

    あなたは使うことができます

    :set list
    

    線の構造を実際に確認します。タブと改行が明示的に表示されます。ブランクが表示された場合、それは実際にはブランクです。


    3

    ハイライト検索

    :set hlsearch 
    

    .vimrcつまり

    スペースタブとキャリッジリターンを検索します

    / \|\t\|\r
    

    またはすべての空白文字を検索します

    /\s
    

    すべての非空白文字を検索する方法(空白文字は表示されないため、単語間に空白文字は表示されますが、末尾の空白文字は表示されません)

    /\S
    

    末尾の空白文字をすべて表示するには-行末

    /\s$
    

    3

    これらのハックをコメントとして.vimrcに保持するので、シェルでは単純に次のようにします。

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    

    1
    :se list
    :se nolist
    

    :se十分です、:set必要ありません。


    1

    スペースを強調表示することもできます(スペースをブロックに置き換える):

    :%s/ /█/g
    

    (書き戻す前に元に戻す)


    1

    これを.vimrcに追加するとうまくいきます。競合するものがないことを確認してください。

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.