TAB文字をTABとしてコピー
PuTTY, rlogin, xterm ではそのような動きをしていないようです。
そういうことできる端末エミュレータの例ってありますか?
>開発のみなさん
そもそも文字単位の描画でないとエミュレーションできない、というものでしょうか?
gnome-terminalでも同様で、知る限りそのような実装になっている例はありません。
私の環境では、再現できなかったのですが、具体的な手順を教えてもらえるでしょうか?
$ perl -e 'print "a\tb\n"' a b
この時、aからbまでをマウスで選択してコピーをすると、aとbの間がTABでなくスペース7つになります。 これが、a<TAB>b のようになってくれると嬉しいです。 (コード部分が崩れたので先のコメントは削除しました)
inuz への返信
{{{ $ perl -e 'print "a\tb\n"' a b }}} この時、aからbまでをマウスで選択してコピーをすると、aとbの間がTABでなくスペース7つになります。 これが、a<TAB>b のようになってくれると嬉しいです。 (コード部分が崩れたので先のコメントは削除しました)
リプライありがとうございます。 当方でも確認しましたが、上記の場合はperlインタープリタもしくはbashが、TABコード(0x09)をスペースに 変換しているため、Tera Termに渡ってくる時点ではすでにスペースでしかないように思います。 Tera Termがタブをスペースに変換しているわけではないので。
永田さんがおっしゃるように、PuTTYやRLoginでもTera Termと同様の動作をしました。
$ perl -e 'print "\t"' | hexdump 0000000 0009 0000001
perl が変換しているわけではないようです。 bashが画面に表示する際に(ncursesか何かが?)TAB幅に合わせてスペースに変換しているようですね。 Tera Termでどうにかするには、無理なこととわかりましたので、コピー後エディタ等で変換することとします。
お騒がせしました。ご対応ありがとうございました。
Edit - Copy table を使えば、スペースをTABに変換して、クリップボードにコピーできます。 これだとダメですか?
時間が無いので一点だけ。
TABをスペースに展開しているのはTTYです。
stty tab0 でTABからスペースへの展開を止められます。
手元の zsh で
echo a\\tz
とすると
a<tab>z
となり、screen 上の zsh で同じことをすると
a<CSI 7 C>z
となります。
スペースが7個返ってきていても、上の返事が返ってきていても、Tera Termのバッファ内容は"a(スペース7個)z"になりそれが表示され、それをコピーしたときにはいずれもスペースが7個になると思います。
yutakapon への返信
Edit - Copy table を使えば、スペースをTABに変換して、クリップボードにコピーできます。 これだとダメですか?
例えば以下のような文字の場合
1 2 3 b c A B C
Copy tableを行うと以下のようになりますが
1 2 3 b c A B C
行頭のTABと複数TABが省かれてしまうので、TABでインデントしたソースコードのコピーをTABのままやりたい私の用途には残念ながら都合が悪いです。
既にいくつか話が出ていますが、TABとしてコピー出来るようにするには複数の問題があります。
まず表示を行うプログラムによってはそもそも TAB をそのまま出力しないというのがあります。
vi や less, その他 curses ベースのプログラム等では TAB を他のカーソル移動命令やスペースに展開にして出力します。
これはカーソル移動の最適化が理由だったり、TAB 部分の文字が確実に消えるようにする為です。
screen や tmux 等のターミナルマルチプレクサを使っている場合も同じ理由で TAB がスペース等に展開されます。
次に TTY の設定によっては TAB がスペースに展開されます。これについては stty tab0 によって回避可能です。
これらの問題をクリアして TAB が Tera Term 側に送られてくるようになったとしても、 複雑な出力の時の動作を定義しづらいという問題があります。
端末では TAB は何等かの文字を出力ものではなく、カーソルの移動命令として扱われます。
その為、TAB で移動した範囲に文字が有っても消える事なく残ります。
このような時、例えば以下のような出力を選択した時はどのような文字列がコピーされるべきでしょうか?
% echo -e ' a \rb\tc' b a c
また、TAB は文字では無いので、TAB で移動した部分の途中にカーソル移動して文字を出力する事も出来ます。 例えば以下のような出力時はどのようにコピーされるべきでしょうか?
% echo -e 'a\tb\e[4G c ' a c b
また、タブストップの位置も変更可能です。 例えば以下のような出力時はどのようにコピーされるべきでしょうか?
% echo -e '\e[3g\e[20G\eH\e[28G\eH\ra\tb\tc' a b c
他にもさまざまなケースが考えられますが、これらで一貫した自然な動作を定義するのが困難なため、 大抵の端末ではすべてスペースとしてコピーされます。
ただ、単純な出力時は TAB としてコピー出来た方が便利なのは確かですし、 以前から興味深いテーマだとは思っていますので、 優先度は低いですが将来的には何等かの対応を入れるかもしれません。
dodaさん、おかげさまで端末側で一貫した動作が難しい点、理解できました。 ありがとうございました。
範囲選択をしてコピーをする際に、TABがスペースになるのですが これをTABのままコピーバッファに入れることは出来ないでしょうか。