Edited at

zshでC-pしたときfgが履歴に出ないようにする

More than 1 year has passed since last update.


TLDR

下記を~/.zshrcに書いておくと、C-pしたときfgbgが履歴に出なくなる。

# 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は端末を操作するためかうまくいかないところがあった。