チケット #33717

TAB文字をTABとしてコピー

登録: 2014-04-28 20:56 最終更新: 2014-05-12 10:30

報告者: inuz 担当者: (未割り当て)
チケットの種類: 機能リクエスト 状況: 完了
コンポーネント: Tera Term マイルストーン: (未割り当て)
優先度: 5 - 中 重要度: 5 - 中
解決法: なし

詳細

範囲選択をしてコピーをする際に、TABがスペースになるのですが これをTABのままコピーバッファに入れることは出来ないでしょうか。

添付ファイルリスト

添付ファイルはありません

チケットの履歴 (15 件中 3 件表示)

2014-04-28 20:56 更新者: inuz
  • 新しいチケット "TAB文字をTABとしてコピー" が作成されました
2014-04-28 21:13 更新者: maya
コメント

PuTTY, rlogin, xterm ではそのような動きをしていないようです。

そういうことできる端末エミュレータの例ってありますか?

>開発のみなさん

そもそも文字単位の描画でないとエミュレーションできない、というものでしょうか?

2014-04-28 23:41 更新者: inuz
コメント

gnome-terminalでも同様で、知る限りそのような実装になっている例はありません。

2014-04-29 19:55 更新者: yutakapon
コメント

私の環境では、再現できなかったのですが、具体的な手順を教えてもらえるでしょうか?

2014-04-29 20:04 更新者: inuz
コメント
(このコメントは削除されました)
2014-04-29 20:05 更新者: inuz
コメント
$ perl -e 'print "a\tb\n"'
a       b

この時、aからbまでをマウスで選択してコピーをすると、aとbの間がTABでなくスペース7つになります。 これが、a<TAB>b のようになってくれると嬉しいです。 (コード部分が崩れたので先のコメントは削除しました)

2014-04-30 19:33 更新者: yutakapon
コメント

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と同様の動作をしました。

2014-05-01 10:31 更新者: inuz
  • チケット完了時刻2014-05-01 10:31 に更新されました
  • 状況オープン から 完了 に更新されました
コメント
$ perl -e 'print "\t"' | hexdump
0000000 0009
0000001

perl が変換しているわけではないようです。 bashが画面に表示する際に(ncursesか何かが?)TAB幅に合わせてスペースに変換しているようですね。 Tera Termでどうにかするには、無理なこととわかりましたので、コピー後エディタ等で変換することとします。

お騒がせしました。ご対応ありがとうございました。

2014-05-01 15:07 更新者: yutakapon
コメント

Edit - Copy table を使えば、スペースをTABに変換して、クリップボードにコピーできます。 これだとダメですか?

2014-05-01 15:16 更新者: doda
コメント

時間が無いので一点だけ。

TABをスペースに展開しているのはTTYです。

stty tab0 でTABからスペースへの展開を止められます。

2014-05-01 15:34 更新者: maya
コメント

手元の zsh で

echo a\\tz

とすると

a<tab>z

となり、screen 上の zsh で同じことをすると

a<CSI 7 C>z

となります。

スペースが7個返ってきていても、上の返事が返ってきていても、Tera Termのバッファ内容は"a(スペース7個)z"になりそれが表示され、それをコピーしたときにはいずれもスペースが7個になると思います。

2014-05-01 17:14 更新者: inuz
コメント

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のままやりたい私の用途には残念ながら都合が悪いです。

2014-05-09 20:15 更新者: doda
コメント

maya への返信

そういうことできる端末エミュレータの例ってありますか?

Terminator が TAB を残そうとしますね。

他では見たことが無いです。

2014-05-09 20:20 更新者: doda
コメント

既にいくつか話が出ていますが、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 としてコピー出来た方が便利なのは確かですし、 以前から興味深いテーマだとは思っていますので、 優先度は低いですが将来的には何等かの対応を入れるかもしれません。

2014-05-12 10:30 更新者: inuz
コメント

dodaさん、おかげさまで端末側で一貫した動作が難しい点、理解できました。 ありがとうございました。

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする