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

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

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

答え2

で次のような環境変数をman bash見つけました。HISTIGNORE

HISTIGNORE

        A  colon-separated list  of patterns  used to  decide which  command
        lines should be saved on the  history list. Each pattern is anchored
        at the  beginning of the line  and must match the  complete line (no
        implicit `*' is  appended). Each pattern is tested  against the line
        after the checks  specified by HISTCONTROL are  applied. In addition
        to the  normal shell  pattern matching  characters, `&'  matches the
        previous history  line. `&'  may be escaped  using a  backslash; the
        backslash  is removed  before  attempting a  match.  The second  and
        subsequent lines  of a multi-line  compound command are  not tested,
        and are added to the history regardless of the value of HISTIGNORE.

したがって、次の値を次にエクスポートしました~/.bashrc

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

export HISTIGNORE="clear:history:. ~/.bashrc "

最後の行はbashどのコマンドも保存しないようにする必要がありclearhistoryさらに重要なのは . ~/.bashrcコマンドです。


の場合、次のように説明されているオプションがzsh見つかりました。HIST_IGNORE_SPACEman zshoptions

HIST_IGNORE_SPACE (-g)

        Remove command lines  from the history list when the  first character on
        the line  is a  space, or when  one of the  expanded aliases  contains a
        leading space. Only  normal aliases (not global or  suffix aliases) have
        this behaviour.  Note that the  command lingers in the  internal history
        until the  next command is entered  before it vanishes, allowing  you to
        briefly reuse or edit the line. If you want to make it vanish right away
        without entering another command, type a space and press return.

これにより、このオプションを有効にすると、zshスペースで始まるすべてのコマンドを履歴から削除する必要があります。ただし、次のコマンドが実行されるまで内部履歴に一時的に残ります。そのため、このオプションを設定して~/.zshrcからキーバインディングをオーバーライドして、次のようにシェル構成を再構成しました。

    setopt HIST_IGNORE_SPACE
    bindkey -s '^Xr' ' . ~/.zshrc^M ^M'
#                     │            │
#                     │            └─ command containing only a space to force `zsh`
#                     │               to “forget“ the previous command immediately
#                     └─ space added to prevent `zsh` from logging the command

関連情報