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


14

Debian 8.3を搭載する

stty werase '^H'

またはArch Linux 2/2016

stty werase '^?'

.bashrc(例えば)を行うCtrl- Backspaceターミナル内の最後の単語を削除します。それでもそれは現代のGUIアプリケーション(例:Firefox)と同じ動作ではありません:それは、最後の削除空白は単語を区切られ、そして最後の単語が空白で区切られていないのような文字. : , ; " ' & / ( )

それは作ることが可能であるCtrl- Backspace振る舞いを近代的なGUIアプリケーションに、端末と同様の中に?また、作るためにどのような方法があるCtrl- Deleteカーソルの直前の単語を削除するには?


1
シェルはこれらのアクションをサポートしている可能性があり、それらは特定のキーにバインドできます。
トーマスディッキー

@ThomasDickey:私はbashを使用しています。bashだけで機能する場合は問題ありません。
wolf-revo-cats

回答:


27

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

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

バッシュは、二つの提供前の単語を削除するためのコマンドをunix-word-ruboutCtrl+ w又はセットなどを介してstty werase)、およびbackward-kill-wordM-DELすなわち、Esc Backspace現在のロケールで英数字のシーケンスとしてワードを扱いおよび_Ctrl+でBackspace前の英数字のシーケンスを消去したい場合はstty werase、を設定せずに、次の行をに挿入します.inputrc

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

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

デフォルトで(+ )にkill-wordバインドされている対称コマンドもあります。+ にバインドするには、まず端末が送信するエスケープシーケンスを特定し、次に対応する行をに追加する必要があります。+ を入力してから+ ; これは、イニシャルがエスケープ文字の視覚的表現であるようなものを挿入します。次に、バインディングはM-dAltDCtrlDelete.inputrcCtrlVCtrlDelete^[[3;5~^[

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

どちらかの単語の定義に満足できない場合は、bashで独自の定義を提供できます。bashでのemacsスタイルのキーバインディングの混乱する動作を参照してください。


2
素晴らしい説明!Ctrl+Delうまくいきました。しかし、私はCtrl+Backspace仕事に行くことができません。以下のためにCtrl+v, Ctrl+Backspace私の端末は述べています^?。私は何を入れるべき.inputrcですか?ありがとう
CiprianTomoiagă2017年

3
@CiprianTomoiaga "\C-?": backward-kill-wordまたは必要なreadline関数。ただし、Ctrl + Backspaceのバインディングを定義できるのは、異なる文字を送信する場合に限り、Backspaceのバインディングとは異なります。端末が^?BackspaceとCtrl + Backspaceの両方を送信する場合、端末で実行されているアプリケーションはそれらを区別する方法がありません。一部の端末(たとえば、xterm、urxvt)は構成できますが、その他の端末(たとえば、VTEベースの端末エミュレータ)は構成できません。
Gilles「SO-邪悪なことをやめる」

4
定義~/.inputrcするとデフォルトが無効になることに注意してください/etc/inputrc。これを修正するには、そのファイルを含める必要があります:(ここ$include /etc/inputrcから)
CiprianTomoiagă2017年

Esc + Backspaceの+1
CelalErgün19年


1

クックドモードの端末処理でのWERASE文字の動作は、少なくともLinuxではハードコード化されています。

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

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

readlineのバージョン(bashなどで使用)は、カーネルのバージョンとは少し異なるようですが、ハードコードされているようです。

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

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


1. viユーザーはおそらくの代わりにbackward-kill-word(デフォルトのバインディングM-DEL)を探していますunix-word-rubout
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.