user128511
user128511

Reputation:

oh-my-zsh cursor up before program has finished vs after, how to make them behave consistently

I've noticed that if I press up arrow at a prompt then I get the previous command and up again gets me the command before that.

Whereas if I press up arrow before the previous program has completed then instead I get the previous command displayed, the cursor is at the end of the line, but oh-my-zsh is now in "search for lines that start with ... " mode meaning I can't press up to get the previous command.

I'm sure this behavior is well known and expected but just in case you don't get it you can repo it like this

  1. Type ls return
  2. Type sleep 3 return
  3. wait 3 seconds for prompt to appear
  4. press (should show sleep 3)
  5. press again (should show ls)
  6. press return (to run ls)
  7. Type sleep 3 return (press the up arrow before the 3 seconds elapses)
  8. It should now be showing sleep 3
  9. Press
    it will still be showing sleep 3 but it want it to be showing ls. Instead it is in "search for commands that start with sleep 3 mode instead of just go to previous command mode.

To make try to clear in both cases these are the steps

  1. lsreturn
  2. sleep 3return

But they end up with different results depending on if step3 happens before or after step2 finishes.

Note I saw this Q&A: https://unix.stackexchange.com/questions/324623/how-to-make-oh-my-zsh-history-behavior-similar-to-bashs

But that doesn't seem to be what I'm looking for. I like oh-my-zsh's partial line + up = search for lines that start with the partial. What I'm trying to fix is that if I press up on step 2 above it magically inserts a partial where as if I wait until step 2 finishes it doesn't.

How do I get oh-my-zsh to be consistent here so that a premature up arrow behaves the same as a normal up arrow?

I'm surprised this question isn't common. It's seriously infuriating to have the terminal act inconsistently. I'd except most devs using oh-my-zsh to run into this issue all the time and be massively frustrated.

The example above with sleep 3 is only to make it easy to show the problem. In actual usage the problem happens frequently even with short lived commands. I type say git status return git commit somefile -m "short comment" return expecting to see "git status". 66% of the time I get git status and the other 34% I get `git commit somefile -m "short comment" and pressing again just blinks the cursor and I have to press Ctrl-C to break out of zsh's partial complete mode.

The fact that this does not seem to be a common complaint for oh-my-zsh makes me wonder if I have something setup wrong.

To make it clearer run zsh without oh-my-zsh.

zsh -d -f
autoload -U up-line-or-beginning-search
zle -N up-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search

Now try the steps above. You'll get consistent behavior.

Upvotes: 2

Views: 768

Answers (1)

Guy Grin
Guy Grin

Reputation: 2034

This might be an overkill solution but, following this guide you can see that you can bind new actions to the up/down arrow key. So if you add:

bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

to your ~/.zshrc, it should remove the functionality you talked about. I managed to get it to work while still maintaining regular search capabilities but this is not thoroughly tested and should probably be used with care.

Upvotes: 2

Related Questions