# Configuration Chawan supports custom keybindings and user stylesheets, defined in a toml configuration file. Chawan will look for a config file in the ~/.config/chawan/ directory called `config.toml`. See the default configuration in the res/ folder for the default configuration. A list of configurable options follows. ## External External options must be placed in a section called `[external]`. Following is a list of external options:
**Name** **Value** **Function**
tmpdir path Directory used to save temporary files.
editor shell command External editor command. %s is substituted for the file name, %d for the line number.
## Display Display options must be placed in a section called `[display]`. Following is a list of display options: for black on white, "ansi" for ansi colors, "24bit" for true colors. "8bit" is currently unimplemented (and fallbacks to ansi).
**Name** **Value** **Function**
color-mode "monochrome"/"ansi"/"8bit"/"24bit"/"auto" Set the color mode. "auto" for automatic detection, "monochrome"
format-mode "auto"/["bold", "italic", "underline", "reverse", "strike", "overline", "blink"] Specifies output formatting modes. Accepts the string "auto" or an array of specific attributes. An empty array (`[]`) disables formatting completely.
no-format-mode ["bold", "italic", "underline", "reverse", "strike", "overline", "blink"] Disable specified formatting modes.
emulate-overline boolean When set to true and the overline formatting attribute is not enabled, overlines are substituted by underlines on the previous line.
alt-screen "auto"/boolean Enable/disable the alternative screen.
highlight-color color Set the highlight color. Both hex values and CSS color names are accepted.
double-width-ambiguous boolean Assume the terminal displays characters in the East Asian Ambiguous category as double-width characters. Useful when e.g. ○ occupies two cells.
minimum-contrast number Specify the minimum number of euclidian distance of the background and foreground colors on the RGB plane. -1 disables this function (i.e. allows black letters on black background, etc).
force-clear boolean Force the screen to be completely cleared every time it is redrawn.
## Siteconf Configuration options can be specified for individual sites. Each entry must be in the table array `[[siteconf]]`.
**Name** **Value** **Function**
url regex Regular expression used to match the URL.
substitute_url JS function A JavaScript function returning the substituted url.
## Stylesheets User stylesheets must be placed in a section called `[css]`. There are two ways to import user stylesheets: 1. Include a user stylesheet using the format `include = 'path-to-user.css'`. To include multiple stylesheets, use `include = ['first-stylesheet.css, second-stylesheet.css']`. Relative paths are interpreted relative to the config directory. 2. Place your stylesheet directly in your configuration file using `inline = """your-style"""`. ## Keybindings Keybindings must be placed in these sections: * for pager interaction: `[page]` * for line editing: `[line]` Keybindings are configured using the syntax '' = '' Where `` is a combination of unicode characters with or without modifiers. Modifiers are the prefixes `C-` and `M-`, which add control or escape to the keybinding respectively (essentially making `M-` the same as `C-[`). Modifiers can be escaped with the `\` sign. ```Examples: 'C-M-j' = 'pager.changeLocation()' # change URL when Control, Escape and j are pressed 'gg' = 'pager.cursorFirstLine()' # go to the first line of the page when g is pressed twice ``` An action is a JavaScript function called by chawan every time the keybinding is typed in. A list of built-in pager functions can be found below. ### Pager actions
**Name****Function**
`pager.quit()`Exit the browser
`pager.cursorUp()`Move the cursor to the previous line
`pager.cursorDown()`Move cursor to the next line
`pager.cursorLeft()`Move cursor to the previous cell
`pager.cursorRight()`Move cursor to the next cell
`pager.cursorLineBegin()`Move cursor to the first cell of the line
`pager.cursorLineEnd()`Move cursor to the last cell of the line
`pager.cursorNextWord()`Move cursor to the beginning of the next word
`pager.cursorPrevWord()`Move cursor to the end of the previous word
`pager.cursorNextLink()`Move cursor to the beginning of the next clickable element
`pager.cursorPrevLink()`Move cursor to the beginning of the previous clickable element
`pager.pageDown()`Move screen down by one page
`pager.pageUp()`Move screen up by one page
`pager.pageLeft()`Move screen to the left by one page
`pager.pageRight()`Move screen to the right by one page
`pager.halfPageDown()`Move screen down by half a page
`pager.halfPageUp()`Move screen up by half a page
`pager.scrollDown()`Move screen down by one line
`pager.scrollUp()`Move screen up by one line
`pager.scrollLeft()`Move screen to the left by one line
`pager.scrollRight()`Move screen to the right by one line
`pager.click()`Click element currently under cursor
`pager.changeLocation()`Go to URL
`pager.dupeBuffer()`Duplicate the current buffer
`pager.reload()`Reload page
`pager.reshape()`Reshape buffer (=render page anew)
`pager.redraw()`Redraw buffer (=redraw screen)
`pager.toggleSource()`Source view
`pager.cursorFirstLine()`Move cursor to the first line of the buffer
`pager.cursorLastLine()`Move cursor to the last line of the buffer
`pager.cursorTop()`Move cursor to the first line of the page
`pager.cursorMiddle()`Move cursor to the middle of the page
`pager.cursorBottom()`Move cursor to the last line of the page
`pager.centerLine()`Center screen around line
`pager.lineInfo()`Display information about line
`pager.searchForward()`Search for a string in the current buffer
`pager.searchBackward()`Search for a string, backwards
`pager.isearchForward()`Search for a string and highlight the first result
`pager.isearchBackward()`Search and highlight the first result, backwards
`pager.searchPrev()`Jump to the next search result
`pager.searchNext()`Jump to the previous search result
`pager.peek()`Display an alert of the current URL
`pager.peekCursor()`Display an alert of the URL under the cursor
### Line-editing actions
**Name****Function**
`line.submit()`Submit line
`line.cancel()`Cancel operation
`line.backspace()`Delete character before cursor
`line.delete()`Delete character after cursor
`line.clear()`Clear text before cursor
`line.kill()`Clear text after cursor
`line.clearWord(bounds)`Delete word before cursor[^a]
`line.killWord(bounds)`Delete word after cursor[^a]
`line.backward()`Move cursor back by one character
`line.forward()`Move cursor forward by one character
`line.prevWord(bounds)`Move cursor to the previous word by one character[^a]
`line.nextWord(bounds)`Move cursor to the previous word by one character[^a]
`line.begin()`Move cursor to the previous word by one character
`line.end()`Move cursor to the previous word by one character
`line.escape()`Ignore keybindings for next character
`line.prevHist()`Jump to the previous history entry
`line.nextHist()`Jump to the next history entry
Some entries have an optional `bounds` parameter. If passed, this must be a JavaScript function with one parameter (the current unicode character), and must return true if the passed character should count as a word boundary. ```Examples: # Control+A moves the cursor to the beginning of the line. 'C-a' = 'line.begin()' # Escape+D deletes everything after the cursor until it reaches a word-breaking # character. 'M-d' = 'line.killWord()' # Control+W deletes everything before the cursor until it reaches a space. 'C-w' = 'line.clearWord(x => x == " ")' ```