web-dev-qa-db-ja.com

bashでのCtrl-BackspaceおよびCtrl-Delete

Debian 8.3を搭載する

_stty werase '^H'
_

またはArch Linux 2/2016

_stty werase '^?'
_

_.bashrc_(例)では Ctrl-Backspace 端末の最後の単語を削除します。それでも、最近のGUIアプリケーション(Firefoxなど)と同じ動作ではありません。最後のwhitespace-で区切られたWordを削除します。空白で区切られた最後の単語ではありませんor. : , ; " ' & / ( )のような文字。

作ることは可能ですか Ctrl-Backspace 端末で最新のGUIアプリケーションと同様に動作しますか?また、作る方法はありますか Ctrl-Delete カーソルの直前の単語を削除しますか?

14
wolf-revo-cats

ここには2つのラインエディターがあります。カーネルによって提供される基本的なラインエディター(標準モードのttyラインエディター)とbashのラインエディター(readlineライブラリを介して実装)です。これらの両方には、にバインドされている、前の単語への消去コマンドがあります Ctrl+W デフォルトでは。キーは、stty werase;を使用して、標準モードのttyラインエディター用に構成できます。 bashは、独自の構成でオーバーライドされない限り、tty設定で見つけたキーバインディングを模倣します。

Ttyラインエディタのweraseアクションは設定できません。空白で区切られた単語(ASCII)は常に消去されます。 ttyラインエディタを操作することはほとんどありません。たとえば、次のようなものです。引数なしでcatを入力した場合。そこで豪華なキーバインディングが必要な場合は、readlineを使用する rlwrap のようなツールの下でコマンドを実行できます。

Bashには2つの 前の単語を削除するコマンドunix-Word-ruboutCtrl+w またはstty werase)とbackward-kill-WordM-DELを介して設定されます。 EscBackspace)which Wordを現在のロケールおよび_ で英数字のシーケンスとして扱います。お望みならば Ctrl+Backspace 以前の英数字のシーケンスを消去するには、stty weraseを設定せず、代わりに次の行を.inputrcに挿入します。

"\C-h": backward-kill-Word

これは、端末がCtrl + H文字を送信することを前提としています。 Ctrl+Backspace。残念ながら、これは標準のバインディングがない(そして Backspace 特に 混乱している 歴史的な理由による)。

kill-Wordにバインドされている対称コマンドM-dもあります(Alt+D)デフォルトで。バインドする Ctrl+Delete、まず端末が送信するエスケープシーケンスを特定し、次に対応する行を.inputrcに追加する必要があります。タイプ Ctrl+V その後 Ctrl+Delete;これにより、^[[3;5~のようなものが挿入されます。最初の^[は、エスケープ文字の視覚的表現です。次に、バインディングは

"\e[3;5~": kill-Word

Wordのどちらの定義にも満足できない場合は、bashで独自の定義を提供できます。参照 bacでのemacsスタイルのキーバインディングの動作の混乱

試す

alt+backspace

初級OSでは、それはあなたが望むように機能します(ちょうどのように ctrl+backspace

6
Ahmed Elkoussy

クックドモードの端末処理でのWERASE文字の動作は、少なくともLinuxでは hardcoded です。

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

つまり、単語は文字、数字、アンダースコアです。これは、独自のクックドモード処理を実行するアプリケーションが実行されていない場合に、Linuxのターミナルで常に行われる方法です。

readlineのバージョン(bashなどで使用)は、カーネルのバージョンとは少し異なるようですが、 hardcoded のようにも見えます。

単語は文字と数字で構成されます。

しかし、これはbashが実際に私に対して行うことと一致していないようです:foo+bar^Wは、barだけでなく、すべてを消去します。その詳細情報は here です。

1
Celada