web-dev-qa-db-ja.com

bash readline:外部コマンドを実行するキーバインディング

(背景:私は長年のtcshユーザーであり、徐々にbashに移行し、いくつかの便利なtcsh固有の機能に相当するものを見つけようとしています。)

Tcshでは、外部コマンドを実行するキーバインディングを定義できます。たとえば、次のようになります。

bindkey -c ^Gu uptime

Tcshに「Control-Gu」と入力すると、uptimeコマンドが実行されます。 Enterキーを入力する必要はなく、コマンドは履歴に表示されず、入力行の途中で実行できます(後者は特定のコマンドで特に便利です)。

bashには、GNU readlineライブラリを介した同様のキーバインディングメカニズムがあり、バインディングは$HOME/.inputrc(または他の場所)で指定されています。しかし、info readlineドキュメントを読んだ後、私はしません。キーバインディングが外部コマンドを実行する方法を確認します。

私が理解した最も近いことは、次のようなものを私の.inputrcファイルに追加することです。

"\C-gu": "uptime\n"

しかし、それはコマンドを実行しません。むしろ、uptimeに続けてEnterキーを入力したかのように機能します。このコマンドは私の履歴に表示され(問題ありません)、空の行でのみ機能します。 "echo control-Gu"と入力すると、コマンドを実行するのではなく、uptimeが出力されます。

もう1つの小さな欠点は、バインディングが、Perlデバッガーなど、GNU readlineを使用する他のコマンドに影響を与えることです。

キーシーケンスを指定された外部コマンドの実行にマッピングすることにより、bashでtcshのbindkey -cの効果をシミュレートする方法はありますか?

重要な場合は、Ubuntu12.04ベータ2でbash4.2.24を使用しています。

4
Keith Thompson

すべてのbash行編集が~/.inputrcから制御されるわけではありません。その多くは、bindビルトインを介して構成されます。この場合、次のようなものが必要です

bind -x '"\C-gu":uptime'

~/.bashrcで。

6
geekosaur