about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-05-04 21:26:10 +0200
committerbptato <nincsnevem662@gmail.com>2024-05-04 21:30:35 +0200
commit731f88183946a17888282c98ae60ecc58c98d96c (patch)
treefc0c6f66479eb7ce43a94e020007284cd812bfab
parent63442e5f8be17631a91cee352e441f59daa2df0a (diff)
downloadchawan-731f88183946a17888282c98ae60ecc58c98d96c.tar.gz
Update docs
-rw-r--r--doc/api.md118
-rw-r--r--doc/cha-api.5505
-rw-r--r--doc/cha-config.578
-rw-r--r--doc/config.md69
4 files changed, 278 insertions, 492 deletions
diff --git a/doc/api.md b/doc/api.md
index d13d8649..5d8f7b2f 100644
--- a/doc/api.md
+++ b/doc/api.md
@@ -52,8 +52,6 @@ just include it in an action:
 The global object (`globalThis`) implements the `Client` interface. Documented
 functions of this are:
 
-Following properties (functions/getters) are defined by `Pager`:
-
 <table>
 
 <tr>
@@ -302,28 +300,23 @@ Following properties (functions/getters) are defined by `Buffer`:
 </tr>
 
 <tr>
-<td>`cursorUp(n = 1)`</td>
-<td>Move the cursor upwards by n lines, or if n is unspecified, by 1.</td>
-</tr>
-
-<tr>
-<td>`cursorDown(n = 1)`</td>
-<td>Move the cursor downwards by n lines, or if n is unspecified, by 1.</td>
+<td>`cursorUp(n = 1)`, `cursorDown(n = 1)`</td>
+<td>Move the cursor upwards/downwards by n lines, or if n is unspecified, by
+1.</td>
 </tr>
 
 <tr>
-<td>`cursorLeft(n = 1)`</td>
-<td>Move the cursor to the left by n cells, or if n is unspecified, by 1.</td>
+<td>`cursorLeft(n = 1)`, `cursorRight(n = 1)`</td>
+<td>Move the cursor to the left/right by n cells, or if n is unspecified, by
+1.<br>
+Note: `n` right now represents cells, but really it should represent characters.
+(The difference is that right now numbered cursorLeft/cursorRight is broken for
+double-width chars.)</td>
 </tr>
 
 <tr>
-<td>`cursorRight(n = 1)`</td>
-<td>Move the cursor to the right by n cells, or if n is unspecified, by 1.</td>
-</tr>
-
-<tr>
-<td>`cursorLineBegin()`</td>
-<td>Move the cursor to the first cell of the line.</td>
+<td>`cursorLineBegin()`, `cursorLineEnd()`</td>
+<td>Move the cursor to the first/last cell of the line.</td>
 </tr>
 
 <tr>
@@ -332,11 +325,6 @@ Following properties (functions/getters) are defined by `Buffer`:
 </tr>
 
 <tr>
-<td>`cursorLineEnd()`</td>
-<td>Move the cursor to the last cell of the line.</td>
-</tr>
-
-<tr>
 <td>`cursorNextWord()`, `cursorNextViWord()`, `cursorNextBigWord()`</td>
 <td>Move the cursor to the beginning of the next [word](#word-types).</td>
 </tr>
@@ -365,13 +353,9 @@ element.</td>
 </tr>
 
 <tr>
-<td>`cursorPrevParagraph(n = 1)`</td>
-<td>Move the cursor to the beginning of the nth next paragraph.</td>
-</tr>
-
-<tr>
-<td>`cursorNextParagraph(n = 1)`</td>
-<td>Move the cursor to the end of the nth previous paragraph.</td>
+<td>`cursorNextParagraph(n = 1)`, `cursorPrevParagraph(n = 1)`</td>
+<td>Move the cursor to the beginning/end of the nth next/previous
+paragraph.</td>
 </tr>
 
 <tr>
@@ -392,23 +376,9 @@ from the document's last line.</td>
 </tr>
 
 <tr>
-<td>`halfPageDown(n = 1)`</td>
-<td>Scroll forwards by n half pages.</td>
-</tr>
-
-<tr>
-<td>`halfPageUp(n = 1)`</td>
-<td>Scroll backwards by n half pages.</td>
-</tr>
-
-<tr>
-<td>`halfPageLeft(n = 1)`</td>
-<td>Scroll to the left by n half pages.</td>
-</tr>
-
-<tr>
-<td>`halfPageUp(n = 1)`</td>
-<td>Scroll to the right by n half pages.</td>
+<td>`halfPageUp(n = 1)`, `halfPageDown(n = 1)`, `halfPageLeft(n = 1)`,
+`halfPageRight(n = 1)`</td>
+<td>Scroll up/down/left/right by n half pages.</td>
 </tr>
 
 <tr>
@@ -577,87 +547,67 @@ Following properties (functions/getters) are defined by `LineEdit`:
 
 <tr>
 <td>`submit()`</td>
-<td>Submit line</td>
+<td>Submit line.</td>
 </tr>
 
 <tr>
 <td>`cancel()`</td>
-<td>Cancel operation</td>
+<td>Cancel operation.</td>
 </tr>
 
 <tr>
 <td>`backspace()`</td>
-<td>Delete character before cursor</td>
+<td>Delete character before cursor.</td>
 </tr>
 
 <tr>
 <td>`delete()`</td>
-<td>Delete character after cursor</td>
+<td>Delete character after cursor.</td>
 </tr>
 
 <tr>
 <td>`clear()`</td>
-<td>Clear text before cursor</td>
+<td>Clear text before cursor.</td>
 </tr>
 
 <tr>
 <td>`kill()`</td>
-<td>Clear text after cursor</td>
+<td>Clear text after cursor.</td>
 </tr>
 
 <tr>
 <td>`clearWord()`</td>
-<td>Delete word before cursor</td>
+<td>Delete word before cursor.</td>
 </tr>
 
 <tr>
 <td>`killWord()`</td>
-<td>Delete word after cursor</td>
+<td>Delete word after cursor.</td>
 </tr>
 
 <tr>
-<td>`backward()`</td>
-<td>Move cursor back by one character</td>
+<td>`backward()`, `forward()`</td>
+<td>Move cursor backward/forward by one character.</td>
 </tr>
 
 <tr>
-<td>`forward()`</td>
-<td>Move cursor forward by one character</td>
+<td>`nextWord()`, `prevWord()`</td>
+<td>Move cursor to the next/previous word by one character.</td>
 </tr>
 
 <tr>
-<td>`prevWord()`</td>
-<td>Move cursor to the previous word by one character</td>
-</tr>
-
-<tr>
-<td>`nextWord()`</td>
-<td>Move cursor to the previous word by one character</td>
-</tr>
-
-<tr>
-<td>`begin()`</td>
-<td>Move cursor to the previous word by one character</td>
-</tr>
-
-<tr>
-<td>`end()`</td>
-<td>Move cursor to the previous word by one character</td>
+<td>`begin()`, `end()`</td>
+<td>Move cursor to the beginning/end of the line.</td>
 </tr>
 
 <tr>
 <td>`escape()`</td>
-<td>Ignore keybindings for next character</td>
-</tr>
-
-<tr>
-<td>`prevHist()`</td>
-<td>Jump to the previous history entry</td>
+<td>Ignore keybindings for next character.</td>
 </tr>
 
 <tr>
-<td>`nextHist()`</td>
-<td>Jump to the next history entry</td>
+<td>`nextHist()`, `prevHist()`</td>
+<td>Jump to the previous/next history entry.</td>
 </tr>
 
 </table>
diff --git a/doc/cha-api.5 b/doc/cha-api.5
index 4d0c228b..5ffdf460 100644
--- a/doc/cha-api.5
+++ b/doc/cha-api.5
@@ -1,85 +1,58 @@
 '\" t
-.\" Automatically generated by Pandoc 2.17.1.1
+.\" Automatically generated by Pandoc 3.1.13
 .\"
-.\" Define V font for inline verbatim, using C font in formats
-.\" that render this, and otherwise B font.
-.ie "\f[CB]x\f[]"x" \{\
-. ftr V B
-. ftr VI BI
-. ftr VB B
-. ftr VBI BI
-.\}
-.el \{\
-. ftr V CR
-. ftr VI CI
-. ftr VB CB
-. ftr VBI CBI
-.\}
-.TH "cha-api" "5" "" "" "Chawan\[cq]s command API"
-.hy
+.TH "cha\-api" "5" "" "" "Chawan\[cq]s command API"
 .SH Chawan\[cq]s command API
