3

The following function

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

adds the string This is a test to the zsh-history.

If I call the function explicitly by typing test_hist, the string is immediately added to the history, but if I call it through the bindkey by pressing ctrl-x ctrl-t, the string is not added to the history straight away. I need to issue another command before I can see it in the history.

Why is that, and how can I fix it?

1
  • Didn't know that. Just edited the question.
    – noibe
    Apr 30, 2020 at 11:24

1 Answer 1

1
+50

I find that using fc -R =(print text) in place of print -s text works consistently in and out of a zle widget though, so it could be a work around for you.

Looking at the code of zsh 5.8, I find that fc -R seems to let zle know that a new history entry has been added when it detects zle is active, while print -s doesn't.

This patch (on the current git head as of 2020-05-02T22:20+01:00) seems to fix it:

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;
    }

Not sure if that's the right fix though. I'll submit it to zsh-workers@zsh.org (done now).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.