履歴に新しいコマンドを保存せずにシェル構成を再構成するキーバインディングをどのように作成できますか?

履歴に新しいコマンドを保存せずにシェル構成を再構成するキーバインディングをどのように作成できますか?

C-x rreadlineライブラリの1つに保存されている設定を再ロードするために、キーシーケンスを使用してキーバインディングを作成したいと思います。bash~/.bashrc~/.inputrc

re-read-init-filereadlineの設定を再ロードするには、次の機能を使用できると思いましたman 3 readline

re-read-init-file (C-x C-r)
        Read in the contents of the inputrc file, and incorporate any bindings or variable  assignments  found there.

設定を再ロードするには、またはコマンドをbash使用できます。しかし、シェルコマンドとreadline関数を組み合わせる最良の方法は何であるかわかりません。だから私は2つのキーバインディングの組み合わせを思いついた。source.

bind '"\C-xr":      ". ~/.bashrc \C-x\C-z1\C-m"'
bind '"\C-x\C-z1":  re-read-init-file'

Bashを押すと、C-x r次のことが起こります。

. ~/.bashrc    `~/.bashrc` is inserted on the command line
C-x C-z 1      `C-x C-z 1` is typed which is bound to `re-read-init-file`
C-m            `C-m` is hit which executes the current command line

~/.inputrctmuxの内側には1つが編集用で、もう1つはシェル用のウィンドウがあり、設定ファイルを変更する~/.bashrcと、シェルに入力した後に変更C-x r(新しいエイリアスまたは新しいキーバインディング)が次のように適用されることがわかるため、うまくいくようです。ウィンドウを閉じずに新しいシェルをもう一度開きます。

しかし、同じ結果を得るためのより良い方法はありますか?特に履歴にエントリを残さずにコマンドを実行できますか?C-p最後に実行されたコマンド呼び出しをクリックすると取得されますが、. ~/.bashrcシェル構成を再インポートする前にコマンドを実行した方がよいでしょう。

私は同じ問題がありますzsh

bindkey -s '^Xr' '. ~/.zshrc^M'

同様に をクリックすると、C-x rコマンドが. ~/.zshrc履歴に書き込まれます。ソースを再構成するより良い方法はありますかzsh

ベストアンサー1

実行するためにコマンドラインにコマンドを挿入しないでください!これは非常に脆弱です。現在、プロンプトに何も入力されていないとします。代わりに、 line-edit コマンドではなくシェルコマンドにキーをバインドします。

バッシュでは、以下を使用してください。bind -x

bind -x '"\C-xr": . ~/.bashrc'

readline 設定も再読み込みするには、キーバインディングで readline コマンドと bash コマンドを混在させる簡単な方法はありません。不器用なアプローチは、2つのキーシーケンスを含むreadlineマクロにキーをバインドすることです。 1 つは実行される readline コマンドにバインドされ、もう 1 つは bash コマンドにバインドされます。

bind '"\e[99i~": re-read-init-file'
bind -x '"\e[99b~": . ~/.bashrc'
bind '"\C-xr": "\e[99i~\e[99b~"'

zsh では、次を使用します。zle -N関数をウィジェットとして宣言してからbindkeyウィジェットをキーにバインドします。

reread_zshrc () {
  . ~/.zshrc
}
zle -N reread_zshrc
bindkey '^Xr' reread_zshrc

おすすめ記事