人们提到preexec
在 zsh 中使用 hook,但是我到底应该如何使用它呢?我的意思是,好吧,我可以检查每个命令是否是我不想出现在历史记录中的命令,但是之后该怎么办呢?
答案1
默认情况下zsh
,即使设置 ,也始终保留会话历史记录中的最后一个命令HISTSIZE=0
。您可以编写自己的小部件来规避历史记录机制。
sneaky-run () {
echo
eval $BUFFER
BUFFER=''
zle reset-prompt
}
zle -N sneaky-run
bindkey '^X^M' sneaky-run
该小部件sneaky-run
将运行当前输入的命令,然后清空命令缓冲区并重置提示。在小部件中运行的命令不会添加到历史记录中。
需要echo
在开头,以便输出在新行中开始。如果您有多行提示符,则可能需要echo
在 之前为每个附加行添加附加 s zle reset-prompt
,否则提示符可能会覆盖命令输出的几行。
对于此示例,sneaky-run
绑定到组合键Ctrl+ X, Enter。
如果您不想为此使用额外的组合键,您还可以包装该accept-line
小部件,该小部件通常绑定到Enter
accept-line-with-sneaky () {
if [[ "$BUFFER" == "${BUFFER#" } ]] ; then
zle accept-line
else
echo
eval $BUFFER
BUFFER=''
zle reset-prompt
fi
}
zle -N accept-line-with-sneaky
bindkey '^M' accept-line-with-sneaky
这模仿了设置的行为HIST_IGNORE_SPACE
:如果命令以空格开头,则不会将其添加到历史记录中。但除了 with 之外,HIST_IGNORE_SPACE
在 pressiong 时它也将不可用Up。
笔记:这将覆盖 的最基本的键绑定之一zsh
。因此,在将其放入您的~/.zshrc
.
答案2
您应该使用该HIST_IGNORE_SPACE
选项。
setopt HIST_IGNORE_SPACE
或者将其设置在您的配置文件中,然后在您不想存储的命令前面加上空格。