VS Code でドキュメントの空白文字を見やすくしてみる


VS Code で、ドキュメント内の空白文字を可視化させて、判別し易くしてみるにはどうすれば良いか？ 一例として、ちょっとまとめてみました。

もともとは、下記のようなつぶやきを見つけたので、

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Visual Studio Codeを使っている方でeditor.renderWhitespaceを有効にした場合に出てくる「・」をわかりやすくする方法知りませんか？<br>Atomみたいに色が変わるとか？ <a href="https://twitter.com/hashtag/code?src=hash">#code</a> <a href="https://twitter.com/hashtag/visualstudio?src=hash">#visualstudio</a></p>&mdash; 高木徹 (@TTrpbm) <a href="https://twitter.com/TTrpbm/status/814670296456171521">2016年12月30日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

このように返してみたら、

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/TTrpbm">@ttrpbm</a> editor.renderWhitespace と直接関係なく、トグル操作になってしまいますが、この拡張機能はいかがでしょ？ Whitespace+ Config で色の変更もできます。<a href="https://t.co/IbtwtApVFq">https://t.co/IbtwtApVFq</a></p>&mdash; Kazuyuki Sato (@satokaz) <a href="https://twitter.com/satokaz/status/814729852527865856">2016年12月30日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

と、返ってきたので調べてみた。(考えもしなかった)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/satokaz">@satokaz</a> 教えていただきありがとうございます！<br>ちゃんとできました。<br>一つ質問なのですが「editor.renderWhitespace&quot;: &quot;boundary&quot;」のような単語と単語の間の空白は無視するにはpatternにどのような値を渡せばよいのでしょうか？</p>&mdash; 高木徹 (@TTrpbm) <a href="https://twitter.com/TTrpbm/status/814826708138213376">2016年12月30日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

勉強になりました。

## 標準設定 `editor.renderWhitespace` で空白文字表示有効にしつつ

VS Code 1.6 で実装された機能。
エディタで空白文字を可視化する手段としては、settings.json に `editor.renderWhitespace` 設定が提供され、これを有効にすると、空白文字を「･」(ビュレット(bullet)、中点、中黒) に置き換えて表示してくれるようになりました。

設定可能な値:

* `none` : スペースを表示しない
* `all` : すべてのスペースを表示する
* `boundary` : 単語間の単一スペースは表示しない

