none
スニペット入力時に入る余計なインデントを抑制したい RRS feed

  • 質問

  • スニペットによる入力は便利なのですが、入力後に全く期待しないインデントの挿入が行われることがよくあり、これをどうにか抑制したいと考えています。

    例として私の環境では Visual C# 組み込みのスニペットである switch を入力すると、その switch ブロック自体にやたらと無駄なインデントが挿入され、さらにそれを書こうとした関数の閉じカッコにまで余計なインデントが入ったり、#region を書こうとすると、同ソース内にすでに記述されている他の #region や関数の定義行になぜかインデントが入ります。

    また自作の非常にシンプルな、<Code>ブロックで決まった文字列を挿入するだけのスニペットも実行するとその文字列の前に4タブ分くらいのインデントが何故か入ります。

    こういった過剰なインデントの挿入を抑止する方法を御存知の方がいらっしゃいましたらご教示いただければ幸いです。

    2020年12月15日 11:09

回答

  • inu_tarouさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    「拡張機能」>「拡張機能の管理」>「インストール済み」に、サードパーティの拡張機能を無効しにしてみてください。
    それでもうまくいかない場合、VSを最新のバージョンに変更してみてください。
    私の環境(VS 2019 community16.8.2)の下で試してみたところ、正常に動いています。



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

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

    • 回答としてマーク inu_tarou 2020年12月25日 10:47
    2020年12月23日 6:18
    モデレータ
  • Kumo様

    ご返信いただきありがとうございます。

    ご案内いただきました通り、まずは拡張機能を無効にしたところ、本現象が解消されました。

    ありがとうございます!

    私の環境で無効化することが出来たのは「Line Ending Unifier」という、改行コードの不統一を自動修正するサードパーティ製の拡張機能と、Microsoft Corporation謹製の「Macros for Visual Studio」の2つだけでしたが、これらをどちらも無効化し、VSを再起動したところ、問題が解消しました。

    ついでに、どちらが問題の原因だったのかを確かめるべく、これらを1つずつ「有効化」し、都度、VSを再起動して動作を確かめてみたのですが、両方を有効化したあとも現象は再発せず、普通にスニペット入力が実行されました・・。

    というわけで厳密な原因の特定には至らなかったものの、ひとまずこれで、快適なコーディング環境が実現できました。ありがとうございました!!

    • 回答としてマーク inu_tarou 2020年12月25日 15:39
    2020年12月25日 10:47

