use utf8;

my %commonkey = (
	'H' => "screen top",
	'j' => "entry <down>",
	'k' => "entry <up>",
	'L' => "screen bottom",
	'^l'=> "redraw",
	'M' => "screen middle",
	'^m'=> "select",
	'n' => "search <down>",
	'q' => "exit",
	't' => "tag",
	'z' => "page <down>",
	'Z' => "page <up>",

	'*' => "last entry",
	'=' => "first entry",
	':' => "enter command",
	';' => "apply to tagged",
	'>' => "line <down>",
	'<' => "line <up>",
	']' => "half page <down>",
	'[' => "half page <up>",
	'?' => "help",
	'!' => "invoke shell",
	'/' => "search <down>",
	'+/'=> "search <up>",
);

my %commondef = (
	"\e"=> 'g9 mode',

	'H' => 'g2', # top-page
	'j' => 'g2', # next-entry, next-undeleted
	'k' => 'g2', # previous-entry, previous-undeleted
	'L' => 'g2', # bottom-page
	'^l'=> 'g1', # refresh
	'M' => 'g2', # middle-page
	'^m'=> 'g6 mode^m', # select-entry, display-message
	'n' => 'g3', # search-next
	'q' => 'g8 mode', # exit
	't' => 'g4', # tag-entry
	'z' => 'g2', # next-page
	'Z' => 'g2', # previous-page

	'*' => 'g2', # last-entry
	'=' => 'g2', # first-entry
	':' => 'g6', # enter-command
	';' => 'g6 arg', # tag-prefix
	'>' => 'g2', # next-line
	'<' => 'g2', # previous-line
	']' => 'g2', # half-down
	'[' => 'g2', # half-up
	'?' => 'g1', # help
	'!' => 'g1 arg', # shell
	'/' => 'g3 arg mode/~', # search
	'+/'=> 'g3 arg mode/~', # search
);

