Version 3 (modified by judah, 6 years ago)


Key Bindings

Haskeline provides a line-editing user interface with many interactivity commands. Currently the user may choose either Emacs or Vi style bindings by editing the ~/.haskeline file; see System.Console.Haskeline.Prefs for more details.


  • ^A: Control-A
  • M-A: Option-A
  • [printable char]: Any Unicode printable character (Data.Char.isPrint returns True)
  • [kill]: the console's 'kill' character (usually ^U)

Commands shared by both bindings

Left/right arrow move the cursor left/right by one character
Return finish the line entry
Backspacedelete the character left of the cursor
Delete delete the character right of the cursor
[printable char] insert a character
Up/down arrow move backwards/forwards in the command history
Tab run tab completion
^L clear the screen
^R search backwards in history
^S search forwards in history
[kill] delete until the start of the line

Emacs-specific bindings

^A move to the start of the line
^E move to the end of the line
^B move left one character
^F move right one char
^_ or ^X^Uundo
^D delete the character to the right of the cursor
^D is treated as an EOF if the input line is empty and the last character pressed was not also ^D.
M-F move forwards one word
M-B move backward one word
M-W delete backwards one "big word"
M-Backspace delete backwards one word
M-D delete forwards one word
^K delete until the end of the line

Vi-specific bindings

The Vi bindings start in "insert mode" allowing all of the shared commands listed above. If ^D is typed when the line is empty, it is treated as an EOF; otherwise, it is ignored. Pressing ESCAPE enters the "command mode" which provides all of the shared commands except for [printable char] and Tab, allowing instead the following commands:

i enter insert mode
I enter insert mode at the start of the line
a enter insert mode after the current character
A enter insert mode at end of the line
s delete the char under the cursor and enter insert mode
S clear the line and enter insert mode
r replace one character
R replace many characters
u undo
. or ^Rredo
[n][movement] do a movement, repeated n times
[n]d[movement] delete the characters the movement would move past
[n]c[movement] delete the characters the movement would move past, and enter insert mode
[n]x delete the character under the cursor (repeated n times)
dd delete the whole line
cc delete the whole line and enter insertmode

The movement commands are:

hleft one character
lright one character
[space]right one character
wright one word
bleft one word
Wright one bigword
Bleft one bigword
0move to the start of the line
$move to the end of the line