-.PP
-As described in \f[B]cha-config\f[R](5), keypress combinations can be
+As described in \f[B]cha\-config\f[R](5), keypress combinations can be
 bound to actions.
 .PP
 An action can be either a JavaScript expression, or a command defined in
-the \f[V][cmd]\f[R] section of config.toml.
+the \f[CR][cmd]\f[R] section of config.toml.
 For example, the following works:
 .IP
-.nf
-\f[C]
+.EX
 gpn = \[aq]n => pager.alert(n)\[aq] # e.g. 2gpn prints \[ga]2\[aq] to the status line
-\f[R]
-.fi
+.EE
 .PP
 Note however, that JavaScript functions must be called with an
-appropriate \f[V]this\f[R] value.
+appropriate \f[CR]this\f[R] value.
 Unfortunately, this also means that the following does not work:
 .IP
-.nf
-\f[C]
+.EX
 gpn = \[aq]pager.alert\[aq] # broken!!!
-\f[R]
-.fi
+.EE
 .PP
 To work around this limitation, actions have to wrap the target function
 in a closure, as above.
 However, this has very poor reusability; for more complex actions, you
-would have to copy and paste the entire function every time you re-bind
+would have to copy and paste the entire function every time you re\-bind
 it or call it from a different function.
 .PP
-To fix this, it is possible to define a command in the \f[V][cmd]\f[R]
+To fix this, it is possible to define a command in the \f[CR][cmd]\f[R]
 section:
 .IP
-.nf
-\f[C]
-[cmd.my.namespace]
+.EX
+\f[B][cmd.my.namespace]\f[R]
 showNumber = \[aq]n => pager.alert(n)\[aq]
-\f[R]
-.fi
+.EE
 .PP
-\f[V]my.namespace\f[R] can be anything you want; it is to avoid
+\f[CR]my.namespace\f[R] can be anything you want; it is to avoid
 collisions when including multiple configs.
-Avoid setting it to \f[V]pager\f[R] or \f[V]line\f[R], because these are
-used by the default config.
+Avoid setting it to \f[CR]pager\f[R] or \f[CR]line\f[R], because these
+are used by the default config.
 .PP
-Now you can call \f[V]cmd.my.namespace.showNumber()\f[R] from any other
+Now you can call \f[CR]cmd.my.namespace.showNumber()\f[R] from any other
 function, or just include it in an action:
 .IP
-.nf
-\f[C]
+.EX
 \[aq]gpn\[aq] = \[aq]cmd.my.namespace.showNumber\[aq]
-\f[R]
-.fi
+.EE
 .SS Interfaces
 .SS Client
-.PP
-The global object (\f[V]globalThis\f[R]) implements the \f[V]Client\f[R]
-interface.
+The global object (\f[CR]globalThis\f[R]) implements the
+\f[CR]Client\f[R] interface.
 Documented functions of this are:
 .PP
-Following properties (functions/getters) are defined by \f[V]Pager\f[R]:
-.PP
 .TS
 tab(@);
 lw(28.0n) lw(38.5n) lw(3.5n).
@@ -91,13 +64,13 @@ T}@T{
 T}
 _
 T{
-\f[V]quit()\f[R]
+\f[CR]quit()\f[R]
 T}@T{
 Exit the browser.
 T}@T{
 T}
 T{
-\f[V]suspend()\f[R]
+\f[CR]suspend()\f[R]
 T}@T{
 Temporarily suspend the browser, by delivering the client process a
 SIGTSTP signal.
@@ -106,18 +79,18 @@ T}@T{
 T}
 .TE
 .PP
-\f[V]Client\f[R] also implements various web standards normally
-available on the \f[V]Window\f[R] object on websites, e.g.\ fetch().
+\f[CR]Client\f[R] also implements various web standards normally
+available on the \f[CR]Window\f[R] object on websites, e.g.\ fetch().
 Note however that it does \f[I]not\f[R] give access to JS objects in
-buffers, so e.g.\ \f[V]globalThis.document\f[R] is not available.
+buffers, so e.g.\ \f[CR]globalThis.document\f[R] is not available.
 .SS Pager
+\f[CR]Pager\f[R] is a separate interface from \f[CR]Client\f[R] that
+gives access to the pager (i.e.\ browser chrome).
+It is accessible as \f[CR]globalThis.pager\f[R], or simply
+\f[CR]pager\f[R].
 .PP
-\f[V]Pager\f[R] is a separate interface from \f[V]Client\f[R] that gives
-access to the pager (i.e.\ browser chrome).
-It is accessible as \f[V]globalThis.pager\f[R], or simply
-\f[V]pager\f[R].
-.PP
-Following properties (functions/getters) are defined by \f[V]Pager\f[R]:
+Following properties (functions/getters) are defined by
+\f[CR]Pager\f[R]:
 .PP
 .TS
 tab(@);
