LinuxターミナルエミュレーターでShift +矢印キーを使用してテキストを強調表示できないのはなぜですか?


19

これらは、文字通り、ターミナルエミュレーター以外のLinuxアプリケーションでテキストを編集するときに常に使用する標準のテキスト編集キーボードショートカットです。

  • 左+右矢印で左+右に移動
  • ctrl + arrowで単語全体を移動します
  • ホーム/エンドで行の開始/終了に移動します
  • ctrl + c / ctrl + vでコピー/貼り付け[一部の端末はshift-ctrl-C / shift-ctrl-Vを使用できます。これは良い代替品です]
  • Shift +矢印でテキストを強調表示
  • shift + ctrl + arrowで単語全体を強調表示します

このリストの最後の2つの項目を許可するシェルとターミナルエミュレータの組み合わせを発見したことはありません。明らかに端末エミュレーターは強調表示をサポートし(マウスで可能)、修飾キーとしてctrlおよびshiftキーの使用をサポートします(カーソルを単語全体に移動したり、文字を大文字にしたりできます; [編集:] shift-ctrl-Cおよびshift-ctrl-Vでコピー/貼り付けに使用することもできます)、この機能を妨げる問題は何ですか?いくつか質問があります。

  • これは私の端末エミュレーターの問題ですか、それともシェル(bash、変更しても構いませんが)の問題ですか?
  • ターミナルエミュレーター/シェルが、この普遍的な標準に準拠していないのはなぜですか?
  • 実際の理由がある場合、それは古くて時代遅れですか、それともかなりの数のデスクトップ Linuxユーザーに関連していますか?
  • 回避策はありますか?
  • これをサポートするために使用できる不明瞭なプログラムはありますか?
  • これをサポートするために、たとえばgnome-terminalのソースを変更することは可能ですか?

マウスでテキストをコピー/貼り付けできることは知っていますが、それは私が尋ねていることではありません。ターミナルエミュレータのキーボードではこれらのことができない理由を尋ねています。


マウスでテキストを選択しても、カーソルの位置は変わりません。キーボードで通常のコマンドを入力するときにテキスト選択を混ぜると、入力したばかりでまだ実行されていないコマンドの境界を越えて本当に混乱するだけです。キーボードを使用して、Webページ上のテキストボックスの境界を越えてテキストを選択できますか?端末などのテキストを選択できる別のモードに入ることを許可する画面のようなプログラムもありますが、もちろんコマンドを入力することはできません。
ダニエルベック

1
Daniel:たとえば、Matlabコンソールは、キーボードでテキストを強調表示できるCLIです。私の経験では完璧に機能します。必要に応じて、現在実行されていないコマンドを超えた選択が可能になりますが、個人的にはほとんど使用できません。
モンギン


回答:


5

これを一度に1つずつ取っておくと最も便利だと思います。一般的な問題は次のとおりです。キープレスの対象は誰ですか。端末、または端末内で実行されているプログラム?

例として、端末の一種である「screen」は、コマンドのプレフィックスとしてCtrl+ Aを使用して、実行中のプログラム自体に送られるものと区別します。(そしてCtrl+ を送信する方法を提供しますA。)

gnome-terminal あなたが尋ねるもののいくつかを含む、様々なことを行うためにキャプチャするいくつかのキーがあります。

また、端末の「ハイライト」は端末のカーソル位置とは別あることに注意してください。一部の端末には、まったく強調表示する機能がありません。

次に、このキーの組み合わせを一度に取得します。

左+右矢印で左+右ctrl +矢印で単語全体をホーム/エンドに移動して行の先頭/末尾に移動

何を左右に動かしますか?Bashはこれを行うように構成でき、通常はデフォルトです。通常、これらはカーソル位置を移動します。

ctrl + c / ctrl + vでコピー/貼り付け

最初:コピー/貼り付けは理にかなっていますか?VTを使用している場合、特にXが実行されていない場合は、クリップボードが実際にはありません。

