about summary refs log tree commit diff stats
path: root/res
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-03-26 20:46:55 +0100
committerbptato <nincsnevem662@gmail.com>2024-03-26 20:54:55 +0100
commit0d1a11cea0fa48837f4ae1ca869e9b01e1f159f4 (patch)
treee962a0a15d1bdd7b6b13cfceea49d486081cd5a4 /res
parent845445b4c4ab69cc2ffc564c7ab71eeaf8cc3c5e (diff)
downloadchawan-0d1a11cea0fa48837f4ae1ca869e9b01e1f159f4.tar.gz
config: improve input system
as described in <https://todo.sr.ht/~bptato/chawan/6>
Diffstat (limited to 'res')
-rw-r--r--res/chawan.html4
-rw-r--r--res/config.toml555
2 files changed, 344 insertions, 215 deletions
diff --git a/res/chawan.html b/res/chawan.html
index 169c6800..6ce6950b 100644
--- a/res/chawan.html
+++ b/res/chawan.html
@@ -67,7 +67,7 @@ up/down by one row
 <li><kbd>C-d</kbd>, <kbd>C-u</kbd>: scroll up/down by half a page
 <li><kbd>C-f</kbd>, <kbd>C-b</kbd> (or <kbd>PgDn</kbd>, <kbd>PgUp</kbd>)</kbd>:
 scroll up/down by an entire page
-<li><kbd>{number}G<kbd> (or <kbd>{number}gg</kbd>): jump to {number}'th line
+<li><kbd>{number}G</kbd> (or <kbd>{number}gg</kbd>): jump to {number}'th line
 <li><kbd>g0<kbd>: jump to first character of the current line's visible part
 <li><kbd>gc<kbd>: jump to center of the current line's visible part
 <li><kbd>g$<kbd>: jump to last character of the current line's visible part
@@ -79,7 +79,7 @@ screen to the left/right by one cell
 <li><kbd>/</kbd>, <kbd>?</kbd>: on-page search (or search backwards)
 <li><kbd>n</kbd>, <kbd>N</kbd>: next/previous match
 <li><kbd>C-z</kbd>: suspend the browser