@@ -130,44 +103,44 @@ T}@T{
 T}
 _
 T{
-\f[V]load(url)\f[R]
+\f[CR]load(url)\f[R]
 T}@T{
 Put the specified address into the URL bar, and optionally load it.
-Note that this performs auto-expansion of URLs, so Chawan will expand
-any matching omni-rules (e.g.\ search), try to open schemeless URLs with
-the default scheme/local files, etc.
+Note that this performs auto\-expansion of URLs, so Chawan will expand
+any matching omni\-rules (e.g.\ search), try to open schemeless URLs
+with the default scheme/local files, etc.
 Opens a prompt with the current URL when no parameters are specified;
 otherwise, the string passed is displayed in the prompt.
 If this string ends with a newline
-(e.g.\ \f[V]pager.load(\[dq]about:chawann\[dq])\f[R]), the URL is loaded
-directly.
+(e.g.\ \f[CR]pager.load(\[dq]about:chawann\[dq])\f[R]), the URL is
+loaded directly.
 T}@T{
 T}
 T{
-\f[V]loadSubmit(url)\f[R]
+\f[CR]loadSubmit(url)\f[R]
 T}@T{
-Act as if \f[V]url\f[R] had been input into the address bar.
-Same as \f[V]pager.load(url + \[dq]n\[dq])\f[R].
+Act as if \f[CR]url\f[R] had been input into the address bar.
+Same as \f[CR]pager.load(url + \[dq]n\[dq])\f[R].
 T}@T{
 T}
 T{
-\f[V]gotoURL(url)\f[R]
+\f[CR]gotoURL(url)\f[R]
 T}@T{
 Go to the specified URL immediately (without a prompt).
-This differs from \f[V]load\f[R] and \f[V]loadSubmit\f[R] in that it
+This differs from \f[CR]load\f[R] and \f[CR]loadSubmit\f[R] in that it
 \f[I]does not\f[R] try to correct the URL.
-Use this for loading automatically retrieved (i.e.\ non-user-provided)
+Use this for loading automatically retrieved (i.e.\ non\-user\-provided)
 URLs.
 T}@T{
 T}
 T{
-\f[V]dupeBuffer()\f[R]
+\f[CR]dupeBuffer()\f[R]
 T}@T{
 Duplicate the current buffer by loading its source to a new buffer.
 T}@T{
 T}
 T{
-\f[V]discardBuffer()\f[R]
+\f[CR]discardBuffer()\f[R]
 T}@T{
 Discard the current buffer, and move back to its previous sibling
 buffer, or if that doesn\[cq]t exist, to its parent.
@@ -176,70 +149,70 @@ the next sibling buffer instead.
 T}@T{
 T}
 T{
-\f[V]discardTree()\f[R]
+\f[CR]discardTree()\f[R]
 T}@T{
 Discard all child buffers of the current buffer.
 T}@T{
 T}
 T{
-\f[V]reload()\f[R]
+\f[CR]reload()\f[R]
 T}@T{
 Open a new buffer with the current buffer\[cq]s URL, replacing the
 current buffer.
 T}@T{
 T}
 T{
-\f[V]reshape()\f[R]
+\f[CR]reshape()\f[R]
 T}@T{
 Reshape the current buffer (=render the current page anew.)
 T}@T{
 T}
 T{
-\f[V]redraw()\f[R]
+\f[CR]redraw()\f[R]
 T}@T{
 Redraw screen contents.
 Useful if something messed up the display.
 T}@T{
 T}
 T{
-\f[V]toggleSource()\f[R]
+\f[CR]toggleSource()\f[R]
 T}@T{
 If viewing an HTML buffer, open a new buffer with its source.
 Otherwise, open the current buffer\[cq]s contents as HTML.
 T}@T{
 T}
 T{
-\f[V]lineInfo()\f[R]
+\f[CR]lineInfo()\f[R]
 T}@T{
 Display information about the current line.
 T}@T{
 T}
 T{
-\f[V]searchForward()\f[R]
+\f[CR]searchForward()\f[R]
 T}@T{
 Search for a string in the current buffer.
 T}@T{
 T}
 T{
-\f[V]searchBackward()\f[R]
+\f[CR]searchBackward()\f[R]
 T}@T{
 Search for a string, backwards.
 T}@T{
 T}
 T{
-\f[V]isearchForward()\f[R]
+\f[CR]isearchForward()\f[R]
 T}@T{
-Incremental-search for a string, highlighting the first result.
+Incremental\-search for a string, highlighting the first result.
 T}@T{
 T}
 T{
-\f[V]isearchBackward()\f[R]
+\f[CR]isearchBackward()\f[R]
 T}@T{
-Incremental-search and highlight the first result, backwards.
+Incremental\-search and highlight the first result, backwards.
 T}@T{
 T}
 T{
-\f[V]gotoLine(n?)\f[R]
+\f[CR]gotoLine(n?)\f[R]
 T}@T{
 Go to the line passed as the first argument.
 If no arguments were specified, an input window for entering a line is
@@ -247,68 +220,68 @@ shown.
 T}@T{
 T}
 T{
-\f[V]searchNext(n = 1)\f[R]
+\f[CR]searchNext(n = 1)\f[R]
 T}@T{
 Jump to the nth next search result.
 T}@T{
 T}
 T{
-\f[V]searchPrev(n = 1)\f[R]
+\f[CR]searchPrev(n = 1)\f[R]
 T}@T{
 Jump to the nth previous search result.
 T}@T{
 T}
 T{
-\f[V]peek()\f[R]
+\f[CR]peek()\f[R]
 T}@T{
 Display an alert message of the current URL.
 T}@T{
 T}
 T{
-\f[V]peekCursor()\f[R]
+\f[CR]peekCursor()\f[R]
 T}@T{
 Display an alert message of the URL or title under the cursor.
 Multiple calls allow cycling through the two.
-(i.e.\ by default, press u once -> title, press again -> URL)
+(i.e.\ by default, press u once \-> title, press again \-> URL)
 T}@T{
 T}
 T{
-\f[V]ask(prompt)\f[R]
+\f[CR]ask(prompt)\f[R]
 T}@T{
 Ask the user for confirmation.
 Returns a promise which resolves to a boolean value indicating whether
 the user responded with yes.
 Can be used to implement an exit prompt like this:
-\f[V]q = \[aq]pager.ask(\[dq]Do you want to exit Chawan?\[dq]).then(x => x ? pager.quit() : void(0))\[aq]\f[R]
+\f[CR]q = \[aq]pager.ask(\[dq]Do you want to exit Chawan?\[dq]).then(x => x ? pager.quit() : void(0))\[aq]\f[R]
 T}@T{
 T}
 T{
-\f[V]askChar(prompt)\f[R]
+\f[CR]askChar(prompt)\f[R]
 T}@T{
 Ask the user for any character.
-Like \f[V]pager.ask\f[R], but the return value is a character.
+Like \f[CR]pager.ask\f[R], but the return value is a character.
 T}@T{
 T}
 T{
-\f[V]saveLink()\f[R]
+\f[CR]saveLink()\f[R]
 T}@T{
 Save URL pointed to by the cursor.
 T}@T{
 T}
 T{
-\f[V]saveSource()\f[R]
+\f[CR]saveSource()\f[R]
 T}@T{
 Save the source of the current buffer.
 T}@T{
 T}
 T{
-\f[V]extern(cmd, options = {setenv: true, suspend: true, wait: false})\f[R]
+\f[CR]extern(cmd, options = {setenv: true, suspend: true, wait: false})\f[R]
 T}@T{
-Run an external command \f[V]cmd\f[R].
-The \f[V]$CHA_URL\f[R] and \f[V]$CHA_CHARSET\f[R] variables are set when
-\f[V]options.setenv\f[R] is true.
-\f[V]options.suspend\f[R] suspends the pager while the command is being
-executed, and \f[V]options.wait\f[R] makes it so the user must press a
+Run an external command \f[CR]cmd\f[R].
+The \f[CR]$CHA_URL\f[R] and \f[CR]$CHA_CHARSET\f[R] variables are set
+when \f[CR]options.setenv\f[R] is true.
+\f[CR]options.suspend\f[R] suspends the pager while the command is being
+executed, and \f[CR]options.wait\f[R] makes it so the user must press a
 key before the pager is resumed.
 Returns true if the command exit successfully, false otherwise.
 Warning: this has a bug where the output is written to stdout even if
@@ -318,59 +291,58 @@ Redirect to /dev/null in the command if this is not desired.
 T}@T{
 T}
 T{
-\f[V]externCapture(cmd)\f[R]
+\f[CR]externCapture(cmd)\f[R]
 T}@T{
 Like extern(), but redirect the command\[cq]s stdout string into the
 result.
 null is returned if the command wasn\[cq]t executed successfully, or if
-the command returned a non-zero exit value.
+the command returned a non\-zero exit value.
 T}@T{
 T}
 T{
-\f[V]externInto(cmd, ins)\f[R]
+\f[CR]externInto(cmd, ins)\f[R]
 T}@T{
-Like extern(), but redirect \f[V]ins\f[R] into the command\[cq]s
+Like extern(), but redirect \f[CR]ins\f[R] into the command\[cq]s
 standard input stream.
-\f[V]true\f[R] is returned if the command exits successfully, otherwise
-the return value is \f[V]false\f[R].
+\f[CR]true\f[R] is returned if the command exits successfully, otherwise
+the return value is \f[CR]false\f[R].
 T}@T{
 T}
 T{
-\f[V]externFilterSource(cmd, buffer = null, contentType = null)\f[R]
+\f[CR]externFilterSource(cmd, buffer = null, contentType = null)\f[R]
 T}@T{
-Redirects the specified (or if \f[V]buffer\f[R] is null, the current)
-buffer\[cq]s source into \f[V]cmd\f[R].
+Redirects the specified (or if \f[CR]buffer\f[R] is null, the current)
+buffer\[cq]s source into \f[CR]cmd\f[R].
 Then, it pipes the output into a new buffer, with the content type
-\f[V]contentType\f[R] (or, if \f[V]contentType\f[R] is null, the
+\f[CR]contentType\f[R] (or, if \f[CR]contentType\f[R] is null, the
 original buffer\[cq]s content type).
-Returns \f[V]undefined\f[R].
+Returns \f[CR]undefined\f[R].
 (It should return a promise; TODO.)
 T}@T{
 T}
 T{
-\f[V]buffer\f[R]
+\f[CR]buffer\f[R]
 T}@T{
 Getter for the currently displayed buffer.
-Returns a \f[V]Buffer\f[R] object; see below.
+Returns a \f[CR]Buffer\f[R] object; see below.
 T}@T{
 T}
 .TE
 .SS Buffer
-.PP
-Each buffer is exposed as an object that implements the \f[V]Buffer\f[R]
-interface.
+Each buffer is exposed as an object that implements the
+\f[CR]Buffer\f[R] interface.
 To get a reference to the currently displayed buffer, use
-\f[V]pager.buffer\f[R].
+\f[CR]pager.buffer\f[R].
 .PP
 Important: there exists a quirk of questionable value on pager, where
 accessing properties that do not exist on the pager will dispatch those
-to the current buffer (\f[V]pager.buffer\f[R]).
-So if you see e.g.\ \f[V]pager.url\f[R], that is actually equivalent to
-\f[V]pager.buffer.url\f[R], because \f[V]Pager\f[R] has no \f[V]url\f[R]
-getter.
+to the current buffer (\f[CR]pager.buffer\f[R]).
+So if you see e.g.\ \f[CR]pager.url\f[R], that is actually equivalent to
+\f[CR]pager.buffer.url\f[R], because \f[CR]Pager\f[R] has no
+\f[CR]url\f[R] getter.
 .PP
 Following properties (functions/getters) are defined by
-\f[V]Buffer\f[R]:
+\f[CR]Buffer\f[R]:
 .PP
 .TS
 tab(@);
@@ -383,211 +355,177 @@ T}@T{
 T}
 _
 T{
-\f[V]cursorUp(n = 1)\f[R]
-T}@T{
-Move the cursor upwards by n lines, or if n is unspecified, by 1.
-T}@T{
-T}
-T{
-\f[V]cursorDown(n = 1)\f[R]
-T}@T{
-Move the cursor downwards by n lines, or if n is unspecified, by 1.
-T}@T{
-T}
-T{
-\f[V]cursorLeft(n = 1)\f[R]
+\f[CR]cursorUp(n = 1)\f[R], \f[CR]cursorDown(n = 1)\f[R]
 T}@T{
-Move the cursor to the left by n cells, or if n is unspecified, by 1.
+Move the cursor upwards/downwards by n lines, or if n is unspecified, by
+1.
 T}@T{
 T}
 T{
-\f[V]cursorRight(n = 1)\f[R]
+\f[CR]cursorLeft(n = 1)\f[R], \f[CR]cursorRight(n = 1)\f[R]
 T}@T{
-Move the cursor to the right by n cells, or if n is unspecified, by 1.
+Move the cursor to the left/right by n cells, or if n is unspecified, by
+1.
+Note: \f[CR]n\f[R] right now represents cells, but really it should
+represent characters.
+(The difference is that right now numbered cursorLeft/cursorRight is
+broken for double\-width chars.)
 T}@T{
 T}
 T{
-\f[V]cursorLineBegin()\f[R]
+\f[CR]cursorLineBegin()\f[R], \f[CR]cursorLineEnd()\f[R]
 T}@T{
-Move the cursor to the first cell of the line.
+Move the cursor to the first/last cell of the line.
 T}@T{
 T}
 T{
-\f[V]cursorLineTextStart()\f[R]
+\f[CR]cursorLineTextStart()\f[R]
 T}@T{
-Move the cursor to the first non-blank character of the line.
+Move the cursor to the first non\-blank character of the line.
 T}@T{
 T}
 T{
-\f[V]cursorLineEnd()\f[R]
-T}@T{
-Move the cursor to the last cell of the line.
-T}@T{
-T}
-T{
-\f[V]cursorNextWord()\f[R], \f[V]cursorNextViWord()\f[R],
-\f[V]cursorNextBigWord()\f[R]
+\f[CR]cursorNextWord()\f[R], \f[CR]cursorNextViWord()\f[R],
+\f[CR]cursorNextBigWord()\f[R]
 T}@T{
 Move the cursor to the beginning of the next word.
 T}@T{
 T}
 T{
-\f[V]cursorPrevWord()\f[R], \f[V]cursorPrevViWord()\f[R],
-\f[V]cursorPrevBigWord()\f[R]
+\f[CR]cursorPrevWord()\f[R], \f[CR]cursorPrevViWord()\f[R],
+\f[CR]cursorPrevBigWord()\f[R]
 T}@T{
 Move the cursor to the end of the previous word.
 T}@T{
 T}
 T{
-\f[V]cursorWordEnd()\f[R], \f[V]cursorViWordEnd()\f[R],
-\f[V]cursorBigWordEnd()\f[R]
+\f[CR]cursorWordEnd()\f[R], \f[CR]cursorViWordEnd()\f[R],
+\f[CR]cursorBigWordEnd()\f[R]
 T}@T{
 Move the cursor to the end of the current word, or if already there, to
 the end of the next word.
 T}@T{
 T}
 T{
-\f[V]cursorWordBegin()\f[R], \f[V]cursorViWordBegin()\f[R],
-\f[V]cursorBigWordBegin()\f[R]
+\f[CR]cursorWordBegin()\f[R], \f[CR]cursorViWordBegin()\f[R],
+\f[CR]cursorBigWordBegin()\f[R]
 T}@T{
 Move the cursor to the beginning of the current word, or if already
 there, to the end of the previous word.
 T}@T{
 T}
 T{
-\f[V]cursorNextLink()\f[R], \f[V]cursorPrevLink()\f[R]
+\f[CR]cursorNextLink()\f[R], \f[CR]cursorPrevLink()\f[R]
 T}@T{
 Move the cursor to the beginning of the next/previous clickable element.
 T}@T{
 T}
 T{
-\f[V]cursorPrevParagraph(n = 1)\f[R]
+\f[CR]cursorNextParagraph(n = 1)\f[R],
+\f[CR]cursorPrevParagraph(n = 1)\f[R]
 T}@T{
-Move the cursor to the beginning of the nth next paragraph.
+Move the cursor to the beginning/end of the nth next/previous paragraph.
 T}@T{
 T}
 T{
-\f[V]cursorNextParagraph(n = 1)\f[R]
-T}@T{
-Move the cursor to the end of the nth previous paragraph.
-T}@T{
-T}
-T{
-\f[V]cursorNthLink(n = 1)\f[R]
+\f[CR]cursorNthLink(n = 1)\f[R]
 T}@T{
 Move the cursor to the nth link of the document.
 T}@T{
 T}
 T{
-\f[V]cursorRevNthLink(n = 1)\f[R]
+\f[CR]cursorRevNthLink(n = 1)\f[R]
 T}@T{
 Move the cursor to the nth link of the document, counting backwards from
 the document\[cq]s last line.
 T}@T{
 T}
 T{
-\f[V]pageUp(n = 1)\f[R], \f[V]pageDown(n = 1)\f[R],
-\f[V]pageLeft(n = 1)\f[R], \f[V]pageRight(n = 1)\f[R]
+\f[CR]pageUp(n = 1)\f[R], \f[CR]pageDown(n = 1)\f[R],
+\f[CR]pageLeft(n = 1)\f[R], \f[CR]pageRight(n = 1)\f[R]
 T}@T{
 Scroll up/down/left/right by n pages.
 T}@T{
 T}
 T{
-\f[V]halfPageDown(n = 1)\f[R]
-T}@T{
-Scroll forwards by n half pages.
-T}@T{
-T}
-T{
-\f[V]halfPageUp(n = 1)\f[R]
+\f[CR]halfPageUp(n = 1)\f[R], \f[CR]halfPageDown(n = 1)\f[R],
+\f[CR]halfPageLeft(n = 1)\f[R], \f[CR]halfPageRight(n = 1)\f[R]
 T}@T{
-Scroll backwards by n half pages.
+Scroll up/down/left/right by n half pages.
 T}@T{
 T}
 T{
-\f[V]halfPageLeft(n = 1)\f[R]
-T}@T{
-Scroll to the left by n half pages.
-T}@T{
-T}
-T{
-\f[V]halfPageUp(n = 1)\f[R]
-T}@T{
-Scroll to the right by n half pages.
-T}@T{
-T}
-T{
-\f[V]scrollUp(n = 1)\f[R], \f[V]scrollDown(n = 1)\f[R],
-\f[V]scrollLeft(n = 1)\f[R], \f[V]scrollRight(n = 1)\f[R]
+\f[CR]scrollUp(n = 1)\f[R], \f[CR]scrollDown(n = 1)\f[R],
+\f[CR]scrollLeft(n = 1)\f[R], \f[CR]scrollRight(n = 1)\f[R]
 T}@T{
 Scroll up/down/left/right by n lines.
 T}@T{
 T}
 T{
-\f[V]click()\f[R]
+\f[CR]click()\f[R]
 T}@T{
 Click the HTML element currently under the cursor.
 T}@T{
 T}
 T{
-\f[V]cursorFirstLine()\f[R], \f[V]cursorLastLine()\f[R]
+\f[CR]cursorFirstLine()\f[R], \f[CR]cursorLastLine()\f[R]
 T}@T{
 Move to the first/last line in the buffer.
 T}@T{
 T}
 T{
-\f[V]cursorTop()\f[R]
+\f[CR]cursorTop()\f[R]
 T}@T{
 Move to the first line on the screen.
 (Equivalent to H in vi.)
 T}@T{
 T}
 T{
-\f[V]cursorMiddle()\f[R]
+\f[CR]cursorMiddle()\f[R]
 T}@T{
 Move to the line in the middle of the screen.
 (Equivalent to M in vi.)
 T}@T{
 T}
 T{
-\f[V]cursorBottom()\f[R]
+\f[CR]cursorBottom()\f[R]
 T}@T{
 Move to the last line on the screen.
 (Equivalent to L in vi.)
 T}@T{
 T}
 T{
-\f[V]lowerPage(n = this.cursory)\f[R]
+\f[CR]lowerPage(n = this.cursory)\f[R]
 T}@T{
 Move cursor to line n, then scroll up so that the cursor is on the top
 line on the screen.
-(\f[V]zt\f[R] in vim.)
+(\f[CR]zt\f[R] in vim.)
 T}@T{
 T}
 T{
-\f[V]lowerPageBegin(n = this.cursory)\f[R]
+\f[CR]lowerPageBegin(n = this.cursory)\f[R]
 T}@T{
-Move cursor to the first non-blank character of line n, then scroll up
+Move cursor to the first non\-blank character of line n, then scroll up
 so that the cursor is on the top line on the screen.
-(\f[V]z<CR>\f[R] in vi.)
+(\f[CR]z<CR>\f[R] in vi.)
 T}@T{
 T}
 T{
-\f[V]centerLine(n = this.cursory)\f[R]
+\f[CR]centerLine(n = this.cursory)\f[R]
 T}@T{
-Center screen around line n.\ (\f[V]zz\f[R] in vim.)
+Center screen around line n.\ (\f[CR]zz\f[R] in vim.)
 T}@T{
 T}
 T{
-\f[V]centerLineBegin(n = this.cursory)\f[R]
+\f[CR]centerLineBegin(n = this.cursory)\f[R]
 T}@T{
 Center screen around line n, and move the cursor to the line\[cq]s first
-non-blank character.
-(\f[V]z.\f[R] in vi.)
+non\-blank character.
+(\f[CR]z.\f[R] in vi.)
 T}@T{
 T}
 T{
-\f[V]raisePage(n = this.cursory)\f[R]
+\f[CR]raisePage(n = this.cursory)\f[R]
 T}@T{
 Move cursor to line n, then scroll down so that the cursor is on the top
 line on the screen.
@@ -595,104 +533,104 @@ line on the screen.
 T}@T{
 T}
 T{
-\f[V]lowerPageBegin(n = this.cursory)\f[R]
+\f[CR]lowerPageBegin(n = this.cursory)\f[R]
 T}@T{
-Move cursor to the first non-blank character of line n, then scroll up
+Move cursor to the first non\-blank character of line n, then scroll up
 so that the cursor is on the last line on the screen.
-(\f[V]z\[ha]\f[R] in vi.)
+(\f[CR]z\[ha]\f[R] in vi.)
 T}@T{
 T}
 T{
-\f[V]nextPageBegin(n = this.cursory)\f[R]
+\f[CR]nextPageBegin(n = this.cursory)\f[R]
 T}@T{
 If n was given, move to the screen before the nth line and raise the
 page.
 Otherwise, go to the previous screen\[cq]s last line and raise the page.
-(\f[V]z+\f[R] in vi.)
+(\f[CR]z+\f[R] in vi.)
 T}@T{
 T}
 T{
-\f[V]cursorLeftEdge()\f[R], \f[V]cursorMiddleColumn()\f[R],
-\f[V]cursorRightEdge()\f[R]
+\f[CR]cursorLeftEdge()\f[R], \f[CR]cursorMiddleColumn()\f[R],
+\f[CR]cursorRightEdge()\f[R]
 T}@T{
 Move to the first/middle/last column on the screen.
 T}@T{
 T}
 T{
-\f[V]centerColumn()\f[R]
+\f[CR]centerColumn()\f[R]
 T}@T{
 Center screen around the current column.
 T}@T{
 T}
 T{
-\f[V]findNextMark(x = this.cursorx, y = this.cursory)\f[R]
+\f[CR]findNextMark(x = this.cursorx, y = this.cursory)\f[R]
 T}@T{
-Find the next mark after \f[V]x\f[R], \f[V]y\f[R], if any; and return
+Find the next mark after \f[CR]x\f[R], \f[CR]y\f[R], if any; and return
 its id (or null if none were found.)
 T}@T{
 T}
 T{
-\f[V]findPrevMark(x = this.cursorx, y = this.cursory)\f[R]
+\f[CR]findPrevMark(x = this.cursorx, y = this.cursory)\f[R]
 T}@T{
-Find the previous mark before \f[V]x\f[R], \f[V]y\f[R], if any; and
+Find the previous mark before \f[CR]x\f[R], \f[CR]y\f[R], if any; and
 return its id (or null if none were found.)
 T}@T{
 T}
 T{
-\f[V]setMark(id, x = this.cursorx, y = this.cursory)\f[R]
+\f[CR]setMark(id, x = this.cursorx, y = this.cursory)\f[R]
 T}@T{
-Set a mark at (x, y) using the name \f[V]id\f[R].
-Returns true if no other mark exists with \f[V]id\f[R].
+Set a mark at (x, y) using the name \f[CR]id\f[R].
+Returns true if no other mark exists with \f[CR]id\f[R].
 If one already exists, it will be overridden and the function returns
 false.
 T}@T{
 T}
 T{
-\f[V]clearMark(id)\f[R]
+\f[CR]clearMark(id)\f[R]
 T}@T{
-Clear the mark with the name \f[V]id\f[R].
+Clear the mark with the name \f[CR]id\f[R].
 Returns true if the mark existed, false otherwise.
 T}@T{
 T}
 T{
-\f[V]gotoMark(id)\f[R]
+\f[CR]gotoMark(id)\f[R]
 T}@T{
-If the mark \f[V]id\f[R] exists, jump to its position and return true.
+If the mark \f[CR]id\f[R] exists, jump to its position and return true.
 Otherwise, do nothing and return false.
 T}@T{
 T}
 T{
-\f[V]gotoMarkY(id)\f[R]
+\f[CR]gotoMarkY(id)\f[R]
 T}@T{
-If the mark \f[V]id\f[R] exists, jump to the beginning of the line at
+If the mark \f[CR]id\f[R] exists, jump to the beginning of the line at
 its Y position and return true.
 Otherwise, do nothing and return false.
 T}@T{
 T}
 T{
-\f[V]getMarkPos(id)\f[R]
+\f[CR]getMarkPos(id)\f[R]
 T}@T{
-If the mark \f[V]id\f[R] exists, return its position as an array where
+If the mark \f[CR]id\f[R] exists, return its position as an array where
 the first element is the X position and the second element is the Y
 position.
 If the mark does not exist, return null.
 T}@T{
 T}
 T{
-\f[V]markURL()\f[R]
+\f[CR]markURL()\f[R]
 T}@T{
-Convert URL-like strings to anchors on the current page.
+Convert URL\-like strings to anchors on the current page.
 T}@T{
 T}
 T{
-\f[V]url\f[R]
+\f[CR]url\f[R]
 T}@T{
 Getter for the buffer\[cq]s URL.
-Note: this returns a \f[V]URL\f[R] object, not a string.
+Note: this returns a \f[CR]URL\f[R] object, not a string.
 T}@T{
 T}
 T{
-\f[V]hoverTitle\f[R], \f[V]hoverLink\f[R], \f[V]hoverImage\f[R]
+\f[CR]hoverTitle\f[R], \f[CR]hoverLink\f[R], \f[CR]hoverImage\f[R]
 T}@T{
 Getter for the string representation of the element title/link/image
 currently under the cursor.
@@ -701,21 +639,20 @@ T}@T{
 T}
 .TE
 .SS LineEdit
