以下功能
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]
(现在完成)。