-<li><kbd>M-C-c</kbd>: cancel loading
+<li><kbd>C-c</kbd>: cancel loading
 <li><kbd>H</kbd>, <kbd>M</kbd>, <kbd>L</kbd>: move cursor to the
 Highest/Middle/Lowest rows
 <li><kbd>zz</kbd>, <kbd>z.</kbd>: center on current line (and move to
diff --git a/res/config.toml b/res/config.toml
index d7186c24..739a7099 100644
--- a/res/config.toml
+++ b/res/config.toml
@@ -4,6 +4,214 @@ startup-script = ""
 headless = false
 console-buffer = true
 
+[cmd.pager]
+quit = '() => quit()'
+suspend = '() => suspend()'
+copyURL = '''
+() => {
+	if (pager.externInto('xsel -bi', pager.url))
+		pager.alert("Copied URL to clipboard.");
+	else
+		pager.alert("Failed to copy URL to clipboard. (Is xsel installed?)");
+}
+'''
+copyCursorLink = '''
+() => {
+	const link = pager.hoverLink;
+	if (!link)
+		pager.alert("Please move the cursor above a link and try again.");
+	else if (pager.externInto('xsel -bi', link))
+		pager.alert("Copied URL to clipboard.");
+	else
+		pager.alert("Failed to copy URL to clipboard. (Is xsel installed?)");
+}
+'''
+yankCursorImage = '''
+() => {
+	const link = pager.hoverImage;
+	if (!link)
+		pager.alert("Please move the cursor above an image and try again.");
+	else if (pager.externInto('xsel -bi', link))
+		pager.alert("Copied URL to clipboard.");
+	else
+		pager.alert("Failed to copy URL to clipboard. (Is xsel installed?)");
+}
+'''
+gotoClipboardURL = '''
+() => {
+	const s = pager.externCapture('xsel -bo');
+	if (s === null)
+		pager.alert("Failed to read URL from clipboard. (Is xsel installed?)");
+	else
+		pager.loadSubmit(s);
+}
+'''
+peek = '() => pager.alert(pager.url)'
+peekCursor = '() => pager.peekCursor()'
+toggleWrap = '''
+() => {
+	config.search.wrap = !config.search.wrap;
+	pager.alert("Wrap search " + (config.search.wrap ? "on" : "off"));
+}
+'''
+dupeBuffer = '() => pager.dupeBuffer()'
+load = '() => pager.load()'
+webSearch = '() => pager.load("ddg:")'
+openBookmarks = '() => pager.loadSubmit("~/.w3m/bookmark.html")'
+reloadBuffer = '() => pager.reload()'
+lineInfo = '() => pager.lineInfo()'
+toggleSource = '() => pager.toggleSource()'
+discardBuffer = '() => pager.discardBuffer()'
+discardTree = '() => pager.discardTree()'
+prevBuffer = '() => pager.prevBuffer()'
+prevSiblingBuffer = '() => pager.prevSiblingBuffer()'
+nextBuffer = '() => pager.nextBuffer()'
+nextSiblingBuffer = '() => pager.nextSiblingBuffer()'
+parentBuffer = '() => pager.parentBuffer()'
+enterCommand = '() => pager.command()'
+searchForward = '() => pager.searchForward()'
+searchBackward = '() => pager.searchBackward()'
+isearchForward = '() => pager.isearchForward()'
+isearchBackward = '() => pager.isearchBackward()'
+searchNext = 'n => pager.searchNext(n)'
+searchPrev = 'n => pager.searchPrev(n)'
+toggleCommandMode = '''
+() => {
+	if ((pager.commandMode = consoleBuffer != pager.buffer))
+		console.show();
+	else
+		console.hide();
+}
+'''
+
+[cmd.buffer]
+cursorLeft = 'n => pager.cursorLeft(n)'
+cursorDown = 'n => pager.cursorDown(n)'
+cursorUp = 'n => pager.cursorUp(n)'
+cursorRight = 'n => pager.cursorRight(n)'
+cursorLineBegin = '() => pager.cursorLineBegin()'
+cursorLineTextStart = '() => pager.cursorLineTextStart()'
+cursorLineEnd = '() => pager.cursorLineEnd()'
+cursorNextWord = '() => pager.cursorNextWord()'
+cursorNextViWord = '() => pager.cursorNextViWord()'
+cursorNextBigWord = '() => pager.cursorNextBigWord()'
+cursorWordBegin = '() => pager.cursorWordBegin()'
+cursorViWordBegin = '() => pager.cursorViWordBegin()'
+cursorBigWordBegin = '() => pager.cursorBigWordBegin()'
+cursorWordEnd = '() => pager.cursorWordEnd()'
+cursorViWordEnd = '() => pager.cursorViWordEnd()'
+cursorBigWordEnd = '() => pager.cursorBigWordEnd()'
+cursorPrevLink = 'n => pager.cursorPrevLink(n)'
+cursorNextLink = 'n => pager.cursorNextLink(n)'
+cursorPrevParagraph = 'n => pager.cursorPrevParagraph(n)'
+cursorNextParagraph = 'n => pager.cursorNextParagraph(n)'
+cursorTop = 'n => pager.cursorTop(n)'
+cursorMiddle = '() => pager.cursorMiddle()'
+cursorBottom = 'n => pager.cursorBottom(n)'
+cursorLeftEdge = '() => pager.cursorLeftEdge()'
+cursorMiddleColumn = '() => pager.cursorMiddleColumn()'
+cursorRightEdge = '() => pager.cursorRightEdge()'
+halfPageDown = 'n => pager.halfPageDown(n)'
+halfPageUp = 'n => pager.halfPageUp(n)'
+pageDown = 'n => pager.pageDown(n)'
+pageUp = 'n => pager.pageUp(n)'
+pageLeft = 'n => pager.pageLeft(n)'
+pageRight = 'n => pager.pageRight(n)'
+scrollDown = 'n => pager.scrollDown(n)'
+scrollUp = 'n => pager.scrollUp(n)'
+scrollLeft = 'n => pager.scrollLeft(n)'
+scrollRight = 'n => pager.scrollRight(n)'
+click = '() => pager.click()'
+viewImage = '() => pager.gotoURL(pager.hoverImage)'
+markURL = '() => pager.markURL()'
+redraw = '() => pager.redraw()'
+reshape = '() => pager.reshape()'
+cancel = '() => pager.cancel()'
+# vi G
+gotoLineOrEnd = 'n => n ? pager.gotoLine(n) : pager.cursorLastLine()'
+# vim gg
+gotoLineOrStart = 'n => n ? pager.gotoLine(n) : pager.cursorFirstLine()'
+# vi z. z^M z-
+centerLineBegin = 'n => pager.centerLineBegin(n)'
+raisePageBegin = 'n => pager.raisePageBegin(n)'
+lowerPageBegin = 'n => pager.lowerPageBegin(n)'
+# vi z+ z^
+nextPageBegin = 'n => pager.nextPageBegin(n)'
+previousPageBegin = 'n => pager.previousPageBegin(n)'
+# vim zz zb zt
+centerLine = 'n => pager.centerLine(n)'
+raisePage = 'n => pager.raisePage(n)'
+lowerPage = 'n => pager.lowerPage(n)'
+cursorToggleSelection = 'n => pager.cursorToggleSelection(n)'
+cursorToggleSelectionLine = 'n => pager.cursorToggleSelection(n, {selectionType: "line"})'
+cursorToggleSelectionBlock = 'n => pager.cursorToggleSelection(n, {selectionType: "block"})'
+sourceEdit = '''
+() => {
+	const url = pager.url;
+	pager.extern(pager.getEditorCommand(url.protocol == "file:" ?
+		url.pathname :
+		pager.cacheFile));
+}
+'''
+saveLink = '() => pager.saveLink()'
+saveSource = '() => pager.saveSource()'
+mark = '''
+async () => {
+	const c = await pager.askChar("m");
+	if (c.charCodeAt() != 3) /* ctrl-c */
+		pager.setMark(c);
+}
+'''
+gotoMark = '''
+async () => {
+	const c = await pager.askChar('`');
+	if (c.charCodeAt() != 3) /* C-c */
+		pager.gotoMark(c);
+}
+'''
+gotoMarkY = '''
+async () => {
+	const c = await pager.askChar('`');
+	if (c.charCodeAt() != 3) /* C-c */
+		pager.gotoMarkY(c);
+}
+'''
+copySelection = '''
+async () => {
+	if (!pager.currentSelection) {
+		feedNext();
+		return;
+	}
+	const text = await pager.getSelectionText(pager.currentSelection);
+	if (pager.externInto('xsel -bi', text))
+		pager.alert("Copied selection to clipboard.");
+	else
+		pager.alert("Failed to copy selection to clipboard. (Is xsel installed?)");
+	pager.cursorToggleSelection();
+}
+'''
+cursorNthLink = 'n => pager.cursorNthLink(n)'
+cursorRevNthLink = 'n => pager.cursorRevNthLink(n)'
+
+[cmd.line]
+submit = '() => line.submit()'
+backspace = '() => line.backspace()'
+delete = '() => line.delete()'
+cancel = '() => line.cancel()'
+prevWord = '() => line.prevWord()'
+nextWord = '() => line.nextWord()'
+backward = '() => line.backward()'
+forward = '() => line.forward()'
+clear = '() => line.clear()'
+kill = '() => line.kill()'
+clearWord = '() => line.clearWord()'
+killWord = '() => line.killWord()'
+begin = '() => line.begin()'
+end = '() => line.end()'
+escape = '() => line.escape()'
+prevHist = '() => line.prevHist()'
+nextHist = '() => line.nextHist()'
+
 [search]
 wrap = true
 ignore-case = true
@@ -80,218 +288,139 @@ match = '^ddg:'
 substitute-url = '(x) => "https://lite.duckduckgo.com/lite/?kp=-1&kd=-1&q=" + encodeURIComponent(x.split(":").slice(1).join(":"))'
 
 [page]
-q = 'quit()'
-C-z = 'suspend()'
-h = 'n => pager.cursorLeft(n)'
-j = 'n => pager.cursorDown(n)'
-k = 'n => pager.cursorUp(n)'
-l = 'n => pager.cursorRight(n)'
-'M-[D' = 'n => pager.cursorLeft(n)'
-'M-[B' = 'n => pager.cursorDown(n)'
-'M-[A' = 'n => pager.cursorUp(n)'
-'M-[C' = 'n => pager.cursorRight(n)'
-'0' = 'pager.cursorLineBegin()'
-'^' = 'pager.cursorLineTextStart()'
-'$' = 'pager.cursorLineEnd()'
-b = 'pager.cursorViWordBegin()'
-e = 'pager.cursorViWordEnd()'
-w = 'pager.cursorNextViWord()'
-B = 'pager.cursorBigWordBegin()'
-E = 'pager.cursorBigWordEnd()'
-W = 'pager.cursorNextBigWord()'
-'[' = 'n => pager.cursorPrevLink(n)'
-']' = 'n => pager.cursorNextLink(n)'
-'{' = 'n => pager.cursorPrevParagraph(n)'
-'}' = 'n => pager.cursorNextParagraph(n)'
-H = 'n => pager.cursorTop(n)'
-M = '() => pager.cursorMiddle()'
-L = 'n => pager.cursorBottom(n)'
-g0 = 'pager.cursorLeftEdge()'
-gc = 'pager.cursorMiddleColumn()'
-'g$' = 'pager.cursorRightEdge()'
-C-d = 'n => pager.halfPageDown(n)'
-C-u = 'n => pager.halfPageUp(n)'
-C-f = 'n => pager.pageDown(n)'
-C-b = 'n => pager.pageUp(n)'
-'M-[6~' = 'n => pager.pageDown(n)'
-'M-[5~' = 'n => pager.pageUp(n)'
-'zH'= 'n => pager.pageLeft(n)'
-'zL' = 'n => pager.pageRight(n)'
-'<' = 'n => pager.pageLeft(n)'
-'>' = 'n => pager.pageRight(n)'
-C-e = 'n => pager.scrollDown(n)'
-C-y = 'n => pager.scrollUp(n)'
-sE = '''
-() => {
-	const url = pager.url;
-	pager.extern(pager.getEditorCommand(url.protocol == "file:" ?
-		url.pathname :
-		pager.cacheFile));
-}
-'''
-sC-m = 'pager.saveLink()'
-sC-j = 'pager.saveLink()'
-sS = 'pager.saveSource()'
-m = '''
-async () => {
-	const c = await pager.askChar("m");
-	if (c.charCodeAt() != 3) /* ctrl-c */
-		pager.setMark(c);
-}
-'''
-'`' = '''
-async () => {
-	const c = await pager.askChar('`');
-	if (c.charCodeAt() != 3) /* C-c */
-		pager.gotoMark(c);
-}
-'''
-"'" = '''
-async () => {
-	const c = await pager.askChar('`');
-	if (c.charCodeAt() != 3) /* C-c */
-		pager.gotoMarkY(c);
-}
-'''
-'zh'= 'n => pager.scrollLeft(n)'
-'zl' = 'n => pager.scrollRight(n)'
-J = 'n => pager.scrollDown(n)'
-K = 'n => pager.scrollUp(n)'
-'-'= 'n => pager.scrollLeft(n)'
-'+' = 'n => pager.scrollRight(n)'
-C-m = 'pager.click()'
-C-j = 'pager.click()'
-I = 'pager.gotoURL(pager.hoverImage)'
-M-u = 'pager.dupeBuffer()'
-C-l = 'pager.load()'
-C-k = 'pager.load("ddg:")'
-M-b = 'pager.loadSubmit("~/.w3m/bookmark.html")'
-U = 'pager.reload()'
-r = 'pager.redraw()'
-R = 'pager.reshape()'
-M-C-c = 'pager.cancel()'
-gg = 'n => n ? pager.gotoLine(n) : pager.cursorFirstLine()'
-G = 'n => n ? pager.gotoLine(n) : pager.cursorLastLine()'
-M-g = 'pager.gotoLine()'
-'z.' = 'n => pager.centerLineBegin(n)'
-'zC-m' = 'n => pager.raisePageBegin(n)'
-'zC-j' = 'n => pager.raisePageBegin(n)'
-'z-' = 'n => pager.lowerPageBegin(n)'
-zz = 'n => pager.centerLine(n)'
-'zt' = 'n => pager.raisePage(n)'
-'zb' = 'n => pager.lowerPage(n)'
-'z+' = 'n => pager.nextPageBegin(n)'
-'z^' = 'n => pager.previousPageBegin(n)'
-C-g = 'pager.lineInfo()'
-v = 'n => pager.cursorToggleSelection(n)'
-V = 'n => pager.cursorToggleSelection(n, {selectionType: "line"})'
-C-v = 'n => pager.cursorToggleSelection(n, {selectionType: "block"})'
-y = '''
-async () => {
-	if (!pager.currentSelection) {
-		feedNext();
-		return;
-	}
-	const text = await pager.getSelectionText(pager.currentSelection);
-	if (pager.externInto('xsel -bi', text))
-		pager.alert("Copied selection to clipboard.");
-	else
-		pager.alert("Failed to copy selection to clipboard. (Is xsel installed?)");
-	pager.cursorToggleSelection();
-}
-'''
-'\' = 'pager.toggleSource()'
-D = 'pager.discardBuffer()'
-M-d = 'pager.discardTree()'
-',' = 'pager.prevBuffer()'
-'M-,' = 'pager.prevSiblingBuffer()'
-'.' = 'pager.nextBuffer()'
-'M-.' = 'pager.nextSiblingBuffer()'
-'M-/' = 'pager.parentBuffer()'
-M-c = 'pager.command()'
-'/' = 'pager.isearchForward()'
-'?' = 'pager.isearchBackward()'
-n = 'n => pager.searchNext(n)'
-N = 'n => pager.searchPrev(n)'
-c = 'pager.peek()'
-u = 'pager.peekCursor()'
-C-w = '''
-config.search.wrap = !config.search.wrap;
-pager.alert("Wrap search " + (config.search.wrap ? "on" : "off"));
-'''
-M-y = '''
-() => {
-	if (pager.externInto('xsel -bi', pager.url))
-		pager.alert("Copied URL to clipboard.");
-	else
-		pager.alert("Failed to copy URL to clipboard. (Is xsel installed?)");
-}
-'''
-yc = '() => pager.alert("Please use `yu` to copy URLs instead!");'
-yu = '''
-() => {
-	const link = pager.hoverLink;
-	if (!link)
-		pager.alert("Please move the cursor above a link and try again.");
-	else if (pager.externInto('xsel -bi', link))
-		pager.alert("Copied URL to clipboard.");
-	else
-		pager.alert("Failed to copy URL to clipboard. (Is xsel installed?)");
-}
-'''
-yI = '''
-() => {
-	const link = pager.hoverImage;
-	if (!link)
-		pager.alert("Please move the cursor above an image and try again.");
-	else if (pager.externInto('xsel -bi', link))
-		pager.alert("Copied URL to clipboard.");
-	else
-		pager.alert("Failed to copy URL to clipboard. (Is xsel installed?)");
-}
-'''
-M-p = '''
-() => {
-	const s = pager.externCapture('xsel -bo');
-	if (s === null)
-		pager.alert("Failed to read URL from clipboard. (Is xsel installed?)");
-	else
-		pager.loadSubmit(s);
-}
-'''
-':' = 'pager.markURL()'
+# buffer commands
+q = 'cmd.pager.quit'
+C-z = 'cmd.pager.suspend'
+h = 'cmd.buffer.cursorLeft'
+j = 'cmd.buffer.cursorDown'
+k = 'cmd.buffer.cursorUp'
+l = 'cmd.buffer.cursorRight'
+'M-[D' = 'cmd.buffer.cursorLeft'
+'M-[B' = 'cmd.buffer.cursorDown'
+'M-[A' = 'cmd.buffer.cursorUp'
+'M-[C' = 'cmd.buffer.cursorRight'
+'0' = 'cmd.buffer.cursorLineBegin'
+'^' = 'cmd.buffer.cursorLineTextStart'
+'$' = 'cmd.buffer.cursorLineEnd'
+b = 'cmd.buffer.cursorViWordBegin'
+e = 'cmd.buffer.cursorViWordEnd'
+w = 'cmd.buffer.cursorNextViWord'
+B = 'cmd.buffer.cursorBigWordBegin'
+E = 'cmd.buffer.cursorBigWordEnd'
+W = 'cmd.buffer.cursorNextBigWord'
+'[' = 'cmd.buffer.cursorPrevLink'
+']' = 'cmd.buffer.cursorNextLink'
+'{' = 'cmd.buffer.cursorPrevParagraph'
+'}' = 'cmd.buffer.cursorNextParagraph'
+H = 'cmd.buffer.cursorTop'
+M = 'cmd.buffer.cursorMiddle'
+L = 'cmd.buffer.cursorBottom'
+g0 = 'cmd.buffer.cursorLeftEdge'
+gc = 'cmd.buffer.cursorMiddleColumn'
+'g$' = 'cmd.buffer.cursorRightEdge'
+C-d = 'cmd.buffer.halfPageDown'
+C-u = 'cmd.buffer.halfPageUp'
+C-f = 'cmd.buffer.pageDown'
+C-b = 'cmd.buffer.pageUp'
+'M-[6~' = 'cmd.buffer.pageDown'
+'M-[5~' = 'cmd.buffer.pageUp'
+'zH'= 'cmd.buffer.pageLeft'
+'zL' = 'cmd.buffer.pageRight'
+'<' = 'cmd.buffer.pageLeft'
+'>' = 'cmd.buffer.pageRight'
+C-e = 'cmd.buffer.scrollDown'
+C-y = 'cmd.buffer.scrollUp'
+J = 'cmd.buffer.scrollDown'
+K = 'cmd.buffer.scrollUp'
+sE = 'cmd.buffer.sourceEdit'
+sC-m = 'cmd.buffer.saveLink'
+sC-j = 'cmd.buffer.saveLink'
+m = 'cmd.buffer.mark'
+'`' = 'cmd.buffer.gotoMark'
+"'" = 'cmd.buffer.gotoMarkY'
+'zh'= 'cmd.buffer.scrollLeft'
+'zl' = 'cmd.buffer.scrollRight'
+'-'= 'cmd.buffer.scrollLeft'
+'+' = 'cmd.buffer.scrollRight'
+C-m = 'cmd.buffer.click'
+C-j = 'cmd.buffer.click'
+I = 'cmd.buffer.viewImage'
+':' = 'cmd.buffer.markURL'
+r = 'cmd.buffer.redraw'
+R = 'cmd.buffer.reshape'
+C-c = 'cmd.buffer.cancel'
+gg = 'cmd.buffer.gotoLineOrStart'
+G = 'cmd.buffer.gotoLineOrEnd'
+'z.' = 'cmd.buffer.centerLineBegin'
+'zC-m' = 'cmd.buffer.raisePageBegin'
+'zC-j' = 'cmd.buffer.raisePageBegin'
+'z-' = 'cmd.buffer.lowerPageBegin'
+zz = 'cmd.buffer.centerLine'
+'zt' = 'cmd.buffer.raisePage'
+'zb' = 'cmd.buffer.lowerPage'
+'z+' = 'cmd.buffer.nextPageBegin'
+'z^' = 'cmd.buffer.previousPageBegin'
+y = 'cmd.buffer.copySelection'
+v = 'cmd.buffer.cursorToggleSelection'
+V = 'cmd.buffer.cursorToggleSelectionLine'
+C-v = 'cmd.buffer.cursorToggleSelectionBlock'
+
+# pager commands
+sS = 'cmd.pager.saveSource'
+M-u = 'cmd.pager.dupeBuffer'
+C-l = 'cmd.pager.load'
+C-k = 'cmd.pager.webSearch'
+M-b = 'cmd.pager.openBookmarks'
+U = 'cmd.pager.reloadBuffer'
+C-g = 'cmd.pager.lineInfo'
+'\' = 'cmd.pager.toggleSource'
+D = 'cmd.pager.discardBuffer'
+M-d = 'cmd.pager.discardTree'
+',' = 'cmd.pager.prevBuffer'
+'M-,' = 'cmd.pager.prevSiblingBuffer'
+'.' = 'cmd.pager.nextBuffer'
+'M-.' = 'cmd.pager.nextSiblingBuffer'
+'M-/' = 'cmd.pager.parentBuffer'
+M-c = 'cmd.pager.enterCommand'
+'/' = 'cmd.pager.isearchForward'
+'?' = 'cmd.pager.isearchBackward'
+n = 'cmd.pager.searchNext'
+N = 'cmd.pager.searchPrev'
+c = 'cmd.pager.peek'
+u = 'cmd.pager.peekCursor'
+C-w = 'cmd.pager.toggleWrap'
+M-y = 'cmd.pager.copyURL'
+yc = 'pager.alert("Please use `yu` to copy URLs")'
+yu = 'cmd.pager.copyCursorLink'
+yI = 'cmd.pager.copyCursorImage'
+M-p = 'cmd.pager.gotoClipboardURL'
 
 [line]
-C-m = 'line.submit()'
-C-j = 'line.submit()'
-C-h = 'line.backspace()'
-'C-?' = 'line.backspace()'
-C-d = 'line.delete()'
-C-c = 'line.cancel()'
-M-b = 'line.prevWord()'
-M-f = 'line.nextWord()'
-C-b = 'line.backward()'
-C-f = 'line.forward()'
-C-u = 'line.clear()'
-C-_ = 'line.clear()'
-M-k = 'line.clear()'
-C-k = 'line.kill()'
-C-w = 'line.clearWord()'
-M-C-h = 'line.clearWord()'
-'M-C-?' = 'line.clearWord()'
-M-d = 'line.killWord()'
-C-a = 'line.begin()'
-C-e = 'line.end()'
-C-v = 'line.escape()'
-C-p = 'line.prevHist()'
-C-n = 'line.nextHist()'
-M-c = '''
-if ((pager.commandMode = consoleBuffer != pager.buffer))
-	console.show();
-else
-	console.hide();
-'''
-'M-[D' = 'line.backward()'
-'M-[B' = 'line.nextHist()'
-'M-[A' = 'line.prevHist()'
-'M-[C' = 'line.forward()'
+C-m = 'cmd.line.submit'
+C-j = 'cmd.line.submit'
+C-h = 'cmd.line.backspace'
+'C-?' = 'cmd.line.backspace'
+C-d = 'cmd.line.delete'
+C-c = 'cmd.line.cancel'
+M-b = 'cmd.line.prevWord'
+M-f = 'cmd.line.nextWord'
+C-b = 'cmd.line.backward'
+C-f = 'cmd.line.forward'
+C-u = 'cmd.line.clear'
+C-_ = 'cmd.line.clear'
+M-k = 'cmd.line.clear'
+C-k = 'cmd.line.kill'
+C-w = 'cmd.line.clearWord'
+M-C-h = 'cmd.line.clearWord'
+'M-C-?' = 'cmd.line.clearWord'
+M-d = 'cmd.line.killWord'
+C-a = 'cmd.line.begin'
+C-e = 'cmd.line.end'
+C-v = 'cmd.line.escape'
+C-p = 'cmd.line.prevHist'
+C-n = 'cmd.line.nextHist'
+M-c = 'cmd.pager.toggleCommandMode'
+'M-[D' = 'cmd.line.backward'
+'M-[B' = 'cmd.line.nextHist'
+'M-[A' = 'cmd.line.prevHist'
+'M-[C' = 'cmd.line.forward'