-.PP
 The line editor at the bottom of the screen is exposed to the JavaScript
-context as \f[V]globalThis.line\f[R], or simply \f[V]line\f[R], and
-implements the \f[V]LineEdit\f[R] interface.
+context as \f[CR]globalThis.line\f[R], or simply \f[CR]line\f[R], and
+implements the \f[CR]LineEdit\f[R] interface.
 .PP
-Note that there is no single \f[V]LineEdit\f[R] object; a new one is
+Note that there is no single \f[CR]LineEdit\f[R] object; a new one is
 created every time the line editor is opened, and when the line editor
-is closed, \f[V]globalThis.line\f[R] simply returns \f[V]null\f[R].
+is closed, \f[CR]globalThis.line\f[R] simply returns \f[CR]null\f[R].
 .PP
 Following properties (functions/getters) are defined by
-\f[V]LineEdit\f[R]:
+\f[CR]LineEdit\f[R]:
 .PP
 .TS
 tab(@);
-l l l.
+lw(28.0n) lw(38.5n) lw(3.5n).
 T{
 Property
 T}@T{
@@ -724,105 +661,81 @@ T}@T{
 T}
 _
 T{
-\f[V]submit()\f[R]
-T}@T{
-Submit line
-T}@T{
-T}
-T{
-\f[V]cancel()\f[R]
-T}@T{
-Cancel operation
-T}@T{
-T}
-T{
-\f[V]backspace()\f[R]
-T}@T{
-Delete character before cursor
-T}@T{
-T}
-T{
-\f[V]delete()\f[R]
-T}@T{
-Delete character after cursor
-T}@T{
-T}
-T{
-\f[V]clear()\f[R]
+\f[CR]submit()\f[R]
 T}@T{
-Clear text before cursor
+Submit line.
 T}@T{
 T}
 T{
-\f[V]kill()\f[R]
+\f[CR]cancel()\f[R]
 T}@T{
-Clear text after cursor
+Cancel operation.
 T}@T{
 T}
 T{
-\f[V]clearWord()\f[R]
+\f[CR]backspace()\f[R]
 T}@T{
-Delete word before cursor
+Delete character before cursor.
 T}@T{
 T}
 T{
-\f[V]killWord()\f[R]
+\f[CR]delete()\f[R]
 T}@T{
-Delete word after cursor
+Delete character after cursor.
 T}@T{
 T}
 T{
-\f[V]backward()\f[R]
+\f[CR]clear()\f[R]
 T}@T{
-Move cursor back by one character
+Clear text before cursor.
 T}@T{
 T}
 T{
-\f[V]forward()\f[R]
+\f[CR]kill()\f[R]
 T}@T{
-Move cursor forward by one character
+Clear text after cursor.
 T}@T{
 T}
 T{
-\f[V]prevWord()\f[R]
+\f[CR]clearWord()\f[R]
 T}@T{
-Move cursor to the previous word by one character
+Delete word before cursor.
 T}@T{
 T}
 T{
-\f[V]nextWord()\f[R]
+\f[CR]killWord()\f[R]
 T}@T{
-Move cursor to the previous word by one character
+Delete word after cursor.
 T}@T{
 T}
 T{
-\f[V]begin()\f[R]
+\f[CR]backward()\f[R], \f[CR]forward()\f[R]
 T}@T{
-Move cursor to the previous word by one character
+Move cursor backward/forward by one character.
 T}@T{
 T}
 T{
-\f[V]end()\f[R]
+\f[CR]nextWord()\f[R], \f[CR]prevWord()\f[R]
 T}@T{
-Move cursor to the previous word by one character
+Move cursor to the next/previous word by one character.
 T}@T{
 T}
 T{
-\f[V]escape()\f[R]
+\f[CR]begin()\f[R], \f[CR]end()\f[R]
 T}@T{
-Ignore keybindings for next character
+Move cursor to the beginning/end of the line.
 T}@T{
 T}
 T{
-\f[V]prevHist()\f[R]
+\f[CR]escape()\f[R]
 T}@T{
-Jump to the previous history entry
+Ignore keybindings for next character.
 T}@T{
 T}
 T{
-\f[V]nextHist()\f[R]
+\f[CR]nextHist()\f[R], \f[CR]prevHist()\f[R]
 T}@T{
-Jump to the next history entry
+Jump to the previous/next history entry.
 T}@T{
 T}
 .TE