すべての返信

  • 下記の環境にて実験してみましたが、当方では事象を再現できませんでした。

    • VSCode Version 1.51.1
    • VSCode Version 1.52.0
    • VS2017 Version 15.9.30
    • VS2019 Version 16.8.3

    撮影された画面内に移っていない範囲で、波括弧の対応が崩れているなどといった文法上の問題は無いでしょうか。

    あるいは、Visual Studio の [ツール]-[オプション]設定で、何か影響を及ぼしそうな箇所を弄っていないでしょうか。
    確認のため、Visual Studio の [ツール]-[設定のインポートとエクスポート]にて、現在の設定をエクスポートしておいてから「リセット」して、動作に差がでるかどうかを試してみては如何でしょう。

    2020年12月15日 12:15
  • inu_tarouさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    「ツール」>「オプション」>「テキストエディタ」>「C#」>「コードスタイル」>「書式設定」>「インデント」に移動して、ご希望に応じて変更してみてください。



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

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

    2020年12月18日 3:31
    モデレータ
  • ご返信、ありがとうございます。

    ご指摘いただいた括弧の対応については問題なく、ビルドも問題なく通る状態で、最初の投稿のような挙動となります。またご案内いただきました通り、設定のエクスポートを行ってから「リセット」を行い、使用するフォント等も初期状態になったことを確認してから switch, #region 等のスニペット入力を試してみましたが、やはり、最初の投稿にて説明したような挙動となってしまいました。

    ほかに思い当たる原因、試してみるべき対応策等ございましたら、ご教示いただけると幸いです。

    2020年12月18日 14:26
  • Kumo様

    ご返信、ありがとうございます。

    ご案内いただきました「書式設定」ですが、私も当初は、この辺りを見直すことで状況が改善できるのかと思い、設定を変更しつつ挙動を試していたのですが、あまり芳しい成果は確認できませんでした。例えば「インデント」の項目にある「~をインデントする」というチェックボックスをすべてオフにしても、最初の投稿でお伝えしたような、過剰なインデントは発生してしまう状況です。

    また、これらの項目をオフにした場合もそうでない場合も、例えば switch ブロックを入力しようとした場合、"sw" あたりまで入力した段階で intellisence の入力候補ウィンドウがかなり絞られ、Tabキーを押すことで "switch" をスニペットにより入力することが可能になりますが、これを実行すると過剰なインデントが入るものの、intellisence を無視して switch とそれに続く丸括弧、括弧内の判定式、閉じ括弧・・・あたりまで手動で入力して改行した場合は問題が起きず、記述を始めた行のインデント幅がキープされます。

    以上のことから "switchブロックの入力にまつわる問題" ではなく、どちらかといえば "スニペット入力にまつわる問題" なのだろうと考えているのですが、それに該当するような設定項目が見当たらず、こちらでご相談させていただいた次第です。

    引き続き、もし思い当たる解消方法がございましたら、ご教示いただければ幸いです。


    2020年12月18日 14:51
  • inu_tarouさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    Tabキーを押して、コードスニペット入力時に、インデントを減らしたいということですか。
    そうであれば、「ツール」>「オプション」>「テキストエディタ」>「C#」>「タブ」に移動して、「インデントのサイズ」を変更してみてはいかがでしょうか。


    そうでない場合、ご質問のスクリーンショットを共有していただけませんか。

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

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

    2020年12月21日 9:08
    モデレータ
  • Kumo様

    ご返信ありがとうございます。

    ご案内いただいた「インデントのサイズ」は「2」に設定しており、通常、Tabキーにより意図してインデントを入力する場合は問題なく設定した通りの空白が挿入されます。

    ですが intellisence の候補にスニペット(switch等)が表示されている状態で、そのスニペット入力を確定させるために Tab を押した場合、過剰なインデントが挿入されてしまうという状態です。

    実際にスニペットによる switch ブロックの入力を行った直後のスクリーンショットを添付しました。

    インデントサイズ「2」を大きく超えて空白が挿入されていることと、関数の閉じカッコまでなぜか余計なインデントが入っていることがご確認いただけると思います。(この switch 入力を行う前まで、閉じカッコは開きカッコと同じく行頭から2スペース分のところにありました)


    2020年12月22日 22:45
  • 何故か、前回撮影いただいた 
    https://social.msdn.microsoft.com/Forums/getfile/1628124
    が見えなくなっていますね…。

    現状の崩れたインデントが、タブと空白のいずれで構成されているのかを確認できるよう、[Ctrl+R, Ctrl+W] で空白表示を有効にしてみると、もしかしたら解決のヒントが見えてくるかもしれません。

    ご案内いただいた「インデントのサイズ」は「2」に設定しており、通常、Tabキーにより意図してインデントを入力する場合は問題なく設定した通りの空白が挿入されます。

    当方ではまだ再現できていません。一応、
    C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC#\Snippets\1041\Visual C#\switch.snippet
    を確認した限りでは、switch の直前に空白は含まれていないようです。

    インデントのサイズを 4 から 2 に変更した状態で、「static void Main()」内に『sw{Tab}{Tab}』とスニペット入力してみましたが、こちらでは事象を再現できませんでした。

    「static void Main()」だと良くて、「void func( State state )」だと駄目だったりするのでしょうか。

    • 回答としてマーク inu_tarou 2020年12月25日 10:48
    • 回答としてマークされていない inu_tarou 2020年12月25日 15:38
    2020年12月23日 2:11
  • inu_tarouさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    「拡張機能」>「拡張機能の管理」>「インストール済み」に、サードパーティの拡張機能を無効しにしてみてください。
    それでもうまくいかない場合、VSを最新のバージョンに変更してみてください。
    私の環境(VS 2019 community16.8.2)の下で試してみたところ、正常に動いています。



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

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

    • 回答としてマーク inu_tarou 2020年12月25日 10:47
    2020年12月23日 6:18
    モデレータ
  • Kumo様

    ご返信いただきありがとうございます。

    ご案内いただきました通り、まずは拡張機能を無効にしたところ、本現象が解消されました。

    ありがとうございます!

    私の環境で無効化することが出来たのは「Line Ending Unifier」という、改行コードの不統一を自動修正するサードパーティ製の拡張機能と、Microsoft Corporation謹製の「Macros for Visual Studio」の2つだけでしたが、これらをどちらも無効化し、VSを再起動したところ、問題が解消しました。

    ついでに、どちらが問題の原因だったのかを確かめるべく、これらを1つずつ「有効化」し、都度、VSを再起動して動作を確かめてみたのですが、両方を有効化したあとも現象は再発せず、普通にスニペット入力が実行されました・・。

    というわけで厳密な原因の特定には至らなかったものの、ひとまずこれで、快適なコーディング環境が実現できました。ありがとうございました!!

    • 回答としてマーク inu_tarou 2020年12月25日 15:39
    2020年12月25日 10:47
  • 魔界の仮面弁士様

    ご返信ありがとうございます。

    GifはNGなんでしょうか、新たにほぼ同じ内容の画像(動画Gif)を改めて添付しようと思ったのですが、アップロード待機時のグルグルが永遠に終わらなそうだったので諦めました・・。



    それはさておき、インデントがタブなのか空白なのか?というお話ですが、過剰に挿入されるインデントはすべて空白でした。

    私は「設定>テキストエディタ>C#>タブ>タブ」の設定を「空白の挿入」にしているので、この動作は(過剰に挿入されることを除けば)自然なように思えるのですが、気になってこの設定を「空白の挿入」から「タブの保持」に切り替えて試してみたところ、意外なことに、スニペット入力時に過剰に挿入されるインデントは「空白」のままでした。(その状態で、スニペットと関係ない通常の編集で Tab キーを入力した場合は空白ではなくタブ文字が挿入されることも確認しています)



    また、関数のシグネチャ等には関係なく、どこでもこの現象は起きるようです。(static void Main() でも起きました)



    ただ本件、フォーラムオペレーターのKumo様にご案内いただいた方法を試したところ、厳密な原因の特定までは至らなかったものの、悩まされていた現象が起きなくなり、解決することが出来ました。詳細を Kumo様への返信に書きましたので、よかったらご確認ください。このたびは丁寧なアドバイスをいただき、ありがとうございました!
    2020年12月25日 10:47