2022/07/31

[vscode] vscode と editorconfig

私はテキストエディタでハードタブ、キャラクタコードで 0x09 の表現をスペース4つで見えるようにしていることが多い。

UNIX とかは 8 文字だけど、横幅が広くなると困るので 4 つにしている。
もともと C言語で書いていて、X Window とかで書いているときはそのまま従って 8 つだったのだけど、当時の文化として「横幅はだいたい 80桁で!」だったはずだ。メールも 76 だったと思う。
そうなるとインデントで幅を取られることが馬鹿らしくなり、自然と短くしていったのだった。

 

HTML を触ることがあった。
そのときに「タブは 2文字」というのがよく使われていたのだ(私の作業では)。
そもそもその時代になると、ハードタブで個人差が生じるくらいだったらソフトタブでスペースを直接埋め込めば間違いがない、という風潮だったように思う。
「インデントを削るのに文字数分削除するのが面倒!」「間違えて 3 とか 5 になってしまうかもしれないじゃないか!」と心の中で反発しつつも使っていくと、うん、慣れてしまった。
今やスペースでタブを表現せずにどうするんだ、くらいまでになっている。
人間、そんなもんだよね。

 

さて、ここまでは時代の風潮くらいのものなのだが、言語仕様でタブを意識するモノが出てきた。
Python と Golang だ。

Python は、インデントが正しくなっていないと実行時エラーになっていたと思う。
面倒なので例として PEP8 のインデントルールを見てみよう。

PEP 8 – Style Guide for Python Code | peps.python.org
https://peps.python.org/pep-0008/#indentation

> Use 4 spaces per indentation level.

なるほど、4スペースか。
・・・ではなく、Python の仕様確認が先だろう。

2.1.8 Indentation
https://docs.python.org/release/2.5.1/ref/indentation.html#l2h-9

> First, tabs are replaced (from left to right) by one to eight spaces such that the total number of characters up to and including the replacement is a multiple of eight (this is intended to be the same rule as used by Unix). The total number of spaces preceding the first non-blank character then determines the line's indentation. Indentation cannot be split over multiple physical lines using backslashes; the whitespace up to the first backslash determines the indentation.

Google翻訳
> まず、タブは (左から右へ) 1 から 8 個のスペースで置き換えられ、置換を含む最大文字数が 8 の倍数になります (これは、Unix で使用されるのと同じ規則になるように意図されています)。次に、空白以外の最初の文字の前にあるスペースの総数によって、行のインデントが決まります。バックスラッシュを使用してインデントを複数の物理行に分割することはできません。最初のバックスラッシュまでの空白がインデントを決定します。

うーん、これを正しく解釈できる自信がない。
tabs を one to eight spaces に置換するということは、純粋に 8文字のスペース文字に変換するのではなく、 8文字インデントになっている文章と見なして最大 8 文字のスペース文字に変換して頭を揃えようとする、ということだろうか。
インデントエラーの例も、けっこう緩いと思った。

  • 関数の先頭がインデントされているのはエラー
  • 関数の中身がインデントされていないのはエラー
  • インデントされないはずの行でインデントが変化しているのはエラー
  • インデントが戻るはずがない行でインデントが変化しているのはエラー

いくつインデントすべき、みたいなのは要件に入らないということだろう。


さて、いつものように本題から逸れていますが、いつものことです。

お勉強中の Go言語だけど、あっちは「インデントはハードタブ」という仕様だ!・・・と思っていたのだけど、Launguage Specification に "indent" は出てこなかった。

The Go Programming Language Specification - The Go Programming Language
https://go.dev/ref/spec

あーれー、私の勘違い??
まあいいや。golang のフォーマッタを使うと自動的にタブ文字になっていたと思うし。

 

そこらへんはよかったのだが、他から clone した GitHub のプロジェクトのファイルを開いたときに何か違和感があった。
おかしい・・・初めて見るコードなのに違和感がある・・・。

ああ、タブ文字が 8 スペースで表示されているんだ。
でも vscode の設定では 4 スペースにしているし。。。
4 スペースに変更しても別のファイルでは 8 スペースで表示されるし。。。
なんなの??

 

ようやく本題ですが、このプロジェクトには `.editorconfig` というファイルがあり、それを vscode が読み込んで反映させていたようだった。

EditorConfig
https://editorconfig.org/

私の設定よりもこっちが優先されるのね。
まあ、そうでないと意味が無いわな。


EditorConfig のページはなかなか気合いが入っている。
サポートしているサイトの紹介があるのだが、そのリンク先画像がたぶん自作なのだ。 GitHub なんかこれだよ。

image

普通に引用した方がかんたんだろうに、あえてこのページの世界観でアイコンを描くというところに気合いを感じる。だって、アイコンをそのまま借りた方がはるかに楽なのですぞ。

 

EditorConfig はすべてのエディタがサポートしているわけではないと思うが、いくつかの主要なエディタが採用しているならファイルとして作って置いても損にはならないかもしれない。テキストエディタで外部からの設定を求めるというのはどうなんだろうと考えなくもないが、嫌なら使わなければよいだけの話である。

vscode だとプラグインがいりそうなことを書いてあるのだが、使っていないつもりなのに反映されてしまった。
こういうのは個人の好みもあるから、けっこう難しいね。