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, --cmd CMD โ€” 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, --config FILE โ€” use a custom configuration given as FILE. And no worries, this also gets applied to any newly spawned instances. โœจ
  • -e, --embed WINID โ€” [DEPRECATED - GTK4 removed XEmbed support]. This option is no longer functional. GTK4 removed the GtkPlug/GtkSocket XEmbed 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, --profile PROFILE-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 with gi.
  • 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.
  • o โ€” Start Command Mode and print :open to the input box. Yes, with the trailing space.
  • O โ€” Start Command Mode and print :open URI to the input box.
  • t โ€” Start Command Mode and print :tabopen to the input box. Trailing space again, iconic.
  • T โ€” Start Command Mode and print :tabopen URI to 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 register x or, if not given, from the clipboard.
  • ["x]P โ€” Open the URI out of the register x or, if not given, from the clipboard in a new tab.
  • [N]CTRL-O โ€” Go back N steps in the browser history.
  • [N]CTRL-I โ€” Go forward N steps in the browser history.
  • [N]gu โ€” Go to the Nth 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 :qpush command.

๐ŸŒˆ Motion ๐ŸŒˆ

  • [N]CTRL-F โ€” Scroll N pages down.
  • [N]CTRL-B โ€” Scroll N pages up.
  • [N]CTRL-D โ€” Scroll N half pages down.
  • [N]CTRL-U โ€” Scroll N half pages up.
  • [N]gg โ€” Scroll to the top of the current page. Or if N is given, to N% of the page.
  • [N]G โ€” Scroll to the bottom of the current page. Or if N is given, to N% of the page.
  • 0, ^ โ€” Scroll to the absolute left of the document. Unlike in Vim, 0 and ^ work exactly the same way.
  • $ โ€” Scroll to the absolute right of the document.
  • [N]h โ€” Scroll N steps to the left of page.
  • [N]l โ€” Scroll N steps to the right of page.
  • [N]j โ€” Scroll page N steps down.
  • [N]k โ€” Scroll page N steps 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 last m' 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 ;o hint mode.
  • F โ€” Is an alias for the ;t hint 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 configured download-path.
  • ;O โ€” Generate an :open prompt with hintโ€™s URI.
  • ;T โ€” Generate an :tabopen prompt 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 :qpush command. This is only available if Vimb was compiled with the QUEUE feature.
  • ;P โ€” Push the hintโ€™s URI to the beginning of the Read It Later queue like the :qunshift command. This is only available if Vimb was compiled with the QUEUE feature.
  • ;x โ€” Hints like ;o, but instead of opening the hinted URI, the x-hint-command is run in Vimb.
  • ["x];y โ€” Yank hintโ€™s destination location into primary and secondary clipboard and into the register x.
  • ["x];Y โ€” Yank hintโ€™s text description or form text into primary and secondary clipboard and into the register x.

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 by N steps.
  • [N]zo โ€” Zoom-Out the text of the page by N steps.
  • [N]zI โ€” Full-Content Zoom-In the page by N steps.
  • [N]zO โ€” Full-Content Zoom-Out the page by N steps.
  • zz โ€” Reset Zoom.

๐Ÿ“ Yank ๐Ÿ“

  • ["x]y โ€” Yank the URI or current page into register x and clipboard.
  • ["x]Y โ€” Yank the current selection into register x and 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.

  • autocmd
  • cmap, cnoremap, imap, inoremap, nmap, nnoremap
  • eval
  • normal
  • open, tabopen
  • shellcmd, shellex

โŒจ๏ธ Command Line Editing โŒจ๏ธ

  • <Esc>, CTRL-[, CTRL-C โ€” Ignore all typed content and switch back to normal mode.
  • <CR> โ€” Submit the entered ex command 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 x and 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} โ€” matches one or two. 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} โ€” adds cmd to the list of commands Vimb will execute automatically on event for a URI matching pat (see autocmd-patterns). Vimb always adds the cmd after 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 with event whose patterns match pat, and adds the command cmd. โš ๏ธ note that the pattern is not matched literally to find autocommands to remove, like Vim does. Vimb matches the autocommand pattern with pat. if [group] is not given, it deletes autocommands in the current group, as noted above.
  • :au[tocmd]! [group] {event} {pat} โ€” removes all autocommands associated with event and which pattern matches pat in the given group (current group by default).
  • :au[tocmd]! [group] * {pat} โ€” removes all autocommands with patterns matching pat for all events in the given group (current group by default).
  • :au[tocmd]! [group] {event} โ€” removes all autocommands for event in 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 :autocmd commands. the name end selects 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 a timespan is given. lowkey important.
  • hsts-cache โ€” HTTP Strict Transport Security cache.
  • - โ€” can be used to clear all known data types in case a timespan is used.

The timespan is given as a sequence of '[multiplier]unit' tupels with these units:

  • y โ€” year (365 days)
  • w โ€” week (7 days)
  • d โ€” day
  • h โ€” hour
  • m โ€” minute
  • s โ€” 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 "a to "z. Vimb fills these registers only when you say so.
  • ": โ€” last executed ex command.
  • "" โ€” 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.

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 are always, never, or origin (which accepts all non-third-party cookies) ๐Ÿช
  • closed-max-items (int) โ€” max number of stored last closed URLs. Set it to 0 and 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 spelled cursiv-font โ€” that's canon, don't come for me ๐Ÿ™ˆ)
  • dark-mode (bool) โ€” whether to enable dark mode. Websites can use the prefers-color-scheme media 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 is 100.
  • download-command (string) โ€” a command with placeholder %s that 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 :shellex command 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 %s called if a form field is opened with $EDITOR, to spawn the editor โ€” like x-terminal-emulator -e vim %s. To use Gvim as the editor, it's necessary to call it with -f so 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 is name[=[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 to 0 โฐ
  • 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 as asdfg;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. If history-max-items is set to 0, the history file will not be changed. This setting has no effect if option --incognito is 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, or ask (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 as autoaudiosink) ๐Ÿ”‡
  • media-playback-allows-inline (bool) โ€” whether media playback is full-screen only or inline playback is allowed. Setting it to false allows 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 as media-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 are always, never, and ask (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 pixels vimb scrolls 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 to true.
  • 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 instance sv_FI for Swedish as written in Finland, or pt_BR for 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 ;x is 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 -p PROFILE 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 variable stylesheet is enabled.
  • $XDG_DATA_HOME/vimb[/PROFILE] โ€” directory for runtime data. if executed with -p PROFILE parameter, data files are written from this subdirectory.
    • cookies.db โ€” Sqlite cookie storage. this file will not be touched if option --incognito is set. ๐Ÿฅธ
    • closed โ€” holds the URIs of last closed browser windows. this file will not be touched if option --incognito is set.
    • history โ€” this file holds the history of unique opened URIs. this file will not be touched if option --incognito is 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 --incognito is set.
    • queue โ€” holds the read it later queue filled by qpush.
    • search โ€” this file holds the history of search queries. this file will not be touched if option --incognito is 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