@culage

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

等幅フォント使用してもVSCodeのインデントがズレる問題に、どのように対処しているか?

Discussion

Closed

VSCodeはエディタ基底部分(Monaco Editor)の仕様として、一部の全角記号(αなど)を「半角1文字の幅」であると判定してインデントを行うため、記号を含む行でインデントずれが発生します。
例えば、『A<タブ>B』と入力するとBは 5文字目の位置 に表示されますが、『α<タブ>B』と入力するとBは 6文字目の位置 に表示されます。

image.png

これは一部の全角記号の文字幅が、英語圏では半角、東アジア圏では全角で表示される「Ambiguous; 曖昧」と定義されていることに起因し、エディタの設定でインデント幅を正しく判定させることはできないと思います。
( 参照: https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85 )

VSCodeは広く普及しているため多くの人がこの問題を体験していると思いますが、皆様はこの問題にどのような対処をしているでしょうか?

  • ズレを許容している
  • スペースの追加をその都度、手動で行って対処している
  • 全角記号を使わない(→の代わりに->を使うなど)ようにしている
  • 実は全角記号を半角2文字の幅だと判定させる方法がある

……など。

0 likes
This answer has been deleted for violation of our Terms of Service.

等幅フォントを勧めていただく回答が多いですが、これはフォント幅によりずれるのではなく文字数のカウントによってずれる現象ですので等幅フォントを使った上で、ズレが発生します。

0Like

全角文字はコメントくらいでしか使わないので等幅フォント使ってコード書いてる分には特に不便を感じておらず気にしてませんでした。
今使っているフォントはFiraCodeですが「α」と「a」は0.3mmくらいよーーーく見るとズレてる…か…?くらいであまり気にならないのでそれもあるかもしれません。

1Like

等幅であってもフォント側で記号を大きく描画するものがありますので(多分歴史的な経緯があるんだろうとは思います),そういうフォントを使わない限り解決できません.
Wordとかで例えばU+2015をConsolasとMS ゴシックで比較すると分かりやすいです.

issueでもout-of-scopeをマークされているのであきらめてください.

まったく参考になりませんが,本家VSはどうやらグリフ幅の違いを認識して整列してくれるみたいです.

CSVプラグインだってあるVSCodeではなおさら全角文字列をそこまで厳密にASCIIベースで整列せにゃならんケースがそもそもあるか?って話はさておき…

3Like

一部の全角記号(αなど)を「半角1文字の幅」であると判定してインデントを行うため、記号を含む行でインデントずれが発生します。

自分の環境 Windows 10 Pro の VS Code 1.100.3 では、少なくとも「α」(U+03B1) に関してはそういうことはありません。日本語の「あ」(U+3042) ですと少しずれますが。

vscode.jpg

フォントなどの設定の問題では? OS が Windows ではなくて Mac だとか? ちなみに自分の環境の VS Code のフォント設定は以下の通りです (デフォルトから変えていません)。

font.jpg

デフォルトでは Tab キーを押すとスペースが挿入されますが (下の画像参照)、そこは関係なさそうです (チェックを外して Tab が入るようにしても同じ)。

InsertSpace.jpg

2Like

気になったことはありませんが、面白い話題だったので、自分の環境で調べてみました。

問題は、「α」や「→」が表示上では全角幅(通常2文字分)扱いなのに、内部処理幅は半角幅(通常1文字分)となることが問題であると捉えました。

表示に使っているフォントは、源ノ角ゴシック Code JP です。
(このフォントはいわゆる全角文字2文字が半角3文字となるような文字幅なので特殊かもしれません)
調べてみると、「α」は表示幅は半角で内部処理が半角幅、「→」は表示幅は全角で内部処理も全角幅となっていました。 キリル文字も調べてみましたが、これらもαと同じでした。

ということで、フォントによって結果は異なりそうです。字形にこだわるのであれば扱いの工夫で、そうでないなら、問題の出ないフォントを選べばよさそうですね。

1Like

皆様、ありがとうございます。
フォントによって「α」などが半角で表示されるものと全角で表示されるものがあり、半角で表示されるものはズレが発生せず、全角で表示されるものはズレが発生する、ということのようですね。

FiraCodeの表示を試してみたところ、αが半角の幅で表示されてインデントずれは発生しないことが確認できました。

