TLDR
下記を~/.zshrc
に書いておくと、C-p
したときfg
とbg
が履歴に出なくなる。
# fgとbgを完全に無視したC-p
_up-line-or-history-ignoring() {
zle up-line-or-history
case "$BUFFER" in
fg|bg)
zle up-line-or-history
;;
esac
}
zle -N _up-line-or-history-ignoring
bindkey '^P' _up-line-or-history-ignoring
以下のようにhist_ignore_space
を設定する方法はよく紹介されているが、
setopt hist_ignore_space # スペースで始まるコマンドを履歴に残さない
alias fg=' fg'
これだとfg
の直後にC-p
した場合fg
が現れてしまう。先述の設定では現れない。
背景など
こちらの記事を参照:
edit-compile-runサイクルを快適にする方法
代替案:zshのソースを修正する方法
次のように修正すれば一応希望通りになった(簡単な動作確認しかしていない)。
--- zsh-5.3.1/Src/hist.c 2016-11-30 04:52:09.000000000 +0900
+++ zsh-5.3.1.changed/Src/hist.c 2017-08-08 21:14:52.596666658 +0900
@@ -1449,7 +1449,7 @@
if (chwordpos <= 2)
save = 0;
else if (should_ignore_line(prog))
- save = -1;
+ save = 0;
else if (hookret == 2)
save = -2;
else if (hookret)
しかしzshをコンパイルするのはさすがに面倒。
ちなみにこのソース、hend()
という関数がいつ呼ばれるのか、グローバル変数chwords
の意味などよく分からなかった。
gdbでもデバッグしてみようと思ったのだが、zshは端末を操作するためかうまくいかないところがあった。