バックワードキルワードをCtrl + wにバインド


23

Tcshの長期使用から最近のBashの調査に切り替えようとしています。

スペースとスラッシュを単語境界として扱うCtrl + wを除き、お気に入りのすべての機能を移植することができました。ただし、Bashでは、readlineは最初のスペースまですべて削除し、その間のすべてのスラッシュを削除します。

bindを使用して.inputrcと.bashrcの両方で\ Cw:backward-kill-wordのさまざまな組み合わせを試しましたが、希望どおりに動作させることができません。

面白いことに、職場のWindowsのPuttyを使用すると、Alt + Backspaceを使用できます。これは、マニュアルでもデフォルトのバインディングであり、必要な動作を実現できます。しかし、自宅のMacのTerminal.appでは、これは機能しません。Terminal.appからたまたまログインしたFreeBSDまたはLinuxサーバーについても同様です。

そこで、スーパーユーザーに助けを求めます。

回答:


40

readlineバインドしませんCtrl- Wデフォルトでターミナルドライバーによって処理されるため:

$ stty -a
(...) werase = ^W; (...)

これを無効にするには、(で~/.bashrc)実行する必要があります:

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcとき、それが読まれているので、ここで助けにはなりませんCtrl- Wまだに割り当てられていますwerase

また\C-w、上記のように、フォーマットのkeyseqは二重引用符で囲む必要があることに注意してください。


異なる端末が処理する可能性がありますAlt- Backspace異なる。

  • PuTTYおよびGNOMEターミナル(デフォルト設定)送信1b 7fESC DEL
  • XtermのmetaSendsEscape: true送信1b 08ESC BS)。
  • 送信なしの Xterm (、または最上位ビットが設定されている)。metaSendsEscape88HTSBS

Xtermには、Altキーの動作を制御するためのいくつかの設定があります(MetaXtermおよびX11で一般的に呼び出されます)。でmetaSendsEscape、保持Altするとキープレスの前にESC(hex 1b)が付きます。設定なし(デフォルトモード)ではAlt、入力文字の最上位ビットが設定され、特殊文字が生成されます。(たとえば、Alt- NはそれぞれESC nおよびになりîます。)

覚えている限りでは、Terminal.appにもMeta / Alt / whatever-macs-useの動作を制御する同様の設定があります。


これは最良の答えであるだけでなく、非常に有益です、ありがとう!
ステファンM

1
@shurane:通常の消去(バックスペース)のようなweraseの「単語消去」アクションは、OS自体の「ttyデバイス」ドライバーで実装されます。cat。すべてのUnixで、sttyこれらの特殊キーを含むさまざまなttyパラメーターを制御するために使用されます。(UNIX 7th Editionのstty
外観は次のとおり

1
@shurane:一方、readlineは元々bashシェル用に書かれたユーザー空間ライブラリです(現在は多くのプログラムで使用されていますが)。ttyドライバーの膨張を回避するために、他のアクションがreadlineに実装された可能性があります(sttyマニュアルに記載されているように、既にかなりの量のフラグとトグルがありました)。また、bashはもともとGNU OSを対象としており、後に他のUnixに移植されました。いくつかの非常に異なるカーネルよりも、単一のライブラリで編集機能を維持する方がはるかに簡単です。
悲しみ

3
@shurane:技術的には、しかし、単語消去を含むこれらのすべてのアクションはreadlineによって実装されます。アクティブになっている場合、端末ドライバーによるBackspaceおよびCtrl + W処理を完全に無効にします。readlinesttyは単純に構成を尊重しますが、readline自身の設定でオーバーライドできます(Matt Dayの回答で説明されています)。
悲しみ

4
これは、情報に対する素晴らしい答えです。ただし、readlineを使用しない限り、すべてのプログラムでCtrl-wが無効になることに注意する必要があります。
0fnt

19

grawityは、これを.inputrcファイルで制御することはできないと書いていますが、それは誤りです。

の場合は、特別な端末文字の動作をカスタマイズできset bind-tty-special-chars offます.inputrc

例えば:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
そしてこれには、readlineを使用するすべてのプログラム(例:)で動作するという利点がありpythonます。
wchargin

3

記録のために、それはiTerm2に適用される答えがセットにあるAlt- Backspace(またはOpt ⌥- Mac上で)16進コードを送信する0xb1と、0x7f実行するために、backward-kill-wordアクションの区切り文字として英数字以外の文字を扱いますが。

区別のために、ここで私が説明してる挙動が押している、だOpt ⌥- 一度はこれを変更します。

echo "/example/filepath/with_non-alpha.characters@blah:meh

これに:

echo "/example/filepath/with_non-alpha.characters@blah:

そしてその後のOpt ⌥-のプレス

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

iTerm2の設定は次のとおりです。 ここに画像の説明を入力してください

したがって、PuttyとTerminalに固有のgrawityの答えは素晴らしいです。しかし、iTerm2で設定を適用する方法を探すのに恥ずかしい時間を費やしたため、このスーパーユーザーの投稿は最も頻繁に表示されるようであるため、この質問に添付された回答としてiTerm2に適用される関連情報を提供する責任があったようです。


これを理解するのに本当に時間がかかりました。このソリューションは、リモートbashシェルにログインするときに、OS X(iTerm2を使用)で実際に動作します。ありがとう!
-Martijn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.