Ticket #33717

TAB文字をTABとしてコピー

Date d'ouverture: 2014-04-28 20:56 Dernière mise à jour: 2014-05-12 10:30

Rapporteur:
Propriétaire:
(Aucun)
État:
Atteints
Composant:
Jalon:
(Aucun)
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Aucun
Fichier:
Aucun
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Détails

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

Ticket History (3/15 Histories)

2014-04-28 20:56 Updated by: inuz
  • New Ticket "TAB文字をTABとしてコピー" created
2014-04-28 21:13 Updated by: (del#1144)
Commentaire

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

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

>開発のみなさん

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

2014-04-28 23:41 Updated by: inuz
Commentaire

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

2014-04-29 19:55 Updated by: (del#24082)
Commentaire

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

2014-04-29 20:04 Updated by: inuz
Commentaire
(This comment has been deleted)
2014-04-29 20:05 Updated by: inuz
Commentaire
$ perl -e 'print "a\tb\n"'
a       b

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

2014-04-30 19:33 Updated by: (del#24082)
Commentaire

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 Updated by: inuz
  • État Update from Ouvert to Atteints
  • Ticket Close date is changed to 2014-05-01 10:31
Commentaire
$ perl -e 'print "\t"' | hexdump
0000000 0009
0000001

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

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

2014-05-01 15:07 Updated by: (del#24082)
Commentaire

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

2014-05-01 15:16 Updated by: doda
Commentaire

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

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

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

2014-05-01 15:34 Updated by: (del#1144)
Commentaire

手元の 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 Updated by: inuz
Commentaire

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 Updated by: doda
Commentaire

maya への返信

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

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

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

2014-05-09 20:20 Updated by: doda
Commentaire

既にいくつか話が出ていますが、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 Updated by: inuz
Commentaire

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

Attachment File List

No attachments

Modifier

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Connexion