none
コードの貼り付け時にタブがスペースに変換されてしまうことがある RRS feed

  • 質問

  • Visual Studio Enterprise 2015 で C# コードを書いています。
    オプション設定では、[テキストエディター] - [C#] - [タブ] にて、
    ・インデント=スマート
    ・タブのサイズ=4
    ・インデントのサイズ=4
    ・タブの保持=ON
    という設定にしています。

    表題の件なのですが、以下の状況でクリップボードからの貼り付け時に含まれるタブ文字がスペースに変換されてしまいます。
    class A
    {
    	void g(int n, int m)
    	{
    	}
    	void f()
    	{
    		g(
    			10 // A
    			,20 // B
    		);
    	}
    }
    元コードのインデントはすべてタブで構成されています。
    コンマの位置については目をつぶっていただくとして (これは他人が書いたコードであり、これをVisual Studio で直していくものとします)、
    Bの行を全選択し切り取った後、A行の直前に貼り付けると、「,20」の前にあった3個のタブが、貼り付け後には12個のスペースに変換されてしまいます。

    結果として、後から修正するにしても、貼り付けた直後にはタブとスペースが混じったちぐはぐなインデント状態になってしまいます。

    この挙動を防ぐ、つまり、スペースに変換せずにタブのまま貼り付けるには、どうすれば良いでしょうか。
    2016年1月20日 6:32

すべての返信

  • Visual Studio 2015 Update 1を適用しても発生しますか? 手元のCommunity 2015 Update 1では再現しませんでした。
    2016年1月20日 15:04
  • こんにちは。

    ペーストの仕方次第では発生しました。(Vs2015 Enterprise Update1)

    class A
    {
    	void g(int n, int m)
    	{
    	}
    	void f()
    	{
    		g(              , 20 // B
    			10 // A
    
    		);
    	}
    }
    

    以下のConnectと同様の現象かもしれません。

    https://connect.microsoft.com/VisualStudio/feedback/details/1587483/c-paste-with-keep-tabs-converts-tabs-on-the-next-line-to-spaces

    ステータスはActiveなのでVoteが集まればって感じでしょうか。

    2016年1月20日 15:39
    モデレータ
  • kobayantk さん、

    お書きになっているとおり、Visual Studio では[タブの保持]または[空白の挿入]を選択することができます。
    他人が書いたコード、つまり他人の Visual Studio の設定に応じたテキスト、の場合、
    タブがスペースに置き換えられるように見えるのは、その人が[空白の挿入]に設定していたためではないでしょうか?

    仮にそうだとしても、タブ/スペースの混在を統一してくれる拡張機能があります。


    動作確認した/実際に使用したわけではないので申し訳ありませんが、
    お役に立つかも知れないと思い、コメントさせていただきます。

    以上です。

    2016年1月21日 9:00
  • 「g(」の直後、改行の前にカーソルを移動してペーストすれば確かに再現しますね。質問者さんのいう「A行の直前」というのがそのことを指しているのかどうか不明ですが……

    改行の前ではなく改行の後にカーソルを移動してからペーストすれば発生しないし、貼り付けた後に「g(」の直後に改行を入力すればオートフォーマットされるので、特に困ることはないと思いますが、Visual Studio 2013 Update 5とは挙動が違うし、クリップボードにある元情報(タブ文字0x09)およびエディターの設定(タブの保持)とは異なるデータ(空白0x20)に意図せず変換されて貼り付けられることになるため、確かにバグだと思います。

    暫定回避策として、[ツール]→[オプション]→[テキストエディター]→[C#]→[書式設定]→[全般]にて、[貼り付け時にオート フォーマットする]のチェックを外すことで、ペースト時の意図しないフォーマットを抑制できると思います。改めてフォーマットしたいときは、[編集]→[詳細]→[ドキュメントのフォーマット](Ctrl+K, Ctrl+D)あるいは[選択範囲のフォーマット](Ctrl+K, Ctrl+F)を使えばよいかと。

    • 編集済み sygh 2016年1月21日 13:46
    2016年1月21日 13:28