Using putty, Left and Right keys move cursor one word, instead of one char

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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You must configure your terminal type as putty, putty-256color, or putty-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 and xterm-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 and xterm-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 the xterm 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 and putty-256color reveals what is happening with your ⇱ Home and ⇲ End keys:

% infocmp xterm-256color putty-256color|grep -F kend
    kend: 'EOF', 'E[4~'.
% infocmp xterm-256color putty-256color|grep -F khome
    khome: 'EOH', 'E[1~'.
%

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 the vi-mode commands to exit insert mode () and swap the case of the current character (~).

Further reading

Method 2

As kindly pointed by JdeBP, my TERM was wrongly set.

I was finally able to have everything working consistently with the following steps:

  1. Set terminal type in Putty to putty
  2. Deactivate application mode for cursor and keypad in Putty
  3. Add the following lines to my .tmux.conf file
    • set -g default-terminal "$TERM" to prevent tmux from using screen by default
    • set -g terminal-overrides "putty*:kLFT5=eOD:kRIT5=eOC:kUP5=eOA:kDN5=eOB:[email protected]:[email protected]" to have the Left and Right keys move by one char, instead of one word


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x