about summary refs log tree commit diff stats
path: root/doc/cha-config.5
diff options
context:
space:
mode:
Diffstat (limited to 'doc/cha-config.5')
-rw-r--r--doc/cha-config.51514
1 files changed, 1514 insertions, 0 deletions
diff --git a/doc/cha-config.5 b/doc/cha-config.5
new file mode 100644
index 00000000..c5b71eba
--- /dev/null
+++ b/doc/cha-config.5
@@ -0,0 +1,1514 @@
+'\" t
+.\" Automatically generated by Pandoc 2.17.1.1
+.\"
+.\" 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-config" "5" "" "" "Configuration of Chawan"
+.hy
+.SH Configuration of Chawan
+.PP
+Chawan supports configuration of various options like keybindings, user
+stylesheets, site preferences, etc.
+The configuration format is very similar to toml, with the following
+exceptions:
+.IP \[bu] 2
+Inline tables may span across multiple lines.
+.IP \[bu] 2
+Table arrays can be cleared by setting a variable by the same to the
+empty array.
+This allows users to disable default table array rules.
+.PP
+Example:
+.IP
+.nf
+\f[C]
+omnirule = [] # note: this must be placed at the beginning of the file.
+
+[[omnirule]] # this is legal. all default omni-rules are now disabled.
+\f[R]
+.fi
+.PP
+Chawan will look for a config file in the $XDG_CONFIG_HOME/chawan/
+directory called \f[V]config.toml\f[R].
+(Chawan defaults to \[ti]/.config if the XDG_CONFIG_HOME environment
+variable is not set.)
+See the default configuration file in the res/ folder, and bonus
+configuration files in the bonus/ folder for further examples.
+.SS Start
+.PP
+Start-up options are to be placed in the \f[V][start]\f[R] section.
+.PP
+Following is a list of start-up options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+visual-home
+T}@T{
+url
+T}@T{
+Page opened when Chawan is called with the -V option (and no other pages
+are passed as arguments.)
+T}@T{
+T}
+T{
+startup-script
+T}@T{
+JavaScript code
+T}@T{
+Script Chawan runs on start-up.
+Pages will not be loaded until this function exits.
+(Note however that asynchronous functions like setTimeout do not block
+loading.)
+T}@T{
+T}
+T{
+headless
+T}@T{
+boolean
+T}@T{
+Whether Chawan should always start in headless mode.
+Automatically enabled when Chawan is called with -r.
+T}@T{
+T}
+T{
+console-buffer
+T}@T{
+boolean
+T}@T{
+Whether Chawan should open a console buffer in non-headless mode.
+Defaults to true.
+Warning: this is only useful for debugging.
+Disabling this option without manually redirecting standard error will
+result in error messages randomly appearing on your screen.
+T}@T{
+T}
+.TE
+.SS Search
+.PP
+Search options are to be placed in the \f[V][search]\f[R] section.
+.PP
+Following is a list of search options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+wrap
+T}@T{
+boolean
+T}@T{
+When set to true, searchNext/searchPrev wraps around the document.
+T}@T{
+T}
+T{
+ignore-case
+T}@T{
+boolean
+T}@T{
+When set to true, document-wide searches are case-insensitive by
+default.
+Note: this can also be overridden inline in the search bar (vim-style),
+with the escape sequences \f[V]c\f[R] (ignore case) and \f[V]C\f[R]
+(strict case).
+See search mode for details.)
+T}@T{
+T}
+.TE
+.SS Encoding
+.PP
+Encoding options are to be placed in the \f[V][encoding]\f[R] section.
+.PP
+Following is a list of encoding options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+document-charset
+T}@T{
+array of charset label strings
+T}@T{
+List of character sets for loading documents.
+All listed character sets are enumerated until the document has been
+decoded without errors.
+In HTML, meta tags and the BOM may override this with a different
+charset, so long as the specified charset can decode the document
+correctly.
+T}@T{
+T}
+T{
+display-charset
+T}@T{
+string
+T}@T{
+Character set for keyboard input and displaying documents.
+Used in dump mode as well.
+(This means that e.g.\ \f[V]cha -I EUC-JP -O UTF-8 a > b\f[R] is
+equivalent to \f[V]iconv -f EUC-JP -t UTF-8\f[R].)
+T}@T{
+T}
+.TE
+.SS External
+.PP
+External options are to be placed in the \f[V][external]\f[R] section.
+.PP
+Following is a list of external options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+tmpdir
+T}@T{
+path
+T}@T{
+Directory used to save temporary files.
+T}@T{
+T}
+T{
+editor
+T}@T{
+shell command
+T}@T{
+External editor command.
+%s is substituted for the file name, %d for the line number.
+T}@T{
+T}
+T{
+mailcap
+T}@T{
+array of paths
+T}@T{
+Search path for mailcap files.
+(See \f[B]cha-mailcap\f[R](5) for details.)
+T}@T{
+T}
+T{
+mime-types
+T}@T{
+array of paths
+T}@T{
+Search path for mime.types files.
+(See \f[B]cha-mime.types\f[R](5) for details.)
+T}@T{
+T}
+T{
+cgi-dir
+T}@T{
+array of paths
+T}@T{
+Search path for local CGI scripts.
+(See \f[B]cha-localcgi\f[R](5) for details.)
+T}@T{
+T}
+T{
+urimethodmap
+T}@T{
+array of paths
+T}@T{
+Search path for urimethodmap files.
+(See \f[B]cha-urimethodmap\f[R](5) for details.)
+T}@T{
+T}
+T{
+w3m-cgi-compat
+T}@T{
+boolean
+T}@T{
+Enable local CGI compatibility with w3m.
+In short, it redirects \f[V]file:///cgi-bin/*\f[R] and
+\f[V]file:///$LIB/cgi-bin/*\f[R] to \f[V]cgi-bin:*\f[R].
+For further details, see \f[B]cha-localcgi\f[R](5).
+T}@T{
+T}
+T{
+download-dir
+T}@T{
+string
+T}@T{
+Path to pre-fill for \[lq]Save to:\[rq] prompts.
+This is not validated, you can set it to whatever you find useful.
+T}@T{
+T}
+.TE
+.SS Input
+.PP
+Input options are to be placed in the \f[V][input]\f[R] section.
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+vi-numeric-prefix
+T}@T{
+boolean
+T}@T{
+Whether vi-style numeric prefixes to commands should be accepted.
+When set to true, commands that return a function will be called with
+the numeric prefix as their first argument.
+Note: this only applies for keybindings defined in [page].
+T}@T{
+T}
+T{
+use-mouse
+T}@T{
+boolean
+T}@T{
+Whether Chawan is allowed to use the mouse.
+Currently, the default behavior imitates that of w3m.
+T}@T{
+T}
+.TE
+.PP
+Examples:
+.IP
+.nf
+\f[C]
+[input]
+vi-numeric-prefix = true
+
+[page]
+# Here, the arrow function will be called with the vi numbered prefix if
+# one was input, and with no argument otherwise.
+# The numeric prefix can never be zero, so it is safe to test for undefined
+# using the ternary operator.
+G = \[aq]n => n ? pager.gotoLine(n) : pager.cursorLastLine()\[aq]
+\f[R]
+.fi
+.SS Network
+.PP
+Network options are to be placed in the \f[V][network]\f[R] section.
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+max-redirect
+T}@T{
+number
+T}@T{
+Maximum number of redirections to follow.
+T}@T{
+T}
+T{
+prepend-scheme
+T}@T{
+string
+T}@T{
+Prepend this to URLs passed to Chawan without a scheme.
+Note that local files (\f[V]file:\f[R] scheme) will always be checked
+first; only if this fails, Chawan will retry the request with
+\f[V]prepend-scheme\f[R] set as the scheme.
+By default, this is set to \[lq]https://\[rq].
+Note that the \[lq]://\[rq] part is mandatory.
+T}@T{
+T}
+T{
+prepend-https
+T}@T{
+boolean
+T}@T{
+Deprecated: use prepend-scheme instead.
+When set to false, Chawan will act as if prepend-scheme were set to
+\[lq]\[lq].
+T}@T{
+T}
+T{
+proxy
+T}@T{
+URL
+T}@T{
+Specify a proxy for all network requests Chawan makes.
+All proxies supported by cURL may be used.
+Can be overridden by siteconf.
+T}@T{
+T}
+T{
+default-headers
+T}@T{
+Table
+T}@T{
+Specify a list of default headers for all HTTP(S) network requests.
+Can be overridden by siteconf.
+T}@T{
+T}
+.TE
+.SS Display
+.PP
+Display options are to be placed in the \f[V][display]\f[R] section.
+.PP
+Following is a list of display options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+color-mode
+T}@T{
+\[lq]monochrome\[rq] / \[lq]ansi\[rq] / \[lq]eight-bit\[rq] /
+\[lq]true-color\[rq] / \[lq]auto\[rq]
+T}@T{
+Set the color mode.
+\[lq]auto\[rq] for automatic detection, \[lq]monochrome\[rq] for black
+on white, \[lq]ansi\[rq] for ansi colors, \[lq]eight-bit\[rq] for
+256-color mode, and \[lq]true-color\[rq] for true colors.
+\[lq]8bit\[rq] is accepted as a legacy alias of \[lq]eight-bit\[rq].
+\[lq]24bit\[rq] is accepted as a legacy alias of \[lq]true-color\[rq].
+T}@T{
+T}
+T{
+format-mode
+T}@T{
+\[lq]auto\[rq] / [\[lq]bold\[rq], \[lq]italic\[rq], \[lq]underline\[rq],
+\[lq]reverse\[rq], \[lq]strike\[rq], \[lq]overline\[rq],
+\[lq]blink\[rq]]
+T}@T{
+Specifies output formatting modes.
+Accepts the string \[lq]auto\[rq] or an array of specific attributes.
+An empty array (\f[V][]\f[R]) disables formatting completely.
+T}@T{
+T}
+T{
+no-format-mode
+T}@T{
+[\[lq]bold\[rq], \[lq]italic\[rq], \[lq]underline\[rq],
+\[lq]reverse\[rq], \[lq]strike\[rq], \[lq]overline\[rq],
+\[lq]blink\[rq]]
+T}@T{
+Disable specified formatting modes.
+T}@T{
+T}
+T{
+emulate-overline
+T}@T{
+boolean
+T}@T{
+When set to true and the overline formatting attribute is not enabled,
+overlines are substituted by underlines on the previous line.
+T}@T{
+T}
+T{
+alt-screen
+T}@T{
+\[lq]auto\[rq] / boolean
+T}@T{
+Enable/disable the alternative screen.
+T}@T{
+T}
+T{
+highlight-color
+T}@T{
+color
+T}@T{
+Set the highlight color.
+Both hex values and CSS color names are accepted.
+T}@T{
+T}
+T{
+highlight-marks
+T}@T{
+boolean
+T}@T{
+Enable/disable highlighting of marks.
+T}@T{
+T}
+T{
+double-width-ambiguous
+T}@T{
+boolean
+T}@T{
+Assume the terminal displays characters in the East Asian Ambiguous
+category as double-width characters.
+Useful when e.g.\ \[ci] occupies two cells.
+T}@T{
+T}
+T{
+minimum-contrast
+T}@T{
+number
+T}@T{
+Specify the minimum difference between the luminance (Y) of the
+background and the foreground.
+-1 disables this function (i.e.\ allows black letters on black
+background, etc).
+T}@T{
+T}
+T{
+force-clear
+T}@T{
+boolean
+T}@T{
+Force the screen to be completely cleared every time it is redrawn.
+T}@T{
+T}
+T{
+set-title
+T}@T{
+boolean
+T}@T{
+Set the terminal emulator\[cq]s window title to that of the current
+page.
+T}@T{
+T}
+T{
+default-background-color
+T}@T{
+\[lq]auto\[rq] / color
+T}@T{
+Overrides the assumed background color of the terminal.
+\[lq]auto\[rq] leaves background color detection to Chawan.
+T}@T{
+T}
+T{
+default-foreground-color
+T}@T{
+\[lq]auto\[rq] / color
+T}@T{
+Sets the assumed foreground color of the terminal.
+\[lq]auto\[rq] leaves foreground color detection to Chawan.
+T}@T{
+T}
+T{
+query-da1
+T}@T{
+bool
+T}@T{
+Enable/disable querying Primary Device Attributes, and with it, all
+\[lq]dynamic\[rq] terminal querying.
+It is highly recommended not to alter the default value (which is true),
+or the output will most likely look horrible.
+(Except, obviously, if your terminal does not support Primary Device
+Attributes.)
+T}@T{
+T}
+T{
+columns, lines, pixels-per-column, pixels-per-line
+T}@T{
+number
+T}@T{
+Fallback values for the number of columns, lines, pixels per column, and
+pixels per line for the cases where it cannot be determined
+automatically.
+(For example, these values are used in dump mode.)
+T}@T{
+T}
+T{
+force-columns, force-lines, force-pixels-per-column,
+force-pixels-per-line
+T}@T{
+boolean
+T}@T{
+Force-set columns, lines, pixels per column, or pixels per line to the
+fallback values provided above.
+T}@T{
+T}
+.TE
+.SS Omnirule
+.PP
+The omni-bar (by default opened with C-l) can be used to perform
+searches using omni-rules.
+These are to be placed in the table array \f[V][[omnirule]]\f[R].
+.PP
+Examples:
+.IP
+.nf
+\f[C]
+# Search using DuckDuckGo Lite. (Bound to C-k by default.)
+[[omnirule]]
+match = \[aq]\[ha]ddg:\[aq]
+substitute-url = \[aq](x) => \[dq]https://lite.duckduckgo.com/lite/?kp=-1&kd=-1&q=\[dq] + encodeURIComponent(x.split(\[dq]:\[dq]).slice(1).join(\[dq]:\[dq]))\[aq]
+
+# Search using Wikipedia, Firefox-style.
+[[omnirule]]
+match = \[aq]\[ha]\[at]wikipedia\[aq]
+substitute-url = \[aq](x) => \[dq]https://en.wikipedia.org/wiki/Special:Search?search=\[dq] + encodeURIComponent(x.replace(/\[at]wikipedia/, \[dq]\[dq]))\[aq]
+\f[R]
+.fi
+.PP
+Omnirule options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+match
+T}@T{
+regex
+T}@T{
+Regular expression used to match the input string.
+Note that websites passed as arguments are matched as well.
+Note: regexes are handled according to the match mode regex handling
+rules.
+T}@T{
+T}
+T{
+substitute-url
+T}@T{
+JavaScript function
+T}@T{
+A JavaScript function Chawan will pass the input string to.
+If a new string is returned, it will be parsed instead of the old one.
+T}@T{
+T}
+.TE
+.SS Siteconf
+.PP
+Configuration options can be specified for individual sites.
+Entries are to be placed in the table array \f[V][[siteconf]]\f[R].
+.PP
+Examples:
+.IP
+.nf
+\f[C]
+# Enable cookies on the orange website for log-in.
+[[siteconf]]
+url = \[aq]https://news.ycombinator.com/.*\[aq]
+cookie = true
+
+# Redirect npr.org to text.npr.org.
+[[siteconf]]
+host = \[aq](www.)?npr.org\[aq]
+rewrite-url = \[aq]\[aq]\[aq]
+(x) => {
+x.host = \[dq]text.npr.org\[dq];
+const s = x.pathname.split(\[aq]/\[aq]);
+x.pathname = s.at(s.length > 2 ? -2 : 1);
+/* No need to return; URL objects are passed by reference. */
+}
+\[aq]\[aq]\[aq]
+
+# Allow cookie sharing on *sr.ht domains.
+[[siteconf]]
+host = \[aq](.*.)?sr.ht\[aq] # either \[aq]something.sr.ht\[aq] or \[aq]sr.ht\[aq]
+cookie = true # enable cookies
+share-cookie-jar = \[aq]sr.ht\[aq] # use the cookie jar of \[aq]sr.ht\[aq] for all matched hosts
+third-party-cookie = \[aq].*.sr.ht\[aq] # allow cookies from subdomains
+\f[R]
+.fi
+.PP
+Siteconf options:
+.PP
+.TS
+tab(@);
+lw(15.6n) lw(19.4n) lw(31.1n) lw(3.9n).
+T{
+Name
+T}@T{
+Value
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+url
+T}@T{
+regex
+T}@T{
+Regular expression used to match the URL.
+Either this or the \f[V]host\f[R] option must be specified.
+Note: regexes are handled according to the match mode regex handling
+rules.
+T}@T{
+T}
+T{
+host
+T}@T{
+regex
+T}@T{
+Regular expression used to match the host part of the URL (i.e.\ domain
+name/ip address.)
+Either this or the \f[V]url\f[R] option must be specified.
+Note: regexes are handled according to the match mode regex handling
+rules.
+T}@T{
+T}
+T{
+rewrite-url
+T}@T{
+JavaScript function
+T}@T{
+A JavaScript function Chawan will pass the URL to.
+If a new URL is returned, it will replace the old one.
+T}@T{
+T}
+T{
+cookie
+T}@T{
+boolean
+T}@T{
+Whether loading cookies should be allowed for this URL.
+By default, this is false for all websites.
+T}@T{
+T}
+T{
+third-party-cookie
+T}@T{
+array of regexes
+T}@T{
+Domains for which third-party cookies are allowed on this domain.
+Note: this only works for buffers which share the same cookie jar.
+Note: regexes are handled according to the match mode regex handling
+rules.
+T}@T{
+T}
+T{
+share-cookie-jar
+T}@T{
+host
+T}@T{
+Cookie jar to use for this domain.
+Useful for e.g.\ sharing cookies with subdomains.
+T}@T{
+T}
+T{
+referer-from
+T}@T{
+boolean
+T}@T{
+Whether or not we should send a Referer header when opening requests
+originating from this domain.
+Simplified example: if you click a link on a.com that refers to b.com,
+and referer-from is true, b.com is sent \[lq]a.com\[rq] as the Referer
+header.
+Defaults to false.
+T}@T{
+T}
+T{
+scripting
+T}@T{
+boolean
+T}@T{
+Enable/disable JavaScript execution on this site.
+T}@T{
+T}
+T{
+document-charset
+T}@T{
+boolean
+T}@T{
+Specify the default encoding for this site.
+Overrides document-charset in encoding.
+T}@T{
+T}
+T{
+stylesheet
+T}@T{
+CSS stylesheet
+T}@T{
+Specify an additional user-stylesheet for this site.
+Note: other user-stylesheets (specified under [css] or additional
+matching siteconfs) are not overridden.
+(In other words, they will be concatenated with this stylesheet to get
+the final user stylesheet.)
+T}@T{
+T}
+T{
+proxy
+T}@T{
+URL
+T}@T{
+Specify a proxy for network requests fetching contents of this buffer.
+T}@T{
+T}
+T{
+default-headers
+T}@T{
+Table
+T}@T{
+Specify a list of default headers for HTTP(S) network requests to this
+buffer.
+T}@T{
+T}
+.TE
+.SS Stylesheets
+.PP
+User stylesheets are to be placed in the \f[V][css]\f[R] section.
+.PP
+There are two ways to import user stylesheets:
+.IP "1." 3
+Include a user stylesheet using the format
+\f[V]include = \[aq]path-to-user.css\[aq]\f[R].
+To include multiple stylesheets, use
+\f[V]include = [\[aq]first-stylesheet.css, second-stylesheet.css\[aq]]\f[R].
+Relative paths are interpreted relative to the config directory.
+.IP "2." 3
+Place your stylesheet directly in your configuration file using
+\f[V]inline = \[dq]\[dq]\[dq]your-style\[dq]\[dq]\[dq]\f[R].
+.SS Keybindings
+.PP
+Keybindings are to be placed in these sections:
+.IP \[bu] 2
+for pager interaction: \f[V][page]\f[R]
+.IP \[bu] 2
+for line editing: \f[V][line]\f[R]
+.PP
+Keybindings are configured using the syntax
+.PP
+`' = `'
+.PP
+Where \f[V]<keybinding>\f[R] is a combination of unicode characters with
+or without modifiers.
+Modifiers are the prefixes \f[V]C-\f[R] and \f[V]M-\f[R], which add
+control or escape to the keybinding respectively (essentially making
+\f[V]M-\f[R] the same as \f[V]C-[\f[R]).
+Modifiers can be escaped with the \[ga]\[ga] sign.
+.PP
+\f[V]<action>\f[R] is either a command defined in the \f[V][cmd]\f[R]
+section, or a JavaScript expression.
+Here we only describe the pre-defined actions in the default config; for
+a description of the API, please see:
+.PP
+The API documentation at \f[B]cha-api\f[R](5).
+.PP
+Examples:
+.IP
+.nf
+\f[C]
+# show change URL when Control, Escape and j are pressed
+\[aq]C-M-j\[aq] = \[aq]cmd.pager.load\[aq]
+# go to the first line of the page when g is pressed twice without a preceding
+# number, or to the line when a preceding number is given.
+\[aq]gg\[aq] = \[aq]cmd.pager.gotoLineOrStart\[aq]
+\f[R]
+.fi
+.SS Browser actions
+.PP
+.TS
+tab(@);
+lw(21.5n) lw(43.1n) lw(5.4n).
+T{
+Name
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+\f[V]cmd.pager.quit\f[R]
+T}@T{
+Exit the browser.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.suspend\f[R]
+T}@T{
+Temporarily suspend the browser Note: this also suspends e.g.\ buffer
+processes or CGI scripts.
+So if you are downloading something, that will be delayed until you
+restart the process.
+T}@T{
+T}
+.TE
+.SS Pager actions
+.PP
+Note: \f[V]n\f[R] in the following text refers to a number preceding the
+action.
+e.g.
+in \f[V]10gg\f[R], n = 10.
+If no preceding number is input, then it is left unspecified.
+.PP
+.TS
+tab(@);
+lw(21.5n) lw(43.1n) lw(5.4n).
+T{
+Name
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+\f[V]cmd.pager.cursorUp\f[R]
+T}@T{
+Move the cursor upwards by n lines, or if n is unspecified, by 1.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorDown\f[R]
+T}@T{
+Move the cursor downwards by n lines, or if n is unspecified, by 1.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorLeft\f[R]
+T}@T{
+Move the cursor to the left by n cells, or if n is unspecified, by 1.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorRight\f[R]
+T}@T{
+Move the cursor to the right by n cells, or if n is unspecified, by 1.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorLineBegin\f[R]
+T}@T{
+Move the cursor to the first cell of the line.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorLineTextStart\f[R]
+T}@T{
+Move the cursor to the first non-blank character of the line.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorLineEnd\f[R]
+T}@T{
+Move the cursor to the last cell of the line.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorNextWord\f[R],
+\f[V]cmd.pager.cursorNextViWord\f[R],
+\f[V]cmd.pager.cursorNextBigWord\f[R]
+T}@T{
+Move the cursor to the beginning of the next word.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorPrevWord\f[R],
+\f[V]cmd.pager.cursorPrevViWord\f[R],
+\f[V]cmd.pager.cursorPrevBigWord\f[R]
+T}@T{
+Move the cursor to the end of the previous word.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorWordEnd\f[R], \f[V]cmd.pager.cursorViWordEnd\f[R],
+\f[V]cmd.pager.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]cmd.pager.cursorWordBegin\f[R],
+\f[V]cmd.pager.cursorViWordBegin\f[R],
+\f[V]cmd.pager.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]cmd.pager.cursorPrevLink\f[R]
+T}@T{
+Move the cursor to the beginning of the previous clickable element.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorNextLink\f[R]
+T}@T{
+Move the cursor to the beginning of the next clickable element.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorPrevParagraph\f[R]
+T}@T{
+Move the cursor to the beginning of the nth next paragraph.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorNextParagraph\f[R]
+T}@T{
+Move the cursor to the end of the nth previous paragraph.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorRevNthLink\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]cmd.pager.cursorNthLink\f[R]
+T}@T{
+Move the cursor to the nth link of the document.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.pageUp\f[R], \f[V]cmd.pager.pageDown\f[R],
+\f[V]cmd.pager.pageLeft\f[R], \f[V]cmd.pager.pageRight\f[R]
+T}@T{
+Scroll up/down/left/right by n pages, or if n is unspecified, by one
+page.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.halfPageUp\f[R], \f[V]cmd.pager.halfPageDown\f[R],
+\f[V]cmd.pager.halfPageLeft\f[R], \f[V]pager.halfPageUp\f[R]
+T}@T{
+Scroll up/down/left/right by n half pages, or if n is unspecified, by
+one page.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.scrollUp\f[R], \f[V]cmd.pager.scrollDown\f[R],
+\f[V]cmd.pager.scrollLeft\f[R], \f[V]cmd.pager.scrollRight\f[R]
+T}@T{
+Scroll up/down/left/right by n lines, or if n is unspecified, by one
+line.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.click\f[R]
+T}@T{
+Click the HTML element currently under the cursor.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.load\f[R]
+T}@T{
+Open the current address in the URL bar.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.webSearch\f[R]
+T}@T{
+Open the URL bar with an arbitrary search engine.
+At the moment, this is DuckDuckGo Lite.
+(Note: Chawan developers aren\[cq]t affiliated with DuckDuckGo the
+company or their product in any way.)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.dupeBuffer\f[R]
+T}@T{
+Duplicate the current buffer by loading its source to a new buffer.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.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.
+If the current buffer is a root buffer (i.e.\ it has no parent), move to
+the next sibling buffer instead.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.discardTree\f[R]
+T}@T{
+Discard all child buffers of the current buffer.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.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]cmd.pager.reshape\f[R]
+T}@T{
+Reshape the current buffer (=render the current page anew.)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.redraw\f[R]
+T}@T{
+Redraw screen contents.
+Useful if something messed up the display.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.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]cmd.pager.cursorFirstLine\f[R], \f[V]cmd.pager.cursorLastLine\f[R]
+T}@T{
+Move to the beginning/end in the buffer.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorTop\f[R]
+T}@T{
+Move to the first line on the screen.
+(Equivalent to H in vi.)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.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]cmd.pager.cursorBottom\f[R]
+T}@T{
+Move to the last line on the screen.
+(Equivalent to L in vi.)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.raisePage\f[R], \f[V]cmd.pager.raisePageBegin\f[R],
+\f[V]cmd.pager.centerLine\f[R], \f[V]cmd.pager.centerLineBegin\f[R],
+\f[V]cmd.pager.lowerPage\f[R], \f[V]cmd.pager.lowerPageBegin\f[R]
+T}@T{
+If n is specified, move cursor to line n.\ Then, * \f[V]raisePage\f[R]
+scrolls down so that the cursor is on the top line of the screen.
+(vi \f[V]z<CR>\f[R], vim \f[V]zt\f[R].)
+* \f[V]centerLine\f[R] shifts the screen so that the cursor is in the
+middle of the screen.
+(vi \f[V]z.\f[R], vim \f[V]zz\f[R].)
+* \f[V]lowerPage\f[R] scrolls up so that the cursor is on the bottom
+line of the screen.
+(vi \f[V]z-\f[R], vim \f[V]zb\f[R].)
+The -\f[V]Begin\f[R] variants also move the cursor to the line\[cq]s
+first non-blank character, as the variants originating from vi do.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.nextPageBegin\f[R]
+T}@T{
+If n is specified, 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.)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.previousPageBegin\f[R]
+T}@T{
+If n is specified, 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.)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.cursorLeftEdge\f[R],
+\f[V]cmd.pager.cursorMiddleColumn\f[R],
+\f[V]cmd.pager.cursorRightEdge\f[R]
+T}@T{
+Move to the first/middle/last column on the screen.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.centerColumn\f[R]
+T}@T{
+Center screen around the current column.
+(w3m \f[V]Z\f[R].)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.lineInfo\f[R]
+T}@T{
+Display information about the current line on the status line.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.searchForward\f[R], \f[V]cmd.pager.searchBackward\f[R]
+T}@T{
+Search for a string in the current buffer, forwards or backwards.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.isearchForward\f[R], \f[V]cmd.pager.searchBackward\f[R]
+T}@T{
+Incremental-search for a string, highlighting the first result, forwards
+or backwards.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.gotoLineOrStart\f[R], \f[V]cmd.pager.gotoLineOrEnd\f[R]
+T}@T{
+If n is specified, jump to line n.\ Otherwise, jump to the start/end of
+the page.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.searchNext\f[R], \f[V]cmd.pager.searchPrev\f[R]
+T}@T{
+Jump to the nth (or if unspecified, first) next/previous search result.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.peek\f[R]
+T}@T{
+Display a message of the current buffer\[cq]s URL on the status line.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.peekCursor\f[R]
+T}@T{
+Display a message of the URL or title under the cursor on the status
+line.
+Multiple calls allow cycling through the two.
+(i.e.\ by default, press u once -> title, press again -> URL)
+T}@T{
+T}
+T{
+\f[V]cmd.pager.setMark\f[R]
+T}@T{
+Wait for a character \f[V]x\f[R] and then set a mark with the ID
+\f[V]x\f[R].
+T}@T{
+T}
+T{
+\f[V]cmd.pager.gotoMark\f[R], \f[V]cmd.pager.gotoMarkY\f[R]
+T}@T{
+Wait for a character \f[V]x\f[R] and then jump to the mark with the ID
+\f[V]x\f[R] (if it exists on the page).
+\f[V]gotoMark\f[R] sets both the X and Y positions; gotoMarkY only sets
+the Y position.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.markURL\f[R]
+T}@T{
+Convert URL-like strings to anchors on the current page.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.saveLink\f[R]
+T}@T{
+Save resource from the URL pointed to by the cursor to the disk.
+T}@T{
+T}
+T{
+\f[V]cmd.pager.saveSource\f[R]
+T}@T{
+Save the source of the current buffer to the disk.
+T}@T{
+T}
+.TE
+.SS Line-editing actions
+.PP
+.TS
+tab(@);
+lw(21.5n) lw(43.1n) lw(5.4n).
+T{
+Name
+T}@T{
+Function
+T}@T{
+T}
+_
+T{
+\f[V]cmd.line.submit\f[R]
+T}@T{
+Submit line
+T}@T{
+T}
+T{
+\f[V]cmd.line.cancel\f[R]
+T}@T{
+Cancel operation
+T}@T{
+T}
+T{
+\f[V]cmd.line.backspace\f[R]
+T}@T{
+Delete character before cursor
+T}@T{
+T}
+T{
+\f[V]cmd.line.delete\f[R]
+T}@T{
+Delete character after cursor
+T}@T{
+T}
+T{
+\f[V]cmd.line.clear\f[R]
+T}@T{
+Clear text before cursor
+T}@T{
+T}
+T{
+\f[V]cmd.line.kill\f[R]
+T}@T{
+Clear text after cursor
+T}@T{
+T}
+T{
+\f[V]cmd.line.clearWord\f[R]
+T}@T{
+Delete word before cursor
+T}@T{
+T}
+T{
+\f[V]cmd.line.killWord\f[R]
+T}@T{
+Delete word after cursor
+T}@T{
+T}
+T{
+\f[V]cmd.line.backward\f[R]
+T}@T{
+Move cursor back by one character
+T}@T{
+T}
+T{
+\f[V]cmd.line.forward\f[R]
+T}@T{
+Move cursor forward by one character
+T}@T{
+T}
+T{
+\f[V]cmd.line.prevWord\f[R]
+T}@T{
+Move cursor to the previous word by one character
+T}@T{
+T}
+T{
+\f[V]cmd.line.nextWord\f[R]
+T}@T{
+Move cursor to the previous word by one character
+T}@T{
+T}
+T{
+\f[V]cmd.line.begin\f[R]
+T}@T{
+Move cursor to the previous word by one character
+T}@T{
+T}
+T{
+\f[V]cmd.line.end\f[R]
+T}@T{
+Move cursor to the previous word by one character
+T}@T{
+T}
+T{
+\f[V]cmd.line.escape\f[R]
+T}@T{
+Ignore keybindings for next character
+T}@T{
+T}
+T{
+\f[V]cmd.line.prevHist\f[R]
+T}@T{
+Jump to the previous history entry
+T}@T{
+T}
+T{
+\f[V]cmd.line.nextHist\f[R]
+T}@T{
+Jump to the next history entry
+T}@T{
+T}
+.TE
+.PP
+Note: to facilitate URL editing, the line editor has a different
+definition of what a word is than the pager.
+For the line editor, a word is either a sequence of alphanumeric
+characters, or any single non-alphanumeric character.
+(This means that e.g.\ \f[V]https://\f[R] consists of four words:
+\f[V]https\f[R], \f[V]:\f[R], \f[V]/\f[R] and \f[V]/\f[R].)
+.IP
+.nf
+\f[C]
+# Control+A moves the cursor to the beginning of the line.
+\[aq]C-a\[aq] = \[aq]cmd.line.begin\[aq]
+
+# Escape+D deletes everything after the cursor until it reaches a word-breaking
+# character.
+\[aq]M-d\[aq] = \[aq]cmd.line.killWord\[aq]
+\f[R]
+.fi
+.SS Appendix
+.SS Regex handling
+.PP
+Regular expressions are currently handled using libregexp which is
+included in QuickJS.
+This means that all regular expressions work as in JavaScript.
+.PP
+There are two different modes of regex preprocessing in Chawan:
+\[lq]search\[rq] mode, and \[lq]match\[rq] mode.
+\[lq]match\[rq] mode is used for configurations (meaning in all values
+in this document described as \[lq]regex\[rq]).
+\[lq]search\[rq] mode is used for the on-page search function (using
+searchForward/isearchForward etc.)
+.SS Match mode
+.PP
+Regular expressions are assumed to be exact matches, except when they
+start with a caret (\[ha]) sign or end with an unescaped dollar ($)
+sign.
+.PP
+In other words, the following transformations occur:
+.IP
+.nf
+\f[C]
+\[ha]abcd -> \[ha]abcd (no change, only beginning is matched)
+efgh$ -> efgh$ (no change, only end is matched)
+\[ha]ijkl$ -> \[ha]ijkl$ (no change, the entire line is matched)
+mnop -> \[ha]mnop$ (changed to exact match, the entire line is matched)
+\f[R]
+.fi
+.PP
+Match mode has no way to toggle JavaScript regex flags like \f[V]i\f[R].
+.SS Search mode
+.PP
+For on-page search, the above transformations do not apply; the search
+\f[V]/abcd\f[R] searches for the string \f[V]abcd\f[R] inside all lines.
+.PP
+\[lq]Search\[rq] mode also has some other convenience transformations:
+.IP \[bu] 2
+The string \f[V]c\f[R] (backslash + lower-case c) inside a search-mode
+regex enables case-insensitive matching.
+.IP \[bu] 2
+Conversely, \f[V]C\f[R] (backslash + capital C) disables
+case-insensitive matching.
+(Useful if you have the \[lq]i\[rq] flag inside default-flags.)
+.IP \[bu] 2
+\f[V]<\f[R] and \f[V]>\f[R] is converted to \f[V]b\f[R] (as in vi, grep,
+etc.)
+.PP
+Note that none of these work in \[lq]match\[rq] mode.
+.SS Path handling
+.PP
+Rules for path handling are similar to how strings in the shell are
+handled.
+.IP \[bu] 2
+Tilde-expansion is used to determine the user\[cq]s home directory.
+So e.g.\ \f[V]\[ti]/whatever\f[R] works.
+.IP \[bu] 2
+Environment variables can be used like \f[V]$ENV_VAR\f[R].
+.IP \[bu] 2
+Relative paths are relative to the Chawan configuration directory.
+.PP
+Some non-external variables are also defined by Chawan.
+These can be accessed using the syntax \f[V]${%VARIABLE}\f[R]:
+.IP \[bu] 2
+\f[V]${%CHA_BIN_DIR}\f[R]: the directory which the \f[V]cha\f[R] binary
+resides in.
+Note that symbolic links are automatically resolved to determine this
+path.
+.IP \[bu] 2
+\f[V]${%CHA_LIBEXEC_DIR}\f[R]: the directory for all executables Chawan
+uses for operation.
+By default, this is \f[V]${%CHA_BIN_DIR}/../libexec/chawan\f[R].
+.SS Word types
+.PP
+Word-based pager commands can operate with different definitions of
+words.
+Currently, these are:
+.IP \[bu] 2
+w3m words
+.IP \[bu] 2
+vi words
+.IP \[bu] 2
+Big words
+.SS w3m word
+.PP
+A w3m word is a sequence of alphanumeric characters.
+Symbols are treated in the same way as whitespace.
+.SS vi word
+.PP
+A vi word is a sequence of alphanumeric characters, OR a sequence of
+symbols.
+.PP
+vi words may be separated by whitespace; however, symbolic and
+alphanumeric vi words do not have to be whitespace-separated.
+e.g.\ following character sequence contains two words:
+.IP
+.nf
+\f[C]
+hello[]+{}\[at]\[ga]!
+\f[R]
+.fi
+.SS Big word
+.PP
+A big word is a sequence of non-whitespace characters.
+.PP
+It is essentially the same as a w3m word, but with symbols being defined
+as non-whitespace.
+.SS See also
+.PP
+\f[B]cha\f[R](1)