How to configure PuTTY so that Home/End/PgUp/PgDn work properly in bash?

124

54

The keys Home, End, PageUp, PageDown all type a ~ in my bash session instead of moving the cursor / view around. Why does this happen and which settings do I need to change?

GNU bash, version 4.0.28(1)-release (x86_64--netbsd)
PuTTY v0.60

The question originally read:

In PuTTY, why does pressing the "Home" key on the shell (bash) type a "~"? Or rather, how do I make it move the cursor to the start of the command I've typed?

(I thought the reason was that ~ is the home directory, but the answers say this is not so.)

RomanSt

Posted 2010-01-11T16:48:26.380

Reputation: 7 830

Answers

152

Change the Terminal-type String under the Connection > Data tab from the default “xterm” to “linux”. It worked for me.

enter image description here

Stephen Irons

Posted 2010-01-11T16:48:26.380

Reputation:

5Emphasis: not Terminal -> Keyboard "The Function keys and keypad". – Elazar – 2014-12-03T13:43:47.720

3It works but creates other problems like disabling mouse support. so, it is not acceptable solution for me – Anton – 2015-09-22T20:58:27.800

This solution also enables umlauts inside putty when connecting to OS X! – lorem monkey – 2016-03-03T17:30:02.860

2

Thanks! I had this problem after I tred to make Ctrl Left/Right work using this method (http://superuser.com/a/103097/45410).

– Edwin Yip – 2012-11-04T17:04:46.580

45

This is happening because you don't have PuTTY's terminal type set correctly, or because your server doesn't have the correct terminfo definitions installed.

On Debian-based systems, the ncurses-term package (version 5.7+20081213-1) includes terminfo definition files for putty, putty-256color and putty-vt100 terminal types. If you have this package installed, you can set the "Terminal-type string" to "putty" instead of the default "xterm" in Putty's session configuration (Connection -> Data).

Stephen Irons also mentions "linux" as another terminal type that works; I believe this is correct from prior experience, but haven't tested it recently.

On my systems, this allows Home and End to work correctly, though PageUp/PageDown do not scroll the console window. (They do work properly in ncurses applications like aptitude, and Shift-PgUp/Shift-PgDn scroll the console window.)

quack quixote

Posted 2010-01-11T16:48:26.380

Reputation: 37 382

yum install ncurses-term sorted it for me on CentOS 7 with putty on next login, thank you. – Wandering Zombie – 2014-12-07T14:21:40.943

1setting terminal type to putty works but breaks xterm-like mouse support (e.g. for Midnight Commander) – Anton – 2015-09-22T21:02:29.773

installing 'ncurses-term' worked for me on Debian testing. – hochl – 2016-08-08T13:05:59.930

none of these work for me, I am on putty connecting to centos, and can't run yum install ncurses-term because I am not root. – Herman Toothrot – 2016-09-10T22:14:59.287

1Yes, using TERM=putty or TERM=putty-256color is wisest, though unfortunately at the moment the latter doesn't seem to work right for colors 8-15 (which are supposed to be the bright versions of 0-7). The other "solutions" are are very likely to flake out sometimes do to their flagrant disregard of the differences between the terminals involved. – SamB – 2010-10-14T21:05:02.790

20

If you want to verify which code is sent by PuTTY to your terminal when you press a key or a combination of keys, you just have to issue a Ctrl+V and then press on the desired key.

For example on my box, pressing the Home key will generate the following string on my terminal:

^[[1~

That means that PuTTY sends the escape character ^[ followed by the string [1~.

You can create an ~/.inputrc file in your $HOME folder, or alternatively an /etc/inputrc file depending on your system. Then fill this file with the PuTTY codes and the matching Bash actions you want to be triggered by Bash.

Note: Replace every ^[ character by the equivalent \e string

In my example, I'll add a line with my Home key code and the beginning-of-line action (which by default is bound to Ctrl+A in Bash):

"\e[1~": beginning-of-line

FYI, my inputrc file has the following content:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
"\e[1~": beginning-of-line     # Home key
"\e[4~": end-of-line           # End key
"\e[5~": beginning-of-history  # PageUp key
"\e[6~": end-of-history        # PageDown key
"\e[3~": delete-char           # Delete key
"\e[2~": quoted-insert         # Insert key
"\eOD": backward-word          # Ctrl + Left Arrow key
"\eOC": forward-word           # Ctrl + Right Arrow key

From @Cimbali: More bindable commands (like previous-history: Move `up' through the history list) available on this reference page.

Damien Garrido

Posted 2010-01-11T16:48:26.380

Reputation: 301

YES ! Finally ! Putty's terminal-type string didn't do anything for backward-word and forward-word. This is great ! – Cimbali – 2015-01-24T17:39:28.477

1This is the only acceptable solution because TERM=linux or TERM=putty break xterm-like mouse support. Thanks! – Anton – 2015-09-22T21:06:52.193

14

Crtl+A takes you to the start of the line

Here's a list of Bash keyboard shortcuts

Iain

Posted 2010-01-11T16:48:26.380

Reputation: 4 399

13That's great and all, but Home/End are hard-wired in my brain, and since I only administer the server once in a blue moon the chances of unlearning the hard-wiring are slim. – RomanSt – 2011-01-07T12:27:26.007

9

What it's actually sending is ^[[1~ which is a terminal escape sequence consisting of:

  • ^[ - escape
  • [ - left square bracket
  • 1 - one
  • ~ - tilde

You can see that by pressing Ctrl+V then Home.

You might be able to fix your problem by changing the PuTTY keyboard setting for Home and End keys to rxvt (which makes the escape sequence ^[[H or by changing the $TERM you're using (or by editing ~/.inputrc).

By the way there's no relationship between the tilde you get when you press Home and the tilde that represents the home directory. For example, in my setup Page-Down produces ^[[6~ which would also print a tilde if it weren't being properly interpreted.

Paused until further notice.

Posted 2010-01-11T16:48:26.380

Reputation: 86 075

Thanks! rxvt fixed the Home key; the End key now produces a ding. PgUp/Down do indeed type ~, and none of the PuTTY Keyboard settings make them work. Is my bash messed up, or is this "normal"? – RomanSt – 2010-01-11T17:39:49.257

What do you get when you type echo $TERM? – Paused until further notice. – 2010-01-11T18:07:12.993

xterm (15 character limit argh) – RomanSt – 2010-01-11T18:08:54.127

3You can try adding "\eOw": end-of-line (that's a capital letter O) to your ~/.inputrc file. – Paused until further notice. – 2010-01-11T18:21:07.677

End key fixed; I get the idea. Really wish hacks like this weren't necessary though... – RomanSt – 2010-01-11T18:27:54.433

Further documentation is in the man pages for terminfo(5) and readline. – Paused until further notice. – 2010-01-11T19:54:35.523

2

I couldn't get it working with other methods. I however created this AutoHotkey script that works, as long as your shell is Bash:

#IfWinActive ahk_class PuTTY
PgUp::Send +{PgUp}
PgDn::Send +{PgDn}
Home::Send ^a   ; beginning of line
End::Send ^e    ; end of line
+^Del::Send ^k  ; delete whole line after cursor
+End::Send ^k   ; delete whole line after cursor
+Home::Send ^u  ; delete whole line before cursor
^Del::Send !d   ; delete word after cursor
^BS::Send ^w    ; delete word before cursor
^Left::Send !b  ; jump word left
^Right::Send !f ; jump word right
#IfWinActive

Use with caution though, since not all of these bash hotkeys work in other programs.

Ciantic

Posted 2010-01-11T16:48:26.380

Reputation: 241

This would mess with the main reason I'm looking at this: screen, which with the default settings breaks Ctrl-A because it uses it as an escape character.... – Gert van den Berg – 2016-04-19T08:50:43.140

2

Non of these options worked for me. I am running an old AIX system. I had to add the following alias's to my .profile

alias __A=$(print '\0020') # ^P = up = previous command
alias __B=$(print '\0016') # ^N = down = next command
alias __C=$(print '\0006') # ^F = right = forward a character
alias __D=$(print '\0002') # ^B = left = back a character

TruCK

Posted 2010-01-11T16:48:26.380

Reputation: 21

doesn't work for me, bummer – Herman Toothrot – 2016-09-10T22:29:01.417