`none` (ビュレットは表示されない):
![2017-01-01-22-12-23.png](https://qiita-image-store.s3.amazonaws.com/0/65800/b64ff042-4166-d1a0-932d-a03bbafeb5fc.png "2017-01-01-22-12-23.png")

`all` (全ての空白にビュレットを表示):
![2017-01-01-22-13-25.png](https://qiita-image-store.s3.amazonaws.com/0/65800/e6ce3cc8-8175-37ae-7bd5-08d6e067f4aa.png "2017-01-01-22-13-25.png")

`boundary` (単語間の単一スペースにはビュレットを表示しない):
![2017-01-01-22-14-29.png](https://qiita-image-store.s3.amazonaws.com/0/65800/33f5306b-2255-bcfe-518b-238f7bf5b322.png "2017-01-01-22-14-29.png")

`all` か `boundary` は好みで。

詳しくは、[September 2016 (version 1.6) のリリースノート](https://code.visualstudio.com/updates/v1_6)で。

* [Improvements to LineNumber and Whitespace settings](https://code.visualstudio.com/updates/v1_6#_improvements-to-linenumber-and-whitespace-settings)
* または、日本語訳が掲載されている "[【Visual Studio Code】Stable版 1.6リリースノート意訳しました](https://blogs.msdn.microsoft.com/ayatokura/2016/10/12/vsc1-6_releasenote/)" で。

## さらに Whitespace+ で色づけして

空白文字に色づけをして表示することが可能な拡張機能。


* [Whitespace+](https://marketplace.visualstudio.com/items?itemName=davidhouchin.whitespace-plus)

さらに、空白文字を検出するためのパターンを正規表現でカスタマイズすることが可能。
enabled/disabled はトグル操作となるため、必要なときにコマンドパレットから `Whitespace+ Toggle` を実行するか、`Whitespace+ Config` コマンドを実行し、`"autoStart":` を `true` に設定することで常に有効にすることもできる。

または、拡張機能のコマンドを適当なキーバインドに割り当てます。(thanks! @takemori_kondo)

| コマンド                         | デフォルトのキーバインド| 概要                              |
|----------------------------------|----------------------|-----------------------------------|
|extension.toggleWhitespacePlus    | なし                 |Toggle the display of the extension|


`Ctrl + Shift + tab` キーに、割り当てる例:
ファイル > 基本設定 > キーボードショートカット > keybindings.json

```json
// 既定値を上書きするには、このファイル内にキー バインドを挿入します
[
    // https://github.com/davidhouchin/whitespace-plus/blob/master/package.json
    { "key": "ctrl+shift+tab",        "command": "extension.toggleWhitespacePlus",
                                         "when": "editorTextFocus" }
]
```


表示対象となるのは `space`, `tab`, `newline`, `trailing` (trailing のみ default disabled で Whitespace+ Mode コマンドで切り替えるか Whitespace+ Config で trailing を `"enabled": true` にする) となり、`space` は、`editor.renderWhitespace` のビュレットを表示しつつ色づけしてくれる。
色も、VS Code に適用している light または dark テーマ別に設定できる。

`space` のデフォルトパターンは 

```
"pattern": "\\s"
```

となっているので、スペースはすべて検出対象となる。全角スペースも対象になる。

`"editor.renderWhitespace": "boundary"` 設定のように、単語間の単一スペースを対象としたくない場合は、

```
"pattern": "\\s{2,}"
```

のようにすると良いみたいだけど、これだと、連続したスペースの場合、スペース毎の区切りが表示されなくなってしまう。　

Whitespace+ 無効 (`"pattern": "\\s"`, `"editor.renderWhitespace": "boundary"`): 
![2017-01-01-22-33-12.png](https://qiita-image-store.s3.amazonaws.com/0/65800/61e82b03-db86-e017-6e53-b0f733f37af5.png "2017-01-01-22-33-12.png")

Whitespace+ 有効 (`"pattern": "\\s"`, `"editor.renderWhitespace": "all"`): 
![2017-01-01-22-50-17.png](https://qiita-image-store.s3.amazonaws.com/0/65800/9f900395-c68b-de39-955d-2f89367e86ee.png "2017-01-01-22-50-17.png")

Whitespace+ 有効 (`"pattern": "\\s"`): 
![2017-01-01-22-34-18.png](https://qiita-image-store.s3.amazonaws.com/0/65800/021f15da-19ea-54c1-b81a-019d2184e578.png "2017-01-01-22-34-18.png")

Whitespace+ 有効 (`"pattern": "\\s{2,}"`): 
![2017-01-01-22-37-17.png](https://qiita-image-store.s3.amazonaws.com/0/65800/e4ad13d1-1646-f171-7bd0-9d1348086374.png "2017-01-01-22-37-17.png")

## indent-rainbow でグラデーションにする

インデントを 4 色で識別し易くする拡張機能。
Whitespace+ で利用する色と不透明度の指定次第になりますが、重ねてグラデーションのように表示することも可能です。
不透明が高いと意味ないのであまりオススメしません。が、Whitespace+ を無効にしたときには、インデントが見やすくなるのでインストールしておいても損はないと思ってます。

* [indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)

indent-rainbow + `"editor.renderWhitespace": "all"`: 
![2017-01-01-22-58-42.png](https://qiita-image-store.s3.amazonaws.com/0/65800/0eef92a4-0012-0303-3a14-9f56adf1bcc2.png "2017-01-01-22-58-42.png")

indent-rainbow + Whitespace+ (`"pattern": "\\s"`, `"editor.renderWhitespace": "all"`): 
![2017-01-01-23-16-46.png](https://qiita-image-store.s3.amazonaws.com/0/65800/bda5df28-caec-34d6-f606-102d0c4cd39a.png "2017-01-01-23-16-46.png")

indent-rainbow + Whitespace+ (`"pattern": "\\s{2,}"`, `"editor.renderWhitespace": "all"`): 
![2017-01-01-23-16-03.png](https://qiita-image-store.s3.amazonaws.com/0/65800/26ad9501-6c87-0d25-0a4d-5c9697c319de.png "2017-01-01-23-16-03.png")

## そして全角スペースも

全角のスペースも時には気が付きにくく。
Whitespace+ では全角スペースも判別してくれるけど、`editor.renderWhitespace` の設定は適用されないのでビュレットは表示されず少し見づらくなる。
そこで、zenkaku 拡張機能を追加することで、全角スペースだけを □ で表示してくれるようになり見やすくなる。

* [zenkaku](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)

なにもなし:
![2017-01-01-21-45-43.png](https://qiita-image-store.s3.amazonaws.com/0/65800/8295950b-ba94-4208-743f-3bffce7ae418.png "2017-01-01-21-45-43.png")

zenkaku 拡張機能を有効に:
![2017-01-01-21-46-39.png](https://qiita-image-store.s3.amazonaws.com/0/65800/99b83d5b-eeb3-0808-030b-32e8ac6092c7.png "2017-01-01-21-46-39.png")

Whitespace+ のみ (`"pattern": "\\s"`):
![2017-01-01-21-52-33.png](https://qiita-image-store.s3.amazonaws.com/0/65800/19228326-9b48-b14a-499a-296113a64363.png "2017-01-01-21-52-33.png")

zenkaku + Whitespace+ 拡張機能の組み合わせ `"pattern": "\\s"`:
![2017-01-01-21-50-24.png](https://qiita-image-store.s3.amazonaws.com/0/65800/08f90ec4-6912-6298-aa6b-28eb961094b8.png "2017-01-01-21-50-24.png")


Whitespace+ のみ (`"pattern": "\\s{2,}"`):
![2017-01-01-21-54-37.png](https://qiita-image-store.s3.amazonaws.com/0/65800/f610e27f-bfde-afde-c3bc-59e5090e187c.png "2017-01-01-21-54-37.png")

zenkaku + Whitespace+ 拡張機能の組み合わせ `"pattern": "\\s{2,}"`:
![2017-01-01-21-56-08.png](https://qiita-image-store.s3.amazonaws.com/0/65800/21aa6839-990d-4027-6ca1-8571c4c10f63.png "2017-01-01-21-56-08.png")

## まとめ

よくわからなくなってしまったけど、Whitespace+ 使ってみると、思わぬところにスペースを入れてしまっているのがわかったりと見えないものが見えるひとつの手がかりになることがわかりました。

## 色をいじるときは

[Color Highlight](https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight) 拡張機能をインストールしておけば、ドキュメント内に書かれているカラーコードをその色でハイライト表示してくれます。
さらに、[Color Picker](https://marketplace.visualstudio.com/items?itemName=anseki.vscode-color) 拡張機能があれば、カラーコードにカーソルを置き、Color Picker を呼び出すことで、値を渡すことができるので色々と捗るかと思います。

* [Color Highlight](https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight)
* [Color Picker](https://marketplace.visualstudio.com/items?itemName=anseki.vscode-color)

![2017-01-01-23-11-03.png](https://qiita-image-store.s3.amazonaws.com/0/65800/dff79c88-f31d-b72e-ef96-569d36c0c3de.png "2017-01-01-23-11-03.png")