I have looked for a solution to this OhMyZSH!
problem for a few days now, but can't find a solution.
Admittedly, I do not understand how zle
really works, same for bindkey
. Same goes for the way terminal emulators send "control sequences", and what the "terminal type" means (xterm
, versus xterm-256-color
, and others). Same for the "Application mode"
The setup
I have 2 machines where the latest version of OhMyZSH is installed, commit c3b072
:
- machine A: SLES 11 SP4, running
zsh 4.3.6 (x86_64-suse-linux-gnu)
- machine B: Ubuntu 16.04, running
zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
I connect to either machine using Putty running on Windows, with terminal type xterm
, and in UTF-8 translation mode.
My zshrc
files are pretty much vanilla OhMyZSH
templates, I have just changed the prompt to dieter
on machine A, and powerlevel-9k
[https://github.com/bhilburn/powerlevel9k] on machine B.
What I observe on machine A (aka the "bad" one)
When I edit my command line, the Left and Right cursor keys move one whole word (instead of 1 single character).
Home and End keys though, bring the cursor to the beginning and end of the line, as expected.
This described behaviour applies when in emacs
mode (bindkey -e
).
When I go to vim
mode (bindkey -v
), the Left and Right arrows move 1 character, but the Home and End keys don't move the cursor to the beginning and end of the line. Instead, they switch the case of the character under the cursor.
What I observe on machine B (aka the "good" one)
Left and Right keys move the cursor one single char. Home and end keys move the cursor to the beginning and end of line resp. Ctrl+A and Ctrl+E combos bring my cursor to the beginning and end resp.
This is the behaviour I would like for all my shells.
What I have found so far
I think it is a bindkey
issue. But I know next to nothing about that, and I've had a hard time finding any doc on this zsh
built-in.
Running zsh -v
on both machines at login time gives very different results, despite similar .zshrc
files.
Could someone explain to me what is causing these 2 machines to behave so differently, and how I can change my configuration so that consistency is regained, and all my shells behave like on machine B (aka the "good" one)?
I'm sure you will let me know if you need more information that I don't know is needed.
Many thanks
Best Answer
You must configure your terminal type as
putty
,putty-256color
, orputty-sco
when using PuTTY. They are the only terminal types whose entries in the terminfo database correctly describe PuTTY.It is a widespread incorrect assumption that terminal emulators are all compatible with XTerm, and that the
xterm
andxterm-256color
entries in the terminfo database correctly describe them.This erroneous thinking is called out in Thomas Dickey's XTerm FAQ and it is worth observing that the
xterm
andxterm-256color
entries do not even describe all versions of XTerm, let alone other terminal emulators.PuTTY's doco such as the page hyperlinked there by M. Dickey, even today 16 years since the
putty
entry was added to terminfo, unfortunately promotes this mis-use of thexterm
terminal type, but a mis-use it is, and this is the very sort of application misbehaviour that occurs.Comparing the terminfo database entries for
xterm-256color
andputty-256color
reveals what is happening with your ⇱ Home and ⇲ End keys:As you can see, an application that is told that it is dealing with XTerm expects to receive (from the terminal) the control sequence
␛OH
for the ⇱ Home key and the control sequence␛OF
for the ⇲ End key. But PuTTY actually sends the control sequences␛[1~
and␛[4~
(respectively) instead.Your application, the Z shell, expecting the the XTerm keyboard control sequences (because you have erroneously told it that your terminal has the type
xterm
), does not recognize the PuTTY control sequences, and in fact breaks them down into thevi
-mode commands to exit insert mode (␛
) and swap the case of the current character (~
).Further reading