出力のテキストをコピーできる端末もあれば、クリップボードの内容の入力をシミュレートすることで「貼り付け」を行う端末もあります。Ctrl+ Shift+ Vは、たとえば、に貼り付けられgnome-terminalます。(およびCtrl+ Shift+ Cはコピーです。)前述のように、Ctrl+ CおよびCtrl+の大きな問題Vは、一般的な端末/プログラムコマンドと重複することです。(Ctrl+ Cは割り込み送信(SIGINT)で、Ctrl+ Vは逐語的です。)

一部の端末は、データをコピーする2つのモードもサポートしています。より通常の「単なるコピー」モードと、「ブロック選択」または「ブロックコピー」として知られているモードです。(を押したCtrlまま、gnome-terminalたとえば、中にドラッグします。)

さらに、xsel -bクリップボードの内容をパイプで囲むために使用できます。xselペーストの端末のバージョンがより有用であるかどうか、正確な状況に依存します。を参照してくださいman xsel

Shift + Ctrlを押してテキストを強調表示Shift + ctrl + arrowで単語全体を強調表示

端末のハイライト(この機能がある場合)は、カーソル位置とは別です。繰り返しますが、利用可能なキーコンボの不足がおそらく要因です。ハイライトには、開始位置と終了位置、または左上隅と右下隅の2つの位置があることに注意してください。両方をどのように管理しますか?

最後に、多くのGUI端末では、単語をダブルクリックすると強調表示されることに注意してください。(Xでは、プライマリ選択にコピーします。)

screen、例として、バッファを移動するモード(前の出力)とコピー/貼り付けのモードに切り替えるキーがあります。

xsel一次選択を十分に活用すれば、クリップボード操作は、マウスを使用するメリットがあるほど十分に複雑であることがわかります。


5
回答を書くのに時間を費やしてくれたことに感謝していますが、どういうわけか、これがターミナルエミュレータで利用できない機能を理解しているとは思えません。ターミナルエミュレータは他のプログラムを実行できるという点でユニークであるという新しいアイデアを私に指摘しましたが、ユーザーがキーの組み合わせの選択したサブセットのみを利用できないのはなぜかわかりません。
モンギン

2
端末エミュレータは、物理端末をエミュレートします。コマンドラインインターフェイスを提供するためにゼロから作成されたものではありません。Control-Cのようなものは、Microsoftがキーボードショートカットとしてそれらを採用することを決定するずっと前に意味を確立していたため、ターミナルエミュレータはそれらに従う必要があります。
-chepner

2
悪魔はここの詳細にあると思います。不可能ではありません。画面には、あなたが望むことをするモードがあります。しかし、それを達成するには、「選択したい」モードに切り替える必要があります。gnome-terminal同様の問題が発生します。彼らはおそらくあなたがやっていることではないので、おそらくそれを実装しませんでした。実行中のプログラムはシェルだけではないことに注意してください。任意のプログラムを実行でき、独自の目的でコピー/貼り付けに使用できるキーシーケンスを使用できます。screenはオーバーライドするキーを送信する方法を備えており、gnome-terminalはつま先を踏まないようにします。
タナトス

1
ブロック選択は、長方形を選択する手段です。コントロールを押したままgnome-terminalにドラッグすると、すぐに違いがわかります。ほとんどのGUI端末エミュレータにはこの機能があり、ほとんどの高度なテキストエディタにも同様の機能があります。(たとえば、vimのビジュアルブロックを参照してください。)
タナトス

1
ああ、それから私はブロック選択に精通しているが、名前を知らなかった。また、そのアクションのGUIキーボードショートカットも知らないので、質問に答えるために1つを作成する必要はないようです。私はここでみんなのコメントに感謝しますが、私はまだ満足していないので、私ができることはソースを自分で掘ることだけだと思います
...-monguin

1

私は端末エミュレータの専門家ではありませんが...

ターミナルエミュレーターに実行されるbash(readline)のようなアプリケーションは、実行中のXウィンドウシステムとその内部のXウィンドウについては何も知りません。