diff --git a/doc/cha-config.5 b/doc/cha-config.5
index cc8a33de..450087bc 100644
--- a/doc/cha-config.5
+++ b/doc/cha-config.5
@@ -1,5 +1,5 @@
 '\" t
-.\" Automatically generated by Pandoc 3.1.12.3
+.\" Automatically generated by Pandoc 3.1.13
 .\"
 .TH "cha\-config" "5" "" "" "Configuration of Chawan"
 .SH Configuration of Chawan
@@ -1282,103 +1282,61 @@ _
 T{
 \f[CR]cmd.line.submit\f[R]
 T}@T{
-Submit line
+Submit the line.
 T}@T{
 T}
 T{
 \f[CR]cmd.line.cancel\f[R]
 T}@T{
-Cancel operation
+Cancel the current operation.
 T}@T{
 T}
 T{
-\f[CR]cmd.line.backspace\f[R]
+\f[CR]cmd.line.backspace\f[R], \f[CR]cmd.line.delete\f[R]
 T}@T{
-Delete character before cursor
+Delete character before (backspace)/after (delete) the cursor.
 T}@T{
 T}
 T{
-\f[CR]cmd.line.delete\f[R]
+\f[CR]cmd.line.clear\f[R], \f[CR]cmd.line.kill\f[R]
 T}@T{
-Delete character after cursor
+Delete text before (clear)/after (kill) the cursor.
 T}@T{
 T}
 T{
-\f[CR]cmd.line.clear\f[R]
+\f[CR]cmd.line.clearWord\f[R], \f[CR]cmd.line.killWord\f[R]
 T}@T{
-Clear text before cursor
+Delete word before (clear)/after (kill) the cursor.
 T}@T{
 T}
 T{
-\f[CR]cmd.line.kill\f[R]
+\f[CR]cmd.line.backward\f[R], \f[CR]cmd.line.forward\f[R]
 T}@T{
-Clear text after cursor
+Move cursor backward/forward by one character.
 T}@T{
 T}
 T{
-\f[CR]cmd.line.clearWord\f[R]
+\f[CR]cmd.line.prevWord\f[R], \f[CR]cmd.line.nextWord\f[R]
 T}@T{
-Delete word before cursor
+Move cursor to the previous/next word by one character
 T}@T{
 T}
 T{
-\f[CR]cmd.line.killWord\f[R]
+\f[CR]cmd.line.begin\f[R], \f[CR]cmd.line.end\f[R]
 T}@T{
-Delete word after cursor
-T}@T{
-T}
-T{
-\f[CR]cmd.line.backward\f[R]
-T}@T{
-Move cursor back by one character
-T}@T{
-T}
-T{
-\f[CR]cmd.line.forward\f[R]
-T}@T{
-Move cursor forward by one character
-T}@T{
-T}
-T{
-\f[CR]cmd.line.prevWord\f[R]
-T}@T{
-Move cursor to the previous word by one character
-T}@T{
-T}
-T{
-\f[CR]cmd.line.nextWord\f[R]
-T}@T{
-Move cursor to the previous word by one character
-T}@T{
-T}
-T{
-\f[CR]cmd.line.begin\f[R]
-T}@T{
-Move cursor to the previous word by one character
-T}@T{
-T}
-T{
-\f[CR]cmd.line.end\f[R]
-T}@T{
-Move cursor to the previous word by one character
+Move cursor to the beginning/end of the line.
 T}@T{
 T}
 T{
 \f[CR]cmd.line.escape\f[R]
 T}@T{
-Ignore keybindings for next character
-T}@T{
-T}
-T{
-\f[CR]cmd.line.prevHist\f[R]
-T}@T{
-Jump to the previous history entry
+Ignore keybindings for next character.
 T}@T{
 T}
 T{
-\f[CR]cmd.line.nextHist\f[R]
+\f[CR]cmd.line.prevHist\f[R], \f[CR]cmd.line.nextHist\f[R]
 T}@T{
-Jump to the next history entry
+Jump to the previous/next history entry
 T}@T{
 T}
 .TE
