use utf8;

{
title => 'readline',
version => 1.2,
description => [
	"Reference sheet of default key bindings for GNU readline,",
	"used for line-editing in most Unix software, notably Emacs and Bash.",
],
keywords => [qw( readline gnu bash emacs editing curses )],
rows => [4, 3, 2],
moderows => '^x=213',

mode => {
	''   => "emacs mode",
	'^x' => "emacs ctrl-x bindings",
},

flag => {
	g1 => [info    => "Info command: shows/does something without altering anything."],
	g2 => [motion  => "Move the cursor."],
	g4 => [history => "Replace contents involving kill ring, undo, or command history."],
	g6 => [change  => "Alter current text (filtering or completion)."],
	g7 => [delete  => "Remove text."],
	g8 => [misc    => "Miscellaneous commands."],
	g9 => [mode    => "Additional key functionality (click to view)."],

	arg => ["key<arg>" => "Commands with a dot need a char argument afterwards."],
	'v21 new' => ["&gt;v2.0" => "Unavailable before readline version 2.1 (1997)."],
	'xbash ext' => ["bash" => "Default assignment in Bash shells, but not common readline."],
},

def => {
	'' => {
		"\e" => ['g8', "+"],  # label escape as meta key

		'+<' => ['g4', "history start"],
		'+=' => \'+?', #TODO: v21 # emacs, not in v2.0
		'+>' => ['g4', "history end"],
		'^?' => \'^h',
		'+?' => ['g1', "list complet<>ion<>s"],
		'^@' => ['g8 v21', "set mark"], # not in v2.0

		'+#' => ['g6 v21', "prefix comm<>en<>t"], # not in v2.0
		'+&' => ['g6', "tilde expand"],
		'+*' => ['g6 v21', "complet<>e all"], # not in v2.0
		'+.' => ['g4', "insert last"],
		'+~' => \'+&', # common emacs

		'^[' => ['g8', "meta"],
		'^+['=> \'^i',
		'+\\'=> ['g7', "delete whitesp<>ace"],
		'^]' => ['g2 arg v21', "find char"], # not in v2.0
		'^+]'=> ['g2 arg v21', "rev find char"], # not in v2.0
		'^_' => ['g4', "undo"],
		'+_' => \'+.',

		'+~' => ['g6 xbash', "user<>name exp<>and"], # overrides alias
		'+!' => ['g6 xbash', "cmd expand"],
		'+@' => ['g6 xbash', "host<>name exp<>and"],
		'+$' => ['g6 xbash', "variable expand"],
		'+^' => ['g4 xbash', "history expand"],
		'+/' => ['g1 xbash', "filename expand"],

		'^a' => ['g2', "begin of line"],
		'^b' => ['g2', "char back<>w<>ard<>s"],
		'+b' => ['g2', "word back<>w<>ard<>s"],
		'^c' => ['g8 xbash', "cancel comm<>and"],
		'+c' => ['g6', "capital<>ise word"],
		'^d' => ['g7', "delete char"],
		'+d' => ['g7 ring', "delete word rem<>ain<>der"],
	#	'^e' => ['g9', "emacs mode"],
		'^e' => ['g2', "end of line"],
		'^f' => ['g2', "char forward"],
		'+f' => ['g2', "word forward"],
		'^g' => ['g8', "abort cmd, bell"],
		'^+g'=> \'^g',
		'^h' => ['g7', "back<>space"],
		'^+h'=> ['g7 ring', "delete bound word"], #TODO
		'^i' => ['g6', "auto<>complet<>e\n(tab)"],
		'^+i'=> \'^v^i',
		'^j' => \'^m',
		'^+j'=> ['g9', "vim mode"], #TODO: mode^+j
		'^k' => ['g7 ring', "delete till eol"],
		'^l' => ['g1', "clear screen"],
		'+l' => ['g6', "lowcase word"],
		'^m' => ['g4', "enter line\n(enter)"],
		'^+m'=> \'^+j',
		'^n' => ['g4', "history next"],
		'+n' => ['g4', "match history"],
		'^o' => ['g4 xbash', "enter and next"],
		'^p' => ['g4', "history back"],
		'+p' => ['g4', "rev match history"],
		'^q' => [undef, \'^v', "\nQuote"],  #TODO fix partial override
		'^r' => ['g4', "reverse history"],
		'+r' => ['g4', "full undo\nRevert"],
		'^+r'=> \'+r',
		'^s' => ['g4', "search history"],
		'^t' => ['g6', "move char forw<>ard\nTranspose char"],
		'+t' => ['g6', "move word forw<>ard\nTranspose word"],
		'^u' => ['g7 ring', "delete till bol"], # unix
		'+u' => ['g6', "upcase word"],
		'^v' => ['g8', "verbat<>im char"],
		'^w' => ['g7 ring', "delete word"], # unix
		'^x' => ['g9 arg mode^x', "extend<>ed"],
		'^y' => ['g4', "yank top"],
		'+y' => ['g4 ring', "rotate yank"],
		'^+y'=> ["yank arg", "yank arg"],
		'^z' => ['g8 xbash', "back<>ground"],
	},

	'^x' => {
		lead => "x̂",

		"\e" => ['g8 mode', "+"],

		'('  => ['g8', "start macro"],
		')'  => ['g8', "end macro"],
		'e'  => ['g8', "run macro\nExecute"],
		'^e' => ['g6 xbash linkvi', "editor"],
		'^g' => \'^g',
		'^h' => \'^u',
		'^r' => ['g8', "reload inputrc"],
		'^u' => \'^_',
		'^x' => ['g2 v21', "swap cursor\neXchange"], # not in v2.0
		'^v' => ['g1 xbash', "shell version"],
		'^?' => \'^x^h',
	},
},
}
