chzyer / readline

Readline is a pure go(golang) implementation for GNU-Readline kind library
MIT License
2.1k stars 280 forks source link

Handle keypad mode cursor key escape sequences. #203

Closed tpodowd closed 2 years ago

tpodowd commented 2 years ago

Normally the terminal uses CSI escape sequences when the UP, DOWN, LEFT, RIGHT and HOME, END keys are pressed. These look like the following ESC [ A etc, where ESC [ is the CSI sequence.

xterm and other terminals however can generate an alternative escape sequence called SS3 if in the application keypad mode. This sequence is ESC O A etc.

Bash readline understands both modes so nowadays you rarely see OA being printed when you press the up arrow while the terminal is using the keypad mode. readline currently does not understand these sequences.

To test this fix, I used an xterm and put it in keypad mode using the command "tput smkx". Then I started the readline-demo and tried using arrow keys. Without this fix, OA is printed when I press up. With this fix, readline fetches the previous command as per regular mode. After testing you can escape back to regular mode using "tput rmkx".

tpodowd commented 2 years ago

Hi @chzyer - I've been using this patch also for about 3 years. Let me know if you have any questions.

chzyer commented 2 years ago

Thanks a lot! But I haven’t using a keyboard with keypad for several years. I think I can’t test it. Anyway, I gonna merge this pr first.

tpodowd commented 2 years ago

Awesome. Thanks for merging!