将字符串添加到 zsh 历史记录中

将字符串添加到 zsh 历史记录中

以下功能

function test_hist() {
    print -s "This is a test"
}
zle -N test_hist
bindkey '^X^T' test_hist

将字符串添加This is a test到 zsh-history 中。

如果我通过键入 显式调用该函数test_hist,则该字符串会立即添加到历史记录中,但如果我通过按 ctrl-x ctrl-t 通过绑定键调用它,该字符串不会立即添加到历史记录中。我需要发出另一个命令才能在历史记录中看到它。

为什么会这样,我该如何解决它?

答案1

我发现使用fc -R =(print text)in place ofprint -s text可以在小部件内外一致地工作zle,所以这可能是您的一个解决方法。

查看zsh 5.8的代码,我发现fc -R似乎让 zle 知道当它检测到 zle 处于活动状态时已添加新的历史记录条目, 尽管print -s

这个补丁(在 2020-05-02T22:20+01:00 的当前 git head 上)似乎修复了它:

diff --git a/Src/builtin.c b/Src/builtin.c
index 3dab3f9b4..551653508 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -4918,6 +4918,8 @@ bin_print(char *name, char **args, Options ops, int func)
        ent->stim = ent->ftim = time(NULL);
        ent->node.flags = 0;
        addhistnode(histtab, ent->node.nam, ent);
+       if (zleactive)
+           zleentry(ZLE_CMD_SET_HIST_LINE, curhist);
        unqueue_signals();
        return 0;
    }

但不确定这是否是正确的解决方案。我会将其提交至[email protected]现在完成)。

相关内容