diff --git a/doc/config.md b/doc/config.md
index f1968504..0a60d260 100644
--- a/doc/config.md
+++ b/doc/config.md
@@ -1085,87 +1085,52 @@ position.</td>
 
 <tr>
 <td>`cmd.line.submit`</td>
-<td>Submit line</td>
+<td>Submit the line.</td>
 </tr>
 
 <tr>
 <td>`cmd.line.cancel`</td>
-<td>Cancel operation</td>
+<td>Cancel the current operation.</td>
 </tr>
 
 <tr>
-<td>`cmd.line.backspace`</td>
-<td>Delete character before cursor</td>
+<td>`cmd.line.backspace`, `cmd.line.delete`</td>
+<td>Delete character before (backspace)/after (delete) the cursor.</td>
 </tr>
 
 <tr>
-<td>`cmd.line.delete`</td>
-<td>Delete character after cursor</td>
+<td>`cmd.line.clear`, `cmd.line.kill`</td>
+<td>Delete text before (clear)/after (kill) the cursor.</td>
 </tr>
 
 <tr>
-<td>`cmd.line.clear`</td>
-<td>Clear text before cursor</td>
+<td>`cmd.line.clearWord`, `cmd.line.killWord`</td>
+<td>Delete word before (clear)/after (kill) the cursor.</td>
 </tr>
 
 <tr>