問題は、強調表示されたテキストを表示することではなく、これらの端末デバイスを介して選択されたテキストをXウィンドウアプリケーション(ターミナルエミュレーター)に知らせる方法です。

X端末アプリケーションは、これらのデバイスの1つを入出力で開き、Xキーイベントを適切に出力(X側から)入力(bash側から)に変換する思います。bashの出力ストリームをinputとしてXターミナルに逆変換します。ここでは、Xターミナルはこの入力を処理してカーソルを移動し、bashアプリケーションの出力に応じて背景をある色で塗ります。

私の知識のエスケープするためのコードは、特別な動作を制御するために使用することができる明確なように、背景を塗りつぶし、カーソルを移動し、おそらくいくつかのカスタムエスケープコードはテキストことをX端末を知っているように追加することができ行から、行にCOL、COL単なる例である選択されたテキストは、代わりに選択されたテキストが返される可能性があります(実装の詳細)。

私が推測するに、X端末エミュレータあなたはbashでそれをしたい場合は、あなたがキーの組み合わせは、適切なエスケープコードを押して出力している知って、それをサポートするすべてのアプリケーション、readlineのにパッチを適用する必要があります標準的な定義されていませんエスケープコードを適切に処理する(そして最後に情報をクリップボードに送信する)反対側。おそらくこれを端末機能として実装すると、すべてのアプリケーションにパッチを適用する必要がなくなります。カーネル内の端末デバイスドライバーがエスケープコードについてできるだけ知りたくないことを願っています(そして推測します)。したがって、運が良ければパッチは必要ありません。

Xターミナルは出力を描画するので、マウスを使用すると、選択しているテキスト/文字が簡単にわかります。

グラフィックテキストウィジェットはXウィンドウに関するすべてを知っているため、select&copyの実装が非常に簡単です。

編集

ここで、このurxvt-9.16-image-displayパッチは、新しいエスケープコードをサポートするために必要なものを理解するための良い出発点となります。 http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

答えは、なぜそうするのが難しいのかについての良い説明です。ここでは、gnome-terminalでセットアップctrl-cctrl-vコピーと貼り付けを行い、端末の分野の他のキーを再バインドしsttySIGINT、文字を逐語的に送信および挿入することができます。これは完全な解決策ではありません。一部のプログラムは端末の制御を無効にし、「^ C」および「^ V」を送信できないためです。詳細はこちら

シェル起動スクリプト(例えば~/.bashrc~/.zshrc~/.rcrc)、行います

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

次に、gnome-terminalの[編集]> [設定]> [ショートカット]で、[コピーと貼り付け]をctrl-cおよびctrl-vにバインドできます。ターミナルデバイスに何かが送信される前にターミナルがキーイベントを取得するので、それ以降はターミナルで実行中のプロセスに「^ C」と「^ V」を送信できないことに注意してください。

私はこれをやったばかりで、それがどうなるか、そしてそれが引き起こす問題を見ていきます。Xを実行している場合にのみ、それらを適用するためにsttyを条件付きで実行しました。


1
回答ありがとうございます。その間、私はOSXとEmacsのバインディングに慣れてきました。また、ターミナルでctrl + shift + arrowの夢をあきらめました...
monguin

1

Thanatosが述べたように、ターミナルエミュレータ(X WindowsまたはWaylandで実行)とターミナル内で実行されているプログラム(区別されないかもしれませんが、「シェル」と呼びましょう)には区別があります。これら2つのことは互いに分離されています(技術的な詳細を参照)。

リストの最初の項目(矢印キー、Home / Endなど)は、ターミナル内のプログラムによって直接処理されるため、カーソル位置はターミナル内のプログラムによって制御されます

一方、コピーと貼り付けのショートカット(Ctrl + Shift + CおよびCtrl + Shift + V)は、ターミナルエミュレーターによって処理されます。ターミナルエミュレーターはマウスを理解しているので(マウスでテキストを選択できます)、画面上で(コピーできるように)、キープレスを内部のプログラムに送信できます(ペーストできるように)。

