C-x r
readlineライブラリの1つに保存されている設定を再ロードするために、キーシーケンスを使用してキーバインディングを作成したいと思います。bash
~/.bashrc
~/.inputrc
re-read-init-file
readlineの設定を再ロードするには、次の機能を使用できると思いました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
~/.inputrc
tmuxの内側には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
どのコマンドも保存しないようにする必要がありclear
、history
さらに重要なのは . ~/.bashrc
コマンドです。
の場合、次のように説明されているオプションがzsh
見つかりました。HIST_IGNORE_SPACE
man 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