# 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. ## General General options must be placed in a section called `[general]`. Following is a list of general options:
**Name****Value****Function**
double-width-ambiguousboolean Assume the terminal displays characters in the East Asian Ambiguous category as double-width characters. If you don't know what this means, you probably won't need to enable it.
## Display Display options must be placed in a section called `[display]`. Following is a list of display options:
**Name****Value****Function**
mark-colorcolorSet the marker's color. Valid options are "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "terminal".
## 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 as 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 page browsing: `[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. (Note: it is highly recommended to use single quotes here; escaping can get quite ugly with double quotes.) ```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
### 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
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 == " ")' ```