Shift + LeftおよびShift + Rightをサポートするには、端末エミュレータまたはシェルのいずれかがキーストロークを処理する必要があります。いずれにしても問題があります:

  1. 最終的には選択したテキストをクリップボードにコピーする必要があるため、シェルはこれらのキーを簡単に処理できません。クリップボードは、シェルが必ずしもアクセスできないX Windowsの概念です(ただし、を参照xclip)。私の知る限り、シェルがテキスト選択をサポートしている場合、Linuxは選択された内容についてターミナルエミュレータに通知するメカニズムを定義していません。
  2. 一方、ターミナルエミュレーターはカーソルの位置を管理しません。ターミナルエミュレータがカーソルの位置を変更できたとしても、おそらく現在のテキスト行の開始位置と終了位置がわからないでしょう。たとえば、ターミナルには次のようなテキストが含まれている場合が~ $ ls -lあり、ターミナルエミュレーターはls -l、ユーザーに属するのはパーツのみであることを認識しません。

Shift + Arrowsでの選択をサポートするターミナルエミュレータを想像するのは難しくありませんが、シェルのカーソルを非表示にし、一時的に存在する「フェイクカーソル」を導入して、何かを選択できるようにし、Ctrlキーを押します+ C / Ctrl + Shift + C / Ctrl + Insでコピー(またはキャンセルするにはEsc)し、実際のカーソルをもう一度表示します。もちろん、通常の選択のすべての機能を備えているわけではありません。特に、カットと削除は存在しません。


ありがとう、私はそのTTYの記事を読みますが、まだ読んでいません。これは、「ターミナルエミュレータ」と「テキストプログラムを処理するデスクトップアプリケーション」の違いに対する私の理解のギャップを説明するかもしれません。私の以前の例であるMatlabコンソールは、私が望むとおりに動作します。その動作を備えたデスクトップアプリケーションが存在できない理由がわかりません。そこで実行されるテキストプログラムはMatlab以外のものです。最も基本的なシェルコマンド(ls、cd、cp、mv)のみを使用したい場合、競合は発生しません。screenやtmuxのようなプログラムは、物事を複雑にするかもしれないと理解しています。
モンギン

1

これらは、80年代半ばのIBMの標準である、説明するCUAキーボードバインディングです。

https://en.wikipedia.org/wiki/IBM_Common_User_Access

それらは通常、それ以降に作成されたすべてのデスクトップ環境に実装されます。DOS、Windows、Motif、Netwareツールもすべてこの標準に収束しました。1つの例外はMacです。これは、同じ期間から非常に似ているが異なるセット(CtrlではなくCmd)を使用します。

ただし、Unix端末はこの標準よりもはるかに先行しており、ほとんど無視されていました。また、これらのキーバインディングを実装した場合、既に他の機能にキーバインディングを使用しているTUIプログラムに干渉する可能性があります。技術的には可能ですが、問題もあります。

アプリ:

microテキストエディタは、私はDOSに似たGUIのテキストエディタ、エミュレートで見た中で最高である  editラ崇高テキストが、より現代的な機能を持つが。 neDebianリポジトリの古いバージョンであり、nano適切なキーバインドで設定することもできます。しかし、裸のターミナル/シェル、いいえ。

ではlibvte、ハンドルこれらのキーバインドを自分ですることを初歩的な仮想端末を構築するのは簡単かもしれません。しかし、小さな利益のための多くの仕事。


0

私はこれと同様の問題で仲間を助けたところ、クリップボードマネージャーclipitが犯人であることがわかりました。

sudo apt-get remove clipit

彼のためにすべてを元に戻して実行することができました。それが他の誰かを助けるかもしれないことを願っています。


間違った質問に答えましたか?これは、すべてのターミナルエミュレータの機能に関する一般的な質問でした。「解決策」がないことは明らかです。今ではありませんし、どのマシンにもclipitをインストールしたこともありません。
モンギン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.