私はreadlineのマニュアルページを読んで、存在するかどうかわからなかった素晴らしいコマンドをたくさん見つけました。ただし、一部には主キーバインディングがありません。シェルでバインドされていないコマンドを実行する方法はありますか?
~/.inputrcでコマンドをバインドする方法を尋ねるのではなく、シェルまたはbashスクリプトで「一度に」コマンドを実行する方法を尋ねることです。
たとえば、「変数ダンプ」コマンドがあります。実行する引数で「ダンプ変数」を提供できるコマンドはありますか?
答え1
私はあなたが探しているものがコマンドbind
自体であると信じています。man builtin
情報によると、実行をbind <readline-command>
使用すると一度に実行できますが、マニュアルに記載されているとおりに動作できません...キーが機能しなくなり、旅行が変わる可能性があります。私はあなたに役立つ次のコマンドを見つけました。
bind -p # Equivalent to dump-functions [machine readable]
bind -P # Equivalent to dump-functions [human readable]
bind -s # Equivalent to dump-macros [machine readable]
bind -S # Equivalent to dump-macros [human readable]
bind -v # Equivalent to dump-variables [machine readable]
bind -V # Equivalent to dump-variables [human readable]
エディタノート
マニュアルに記載されているとおりに動作しないことがどれほど迷惑かを指摘したいと思います。なぜなら、入力してbind
タブキーを押してオートコンプリートすると、すべてのコマンドが表示されるからです。
答え2
これが意味のある1つの状況は、行が空のときに主キー入力を「オーバーロード」することです。この場合、多くのバインディングは意味がなく、したがって最も快適なキー入力の多くは非常に便利ですが、無駄になるからです。それはまるで
alt_n() {
[ -z $READLINE_LINE ] && do_something_else || execute_default_command
}
bind -x '"\en": alt_n'
それ以外の場合は、影響を受けるすべてのバインディングに対してデフォルトの動作を実装する必要があります。これはいくつかのケースでは非常に簡単で、他のケースではそうではなく、常に奇妙なバグが発生しやすいハッキングです。誤ってセッションを閉じ続けたため、実際に動作する例(幸いにもEOFの処理方法)はstty eof ^B
.profileにあります。カーソルが離れると、行エディタでは正常に動作しますexport IGNOREEOF=2
が<C-B>
、空のプロンプトでは3回を押して終了できます。
少なくとも私には混乱を引き起こさず、私がコマンドを入力しているのか、空の行に座っているのかを常に知っていました。つまり、すべてのプロンプトは暗黙的にモーダルなので、ショートカットスペースを大量に無駄にし、いくつかのプロンプトをセカンダリバインディングで使用すると本当にきれいになります。具体的には元の機能をそのまま維持しながら別々に使いたくてここまで<M-f>
来<M-b>
ました。pushd +1
pushd -1
私はCの専門家ではありませんが、bashに触れることを検討していますが、それは不可能です。それbind
単一の引数を受け入れ、対応するreadline関数を呼び出すように組み込み関数を拡張することは困難です。すでにこれを行った人がいるかどうか疑問に思います。
答え3
私はここで理論的な問題を見落としていると思います。
readline コマンドを実行することは、内容を読むときにのみ意味があります。ただし、bash コマンドが実行されると、bash は通常は読み込まれません。
Readlineはbashから独立したライブラリです。あなたはそれを次のように使用します
// start reading
char * input = readline("this is the prompt$ ");
// at this place, reading ended
// do something with input
free(input);
Readlineは実行中にのみforward-word
コマンドを実行できます(たとえば)。readline()
入力しimaginary_cmd_for_executing_readline forward-word
てbash
Enterを押すと終了し、readline()
実行forward-word
できなくなります。 Bashのソースコード(またはカスタムロード可能組み込み)からreadlineコマンドに従うC関数を直接呼び出すことができます(たとえば、rl_forward_word
代わりforward-word
にまたはrl_get_previous_history
代わりにprevious-history
)。ただし、メモリ領域の読み書きに失敗することがあります。それから使用するため。それでもラインバッファだけを修正し、実際には何も印刷しないため、結果は得られません。
readline()
Bashは、実行時に実行できる機能のいくつかをreadlineに登録します。
- 信号が届きます(例:を押すctrlc)。
- bashのカスタムreadlineコマンド(たとえば
shell-expand-line
)のいずれかを実行します。これは、登録されたキーシーケンスを入力した場合にのみ発生します。 bind -x
登録されたキーシーケンスを入力します。
これらのフックでは、理論的にreadlineコマンドを実行できます。しかし、すべてキーストローク自体がトリガーとして必要であるため、直接バインディングと比較して使用する利点はありません。しかし、最も重要なことは、前述のように、行を編集せずにreadlineコマンドのみを実行することは意味がないかもしれません。
必要に応じて、実行したいコマンドにキーを一時的にバインドし、そのキーストロークがバックグラウンドで端末自体に自動的に送信されるようにすることができます。Bashは独自の入力ストリームに書き込むことができますか?。