{
title => 'Mutt',
version => '1.3',
description => [
	"Cheat sheet for the Mutt v2.2 e-mail client,",
	"showing the default binding for each key.",
],
keywords => [qw' mutt MUA email client '],

key => {
	%commonkey,

	'@' => "display sender",
	'.' => "list new mail",
	'|' => "pipe to shell",
	'$' => "save mailbox",
	'#' => "split up thread",
	'&' => "thread tagged",
	'%' => "toggle reado<>nl<>y",
	'-' => "collapse thread",
	'_' => "collapse all",
	"'" => "marked mes<>sag<>e",
	'~' => "save mark",

	'a' => "create alias",
	'b' => "bounce",
	'^b'=> "url<>view",
	'+b'=> "search bodies",
	'c' => "open folder",
	'C' => "copy messag<>e",
	'+c'=> "open reado<>nly",
	'+C'=> "make plain copy",
	'd' => "delete",
	'D' => "delete patt<>er<>n",
	'^d'=> "delete thread",
	'+d'=> "delete subthread",
	'e' => "edit",
	'^e'=> "edit con<>tent type",
	'+e'=> "edit+send copy",
	'f' => "forward",
	'F' => "toggle important",
	'^f'=> "forget pass<>phras<>e",
	'g' => "reply to all\nGroup reply",
	'G' => "fetch POP\nGather new mail",
	'h' => "toggle headers",
	'i' => "fetch IMAP",
	'^i'=> "unread msg <down>",
	'+^i'=> "unread msg <up>",
	'j' => "messag<>e <down>",
	'k' => "messag<>e <up>",
	'J' => "any <down>",
	'K' => "any <up>",
	'^k'=> "extract pub keys",
	'+k'=> "send public key",
	'l' => "limit pattern",
	'L' => "reply to list",
	'+l'=> "mlist actions",
	#'+l'=> "show current limit",
	'm' => "compo<>s<>e mail",
	'N' => "toggle new",
	'^n'=> "thread <down>",
	'+n'=> "subthr<>ead <down>",
	'o' => "sort",
	'O' => "sort reverse",
	'p' => "print",
	'P' => "to parent",
	'^p'=> "thread <up>",
	'+p'=> "subthr<>ead <up>",
	'+P'=> "check for pgp",
	'q' => "quit",
	'Q' => "query addr<>ess<>es",
	'r' => "reply to sender",
	'R' => "recall postpon<>e<>d",
	'^r'=> "mark thread read",
	'+r'=> "mark sub<>thread r<>ead",
	's' => "move",
	'+s'=> "save and delete",
	'T' => "tag patt<>er<>n",
	'^t'=> "untag pattern",
	'+t'=> "tag thread",
	'u' => "undo delete",
	'U' => "res<>tore pat<>t<>er<>n",
	'^u'=> "restore thread",
	'+u'=> "restore subthread",
	'v' => "attach<>ments",
	'V' => "version",
	'+v'=> "(un)collapse thread",
	'+V'=> "(un)collapse threads",
	'w' => "set flag",
	'W' => "clear flag",
	'x' => "abort",
	'y' => "list incoming mailboxes",
	'Y' => "edit label",

	(map { 'm'.$_ => $commonkey{$_} } keys %commonkey),

	'm|' => "pipe attach<>m<>ent",
	'ma' => "attach file",
	'mA' => "attach messag<>e",
	'm^b'=> "url<>view",
	'mb' => "edit bcc",
	'mc' => "edit cc",
	'mC' => "copy file",
	'md' => "desc<>ribe attach<>m<>ent",
	'mD' => "delete attach<>m<>ent",
	'm^d'=> "dispo<>sition tog<>gle",
	'me' => "edit body",
	'mE' => "edit all",
	'm^e'=> "edit encoding",
	'mf' => "edit fcc",
	'm^f'=> "forget pass<>phrase",
	'm+f'=> "edit from",
	'mF' => "filter attach<>m<>ent",
	'mG' => "get attach<>m<>ent",
	'mh' => "display message",
	'mi' => "run ispell",
	'm+k'=> "attach PGP key",
	'ml' => "print attach<>m<>ent",
	'mm' => "edit attach<>m<>ent\nMime-appropriate open",
	'mM' => "edit mix",
	'm^m'=> "view attach<>m<>ent",
	'mn' => "new attach<>m<>ent",
	'mo' => "autocrypt toggle", #TODO
	'm^o'=> "rename attach<>m<>ent",
	'mp' => "PGP menu",
	'mP' => "post<>pone",
	'mr' => "edit reply<>-to",
	'mR' => "rename attach<>m<>ent",
	'ms' => "edit subject",
	'mS' => "s/mime options",
	'mt' => "edit to",
	'mT' => "enter tags", #TODO
	'm^t'=> "ctype attach<>m<>ent",
	'mu' => "unlink toggle",
	'mv' => "preview alt fil<>t<>er", # m+v mV
	'mV' => "preview mailcap filter",
	'mw' => "copy to folder",
	'mU' => "encode attach<>m<>ent",
	'my' => "send",
	# ^xe

	'wD' => "deleted",
	'wN' => "new",
	'wO' => "old",
	'wr' => "replied",
	'w*' => "tagged",
	'w!' => "flagged",

	'/~A' => "all",
	'/~b' => "msg body",
	'/~B' => "whole msg",
	'/~c' => "cc address",
	'/~C' => "to or cc address",
	'/~d' => "date sent ran<>g<>e",
	'/~D' => "deleted",
	'/~e' => "sender",
	'/~E' => "expired",
	'/~f' => "from",
	'/~F' => "flagged",
	'/~g' => "signed",
	'/~G' => "encryp<>ted",
	'/~h' => "header",
	'/~H' => "spam attr<>ib<>ute",
	'/~i' => "msg id",
	'/~k' => "pgp key",
	'/~L' => "receiv<>d by",
	'/~l' => "mailing list",
	'/~m' => "num<>ber ran<>g<>e",
	'/~M' => "mime type",
	'/~n' => "score range",
	'/~N' => "new",
	'/~O' => "old",
	'/~p' => "to you",
	'/~P' => "by you",
	'/~Q' => "replies",
	'/~r' => "receive date ran<>ge",
	'/~R' => "read",
	'/~s' => "subject",
	'/~S' => "super<>seded",
	'/~t' => "to address",
	'/~T' => "tagged",
	'/~u' => "subscr<>ibed list",
	'/~U' => "unread",
	'/~v' => "collapsed thread",
	'/~V' => "verified",
	'/~x' => "refer<>ence",
	'/~X' => "attach<>ments",
	'/~y' => "x-label",
	'/~z' => "size range",
	'/~=' => "dupli<>cate",
	'/~$' => "unrefer<>enced",
	'/~(' => "in thread",
	'/~<' => "parent match",
	'/~>' => "child match",

	# globally label escape as meta key
	  "\e"=> "+",
	 "m\e"=> "+",
	 "w\e"=> "+",
	"/~\e"=> "+",
},

mode => {
	'' => 'index',
	'm' => 'compose (m)',
	w => 'message flags (w)',
	'/~' => 'search patterns (/~)',
},

flag => {
	g1 => [aside   => "Temporarily display something without changing state."],
	g2 => [select  => "Scroll list and/or select a different line."],
	g3 => [search  => "Go to a specific message entry."],
	g4 => [edit    => "Modify message flags or contents."],
	g6 => [command => "Any other action which does not alter an existing message."],
	g7 => [send    => "Prepare and/or send a (new) message."],
	g8 => [leave   => "Exit the opened folder."],
	g9 => [display => "Permanently alter/toggle current view."],

	arg => ["key<arg>" => "Commands with a dot need an argument afterwards."],
},

def => {
	'' => {
		%commondef,

		'@' => 'g1', # display-address
		'.' => 'g8', # buffy-list #TODO
		'|' => 'g6', # pipe-message
		'$' => 'g4', # sync-mailbox
		'#' => 'g4', # break-thread
		'&' => 'g4', # link-threads
		'%' => 'g4', # toggle-write
		'-' => 'g9',
		'_' => 'g9',
		'~' => 'g4 arg', # mark-message #TODO
		"'" => 'g3 arg',
		' ' => '=^m',

		'a' => 'g6', # create-alias
		'b' => 'g7', # bounce-message
		'^b'=> 'g1',
		'+b'=> undef, # M <search>~b
		'c' => 'g8', # change-folder
		'C' => 'g6', # copy-message
		'+c'=> 'g8', # change-folder-readonly
		'+C'=> undef, # decode-copy
		'd' => 'g4', # delete-message
		'D' => 'g4 arg mode/~', # delete-pattern
		'^d'=> 'g4', # delete-thread
		'+d'=> 'g4', # delete-subthread
		'e' => 'g4 linkvi', # edit
		'^e'=> 'g4', # edit-type
		'+e'=> undef, # resend-message
		'f' => 'g7 modem', # forward-message
		'F' => 'g4', # flag-message
		'^f'=> 'g6', # forget-passphrase
		'g' => 'g7 modem', # group-reply
		'G' => 'g6', # fetch-mail
		'h' => 'g9', # display-toggle-weed
		'i' => 'g6', # imap-fetch-mail
		'^i'=> 'g3', # next-new-then-unread
		'+^i'=> undef, # previous-new-then-unread
		'j' => 'g2', # next-undeleted
		'k' => 'g2', # previous-undeleted
		'J' => 'g3', # next-entry
		'K' => 'g3', # previous-entry
		'^k'=> 'g1', # extract-keys
		'+k'=> 'g7 modem', # mail-key
		'l' => 'g9 arg mode/~', # limit
		'L' => 'g7 modem', # list-reply
		'+l'=> 'g1', # list-actions/show-limit
		'm' => 'g7 modem', # mail
		'N' => 'g4', # toggle-new
		'^n'=> 'g3', # next-thread
		'+n'=> 'g3', # next-subthread
		'o' => 'g9 modeo', # sort-mailbox
		'O' => 'g9 modeo', # sort-reverse
		'p' => 'g1', # print-message
		'P' => 'g3', # parent-message
		'^p'=> 'g3', # previous-thread
		'+p'=> 'g3', # previous-subthread
		'+P'=> undef, # check-traditional-pgp
		'q' => 'g8', # quit
		'Q' => 'g1 arg', # query
		'r' => 'g7 modem', # reply
		'R' => 'g7 modem', # recall-message
		'^r'=> 'g4', # read-thread
		'+r'=> 'g4', # read-subthread
		's' => 'g4', # save-message
		'+s'=> 'g4', # decode-save
		'T' => 'g4 arg mode/~', # tag-pattern
		'^t'=> 'g4 arg mode/~', # untag-pattern
		'+t'=> 'g4', # tag-thread
		'u' => 'g4', # undelete-message
		'U' => 'g4 arg mode/~', # undelete-pattern
		'^u'=> 'g4', # undelete-thread
		'+u'=> 'g4', # undelete-subthread
		'v' => 'g1', # view-attachments
		'V' => 'g1', # show-version
		'+v'=> 'g9', # collapse-thread
		'+V'=> 'g9', # collapse-all
		'w' => 'g4 arg modew', # set-flag
		'W' => 'g4 arg modew', # clear-flag
		'x' => 'g8', # exit
		'y' => 'g8', # M <change-folder>?<toggle-mailboxes>
		'Y' => 'g4 arg', # edit-label
	}, # index

	'm' => {
		%commondef,

		'|' => 'g4',
		'a' => 'g4',
		'A' => 'g4',
		'b' => 'g4',
		'^b'=> 'g1',
		'c' => 'g4',
		'C' => 'g6',
		'd' => 'g4',
		'D' => 'g4',
		'^d'=> 'g4',
		'e' => 'g4 linkvi',
		'E' => 'g4 linkvi',
		'^e'=> 'g4',
		'f' => 'g4',
		'^f'=> 'g6',
		'+f'=> 'g4',
		'F' => 'g4',
		'G' => 'g1',
		'h' => 'g1',
		'i' => 'g6',
		'+k'=> 'g4',
		'l' => 'g1',
		'm' => 'g4',
		'M' => 'g4',
		'^m'=> 'g1',
		'n' => 'g6',
		'o' => 'g4 ext',
		'^o'=> 'g4',
		'p' => 'g1', #TODO
		'P' => 'g8 mode',
		'r' => 'g4',
		'R' => 'g4',
		's' => 'g4',
		'S' => 'g4 menumS',
		't' => 'g4',
		'T' => 'g4',
		'^t'=> 'g4',
		'w' => 'g6',
		'u' => 'g6',
		'v' => 'g1',
		'+v'=> 'g1',
		'V' => 'g1',
		'U' => 'g4',
		'y' => 'g7',
	}, # compose

	w => {
		"\e"=> 'g9 mode',
		'D' => 'g4',
		'd' => '=wD',
		'N' => 'g4',
		'n' => '=wN',
		'O' => 'g4',
		'o' => '=wO',
		'r' => 'g4',
		'R' => '=wr',
		'*' => 'g4',
		'!' => 'g4',
	}, # flag

	'/~' => {
		"\e"=> 'g9 mode',
		A => 'g3',
		b => 'g3 arg',
		B => 'g3 arg',
		c => 'g3 arg',
		C => 'g3 arg',
		d => 'g3 arg',
		D => 'g3',
		e => 'g3 arg',
		E => 'g3',
		f => 'g3 arg',
		F => 'g3',
		g => 'g3',
		G => 'g3',
		h => 'g3 arg',
		H => 'g3 arg',
		i => 'g3 arg',
		k => 'g3',
		L => 'g3 arg',
		l => 'g3',
		m => 'g3 arg',
		M => 'g3 arg',
		n => 'g3 arg',
		N => 'g3',
		O => 'g3',
		p => 'g3',
		P => 'g3',
		Q => 'g3',
		r => 'g3 arg',
		R => 'g3',
		s => 'g3',
		S => 'g3',
		t => 'g3 arg',
		T => 'g3',
		u => 'g3',
		U => 'g3',
		v => 'g3',
		V => 'g3',
		x => 'g3 arg',
		X => 'g3 arg',
		y => 'g3 arg',
		z => 'g3 arg',
		'=' => 'g3',
		'$' => 'g3',
		'(' => 'g3 arg',
		'<' => 'g3 arg',
		'>' => 'g3 arg',
	}, # search option
},
}
