VIMB(1)
๐ฆ VIMB(1) โ the Vimb Manual, part 1 ๐ฆ
okay bestie, welcome to the Vimb Manual โ this is the page for VIMB(1) and we're gonna get through it together, no cap ๐
โจ NAME โจ
Vimb โ Vim Browser โ a modal web browser built on WebKit, inspired by Vim: the great editor. ๐
โจ SYNOPSIS โจ
vimb [OPTIONS] [URI|file|-]
โจ DESCRIPTION โจ
So like, Vimb is a WebKit-based web browser that literally behaves like the Vimperator plugin for Firefox, and it steals its whole usage paradigm from the great editor, Vim. The goal? A completely keyboard-driven, efficient and pleasurable browsing experience. That's the dream, and it ate. ๐ฅ
โจ OPTIONS โจ
Okay so first the housekeeping rules, bestie ๐
- If no URI or file is given, Vimb opens the configured home-page.
- If URI is
-, Vimb reads the HTML to display from stdin.
ngl this one matters: mandatory arguments to long options are mandatory for short options too. ๐ซถ
-C,--cmdCMD โ run CMD as an ex command line right before the first page is loaded. Use the flag more than once and the commands get called in the order you gave them. You can also pass several ex commands inside one CMD if you separate them with"|". Obsessed. ๐
vimb --cmd "set dark-mode=on|set header=Referer,DNT=1"
-c,--configFILE โ use a custom configuration given as FILE. And no worries, this also gets applied to any newly spawned instances. โจ-e,--embedWINID โ[DEPRECATED - GTK4 removed XEmbed support]. This option is no longer functional. GTK4 removed theGtkPlug/GtkSocketXEmbed support. For tabbed integration alternatives, see the project documentation. ๐ญ-i,--incognitoโ start an instance with user data read-only (peep the FILES section for that). ๐-h,--helpโ show help options. classic.-p,--profilePROFILE-NAME โ create or open the specified configuration profile. Config data for the profile lives in a directory named PROFILE-NAME under the default directory for configuration data. ๐-v,--versionโ print build and version information, then quit. bye bestie ๐--no-maximizeโ no attempt is made to maximize the window. ๐ช--bug-infoโ prints info about the libraries in use, for bug reports, then quits. very "here's my receipt" of it. ๐งพ
โจ MODES โจ
Vimb is modal, and it has these main modes, iykyk:
๐ธ Normal Mode
The default mode. Pressing Escape always enters normal mode. main character energy, honestly.
๐ธ Input Mode
Used for editing text elements in a webpage. ๐๏ธ
๐ธ Command Mode
Executes ex commands from the builtin inputbox (the commandline). ๐ป
๐ธ Pass-Through Mode
In Pass-Through mode, only the <Esc> and <C-[> keybindings are interpreted by Vimb โ every other keystroke is given to the webview to handle. This lets you use a website's own configured keybindings, the ones that might otherwise get swallowed by Vimb. ๐ฆ
๐ NORMAL MODE COMMANDS ๐
Okay bestie, these are the Normal Mode commands. Some of them take a numeric count that multiplies the effect, and if a command supports that count itโs shown as [N]. No cap, that [N] is your little multiplier fairy. ๐ง
๐ General ๐
:โ Start Command Mode and print:to the input box.giโ Set the cursor to the first editable element in the page and switch to Input Mode.iโ Set the cursor to the last focused element in the page and switch to Input Mode. If no element was focused before, the first element is focused like withgi.CTRL-Zโ Switch Vimb into Pass-Through Mode.gfโ Open the configured editor (editor-command) with the current pageโs content.gFโ Open the Web Inspector for the current page.CTRL-Vโ Pass the next key press directly to GTK.CTRL-Qโ Quit the browser if there are no running downloads.
๐ฆ Tabs ๐ฆ
Vimb supports tabbed browsing within a single window. Slay, tabs, we love her. ๐
gtโ Go to the next tab.gTโ Go to the previous tab.g0โ Go to the first tab.g$โ Go to the last tab.
๐ธ Navigation ๐ธ
oโ Start Command Mode and print:opento the input box. Yes, with the trailing space.Oโ Start Command Mode and print:open URIto the input box.tโ Start Command Mode and print:tabopento the input box. Trailing space again, iconic.Tโ Start Command Mode and print:tabopen URIto the input box.ghโ Open the configured home-page.gHโ Open the configured home-page in a new tab.uโ Open the last closed page.Uโ Open the last closed page in a new tab.CTRL-Pโ Open the oldest entry from the read it later queue in the current browser window.["x]pโ Open the URI out of the registerxor, if not given, from the clipboard.["x]Pโ Open the URI out of the registerxor, if not given, from the clipboard in a new tab.[N]CTRL-Oโ Go backNsteps in the browser history.[N]CTRL-Iโ Go forwardNsteps in the browser history.[N]guโ Go to theNth descendent directory of the current opened URI.gUโ Go to the domain of the current opened page.rโ Reload the website.Rโ Reload the website without using caches.CTRL-Cโ Stop loading the current page.CTRL-LeftMouse,MiddleMouseโ Opens the clicked link in a new tab.Shift-LeftMouseโ Push the link url under the cursor to the end of the Read It Later queue like the:qpushcommand.
๐ Motion ๐
[N]CTRL-Fโ ScrollNpages down.[N]CTRL-Bโ ScrollNpages up.[N]CTRL-Dโ ScrollNhalf pages down.[N]CTRL-Uโ ScrollNhalf pages up.[N]ggโ Scroll to the top of the current page. Or ifNis given, toN% of the page.[N]Gโ Scroll to the bottom of the current page. Or ifNis given, toN% of the page.0,^โ Scroll to the absolute left of the document. Unlike in Vim,0and^work exactly the same way.$โ Scroll to the absolute right of the document.[N]hโ ScrollNsteps to the left of page.[N]lโ ScrollNsteps to the right of page.[N]jโ Scroll pageNsteps down.[N]kโ Scroll pageNsteps up.m{a-z}โ Set a page mark{a-z}at the current position on the page. Such set marks are only available on the current page; if the page is left, all marks will be removed.m{A-Z}โ Set a page mark{A-Z}at the current position on the page. These marks are permanent across any page.'{a-z}โ Jump to the mark{a-z}on the current page.'{A-Z}โ Jump to the global mark{A-Z}on a (possibly) different page.''โ Jumps to the position before the latest jump, or where the lastm'command was given.
๐ Hinting ๐
Hinting in Vimb is how you accomplish the tasks that you would do with the mouse in common mouse-driven browsers: open a URI, yank a URI, save a page and so on. When hinting is started, the relevant elements on the page will be marked by labels generated from configured hint-keys. Hints can be selected by using <Tab>, <C-I> or <C-Tab>, <C-O>, by typing the chars of the label, or filtering the elements by some text that is part of the hinted element (like URI, link text, button label) or any combination of these methods. If <enter> is pressed, the current active hint will be fired. If only one possible hint remains, this will be fired automatically. โจ
Syntax:
;{mode}{hint}
Start Hints mode. Different elements depending on mode are highlighted and numbered. Elements can be selected either by typing their label, or by typing part of their text (hint) to narrow down the result. When an element has been selected, it is automatically clicked or used (depending on mode) and hint mode ends.
The filtering of hints by text splits the query at ' ' and use the single parts as separate queries to filter the hints. This is useful for hints that have a lot of filterable chars in common and many chars are required to make a distinct selection. For example ;over tw will easily select the second hint out of {'very long link text one', 'very long link text two'}.
The following keys have special meanings in Hints modes:
<CR>โ Selects the first highlighted element, or the current focused.<Tab>โ Moves the focus to the next hint element.<S-Tab>โ Moves the focus to the previous hint element.<Esc>,CTRL-C,CTRL-[โ Exits Hints mode without selecting an element.
๐ Hint modes ๐
fโ Is an alias for the;ohint mode.Fโ Is an alias for the;thint mode.;oโ Open hintโs location in the current window.;tโ Open hintโs location in a new tab.;sโ Saves the hintโs destination under the configureddownload-path.;Oโ Generate an:openprompt with hintโs URI.;Tโ Generate an:tabopenprompt with hintโs URI.;eโ Open the configured editor (editor-command) with the hinted form elementโs content. If the file in editor is saved and the editor is closed, the file content will be put back in the form field.;iโ Open hinted image in the current window.;Iโ Open hinted image in a new tab.;kโ Kill (remove) hinted element from the page.;pโ Push the hintโs URI to the end of the Read It Later queue like the:qpushcommand. This is only available if Vimb was compiled with theQUEUEfeature.;Pโ Push the hintโs URI to the beginning of the Read It Later queue like the:qunshiftcommand. This is only available if Vimb was compiled with theQUEUEfeature.;xโ Hints like;o, but instead of opening the hinted URI, thex-hint-commandis run in Vimb.["x];yโ Yank hintโs destination location into primary and secondary clipboard and into the registerx.["x];Yโ Yank hintโs text description or form text into primary and secondary clipboard and into the registerx.
Syntax:
g;{mode}{hint}
Start an extended hints mode and stay there until <Esc> is pressed. Like normal hinting, except that after a hint is selected, hints remain visible so that another one can be selected with the same action as the first. Note that the extended hint mode can only be combined with the following hint modes I o p P s t y Y.
๐ซ Motion ๐ซ
Motions commands are like those for normal mode except that CTRL is used as modifier. But they can not be used together with a count.
CTRL-Fโ Scroll one page down.CTRL-Bโ Scroll one page up.CTRL-Dโ Scroll half page down.CTRL-Uโ Scroll half page up.CTRL-Jโ Scroll one step down.CTRL-Kโ Scroll one step up.
โญ Searching โญ
/QUERY,?QUERYโ Start searching for QUERY in the current page./start search forward,?in backward direction.*,#โ Start searching for the current selected text, or if no text is selected for the content of the primary or secondary clipboard.*start the search in forward direction and#in backward direction.
โ ๏ธ Note that these commands will yank the text selection into the clipboard and may remove other content from there! Bestie, please be aware. ๐ญ
[N]nโ Search for the *N*nth next search result depending on current search direction.[N]Nโ Search for the *N*nth previous search result depending on current search direction.<CR>โ Perform a click on element containing the current highlighted search result.
๐ฅ Zooming ๐ฅ
[N]ziโ Zoom-In the text of the page byNsteps.[N]zoโ Zoom-Out the text of the page byNsteps.[N]zIโ Full-Content Zoom-In the page byNsteps.[N]zOโ Full-Content Zoom-Out the page byNsteps.zzโ Reset Zoom.
๐ Yank ๐
["x]yโ Yank the URI or current page into registerxand clipboard.["x]Yโ Yank the current selection into registerxand clipboard.
๐ป COMMAND MODE ๐ป
Commands that are listed below are ex-commands like in Vim, that are typed into the inputbox (the command line of vimb). The commands may vary in their syntax or in the parts they allow, but in general they follow a simple syntax.
:[:| ][N]cmd[name][!][ lhs][ rhs]
Where lhs (left hand side) must not contain any unescaped space. The syntax of the rhs (right hand side) if this is available depends on the command. At the moment the count parts [N] of commands is parsed, but currently there is no command that uses the count.
Commands that are typed interactivly are normally recorded into command history and register. To avoid this, the commands can be prefixed by one or more additional : or whitespace.
Multiple commands, separated by a | can be given in a single command line and will be executed consecutively. The pipe can be included as an argument to a command by escaping it with a backslash. Following commands process the entire command-line string literally. These commands will include any | as part of their argument string and so can not be followed by another command.
autocmdcmap,cnoremap,imap,inoremap,nmap,nnoremapevalnormalopen,tabopenshellcmd,shellex
โจ๏ธ Command Line Editing โจ๏ธ
<Esc>,CTRL-[,CTRL-Cโ Ignore all typed content and switch back to normal mode.<CR>โ Submit the enteredexcommand or search query to run it.CTRL-Hโ Deletes the char before the cursor.CTRL-Wโ Deletes the last word before the cursor.CTRL-Uโ Remove everything between cursor and prompt.CTRL-Bโ Moves the cursor directly behind the prompt:.CTRL-Eโ Moves the cursor after the prompt in inputbox.CTRL-Vโ Pass the next key press directly to GTK.CTRL-R{a-z"%:/;}โ drops the contents of whatever register you name right at the cursor ๐ฅ oh and peep the:reg[ister]command section if you wanna know what lives in registers.
๐ Command Line History ๐
- Tab โ kicks off completion of whatever's in the inputbox, going forward.
- S-Tab โ same completion vibe but backwards, bestie.
- Up โ steps backward through your command history.
- Down โ steps forward through the command history. Also yanks the current selection into register
xand the clipboard, no cap.
๐ Open ๐
:o[pen] [URI]โ opens the given URI in the tab you're chilling in right now. If URI is empty, boom, the configured'home-page'gets opened instead.:t[abopen] [URI]โ same energy but in a new tab. Empty URI? Again, the configured'home-page'opens. โจ
๐ Tabs ๐
:tabc[lose]โ closes the current tab. And if that was the last tab? The whole browser window closes. like, gone-gone ๐ญ:tabn[ext]โ hop over to the next tab.:tabp[rev],:tabp[revious]โ hop back to the previous tab.:tabfirstโ yeet yourself to the first tab.:tablastโ yeet yourself to the last tab.
โจ๏ธ Key Mapping โจ๏ธ
Key mappings let you change what pressing keys actually does โ main character energy for your keyboard fr. Each key mapping belongs to a mode and only works while that mode is active. These commands let you swap one sequence of key presses for another.
Syntax:
:{m}map {lhs} {rhs}
Heads up, this part is important: the {lhs} ends at the first space it finds. So if you want a space inside your {lhs}, you gotta escape it with a single '\' โ there are examples below, don't stress ๐ซถ.
The {rhs} starts at the first non-space character. Want a {rhs} that begins with a space? Use "<Space>".
Standard key mapping commands exist for these modes, m:
nโ Normal mode: when you're just browsing normally.iโ Insert mode: when you're interacting with text fields on a website.cโ Command Line mode: when you're typing into Vimb's command line.
Most keys in a key sequence are just represented by the literal character you see on screen when you press them. But a bunch of those characters have special meanings, and some keys have no visual representation at all โ so yeah, we need a special notation for those.
Special key names look like <...>. Here's the whole guest list: <Left>, <Up>, <Right>, <Down> for the cursor keys, plus <Tab>, <Esc>, <CR>, <Space>, <BS>, <F1>-<F12> and <C-A>-<C-Z>. Now โ if you want an actual sequence of keys like "<", "C", "R", ">", then escape with a backslash: "<CR>". And if you want a backslash followed by a special key, use <Bslash>.
:nm[ap] {lhs} {rhs}:im[ap] {lhs} {rhs}:cm[ap] {lhs} {rhs}
Map the key sequence lhs to rhs for whichever modes that map command applies to. Then โ plot twist โ the result, including rhs, gets scanned again for more mappings. That's what gives you nested and recursive mappings. ๐ฅ
:cmap <C-G>h /home/user/downloads/
Adds a keybind that inserts a file path into the input box. Super handy for the :save command, which you could then use like ":save ^Gh".
:nmap <F1> :set scripts=on<CR>:open !glib<Tab><CR>
This enables scripts and looks up the first bookmarked URI with the tag glib, then opens it immediately when F1 gets pressed. iconic.
:nmap \ \ 50G
Example that maps two spaces to jump to 50% of the page.
:nn[oremap] {lhs} {rhs}:ino[remap] {lhs} {rhs}:cno[remap] {lhs} {rhs}
Maps the key sequence lhs to rhs for the mode the map command applies to โ but it disallows mapping of rhs, so no nested/recursive shenanigans. Lowkey the go-to when you're redefining an existing command.
:nu[nmap] {lhs}:iu[nmap] {lhs}:cu[nmap] {lhs}
Removes the mapping of lhs for the applicable mode. bye felicia ๐
๐ Bookmarks ๐
:bma [tags]โ saves the currently open URI, with tags, into the bookmark file. ๐:bmr [URI]โ removes all bookmarks for the given URI โ or, if you don't give one, for the page that's currently open.
๐ ๏ธ Handlers ๐ ๏ธ
Handlers let you point external scripts at alternative URI methods โ so the weird protocols get handled too, periodt.
:handler-add handler=cmdโ adds a handler that directs handler links to the external cmd. The cmd can contain one placeholder%s, which gets filled with the full URI given when the command is called.
:handler-add mailto=urxvt -e mutt %s
to start your email client for mailto links.
:handler-add magnet=xdg-open %s
to open magnet links with xdg-open.
:handler-add ftp=urxvt -e wget %s -P ~/ftp-downloads
to handle ftp downloads via wget.
:handler-remove handlerโ removes the handler for the given URI handler.
โจ Shortcuts โจ
Shortcuts let you open a URI built from a named template plus extra parameters. If a shortcut called dd is defined, you can fire it off with :open dd list of parameters and it'll open the generated URI. Obsessed tbh.
They're especially convenient with search engines, where the URI is standardised and just one parameter is user-defined.
:shortcut-add shortcut=URIโ adds a shortcut with the shortcut name and URI template. The URI can contain multiple placeholders$0-$9, which get filled by the parameters you give when calling the shortcut. Those parameters get split into as many parameters as the highest used placeholder โ yes, really.
Wanna use spaces inside parameters? Group them by wrapping in single or double quotes โ like in the map example below.
:shortcut-add dl=https://duckduckgo.com/lite/?q=$0
to set up a search engine. Call it with :open dl my search phrase.
:shortcut-add gh=https://github.com/$0/$1
to build URIs from given parameters. Call it like :open gh fanglingsu vimb.
:shortcut-add map=https://maps.google.com/maps?saddr=$0&daddr=$1
to search for a route โ all but the last parameter must be quoted if they contain spaces, like :open map "city hall, London" railway station, London.
:shortcut-remove shortcutโ removes the search engine for the given shortcut.:shortcut-default shortcutโ sets the given shortcut as the default, i.e. the shortcut that gets used when no shortcut is given and the string you're opening isn't a URI. And ngl, it doesn't matter whether the shortcut is already in use or not โ you can still set it.
โ๏ธ Settings โ๏ธ
:se[t] var=valueโ sets configuration values named by var. For a boolean variable you should use'on','off','true'or'false'. Colors go in as hex values like'#f57700'. And spaces or extra equals signs in the value just work, no quotes needed: for example,":set sans-serif-font=Some Sans Font". slay ๐:se[t] var+=valueโ adds the value to a number option, or appends the value to a string option. When the option is a comma-separated list, a comma gets added too โ unless the value was empty.:se[t] var^=valueโ multiplies the value into a number option, or prepends the value to a string option. Comma-separated list? A comma gets added, unless the value was empty.:se[t] var-=valueโ subtracts the value from a number option, or removes the value from a string option if it's there. Comma-separated list? A comma gets deleted, unless that leaves the option empty.:se[t] var?โ shows the currently set value of the variable.VAR.:se[t] var!โ toggles the value of the boolean variable var and displays the new set value. flip it and reverse it ๐ฆ
๐ Queue ๐
The queue lets you mark URIs for later reading. And the tea is that this list is shared between the single instances of Vimb. ๐
:qpu[sh] [URI]โ pushes URI โ or, if you don't give one, the current URI โ to the end of the queue.:qun[shift] [URI]โ pushes URI โ or, if not given, the current URI โ to the beginning of the queue.:qp[op]โ opens the oldest queue entry in the current browser window and removes it from the queue.:qc[lear]โ removes every entry from the queue. clean slate โจ
๐ค Automatic commands ๐ค
An autocommand is a command that runs automatically in response to some event โ like a URI being opened. Autocommands are very powerful. Use them with care and they'll save you from typing a million commands, fr fr.
Autocommands are built from these properties:
- group โ when the
[group]argument isn't given, Vimb uses the current group as defined with':augroup'; otherwise it uses the group defined with[group]. Groups are useful for removing multiple grouped autocommands in one go. - event โ you can give a comma-separated list of event names. No white space allowed in this list, okay?
Events:
LoadStartingโ fired before a new page is going to be opened. No data has been sent or received yet, and the load may still fail for transport issues.LoadStartedโ fired if a new page is going to be opened. No data has been received yet, and the load may still fail for transport issues.LoadCommittedโ fired if the first data chunk has arrived, meaning the necessary transport requirements are established and the load is being performed. This is the right event to toggle content-related settings like'scripts','plugins'and such things. ๐LoadFinishedโ fires when everything required to display on the page has been loaded.DownloadStartedโ fired right after a download is started.DownloadFinishedโ fired if a Vimb managed download is finished.DownloadFailedโ fired if a Vimb managed download failed. ๐ญ
- pat โ a comma-separated list of patterns, matched in order to check if an autocommand applies to the URI associated with an event. To use
','within a single pattern, it must be escaped as'\,'.
Patterns
*โ matches any sequence of chars. and yeah, that includes/โ unlike shell patterns, bestie, this one does not care.?โ matches any single character, except/.{one,two}โ matchesoneortwo. any{,,and}inside this pattern has to be escaped with a\. and heads up:*and?have no special meaning inside the curly braces, they're just lil guys in there.\โ backslash is your escape hatch, use it to kill the special meaning of?*{},in the pattern or pattern list.
cmd โ any ex command that vimb understands. the leading : is not required btw, you can just drop it. and you can chain multiple commands by separating them with | โจ
autocommands, the whole saga ๐
:au[tocmd] [group] {event} {pat} {cmd}โ addscmdto the list of commands Vimb will execute automatically oneventfor a URI matchingpat(see autocmd-patterns). Vimb always adds thecmdafter existing autocommands, so they run in the order you gave them. no queue-jumping, periodt.:au[tocmd]! [group] {event} {pat} {cmd}โ removes all autocommands associated witheventwhose patterns matchpat, and adds the commandcmd. โ ๏ธ note that the pattern is not matched literally to find autocommands to remove, like Vim does. Vimb matches the autocommand pattern withpat. if[group]is not given, it deletes autocommands in the current group, as noted above.:au[tocmd]! [group] {event} {pat}โ removes all autocommands associated witheventand which pattern matchespatin the given group (current group by default).:au[tocmd]! [group] * {pat}โ removes all autocommands with patterns matchingpatfor all events in the given group (current group by default).:au[tocmd]! [group] {event}โ removes all autocommands foreventin the given group (current group by default).:au[tocmd]! [group]โ removes all autocommands in the given group (current group by default). full reset energy.:aug[roup] {name}โ defines the autocmd group name for the following:autocmdcommands. the nameendselects the default group.:aug[roup]! {name}โ deletes the autocmd group name.
Example, iconic behaviour:
:aug github
: au LoadCommitted * set scripts=off|set cookie-accept=never
: au LoadCommitted http{s,}://github.com/* set scripts=on
:aug end
๐ Misc ๐
:cl[eardata] [dataTypes] [timespan] โ asynchronously clears the website data of the given list of dataTypes modified in the past timespan. note that dataTypes must not contain spaces. if timespan is not given, all website data will be removed. and ngl this is a big one: this affects all running instances of vimb ๐ซถ
dataTypes is a comma separated list of these types:
memory-cacheโ memory cache.disk-cacheโ HTTP disk cache.session-storageโ session storage data.local-storageโ local storage data.indexeddb-databasesโ IndexedDB databases.plugin-dataโ plugin data.cookiesโ cookies. note that the cookies are not cleared in case atimespanis given. lowkey important.hsts-cacheโ HTTP Strict Transport Security cache.-โ can be used to clear all known data types in case atimespanis used.
The timespan is given as a sequence of '[multiplier]unit' tupels with these units:
yโ year (365 days)wโ week (7 days)dโ dayhโ hourmโ minutesโ second
Example time, bestie:
:cleardata
to clear all known website data types without any timespan restriction.
:cleardata - 5m
to clear all known website data types modified in the last 5 minutes.
:cleardata local-storage,session-storage,cookies
to completely clear the cookies, local- and session-storage without time restrictions.
:cleardata disk-cache 2d4h
to clear the disk cache that was modified in the past two days and four hours.
:sh[ellcmd] cmd โ runs the given shell cmd syncron and prints the output into the inputbox. the following patterns in cmd get expanded: '~username', '~/', '$VAR' and '${VAR}'. a \ before these patterns disables the expansion. ๐
These environment variables are set for the called shell commands:
VIMB_URIโ this variable is set by Vimb every time a new page is opened, to the URI of the page.VIMB_SELECTIONโ this variable is set to the current selected text on the page.VIMB_TITLEโ contains the title of the current opened page.VIMB_PIDโ contains the pid of the running Vimb instance.VIMB_WIN_IDโ holds the X-Window id of the Vimb window.VIMB_XIDโ holds the X-Window id of the Vimb window.
:sh[ellcmd]! cmd โ like :sh[ellcmd] but asynchronous, so it doesn't sit there blocking you. main character energy.
Example:
:sh! /bin/sh -c 'echo "`date` $VIMB_URI" >> myhistory.txt'
:shelle[x] cmd โ like :sh[ellcmd] but instead of printing the output into the inputbox, it runs the output as ex commands line by line. honestly kind of unhinged in the best way ๐
Example:
:shellex bash -c "sqlite3 \"file:\$XDG_CONFIG_HOME/chromium/Default/History?mode=ro\" \"SELECT url, title FROM urls ORDER BY last_visit_time DESC\" | dmenu -l 20 | awk -F'|' '{print \"open \" \$1}'"
to select an entry from the Chromium history and open in the current window.
:s[ave] [path] โ downloads the current opened page into the configured download directory. if path is given, it downloads under this file name or path. path is expanded and can therefore contain '~/', '${ENV}' and '~user' pattern. cute.
:so[urce] [file] โ read ex commands from file.
:q[uit] โ closes the current tab. if this is the last tab, the browser window is closed. ๐ช this will be refused if there are running downloads.
:q[uit]! โ closes the current tab independent from a running download. no thoughts, just exit.
:quita[ll] โ closes all tabs and quits the browser. this will be refused if there are running downloads in any tab.
:quita[ll]! โ closes all tabs and quits the browser independent from running downloads. bye bestie ๐
:reg[ister] โ displays the contents of all registers.
The registers, aka the โจvaultโจ:
"aโ"zโ 26 named registers"ato"z. Vimb fills these registers only when you say so.":โ last executedexcommand.""โ last yanked content."%โ curent opened URI."/โ last search phrase.";โ contains the last hinted URL.
:e[val] javascript โ runs the given javascript in the current page and displays the evaluated value.
Example: :eval document.cookie
:e[val]! javascript โ like :eval, but there is nothing print to the input box. silent slay.
:no[rmal] [cmds] โ execute normal mode commands cmds. this makes it possible to execute normal mode commands typed on the input box. ๐
cmds cannot start with a space. put a count of 1 (one) before it, "1 " is one space.
Example: :set scripts!|no! R
:no[rmal]! [cmds] โ like :normal, but no mapping is applied to cmds.
:ha[rdcopy] โ print the current document. opens a GUI dialog where you can select the printer, number of copies, orientation, etc. very grown-up of you tbh ๐จ๏ธ
๐ฆ INPUT MODE ๐ฆ
<Esc>,CTRL-[โ switch back to normal mode.CTRL-Oโ executes the next command as a normal mode command and then returns to input mode. quick little detour.CTRL-Tโ open the configured editor with the content of the current form field.CTRL-Vโ pass the next key press directly to WebKit.CTRL-Zโ enter the pass-through mode.
๐ธ COMPLETIONS ๐ธ
The completions are triggered by pressing <Tab> or <S-Tab> in the activated inputbox. depending on the current inserted content, different completions get started. the completion takes additional typed chars to filter the completion list that is shown. filtering as you type, we love to see it โจ
commands
the completion for commands is started when at least : is shown in the inputbox. if initial chars are passed, the completion will lookup those commands that begin with the given chars.
settings
the setting name completion is started if at least :set is shown in inputbox, and it also matches settings that begin with the already typed setting prefix.
history
the history of URIs is shown for the :open and :tabopen commands. this completion looks up every given word in the history URI and titles. only those history items are shown where the title or URI contains all tags.
:open foo bar<Tab>
will complete only URIs that contain the words foo and bar.
bookmarks
the bookmark completion is similar to the history completion, but does match only the tags of the bookmarks. the bookmark completion is started by :open !, :tabopen ! or :bmr and does a prefix search for all given words in the bookmark tags.
:open !foo ba
will match all bookmarks that have tags starting with "foo" and "ba". if the bookmark does not have any tags set, the URL is split on .' and /' into tags.
:bmr tag
will match all bookmarks that have tags starting with "tag".
bookmark tags
the bookmark tag completion allows the insertion of already used bookmarks for the :bma commands.
search
the search completion allows a filtered list of already done searches. this completion starts by / or ? in inputbox and performs a prefix comparison for further typed chars.
๐ SETTINGS ๐
all the settings listed below can be set with the `:set' command. see Settings under COMMAND MODE for syntax. iykyk ๐
allow-file-access-from-file-urls(bool)
indicates whether file access is allowed from file URLs. by default, when something is loaded using a file URI, cross origin requests to other file resources are not allowed.
and that's just the opening act of the settings list btw โ there's a whole parade of them coming, so stay tuned bestie ๐
allow-universal-access-from-file-urls(bool) โ this is the "can JS peek at your whole filesystem?" switch ๐ซฃ. It says whether JavaScript running in the context of a file scheme URL is allowed to access content from any origin. Default behaviour: when something's loaded via a file scheme URL, access to the local file system and arbitrary local storage is not allowed. So by default, no, bestie, the page can't rummage through your stuff ๐caret(bool) โ whether to enable accessibility-enhanced keyboard navigation. Yes it's literally called caret. Cute.cookie-accept(string) โ the cookie accept policy. Your options arealways,never, ororigin(which accepts all non-third-party cookies) ๐ชclosed-max-items(int) โ max number of stored last closed URLs. Set it to0and closed URLs just... won't be stored at all. Gone, reduced to atoms ๐completion-css(string) โ CSS style applied to the inputbox completion list items. Make that dropdown iconic โจcompletion-hover-css(string) โ CSS style applied to the inputbox completion list item that's currently hovered by the mouse ๐ฑ๏ธcompletion-selected-css(string) โ CSS style applied to the inputbox completion list item that's currently selected. The chosen one ๐cursiv-font(string) โ the font family used as the default for content using cursive font. (Yes, the option name is spelledcursiv-fontโ that's canon, don't come for me ๐)dark-mode(bool) โ whether to enable dark mode. Websites can use theprefers-color-schememedia query to adjust styles according to this option ๐default-charset(string) โ the default text charset used when interpreting content with an unspecified charset.default-font(string) โ the font family to use as the default for content that does not specify a font ๐default-zoom(int) โ default Full-Content zoom level in percent. Default is100.download-command(string) โ a command with placeholder%sthat gets invoked to download a URI, in case'download-use-external'is enabled.
The following additional environment variables are available:
$VIMB_URIโ the URI of the current opened page, normally the page where the download was started from, also known as the referer.$VIMB_DOWNLOAD_PATHโ the setting value of'download-path', which would normally be used for downloads.
:set download-command=/bin/sh -c "cd '$VIMB_DOWNLOAD_PATH' && curl -sLJOC - -e '$VIMB_URI' %s"
download-path(string) โ path to the default download directory. If no download directory is set, downloads get written into$HOME/Downloads. It must be an absolute path, no exceptions bestie. You can take advantage of the:shellexcommand to expand relative paths or environment variables:
:shellex sh -c "echo -n :set download-path=; realpath ~/downloads/"
download-use-external(bool) โ indicates if the external download tool set as'download-command'should be used to handle downloads. If this is disabled, Vimb will handle the download itself ๐ชeditor-command(string) โ command with placeholder%scalled if a form field is opened with$EDITOR, to spawn the editor โ likex-terminal-emulator -e vim %s. To use Gvim as the editor, it's necessary to call it with-fso it runs in the foreground ๐งfont-size(int) โ the default font size used to display text.fullscreen(bool) โ show the current window full-screen. Main character energy, entire screen, no notes ๐ฅ๏ธhardware-acceleration-policy(string) โ this setting decides how to enable and disable hardware acceleration.ondemandโ enables hardware acceleration when the web contents request it, disabling it again when no longer needed.alwaysโ enforce hardware acceleration to be enabled.neverโ disables it completely.
Heads up babe: disabling hardware acceleration might cause some websites to not render correctly or consume more CPU ๐ญ
header(list) โ comma separated list of headers that replaces default headers sent by WebKit, or adds new headers. The format for the header list elements isname[=[value]].
Note that these headers will replace already existing headers. If there's no = after the header name, then the complete header will be removed from the request; if the = is present, it means the header value is set to an empty value.
Note that WebKit reuses already-set headers in the case of a reload of a page. So if headers were removed that were previously used to access a certain page, and the page is reloaded or opened via back/forward history, the header will still be sent. To apply the new header setting properly it's required to request another page, or to open the current page new via O<Cr> ๐ฎโ๐จ
To use = within a header value, the value must be quoted like shown in the example for the Cookie header:
:set header=DNT=1,User-Agent,Cookie='name=value'
That one sends the Do Not Track header with each request and removes the User-Agent header completely from the request. Slay ๐
hint-follow-last(bool) โ if on, vimb automatically follows the last remaining hint on the page. If off, hints are fired only if Enter is pressed.hint-keys-same-length(bool) โ if on, all hint labels will have the same length, so no hints will be ambiguous. No cap, very satisfying.hint-timeout(int) โ timeout before automatically following a non-unique numerical hint. To disable auto-fire of hints, set this value to0โฐhint-keys(string) โ the keys used to label and select hints. With its default value, each hint has a unique label which can be typed to select it, while all other characters are used to filter hints based on their text. With a value such asasdfg;lkjh, each hint is "labeled" based on the characters of the home row ๐
If the hint-keys string starts with a 0, the keys are considered to follow the rules of numeric labeling. So the first char of the label will never start with the 0.
Note that the hint matching by label built of hint-keys is case sensitive. In this, vimb differs from some other browsers that show hint labels in upper case but match them lowercase.
To have upper case hint labels, it's possible to add the following css to the style.css file in vimb's configuration directory:
"span[vimbhint="label"] {text-transform: uppercase !important;}"
hint-match-element(bool) โ if this is set to'true', typed chars that are not part of the set'hint-keys'are used to filter hinted DOM elements by their text value. If'hint-keys'are set to chars instead of numbers, it might be useful to disable matching of the elements by'hint-match-element=false'๐ฆhistignore(string) โ determines whether a URI should be saved in the history file. This option must be a valid POSIX Extended Regular Expression. If a URI matches this regular expression, then it won't be saved in the history. If this option is empty, then any URI will be saved in the history ๐history-max-items(int) โ maximum number of unique items stored in search-, command- or URI history. Ifhistory-max-itemsis set to0, the history file will not be changed. This setting has no effect if option--incognitois set ๐ต๏ธhome-page(string) โ homepage that vimb opens if started without a URI.html5-database(bool) โ whether to enable HTML5 client-side SQL database support. Client-side SQL database allows web pages to store structured data and be able to use SQL to manipulate that data asynchronously. Fancy ๐html5-local-storage(bool) โ whether to enable HTML5 localStorage support. localStorage provides simple synchronous storage access.images(bool) โ determines whether images should be automatically loaded or not ๐ผ๏ธincsearch(bool) โ while typing a search command, show where the pattern typed so far matches. Literally the best feature, watching the matches light up as you type is chef's kiss ๐ญโจinput-autohide(bool) โ if enabled, the inputbox will be hidden whenever it contains no text.input-css(string) โ CSS style applied to the inputbox in normal state.input-error-css(string) โ CSS style applied to the inputbox in case of a displayed error. Make your errors pretty ๐intelligent-tracking-prevention(bool) โ whether WebKit's Intelligent Tracking Prevention (ITP) is enabled. Iconic acronym, iconic behaviour ๐javascript-can-access-clipboard(bool) โ whether JavaScript is allowed to read from the clipboard. This does not block JavaScript from writing to the clipboard; only read access is controlled by the underlying WebKit setting. Read that again bestie, only reads ๐javascript-can-open-windows-automatically(bool) โ whether JavaScript can open popup windows automatically without user interaction. Keep this in mind before you get 40 popups ๐javascript-enable-markup(bool) โ whether JavaScript markup is enabled. Disabling can help with some older systems (ppc, ppc64, etc.) that don't have complete JavaScript support to run webpages without crashing ๐ซถgeolocation(string) โ controls website access to the geolocation API. Your choices:always,never, orask(which displays a prompt each time) ๐media(bool) โ enable or disable all media support. When disabled, WebKitGTK will not attempt to play any audio or video content, which can be useful on systems where GStreamer is not fully configured, or to prevent crashes caused by missing GStreamer plugins (such asautoaudiosink) ๐media-playback-allows-inline(bool) โ whether media playback is full-screen only or inline playback is allowed. Setting it tofalseallows specifying that media playback should always be fullscreen.media-playback-requires-user-gesture(bool) โ whether a user gesture (such as clicking the play button) is required to start media playback or load media. Setting it on requires a gesture by the user to start playback, or to load the media ๐media-stream(bool) โ enable or disable support for MediaSource on pages. MediaSource is an experimental proposal which extends HTMLMediaElement to allow JavaScript to generate media streams for playback ๐mediasource(bool) โ enable or disable support for MediaSource on pages. MediaSource is an experimental proposal which extends HTMLMediaElement to allow JavaScript to generate media streams for playback. (Yes, it says the same thing asmedia-streamโ they're twins, we love them both equally ๐)minimum-font-size(int) โ the minimum font size used to display text. No more squinting, periodt.monospace-font(string) โ the font family that gets used as the default for anything using a monospace font. code vibes only ๐ปmonospace-font-size(int) โ the default font size for that monospace font.notification(string) โ controls whether websites can touch the notification API, the one that fires notifications off via dbus. the options arealways,never, andask(which means it shows you a prompt every single time, bestie ๐ซถ).print-backgrounds(bool) โ whether background images should actually get drawn during printing.prevent-newwindow(bool) โ whether links that would normally pop open in a new tab just open in the current tab instead. heads up: this option does not affect links fired by hinting, so don't come for me.sans-serif-font(string) โ the font family used as the default for content in sans-serif font.scripts(bool) โ literally decides whether JavaScript executes inside a page or not. that's it, that's the whole thing ๐scroll-step(int) โ how many pixelsvimbscrolls when you hit'j'or'k'.scroll-multiplier(int) โ a multiplier that bumps up the scroll distance when the window gets scrolled by the mouse wheel. scroll girlies rise ๐ฑ๏ธserif-font(string) โ the font family used as the default for content in serif font.show-titlebar(bool) โ determines whether the titlebar is shown (on systems that provide window decoration, so like, some of them). defaults totrue.site-specific-quirks(bool) โ enables the site-specific compatibility workarounds. the "this site is weird and we're handling it" switch โจsmooth-scrolling(bool) โ enable or disable support for smooth scrolling.spatial-navigation(bool) โ whether to enable Spatial Navigation. this feature is all about being able to navigate between focusable elements in a web page โ hyperlinks, form controls, that kind of thing โ by using the Left, Right, Up and Down arrow keys. so if you press Right, heuristics figure out whether there's an element you might be reaching toward on the right, and if there's more than one candidate, which element you probably actually want. lowkey genius ๐งญspell-checking(bool) โ enable or disable the spell checking feature.spell-checking-languages(string) โ sets a comma separated list of spell checking languages used for spell checking. the locale string is typically in the form lang_*COUNTRY*, where lang is an ISO-639 language code and COUNTRY is an ISO-3166 country code. for instancesv_FIfor Swedish as written in Finland, orpt_BRfor Portuguese as written in Brazil ๐status-bar(bool) โ indicates if the status bar should be shown.status-bar-show-settings(bool) โ whether to show settings on the status bar. this puts some runtime settings that were specified at compile time on the right hand side of the status bar. cute little flex ๐status-css(string) โ CSS style applied to the status bar on none https pages.status-ssl-css(string) โ CSS style applied to the status bar on https pages with a trusted certificate. green flag energy โstatus-ssl-invalid-css(string) โ CSS style applied to the status bar on https pages with an untrusted certificate. ๐ฉstrict-ssl(bool) โ if'on', vimb will not load an untrusted https site. periodt, no exceptions.stylesheet(bool) โ if'on', the user defined styles-sheet is used.tabs-to-links(bool) โ whether the Tab key cycles through elements on the page.
if true, pressing Tab focuses the next element in the web view. otherwise the web view just interprets Tab key presses as normal key presses โ and if the selected element is editable, Tab will insert an actual Tab character. two very different lives, honestly ๐ญ
timeoutlen(int) โ the time in milliseconds that's waited for a key code or a mapped key sequence to complete. the "how long do I hold the door open for you" of keybindings โณuser-agent(string) โ the user-agent string used by WebKit.user-scripts(bool) โ if'on', the user scripts get injected into every page.webaudio(bool) โ enable or disable support for WebAudio on pages. WebAudio is an experimental proposal for allowing web pages to generate Audio WAVE data from JavaScript. experimental!! so like, keep that in mind bestie ๐งwebgl(bool) โ enable or disable support for WebGL on pages.webinspector(bool) โ determines whether or not developer tools, such as the Web Inspector, are enabled. dev girlies stay winning ๐x-hint-command(string) โ the command used if hint mode;xis fired. it can be any vimb command string. note that the command gets run through the mapping mechanism of vimb, so it might change the behaviour by adding or changing mappings. iykyk.
:set x-hint-command=:sh! curl -e <C-R>% <C-R>;
this fills the inputbox with the prefilled download command and replaces <C-R>%' with the current URI and <C-R>;' with the URI of the hinted element. so good.
:nnoremap ;f :set x-hint-command=:sh! firefox '<C-R>;<CR><CR>;x
this makes the key sequence ";f" start hinting and then open the hinted URI in firefox. literally iconic ๐ฅ
๐ FILES ๐
$XDG_CONFIG_HOME/vimb[/PROFILE]โ directory for configuration data. if executed with-pPROFILE parameter, configuration is read from this subdirectory.configโ Ex commands from this file are executed on startup.scripts.jsโ this file can be used to run user scripts, which get injected into every page that gets opened.style.cssโ file for userdefined CSS styles. these files are used if the config variablestylesheetis enabled.
$XDG_DATA_HOME/vimb[/PROFILE]โ directory for runtime data. if executed with-pPROFILE parameter, data files are written from this subdirectory.cookies.dbโ Sqlite cookie storage. this file will not be touched if option--incognitois set. ๐ฅธclosedโ holds the URIs of last closed browser windows. this file will not be touched if option--incognitois set.historyโ this file holds the history of unique opened URIs. this file will not be touched if option--incognitois set.bookmarkโ this file holds the list of bookmarked URIs with tags.commandโ this file holds the history of commands and search queries performed via input box. this file will not be touched if option--incognitois set.queueโ holds the read it later queue filled byqpush.searchโ this file holds the history of search queries. this file will not be touched if option--incognitois set.
ok so the theme here is that --incognito keeps its hands off like five separate files. respect the privacy bestie ๐
๐ ENVIRONMENT ๐
http_proxy,HTTP_PROXYโ if either environment variable is non-empty, the specified host and optional port is used to tunnel requests. for example:HTTP_PROXY=localhost:8118.
๐ REPORTING BUGS ๐
found a bug? report bugs to the main project page on https://github.com/fanglingsu/vimb/issues or on the mailing list https://lists.sourceforge.net/lists/listinfo/vimb-users. we love a paper trail โจ
๐ AUTHOR ๐
Daniel Carl โ that's the main character right there ๐ซถ
and that's the whole page, bestie, we made it to the end ๐ this is vimb/4.0.0, dated 09 2026, section VIMB(1) โ go forth and browse, you're literally so good at this now ๐๐ฆ๐ธ
๐ฆ where this page comes from
- arch rolling: vimb 4.0.0-1 ยท GPL-3.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms