如何在 zsh 中执行命令而不将其存储在历史记录中(即使是“向上”键)

如何在 zsh 中执行命令而不将其存储在历史记录中(即使是“向上”键)

人们提到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

或者将其设置在您的配置文件中,然后在您不想存储的命令前面加上空格。

相关内容