(FiraCodeには日本語が含まれていないため、英数2文字と全角日本語1文字の幅が異なることが原因のズレは発生していまいましたが……)

1Like

半角で表示されるものはズレが発生せず、全角で表示されるものはズレが発生する、ということのようですね。

上の私の回答の「あ」の例を見てもらえばわかると思いますが、そうではありません。以下に再掲します。

vscode.jpg

「あ」の表示幅は「α」や「A」のほぼ 2 倍となっています。

Tab Size はデフォルトの 4 なので、「α」と「B」および「α」と「B」の間は 3 文字分の半角スペース(・が 3 つ)となっています。

一方、「あ」と「B」の間は 2 文字分の半角スペース(・が 2 つ)となっています。

分かります?

1Like

そうではありません。
分かります?

わかりますけど、何がそうではないのでしょうか?

0Like

何がそうではないのでしょうか?

質問者さんの言う、

半角で表示されるものはズレが発生せず、全角で表示されるものはズレが発生する、ということのようですね。

・・・というのは最初の質問の画像にあった ↓ このこと(「α」...「B」は半角一文字分余計にずれている)を言ってるのだと理解していますが、

無題.jpg

私の回答の「あ」が全角表示された例では、そうではない(エディタは半角スペース 2 文字分間を空けている)と言っています。何がこの違いになったのかは分かりませんが。

vscode.jpg

1Like

言葉足らずでした。

文字幅が「Ambiguous; 曖昧」で定義されているキャラクタ(αなど)について、 半角で表示されるものはズレが発生せず、全角で表示されるものはズレが発生する』

ですね。

「あ」は文字幅が「Fullwidth; 全角」で定義されているため、表示も内部的なカウントも「2文字幅」としてカウントされ「B」との間は 2 文字分の半角スペースとなります。

それに対して「α」は文字幅が「Ambiguous; 曖昧」で定義されているため、表示は「1文字幅 or 2文字幅(フォントにより異なる)」で内部的なカウントは「1文字幅」としてカウントされます。
したがって(αの内部的なカウントが「1文字幅」なので)「B」との間は 3 文字分の半角スペースとなります。

αが1文字幅で表示されていれば「B」が正しい位置に表示されますが、
αが2文字幅で表示されていれば「B」はズレた位置に表示されてしまいますね。

0Like

最終的にやはりフォント(等幅かつ一部記号やαなどが半角で表示されるもの)を適切なものにすることでズレないように出来るという結論になりそうです。
UDEV Gothic はかなりズレる文字が少なく良かったです。(完全ではなく★記号はズレが発生してしまいましたが)

0Like

質問者さんの環境と最初の質問の画像で使っていたフォントは何なんですか? (そもそも最初の質問にそれを書かないと話が始まらなかったのですが・・・)

完全ではなく★記号はズレが発生してしまいましたが

ちなみに自分の環境 Windows 10 Pro、VS Code 1.100.3 でデフォルトのフォントで以下のようになります

vscode2.jpg

0Like

もしかして、フォントのベース言語とかによるのでは……?
α は曖昧な幅の代表格のグリフですし。

0Like

@SurferOnWww

質問者さんの環境と最初の質問の画像で使っていたフォントは何なんですか? (そもそも最初の質問にそれを書かないと話が始まらなかったのですが・・・)

申し訳ありません。最初の質問のスクリーンショットで使用しているのはMSゴシックでした。(日本語・英語を等幅にしたい為、このフォントを使っていました)

image.png

「★」については、デフォルトフォントでもちょっと挙動が奇妙な気がします。
以下は font-family: Consolas で表示した内容ですが、タブをスペースで入れるとズレが発生せず、タブ文字で入れるとズレが発生していますね。「α」は同様の入力をしてもズレが発生していません。

image.png

image.png

1Like

私の環境は、以下になります。

【OS】
Windows 11 Home

【VSCode】
バージョン: 1.100.3
コミット: 258e40fedc6cb8edf399a463ce3a9d32e7e1f6f3
日付: 2025-06-02T13:30:54.273Z
Electron: 34.5.1
ElectronBuildId: 11369351
Chromium: 132.0.6834.210
Node.js: 20.19.0
V8: 13.2.152.41-electron.0
OS: Windows_NT x64 10.0.26100

0Like

Your answer might help someone💌