Linuxターミナル上の出力を手軽にコピペしたい

概要

現状、ターミナル上の出力をクリップボードに複製するときは、
毎回マウスに持ち替えて該当箇所を選択、Ctrl+Cしています。

これをもう少し手軽な操作(≒キーボード操作のみ)で行いたいです。

Macのpbcopy的なものがLinuxにもあるよ

簡単に調べてみたところ、
xselxclip のようなコマンドがあるらしいです。

ただこれはコマンドという特性上、

  • 実行結果を事前に想定する必要がありそう
  • 実行後の出力結果を選択する用途ではなさそう
  • 部分的な選択が難しそう

といった点が気になりました(もし誤っていたらご指摘ください)。

理想

1年ほど前に、Windows Terminalに「マークモード」という機能が追加されました。

これが中々便利で、上述した課題がすべて解決されている気がします。
同等とまではいかなくとも、Linux上でもそれっぽいものがあれば教えてほしいです。

本当にその「マークモード」が理想的だと思うのであれば、GNU Screenかtmuxを使えば良いと思います。あるいは、view (もしくは vim -R)にパイプすれば良いでしょう。

もっとも、その場合端末上の文字はスクリーン制御がされていると「自然な折返し」であるとは限らないため、非常に不合理な挙動が予測されます。
VTEのような優れた端末ライブラリはそうした問題を吸収した選択を可能にしているため、広くシステムのセレクション、あるいはクリップボードを使うことのほうが好ましいと考えられています。

  • 実行結果を事前に想定する必要がありそう

これは当たり前の話で、出力を利用するコマンドは複数回実行するものであり、副作用のあるコマンドの出力は再利用すべきではありません。

@harukamy さん

全体的な言い回しから察した限りでは、
「マークモードのような機能は、ターミナルを通常使用する上では不要である」
ように読み取れました。

実際、必要であれば標準で用意されていてもおかしくないですよね……。

同じことを書いているかもしれませんが、

「システムのセレクション、クリップボードはVTEという優れた端末ライブラリを使用しており、
これら機能の使用のほうが推奨される」

と読み替えた上で、落とし込みました。

「マークモードのような機能は、ターミナルを通常使用する上では不要である」
ように読み取れました。

違います。
「マークモードのような機能が支障をきたすケースが多すぎる」
です。

「システムのセレクション、クリップボードはVTEという優れた端末ライブラリを使用しており、
これら機能の使用のほうが推奨される」

これも違います。VTEはGnome TerminalやXFce4 Terminal, LXDE Terminalなどが使用している端末ライブラリです。
優れた端末ライブラリはコピーしようとしたときに発生する様々な問題を自動でケアしてくれるため、多くの場面で「普通にコピペできる」状態にしてくれます。

ただし、同様の処理はテキストバッファには適用可能ではありません。

BTW, 問題が多すぎるので人々が求めていないから存在しないということです。
もちろん、Screenやtmuxのテキストバッファを使うことはできますが、これは普通にコピペできないことへの代替手段に過ぎません。

もうちょっと詳しく説明しましょうか。

画面に表示されている文字は純然たる文字の並びとして存在しているわけではありません。
そのように感じられるのは、かなりモダンなグラフィカル環境の話です。なおかつ、そのような環境ではバーチカルタブのような制御文字は無視されます。

端末、およびビデオカードのテキストモードは基本的にばグリッドになっています。フレームバッファを叩くなど、このルールから逸脱する方法はありますが、基本構造としては単にグリッドになったものだと考えてください。

なので、スクリーンサイズの単位はピクセルではなく、80x24のようなグリッドでのカウントになります。
端末はこのグリッドに文字を配置することができますが、文字の事情は判断できません。ですから、ぴったりグリッドに合うピクセルサイズの文字でないとはみ出したり隙間があいたりします。

端末の制御には端末ドライバーが必要です。つまり、端末への入力は端末ハードウェアに合わせたものが必要です。
現在のほとんどの端末エミュレータは実際はVT-100エミュレータであり、VT-100ドライバーで動作します。
プログラムからみた場合、端末にストリームで流しており、疑似端末デバイスファイル(/dev/pty)は端末ドライバーを介して端末エミュレータと通信します。

そもそもttyはディスプレイを持つデバイスではなくタイプライターです。
ですから、端末ドライバーを介して受け取った内容を端末がどう解釈するかは端末に任されています。
例えばバックスペース文字は現代の端末エミュレータでは前の文字を削除して一文字分戻りますが、テレタイプでは重ね打ちのためにキャリッジを一文字分戻します。キャレットやアクセントを打つためです。
基本的には画面に見えているのは、そうして文字出力を合成した結果に過ぎません。
さらに複雑な制御文字もありますから、端末が何を表示しているかを知ることは、誰にとっても困難なのです。むしろ、出力物を見ている人間が一番把握できます。
これはViから直接コピーができない理由でもあります。ペーストは先頭からキーボードで打ったのと同じように処理すればよいため、できます。

さて、端末のコピーですが、たとえばVTEならpangoを使って文字を組みます。
pangoはバッファ上のテキストを把握しているため、コピーする道が開けます。
ただし、制御文字をpangoはうまく消化できないため、スクリーンプログラムの画面はゴミが入る場合があります。
また、スクリーンプログラムでの画面表示は、画面外にある文字はそもそも存在していないため、その画面上で表示されている文字しかコピーの対象にできません。

スクリーンプログラムの画面外の文字を知っているのはスクリーンプログラムであって、端末ではありません。
なので、端末はどうすることもできません。

さて、screenやtmuxはそれ自体がスクリーンプログラムです。このため、端末の制御機能、スクロールやコピーなどが丸々利きません。
そうした事情からスクロールやコピーなどの機能を自前で持っていますが、まぁ、やってみればわかります。ものすごく使いづらいので。

端末バッファをコピーする機能をもった端末なんかもありますが、そんな機能はなくなったりしてますね。需要がないので。

さて、Microsoftは最近、端末にかなり深い制御を入れてシェルを操作するのにハマっているようです。
しかしこれは、ZshやPowerlineなどの機能を破壊するため、かなりの困りものです。また、入出力をジャックして実現するため、(キーロガーのように)端末が触れてはいけない情報にもアクセスします。
まずこれが「利便性のためなら許容される」と考えるかどうかの問題があります。

そして、そこまでして実現したところで、ほとんどの人が使わない機能にすぎません。
Gtkとしてコピーして貼ってエディットする、リダイレクトする、scriptを使うといった様々な方法から適切なものを選択することより良い方法にならないのです。

それでもなお、その機能が欲しいと思うのなら、何度も言いますがscreenやtmuxにはその機能があります。

「いいね!」 1