-<td>`cmd.line.kill`</td>
-<td>Clear text after cursor</td>
+<td>`cmd.line.backward`, `cmd.line.forward`</td>
+<td>Move cursor backward/forward by one character.</td>
 </tr>
 
 <tr>
-<td>`cmd.line.clearWord`</td>
-<td>Delete word before cursor</td>
+<td>`cmd.line.prevWord`, `cmd.line.nextWord`</td>
+<td>Move cursor to the previous/next word by one character</td>
 </tr>
 
 <tr>
-<td>`cmd.line.killWord`</td>
-<td>Delete word after cursor</td>
-</tr>
-
-<tr>
-<td>`cmd.line.backward`</td>
-<td>Move cursor back by one character</td>
-</tr>
-
-<tr>
-<td>`cmd.line.forward`</td>
-<td>Move cursor forward by one character</td>
-</tr>
-
-<tr>
-<td>`cmd.line.prevWord`</td>
-<td>Move cursor to the previous word by one character</td>
-</tr>
-
-<tr>
-<td>`cmd.line.nextWord`</td>
-<td>Move cursor to the previous word by one character</td>
-</tr>
-
-<tr>
-<td>`cmd.line.begin`</td>
-<td>Move cursor to the previous word by one character</td>
-</tr>
-
-<tr>
-<td>`cmd.line.end`</td>
-<td>Move cursor to the previous word by one character</td>
+<td>`cmd.line.begin`, `cmd.line.end`</td>
+<td>Move cursor to the beginning/end of the line.</td>
 </tr>
 
 <tr>
 <td>`cmd.line.escape`</td>
-<td>Ignore keybindings for next character</td>
-</tr>
-
-<tr>
-<td>`cmd.line.prevHist`</td>
-<td>Jump to the previous history entry</td>
+<td>Ignore keybindings for next character.</td>
 </tr>
 
 <tr>
-<td>`cmd.line.nextHist`</td>
-<td>Jump to the next history entry</td>
+<td>`cmd.line.prevHist`, `cmd.line.nextHist`</td>
+<td>Jump to the previous/next history entry</td>
 </tr>
 
 </table>