none
【VS2019】文字数ではなく列数によるインデントについて RRS feed

  • 質問

  • Visual Studio 2019 のテキストエディターのインデントについての質問です。

    デフォルトの設定(インデントのサイズ:4、空白の挿入)で使用していて、行の先頭に「'コメント行」と入力してあるとします。
    この文字の後ろにキャレットがあるときに Tab キーを押すと、半角スペースが2つ入るのですが、希望としては半角スペースは1つだけ入ってほしいのです。

    おそらくは「'コメント行」が6文字のため、インデントのサイズである4の倍数になるように2つのスペースが入るのだと思うのですが、以前使用していた Visual Studio 2008 ではスペースは1つしか入りませんでした。

    VS2008 では文字数ではなく列数をインデントの基準としていたと思われます。
    列数を基準とすると「'コメント行」は11列にあたるため、半角スペース1つで4の倍数になります。

    複数の行末のコメント位置を揃えたいことが頻繁にあり、VS2008 では Tab キーだけで綺麗に揃えることができていたため、どこかの設定で VS2008 と同じ動作にできないかと思うのですが、VS2019 にそういった設定箇所はありませんでしょうか?

    2020年6月4日 9:51

回答

  • 自分は、「全角1文字=半角2文字」な列幅前提でコーディングすることが多いため、気にはなっていたのですが……調整方法が見当たらないので諦めています。(Excel VBA 等では期待するインデントになってくれているのですが)

    "Roslyn" の問題かと思ったのですが、どうやら VS2010 以降で仕様が変わっているみたいです。2010 は合成絵文字にも対応しているようなので、カウント方法が変更されたのでしょう。

    Unicode では文字幅が ambiguous (文脈依存)になる可能性があるため、多言語対応のために仕方がない部分はあります。
    たとえば、コンソール アプリケーションにおいて、罫線文字を出力する Console.WriteLine("├─┼─┤") というコードを実行した場合、最近の環境では、全角5文字幅ではなく、半角5文字幅で表示されることになります。

    また、最近は「全角2文字=半角3文字」な等幅フォント(Source Han Code JP など)もありますし、Visual Studio Code では合字対応もあります。


    下記では半角空白を ␣ に置き換えています。


    「'{tab}a{tab}a{tab}a」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣a␣␣␣a␣␣␣a』になることが期待されます。
    これは VS2008 / 2010 / 2017 / 2019 で同一でした。


    「'{tab}行{tab}行{tab}行」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣行␣␣行␣␣行』になることが期待されます。VS2008 がこの動作。
    『'␣␣␣行␣␣␣行␣␣␣行』になるのは VS2010 / 2017 / 2019 です。


    「'{tab}行行{tab}行行{tab}行行」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣行行␣␣␣␣行行␣␣␣␣行行』になることが期待されます。VS2008 がこの動作。
    『'␣␣␣行行␣␣行行␣␣行行』になるのは VS2010 / 2017 / 2019 です。


    「'{tab}行行行{tab}行行行{tab}行行行」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣行行行␣␣行行行␣␣行行行』になることが期待されます。VS2008 がこの動作。
    『'␣␣␣行行行␣行行行␣行行行』になるのは VS2010 / 2017 / 2019 です。

    • 回答としてマーク MMTRS 2020年6月9日 5:14
    2020年6月9日 3:41

すべての返信

  • MMTRSさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    Visual Studio 2019でも、列数はインデントの基準としています。
    このリンクをご参照いただければと思います。

    >複数の行末のコメント位置を揃えたいことが頻繁にあり
    →ツール/オプション/テキストエディター/ C#/タブに移動して、「スペースの挿入」を有効にすることができます。 
    ご要件を満たすことができれば幸いです。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年6月9日 1:31
    モデレータ
  • Harukaさん、ありがとうございます。

    ご提示いただいたリンクは最初の投稿前に確認済みです。

    →ツール/オプション/テキストエディター/ C#/タブに移動して、「スペースの挿入」を有効にすることができます。
    ご要件を満たすことができれば幸いです。
    私の場合は VB のため、ツール/オプション/テキスト エディター/Basic/タブ を再度確認しましたが、最初の投稿の通り「空白の挿入」となっています。念のため C# やすべての言語の項目も確認しましたが同様です。
    この状態で要件を満たすことはできません。最初の投稿の通りの動きとなります。

    通常は、「'コメント行」の後ろで Tab キーを押した際の半角スペースは1つしか入らないものなのでしょうか?
    だとすると上記以外にこの動作に影響する設定はありませんでしょうか?

    2020年6月9日 1:54
  • 自分は、「全角1文字=半角2文字」な列幅前提でコーディングすることが多いため、気にはなっていたのですが……調整方法が見当たらないので諦めています。(Excel VBA 等では期待するインデントになってくれているのですが)

    "Roslyn" の問題かと思ったのですが、どうやら VS2010 以降で仕様が変わっているみたいです。2010 は合成絵文字にも対応しているようなので、カウント方法が変更されたのでしょう。

    Unicode では文字幅が ambiguous (文脈依存)になる可能性があるため、多言語対応のために仕方がない部分はあります。
    たとえば、コンソール アプリケーションにおいて、罫線文字を出力する Console.WriteLine("├─┼─┤") というコードを実行した場合、最近の環境では、全角5文字幅ではなく、半角5文字幅で表示されることになります。

    また、最近は「全角2文字=半角3文字」な等幅フォント(Source Han Code JP など)もありますし、Visual Studio Code では合字対応もあります。


    下記では半角空白を ␣ に置き換えています。


    「'{tab}a{tab}a{tab}a」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣a␣␣␣a␣␣␣a』になることが期待されます。
    これは VS2008 / 2010 / 2017 / 2019 で同一でした。


    「'{tab}行{tab}行{tab}行」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣行␣␣行␣␣行』になることが期待されます。VS2008 がこの動作。
    『'␣␣␣行␣␣␣行␣␣␣行』になるのは VS2010 / 2017 / 2019 です。


    「'{tab}行行{tab}行行{tab}行行」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣行行␣␣␣␣行行␣␣␣␣行行』になることが期待されます。VS2008 がこの動作。
    『'␣␣␣行行␣␣行行␣␣行行』になるのは VS2010 / 2017 / 2019 です。


    「'{tab}行行行{tab}行行行{tab}行行行」の結果は、「全角1文字=半角2文字」な等幅フォントにおいて
    『'␣␣␣行行行␣␣行行行␣␣行行行』になることが期待されます。VS2008 がこの動作。
    『'␣␣␣行行行␣行行行␣行行行』になるのは VS2010 / 2017 / 2019 です。

    • 回答としてマーク MMTRS 2020年6月9日 5:14
    2020年6月9日 3:41
  • 魔界の仮面弁士さん、とてもわかりやすく解説していただき、ありがとうございます。

    VS2010 から変わっていたとは、恥ずかしながら知りませんでした。
    とすると、おそらく VS2010 のリリース以降、同様の要望が少なからずあったはずで、それが VS2019 になっても吸収されていないということは、VS2008 の動きに戻すことができないか、Microsoft としてはもはや戻すつもりはないということなのでしょうね...
    (おそらくは魔界の仮面弁士さんのおっしゃるような要因で前者だと思いますが)

    私も、様々なところで「全角1文字=半角2文字」という前提は見直さなければいけないのかなと考えることがありますが、SE にとってはなかなかこれを捨てきれないというのが現実のような気がします。

    ひとまず、インデントに関しては期待している動作にはならないという前提で、社内でのコーディングルールを見直してみようと思います。

    ありがとうございました。

    2020年6月9日 4:34