bashでは、ファンクションキーをコマンドにバインドするにはどうすればよいですか?


91

例:F12コマンドにキーをバインドして、メッセージ「foobar」を押すecho "foobar"たびF12に画面に出力されるようにします。理想的には、ビルトインだけでなく、任意のシェルコマンドにすることができます。これをどうやってやるの?

回答:


163

コマンドラインでCtrl- vを押してから、目的のキーを押すことで、キーによって出力された文字シーケンスを確認できます。私のシステムではF12、が表示されます^[[24~。を^[表しEscます。異なるタイプの端末または端末エミュレーターは、同じキーに対して異なるコードを発行できます。

Bashプロンプトで、次のようなコマンドを入力してキーマクロを有効にし、試してみることができます。

bind '"\e[24~":"foobar"'

これで、を押すF12と、コマンドラインに「foobar」が表示され、さらに編集することができます。キーストロークでコマンドをすぐに入力したい場合は、改行を追加できます。

bind '"\e[24~":"pwd\n"'

これで、を押すとF12、を押さなくても現在のディレクトリが表示されますEnter。行にすでに何かを入力していて、これを使用して自動的に実行されるとどうなりますか?乱雑になる可能性があります。ただし、マクロの一部として行をクリアできます。

bind '"\e[24~":"\C-k \C-upwd\n"'

スペースがあることを確認しますCtrl- u鳴ってから鐘を保つために削除するために何かを持っています。

マクロが希望どおりに機能するようになったら、~/.inputrcファイルに追加してマクロを永続化できます。bindコマンドや一重引用符の外側のセットは必要ありません。

"\e[24~":"\C-k \C-upwd\n"

編集:

現在のコマンドラインに影響を与えずに何かを実行するキーバインディングを作成することもできます。

bind -x '"\eW":"who"'

そして、あなたは、たとえば、ユーザ名が必要なコマンドを入力している、とあなたが押すことができ、ログインしているユーザーの名前を知っている必要がありながらAlt- Shift- Wとの出力がwho表示され、プロンプトが再発行されます部分的なコマンドはそのままで、カーソルは行の同じ位置にあります。

残念ながら、これはF123文字以上を出力するようなキーでは適切に機能しません。場合によっては、これを回避できます。

コマンド(whoこの場合)は、プログラム、スクリプト、または関数など、任意の実行可能ファイルです。


2
「ctrl + q」にバインディングを追加したい場合はどうなりますか?
kubudi 2013

5
@kubudi:bind '"\C-q": menu-complete'例えば(またはのあなた~/.inputrc"\C-q": menu-complete)。またstty -ixon~/.bashrcフロー制御を無効にして、^ Sおよび^ Qを使用可能にする必要がある場合もあります。
追って通知があるまで一時停止。

あなたはそれが^[表すことを言ってesc、それから\eあなたの例ではそれを代用するようです。理由を教えてください。
リムーバー

1
@Remover:これ^[は出力表現です。\eそれを入力するための一つの方法である(^[そのために動作しません)。
追って通知があるまで一時停止。

「\ Cz」をバインドするにはどうすればよいですか?sheerun.net/2014/03/21/how-to-boost-your-vim-productivity
pkoch

19

~/.inputrc(GNU Readlineライブラリの構成ファイル)でbashキーバインディングを定義できます 。構文は

<keysymまたはキー名>:マクロ

例えば:

Control-o: "> output"

を押すと「出力」を挿入するマクロを作成します ControlO

 "\e[11~": "echo foobar"

を押すと "echo foobar"を挿入するマクロが作成されますF1...のキーシムF11が手元にないのかわかりません。

編集:

.inputrc\n改行のエスケープシーケンスを理解するため、

 "\e[11~": "echo foobar\n"

これは、コマンドが発行された後、効果的に「Enter」を押します。


4
あなたは、改行文字を追加するには、マクロ内の「n \」を使用することができます
バートンチッテンデン

端末を開く際のキーマッピングを定義しているので、これは私にとってよりうまくいきます。
Heldraug

以下のためにAlt使用することは、\e例えば"\eo": "> output"
ジャニスElmeris

使用の.inputrc詳細なチュートリアルについては、hackaday.com / 2018/01/19 / linux
Josh Habdas '17

1
@ArthurHenriqueDellaFraga回答を編集しました。それはあなたのホームディレクトリにあります。存在しない場合は作成できます。
Barton Chittenden

7

このソリューションはX11環境に固有であり、bashとは関係ありませんが、.Xmodmapsに以下を追加します

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

F12を押すと、文字列 "foobar"が端末に送信されます。


これは、コマンドを実行するシェルと同じではないことに注意してください。コマンドを実際に実行したい場合は、Enterキーを押す必要があります(または、送信された文字列にそれを実行させる必要があります)。おそらくまた、安全で最初にラインをクリアしたいでしょう。
Cascabel 2010年

2
これはすばらしいことですが、とにかくFedora 20の時点では機能していないようです。xevを使用して最初にF12の適切なキーコード(私の場合は96)を見つけ、88の代わりにそれを使用してみました。どちらも機能しません。
BobDoolittle 2014年

2

Ctrl+Bコマンドにバインドしたかった。上記の回答に触発されて使用しようとしましbindたが、一連の不可解な波線(\e[24~?)がに変換されましたCtrl+B

Macでは、ターミナルアプリの[設定]、[プロファイル]-> [キーボード]->の順に移動し、目的+のキーボードショートカットを押すと、それが表示されます。私にとってCtrl+Bは、私が\002コマンドに正常にバインドした結果

bind '"\002":"echo command"'

また、コマンドを(プロンプトに挿入するだけでなく)すぐに実行したい場合は、次のようにコマンドの最後にEnterを追加できます。

bind '"\002":"echo command\015"'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.