vifm-lua.txt    For Vifm version 1.0  Last change: 2025 Mar 22

 Email for bugs and suggestions: <xaizek@posteo.net>

Note: this is very much work in progress.  Everything can change up to
complete removal of this interface (that's an unlikely scenario though).

Current API version: v0.2.0

vifm-lua-status      Status of plugins.
vifm-lua-plugins     Sample plugins.
vifm-lua-why         Generic reasoning behind this API.
vifm-lua-design      Generic ideas about the design.
vifm-lua-evolution   Plans on Lua API.
vifm-lua-loading     Which plugins get loaded.
vifm-lua-libs        What Lua libraries are available.
vifm-lua-handlers    Lua handlers concept.
vifm-lua-events      Description of event types.
vifm-lua-caps        What using Lua in Vifm buys you.
vifm-lua-api         Root-level API.
vifm-l_vifm          vifm global table.
vifm-l_vifm.abbrevs  vifm.abbrevs global table.
vifm-l_vifm.cmds     vifm.cmds global table.
vifm-l_vifm.events   vifm.events global table.
vifm-l_vifm.fs       vifm.fs global table.
vifm-l_vifm.keys     vifm.keys global table.
vifm-l_vifm.menus    vifm.menus global table.
vifm-l_vifm.opts     vifm.opts global table.
vifm-l_vifm.plugin   vifm.plugin global table.
vifm-l_vifm.plugins  vifm.plugins global table.
vifm-l_vifm.sb       vifm.sb global table.
vifm-l_vifm.sessions vifm.sessions global table.
vifm-l_vifm.tabs     vifm.tabs global table.
vifm-l_vifm.version  vifm.version global table.
vifm-l_VifmEntry     VifmEntry type.
vifm-l_VifmJob       VifmJob type.
vifm-l_VifmTab       VifmTab type.
vifm-l_VifmView      VifmView type.
vifm-lua-index       Index of all Vifm entities in the API.

--------------------------------------------------------------------------------
vifm-lua-status

Pre-pre-alpha.  Just figuring out the basics, trying things out and shaping
the design.  API is nowhere near being complete and there are some weird
ideas which can significantly affect their structure.

There is no manual page that corresponds to this document.  Rather significant
changes are expected, so until things stabilize, only one version will be
maintained.

--------------------------------------------------------------------------------
vifm-lua-plugins

Since API is not stable at all, example plugins are stored in code repository
of Vifm and are thus bound to corresponding revision of the application.

--------------------------------------------------------------------------------
vifm-lua-why

Think of Lua API as a way to reach deeper into the internals of Vifm.  This
isn't a replacement of existing functionality, but a richer way of interacting
with the core behind it.

One of the primary motivations were deficiencies in integrations with external
applications.  Communicating results of calling them back to Vifm was
problematic, there was simply no good way of doing it reliably.

Regular :commands are a form of user-interface by design, which has various
implications that limit their abilities.  For example, you can't reliably check
if a command succeeded and different commands treat same arguments differently
for the purpose of ease of use, which however makes automation harder.  When
things like that start to get in the way, it's a good idea to reimplement
relevant functionality in Lua.

On top of that users' preferences differ and contradict each other, this can
lead to proliferation of options to account for very fine-grained details.
It's better to let users implement their wild and highly specific ideas on their
own rather than trying to squeeze all possible use case into the application.
The useful functionality developed on the side can eventually make its way to
the code base.

--------------------------------------------------------------------------------
vifm-lua-design

The intent is for Lua to be a way of extending the core.  It's not meant
neither as a replacement of :commands nor as a continuation of it.  Instead
it's supposed to be a more low-level way of interacting with the core and
extending it.

One implication is that there is no builtin way of calling Lua from :commands
or vice versa.  This gets too ugly too quickly, hence they are separated except
for certain well-defined extension points where Lua parts integrate with
:commands.

Therefore one should think of :commands as a user-facing interface and Lua
part as an internal extension language with wider range of possibilities.

Callback safety

Whenever Vifm invokes a Lua function from C code, there is a danger that Lua
will break some invariant.  To account for this, all API calls (including
things like table indexing) are classified as either "safe" or "unsafe".
Safe ones can be called from anywhere, but unsafe API is not always
accessible.  As an example, you can't change directory of any view or add a
view column from a view column handler.

Unsafe API is marked with {unsafe} in its description.  If description of a
handler doesn't say that it's run in a safe environment, it can use unsafe API
as well.  In order to allow use of unsafe API, an execution of a handler might
be postponed until Vifm reaches a state where it holds the least amount of
assumptions about what's going on, such handlers are marked as {delayed}.

--------------------------------------------------------------------------------
vifm-lua-evolution

Lua version is fixed at 5.4 and is bundled as part of Vifm to avoid plugin
compatibility issues.

At the moment API can change, but the idea is to figure out key principles of
organization, kinds of entities, naming strategy, ways to extend, etc. and
fix them.  Initial stable version of the API doesn't need to be exhaustive,
just sensible and relatively future proof.  Future releases should extend
functionality rather than change it (unless absolutely necessary).  Doing this
needs usage cases along with success and failure stories, so feedback is
welcome.

Current design principles:
 1. Callbacks in Lua accept a table and return one (if they return anything).
    This allows adding new fields to both input and output while staying
    backward compatible and readable at the cost of being a bit more verbose.

Random ideas

Use camelCase?
Use tables more often?  Supposed to be more extensible.
Make "description" a required argument?

Add VifmJob:succeeded() ?
Add VifmJob:haserrors() ?

Map options to arrays when possible, like for set options ?
Forbid use of option abbreviations ?
Technically options are also part of user-interface and maybe shouldn't be
exposed in this way.

--------------------------------------------------------------------------------
vifm-lua-loading

There are two lists of plugins that affect plugin loading: whitelist and
blacklist.  Here's how they function:
 1. If whitelist isn't empty, only plugins in the list can be loaded.  Trying to
    load any other plugin fails.  Contents of blacklist is ignored.
 2. If whitelist is empty and blacklist isn't, loading anything that's not in
    the blacklist is allowed.

The whitelist is meant to help testing plugins in isolation for debugging
purposes.

The blacklist can be used to temporarily disable broken or just unused plugins
as well as for debugging.

--------------------------------------------------------------------------------
vifm-lua-libs

The following standard libraries are enabled:
 * basic (core global functions)
 * table manipulation (tbl table)
 * package library (require global and package table)
 * string manipulation (string table)
 * input and output (io table)
 * mathematical functions (math table)
 * time subset of OS facilities (clock, date, difftime and time
   elements) and tmpname of os table

--------------------------------------------------------------------------------
vifm-plugins

Loading of plugins is performed after processing contents of vifm-vifmrc.
Plugins are searched in the directories specified via vifm---plugins-dir
command-line option and the last specified directory is searched first.  Then
$VIFM/plugins/ is enumerated in search of plugins.  Directories or symbolic
links to directories are considered as candidates.  Those starting with a dot
are ignored.

For example, running Vifm like

  vifm --plugins-dir dirA --plugins-dir ~/dirB

results in search for plugins in this order of directories:
 1. $PWD/dirA
 2. ~/dirB
 3. $VIFM/plugins
The order matters as it defines which of the conflicting plugins gets
loaded (see below on name conflicts).  Such an ordering allows shadowing
plugins from default location.

Implications of the default order of initialization:
 * :commands defined in configuration have precedence over :commands defined by
   plugins
 * :commands from plugins can't be used during startup

You can load plugins explicitly by calling :plugin load command inside
vifm-vifmrc.  From then on things defined by plugins can be used in
configuration.

All plugins are required to contain init.lua file at their root.  This file
gets processed and its return value is interpreted as plugin data.  The return
value must be a table.  The table is stored in a vifm.plugins.all dictionary
with a key that corresponds to the plugin's name.  At the moment the name of a
plugin is the name of its directory.  Name of a plugin must be unique (names
that differ by only by case are considered unique) or loading it will be
skipped.

Global variables created by one plugin are local to that plugin and won't
affect or be visible to other plugins.

--------------------------------------------------------------------------------
vifm-lua-handlers

Lua handlers are extension points within existing command-system of Vifm
which enable invoking plugin functionality in a well-defined manner.

A handler is a named Lua function, which is registered via a call to
vifm-l_vifm.addhandler().  The call specifies "partial name" which is
prepended with a namespace ("#pluginname#" string) behind the scenes to form
a full name.  This is done to avoid conflicts between plugins.

The scope of handlers is limited to extensions that accept and return all
relevant information on each invocation.  Things like keys or commands can't
be handled this way because they need to communicate metadata about how to
call them.

Handlers are executed in a safe environment and can't call API marked as
{unsafe}.

A handler can be used in place of an external program in vifm-:filetype or
vifm-:filextype commands like this:
  filetype {*.png} #pluginname#open

A handler can be used in place of an external viewer in vifm-:fileviewer
command like this:
  fileviewer {*.vim} #pluginname#view --strip-comments %c

A viewer can also be called through vifm-%q:
  :!#pluginname#something %q

A handler can be used to generate vifm-'statusline' or vifm-'tabline'
value like this:
  set statusline=#pluginname#statusline
  set tabline=#pluginname#tabline

Below is a specification of input and output for different kinds of handlers.

:filetype or :filextype handler

Fields of {info} argument for {handler}.handler for :file[x]type:
 - "command" (string)
   Command which handles the file.
 - "entry" (table)
   Information about a file list entry as an instance of vifm-l_VifmEntry.

There is no return value.

:fileviewer handler

Fields of {info} argument:
 - "command" (string)
   Command with which the viewer was invoked.
 - "path" (string)
   Path to the file which is being viewed.
 - "x" (integer)
   X coordinate of the preview area in characters.
 - "y" (integer)
   Y coordinate of the preview area in characters.
 - "width" (integer)
   Width of the preview area in characters.
 - "height" (integer)
   Height of the preview area in characters.

Fields of returned table:
 - "lines" (array of strings)
   Preview text.

'statusline' handler

Fields of {info} argument:
 - "view" (vifm-l_VifmView)
   Current view.
 - "width" (integer)
   Width of the status line.

Fields of returned table:
 - "format" (string)
   Value for vifm-'statusline'.

'tabline' handler

Fields of {info} argument:
 - "other" (boolean)
   Whether this is for the tabline of inactive pane in case of pane tabs.
 - "width" (integer)
   Width of the tab line.

Fields of returned table:
 - "format" (string)
   Value for vifm-'tabline'.

'vicmd' or 'vixcmd' handler

Editor is invoked by Vifm in several different contexts with generally
different input data and sometimes different expectations (like waiting until
editing is finished).  This is why a handler needs to process several kinds of
actions which correspond to those contexts.

Format of returned table is currently the same for all actions:
 - "success" (boolean)
   Whether opening editor was successful.  If we're interested in the result
   of editing (e.g., for bulk renaming), success condition also implies
   receiving non-zero exit code from the editor.

There is also common field of the input table:
 - "command" (string)
   Command specified in one of the options.

"open-help" action

Occurs on vifm-:help command if vifm-'vimhelp' is set.  Should open
documentation in Vim's format and position cursor at the specified topic (help
tag).

Fields of {info} argument:
 - "action" (string)
   "open-help" string.
 - "topic" (string)
   Help topic (help tag).
 - "vimdocdir" (string)
   Path to parent of doc/ directory with documentation in Vim format with tags
   file.

"edit-one" action

Occurs on:
 - vifm-:help command if vifm-'vimhelp' is unset
 - pressing vifm-v_v key in view mode
 - opening file from a menu
 - opening file with a FUSE mounter using vifm-i
 - using vifm-q:, vifm-q/ and vifm-q? commands in normal mode
 - requests to provide file names (like on :copy? or vifm-:rename)

Should open single file at an optionally specified location (line, column) and
support waiting until editing has finished.

Fields of {info} argument:
 - "action" (string)
   "edit-one" string.
 - "path" (string)
   Path to the file to open.
 - "mustwait" (boolean)
   Whether handler must not return until editor has exited.
 - "line" (integer) (optional)
   Line number at which to open the file.
 - "column" (integer) (optional)
   Column number at which to open the file.  Present only if "line" field is
   present.

"edit-many" action

Occurs on:
 - opening selection or current file on vifm-Enter key in normal mode
 - using vifm-:edit command

Should open one or multiple files in an editor, likely as a list of buffers or
tabs.

Fields of {info} argument:
 - "action" (string)
   "edit-many" string.
 - "paths" (array of strings)
   Paths to the files to open.

"edit-list" action

Occurs on pressing vifm-m_v key in view mode.  Should open list of files or
quickfix entries in an editor as a navigation list.

Fields of {info} argument:
 - "action" (string)
   "edit-list" string.
 - "current" (integer)
   Position of the current entry.
 - "entries" (array of strings)
   List of entries to pass to an editor.
 - "isquickfix" (boolean)
   Whether input entries are of the form "path[:line[:column]][:text]".
   Because such lists come from external tools, this information is determined
   using a simple heuristic and might not always be correct.

--------------------------------------------------------------------------------
vifm-lua-events

These are types of events that can be subscribed to via
vifm-l_vifm.events.listen().

                                               vifm-lua-event-app.exit
"app.exit" event

Occurs before Vifm exits normally.  Does not happen on vifm-:restart.

                                               vifm-lua-event-app.fsop
"app.fsop" event

Occurs after a successful execution of a file-system operation.

Fields of the only table parameter:
 - "op" (string)
   Type of an operation (see below for a list).
 - "path" (string)
   Source path or the only path affected by the operation.
 - "target" (string) (optional)
   Destination path or target of a symbolic link.
 - "isdir" (boolean)
   Whether operation is performed on a directory.
 - "fromtrash" (boolean) (optional)
   "move" operation sets the flag if "path" points inside a trash directory,
   meaning that file was restored or otherwise moved from trash.
 - "totrash" (boolean) (optional)
   "move" operation sets the flag if "target" points inside a trash directory,
   meaning that file was deleted to trash.

Operation types:
 - "copy"
   Copying a file/directory from one location to another.
 - "create"
   Creation of a file/directory.
 - "move"
   Moving a file/directory from one location to another.  Includes renames,
   moves across partition boundaries, deletion to trash and moving out of
   trash.
 - "remove"
   Removal of a file/directory.  This includes symbolic link removal on
   changing its target.
 - "symlink"
   Creation of a symbolic link, which might be a second step of updating its
   target.

The list of operations isn't complete, to be extended as needed.

Operations performed in background aren't reported.

Note: a bulk rename that contains a cycle ("a" -> "b" -> "a" being the
shortest one) will be reported the way it's performed, that is including
temporary renames (e.g., "a -> a_", "b -> a", "a_ -> b").

--------------------------------------------------------------------------------
vifm-lua-caps

This is what one can do by using Lua at the moment:
 * :commands in Lua with completion (vifm-l_vifm.cmds)
 * save and reset options (e.g., some kind of presets) (vifm-l_vifm.opts)
 * custom columns (vifm-l_vifm.addcolumntype())
 * :filetype/:filextype/:fileviewer/%q handlers in Lua (vifm-lua-handlers)
 * 'statusline' and 'tabline' generators in Lua (vifm-lua-handlers)
 * fully integrate an arbitrary editor by changing vifm-'vicmd' or vifm-'vixcmd'
   (vifm-lua-handlers), while builtin logic assumes compatibility with Vim
 * starting background jobs that appear on a job bar (vifm-l_vifm.startjob())
 * starting background jobs to do something when they're over (see "onexit" of
   vifm-l_vifm.startjob())
 * defining custom keys and selectors (vifm-l_vifm.keys.add())
 * defining custom command-line abbreviations (vifm-l_vifm.abbrevs.add())
 * running code before exit and when a file operation is done (vifm-lua-events)

--------------------------------------------------------------------------------
vifm-lua-api

Builtin print() function puts messages to plugin's log (see vifm-:plugins
menu).

All API calls can raise errors:
 * on generic internal issues (like out of memory)
 * when argument is missing
 * when argument has wrong type
 * when required table key is missing
 * when table key has wrong type
 * if the API call is unsafe and is disallowed in current environment

Indices passed in or returned by the API start at 1 as arrays do in Lua.

The following callbacks can perform only safe API calls:
 * all Lua handlers (vifm-lua-handlers)
 * view column handlers (vifm-l_vifm.addcolumntype())

Interaction with the host happens through vifm global table.  See vifm-l_vifm.

--------------------------------------------------------------------------------
vifm-l_vifm

Global vifm table is the entry-point to the API.

vifm.abbrevs
Table for managing command-line abbreviations.  See vifm-l_vifm.abbrevs.

vifm.cmds
Table for managing command-line commands.  See vifm-l_vifm.cmds.

vifm.events
Table for dealing with events.  See vifm-l_vifm.events.

vifm.fs
Table for basic/low-level file-system operations.  See vifm-l_vifm.fs.

vifm.keys
Table for managing keys.  See vifm-l_vifm.keys.

vifm.menus
Table for managing menus.  See vifm-l_vifm.menus.

vifm.opts
Table for managing options.  See vifm-l_vifm.opts.

vifm.plugin
Table that provides API service for this plugin.  See vifm-l_vifm.plugin.

vifm.plugins
Table for managing plugins.  See vifm-l_vifm.plugins.

vifm.sb
Table for managing status bar.  See vifm-l_vifm.sb.

vifm.sessions
Table for managing sessions.  See vifm-l_vifm.sessions.

vifm.tabs
Table for managing tabs.  See vifm-l_vifm.tabs.

vifm.version
Table with version information.  See vifm-l_vifm.version.

vifm.addcolumntype({column})                   vifm-l_vifm.addcolumntype()
Registers a new view column type to be used in vifm-'viewcolumns' option.

Possible fields of {column}:
 - "name" (string)
   Name of the command.  Must consist of Latin characters and not start with
   the lower case one (those are reserved for builtin columns).
 - "handler" (function)
   Handler which accepts {info} and returns a table.  See below.
 - "isprimary" (boolean) (default: false)
   Whether this column is highlighted with file color and search match
   is highlighted as well.

{column}.handler is executed in a safe environment and can't call API marked
as {unsafe}.

Fields of {info} argument for {column}.handler:
 - "entry" (table)
   Information about a file list entry as an instance of vifm-l_VifmEntry.
 - "width" (table)
   Calculated width of the column.

Fields of table returned by {column}.handler:
 - "text" (string)
    Table cell's value as a string or convertible to it.
 - "matchstart" (integer) (default: 0)
    For a search match this is the end position of a substring found in
    entry's name, zero otherwise.
 - "matchend" (integer) (default: 0)
    For a search match this is the end position of a substring found in
    entry's name, zero otherwise.

Return:
  true if column was added.

Raises an error:
  If {column}.name has incorrect value.

vifm.addhandler({handler})                     vifm-l_vifm.addhandler()
Registers a new handler that will be accessible in viewers.  See
vifm-lua-handlers for general description and details about specific
use-cases.

Possible fields of {handler}:
 - "name" (string)
   Partial name of the handler.  Must not contain any spaces.  Can be
   #-separated list of names, e.g. "view#pdf".
 - "handler" (function)
   Handler which accepts {info} and returns a table.  See below.

Return:
  true if handler was added, false if a handler with such name already
  exists.

Raises an error:
  If {handler}.name has incorrect value.

vifm.currview()                                vifm-l_vifm.currview()
Retrieves a reference to active view.

Return:
  Returns an instance of vifm-l_VifmView.

vifm.otherview()                               vifm-l_vifm.otherview()
Retrieves a reference to inactive view.

Return:
  Returns an instance of vifm-l_VifmView.

vifm.errordialog({title}, {msg})               vifm-l_vifm.errordialog()
Displays error dialog.

Parameters:
  {title}  Title of the dialog.
  {msg}    Contents of the dialog.

vifm.expand({str})                             vifm-l_vifm.expand()
Expands environment variables and macros in a string.

Parameters:
  {str}  String to expand.

Return:
  Expanded string.

vifm.fnamemodify({path}, {mods}[, {base}])     vifm-l_vifm.fnamemodify()
Changes path according to modifiers.

Parameters:
  {path}  Path to modify.
  {mods}  Modifiers to apply (:p, :t, etc.).
  {base}  Base directory for relative paths.
          Default: path of active pane.

Return:
  Modified path.

vifm.escape({what})                            vifm-l_vifm.escape()
Escapes input to make it suitable for use in an external command for current
value of vifm-'shell'.

Parameters:
  {what}  String to escape.

Return:
  Modified path.

vifm.executable({what})                        vifm-l_vifm.executable()
If {what} is absolute or relative path, checks whether it exists and refers to
an executable, otherwise checks whether command named {what} is present in
directories listed in $PATH.  Checks for various executable extensions on
Windows.

Parameters:
  {what}  Path or command name to check.

Return:
  true if an executable was found.

vifm.exists({path})                            vifm-l_vifm.exists()
Checks existence of a path without resolving symbolic links.

Parameters:
  {path}  Path to check.

Return:
  true if path exists.

vifm.makepath({path})                          vifm-l_vifm.makepath()
Creates target path and missing intermediate directories.

This is {deprecated}.  See vifm-l_vifm.fs.mkdir() instead.

Parameters:
  {path}  Path to create.

Return:
  true on success.  Trying to create path that already exists is not
  considered to be an error.

vifm.run({info})                               vifm-l_vifm.run()
Runs an external command similar to vifm-:!.  Waits for it to finish if
terminal multiplexer is not involved.

Command is dispatched via a shell, but vifm-'shellcmdflag' is always
ignored.

Possible fields of {info}:
 - "cmd" (string)
   Command to execute.
 - "pause" (string) (default: "onerror")
   When to pause after command execution: "never", "onerror", "always".
 - "usetermmux" (boolean) (default: true)
   Whether to open terminal multiplexer if support was enabled via
   vifm-:screen.

Parameters:
  {info}  Table with information about what and how to run.

Return:
  Exit code of the command, see vifm-l_VifmJob:exitcode() for details.
  Mind that if terminal multiplexer is used, this will be exit code of a
  command that communicates with the multiplexer.

Raises an error:
  If {info}.pause has incorrect value.

vifm.startjob({job})                           vifm-l_vifm.startjob()
Launches an external command as a background job.  Returns without waiting
for it to finish.

Command is dispatched via a shell, but vifm-'shellcmdflag' is always
ignored.

Possible fields of {job}:
 - "cmd" (string)
   Command to execute.
 - "description" (string) (default: "")
   Description of the job to be displayed on the job bar (when "visible" key
   is set to true).
 - "iomode" (string) (default: "r")
   Specifies mode of interaction with the job:
    - "r" - reading output of the process (see vifm-l_VifmJob:stdout())
    - "w" - providing input to the process (see vifm-l_VifmJob:stdin())
    - ""  - no I/O interaction
 - "onexit" (function) (default: nil)
   Handler to invoke when the job is done, gets the job as its only parameter.
   The handler is {delayed}.
 - "mergestreams" (boolean) (default: false)
   Whether to merge error stream of the command with its output stream.
 - "pwd" (string) (default: ".")
   Working directory of the new process.
 - "visible" (boolean) (default: false)
   Whether to show this job on a job bar.

Parameters:
  {job}  Table with information about a job.

Return:
  Returns an instance of vifm-l_VifmJob.

Raises an error:
  If "iomode" has incorrect value.
  If "pwd" doesn't specify an existing path.

vifm.stdout()                                  vifm-l_vifm.stdout()
Retrieves stream to which Vifm's standard stream was redirected.

Return:
  The stream that can't be closed or nil if output stream wasn't redirected
  to a TTY (character device on Windows).  In the former case the same stream
  is returned on each call.

vifm.input({info})                             vifm-l_vifm.input()
Prompts user for input via command-line prompt.

Possible fields of {info}:
 - "prompt" (string)
   Prompt invitation.
 - "initial" (string) (default: "")
   Initial input for the prompt.
 - "complete" (string) (default: "")
   How to complete input: "dir" (directories only), "file" (files and
   directories), "" (no completion).

Parameters:
  {info}  Table with information about the prompt.

Return:
  String on success or nil if the prompt was cancelled.

Raises an error:
  If {info}.complete has incorrect value.

--------------------------------------------------------------------------------
vifm-l_vifm.abbrevs

This global vifm.abbrevs table provides means of managing command-line
abbreviations.

vifm.abbrevs.add({abbrev})                     vifm-l_vifm.abbrevs.add()
Registers a new command-line abbreviation.

Possible fields of {abbrev}:
 - "lhs" (string)
   Left-hand side of the abbreviation.
 - "description" (string) (default: "")
   Description of the abbreviation.
 - "noremap" (boolean) (default: true)
   Whether to ignore user mappings in "rhs" during expansion.
 - "handler" (function)
   Handler which accepts {info} and returns {results}.

{abbrev}.handler is executed in a safe environment and can't call API marked
as {unsafe}.

Fields of {info} argument for "handler":
 - "lhs" (string)
   Left-hand side of the abbreviation.

Fields of {results} return value of "handler":
 - "rhs" (string)
   Right-hand side of the abbreviation.
In case of inappropriate {results}, the abbreviation won't be expanded.

This function is {unsafe}.

Parameters:
  {abbrev}  Table with information about an abbreviation.

Return:
  true on success.

--------------------------------------------------------------------------------
vifm-l_vifm.cmds

This global vifm.cmds table provides means of managing command-line commands.

vifm.cmds.add({cmd})                           vifm-l_vifm.cmds.add()
Registers a new :command of a kind that's equivalent to builtin commands.

The word "parsing" below refers to processing of command-line arguments like
removal of slashes used for escaping and skipping whitespace.

Possible fields of {cmd}:
 - "name" (string)
   Name of the command.
 - "description" (string) (default: "")
   Description of the command.
 - "handler" (function)
   Handler which accepts {info}.
 - "complete" (function)
   Completion function which accepts {info} and returns {results}.
 - "minargs" (integer) (default: 0)
   Minimal number of arguments.
 - "maxargs" (integer) (default: minargs)
   Maximal number of arguments.  Negative number means "indefinite".
 - "withrange" (boolean) (default: false)
   Whether this command accepts a range.

Fields of {info} argument for "handler":
 - "args" (string)
   All arguments passed to the command.
 - "argv" (array of strings)
   Set of parsed arguments of the command.
 - "range" (table)
   Information about a range passed to the command or nil for commands that
   don't accept a range or when none is supplied.  Fields:
    - "from" (integer)
      1-based index of the first entry in the range.
    - "to" (integer)
      1-based index of the last entry in the range.  Equal to "from" if there
      is only one element in the range.

Fields of {info} argument for "complete":
 - "arg" (string)
   Argument being completed.
 - "args" (string)
   Command-line up to cursor position (for cases when completion depends on
   what comes before current argument).
 - "argv" (array of strings)
   Same as "args", but parsed into an array.

Fields of {results} return value of "complete":
 - "offset" (integer) (default: 0)
   Offset from beginning of the argument.  This is useful to avoid prepending
   prefix that's common to all matches, thus completing only essential part.
   For example, in case of "var=val" use offset=4 to complete part after "=".
 - "matches" (array of strings or tables)
   List of items in values of the table (keys are ignored).  Each list item
   can either be a string or a table.  When item is a string it is used as a
   completion match.  When item is a table it can contain these keys:
    - "match" (string)
      Use "match" as a completion match.
    - "description" (string) (optional)
      A string that will be showed along with the "match" but not inserted on
      the command line.
   All other items of unspecified types will be silently ignored.

Parameters:
  {cmd}  Table with information about a command.

Return:
  true on success.

vifm.cmds.command({cmd})                       vifm-l_vifm.cmds.command()
Registers a new :command that works exactly as those registered using
vifm-:command builtin command.

Possible fields of {cmd}:
 - "name" (string)
   Name of the command.
 - "description" (string) (default: action)
   Description of the command.
 - "action" (string)
   Value of the command.  See vifm-:command for possible value.

Parameters:
  {cmd}  Table with information about a command.

Return:
  true on success.

vifm.cmds.delcommand({name})                   vifm-l_vifm.cmds.delcommand()
Removes :command added by vifm.cmds.command(), basically being an equivalent
of vifm-:delcommand builtin command.

Parameters:
  {name}  Name of the command.

Return:
  true on success.

--------------------------------------------------------------------------------
vifm-l_vifm.events

This global vifm.events table groups items related to events.

events.listen({event})                         vifm-l_vifm.events.listen()
Registers a handler for an event.

Possible fields of {event}:
 - "event" (string)
   Name of event to listen for.  See vifm-lua-events for event descriptions.
 - "handler" (function)
   Handler to invoke when the event happens.

Registering the same handler more than once for the same event has no effect.

Parameters:
  {event}  Table with information about event handling.

Return:
  nil

Raises an error:
  On unknown event name.

--------------------------------------------------------------------------------
vifm-l_vifm.fs

This global vifm.fs table provides basic/low-level file-system operations.

The main purpose is to allow plugins to perform file manipulations the same
way in different environment, avoid invoking external applications and
dealing with things like escaping.

The implementation is the same that is used when vifm-'syscalls' is enabled
regardless of the value of the option.  This is to make behaviour more
consistent across supported platforms and user configurations.

These operations:
 * synchronous
 * non-interactive:
   - no dialog on conflicts
   - no dialog on errors
   - can't be cancelled
 * don't change undo history (can't be undone or redone)
 * generate vifm-lua-event-app.fsop event

fs.cp({from}, {to}, {onconflict})              vifm-l_vifm.fs.cp()
Copies a file/directory from {from} to {to}.

Possible values of {onconflict}:
 - "append-tail"
   For files: append the end of a file at {from} to the corresponding file at
              {to} until they are of equal size if the latter is initially
              shorter than the former.
   For directories: fail if {to} exists.
 - "overwrite"
   For files: remove {to} file before placing a copy in its place.
   For directories: merge {from} into {to} replacing matching files.
 - "skip"
   For files: avoid copying a path in {from} if a corresponding path exists in
              {to}.
   For directories: merge {from} into {to} skipping matching files.
 - (default) "fail" or any other value
   Return an error if {to} already exists.

Parameters:
  {from}        Path to a file/directory to copy.
  {to}          Where the copy should be placed.
  {onconflict}  What to do if {to} already exists.

Return:
  true on success.

fs.ln({path}, {target})                        vifm-l_vifm.fs.ln()
Creates or updates a symbolic link at {path}.

Parameters:
  {path}    The path to a symbolic link.
  {target}  Where the link should point.

Return:
  true on success.

fs.mkdir({path}, {onmissingparent})            vifm-l_vifm.fs.mkdir()
Creates an empty directory at {path}.

Possible values of {onmissingparent}:
 - "create"
   Try to create all missing path components.
 - (default) "fail" or any other value
   Return an error if parent of the {path} doesn't exist.

Parameters:
  {path}             The path at which a new directory should be created.
  {onmissingparent}  What to do if parent of the {path} doesn't exist.

Return:
  true on success.

fs.mkfile({path})                              vifm-l_vifm.fs.mkfile()
Creates an empty file at {path}.  Fails if that path already exists.

Parameters:
  {path}  The path at which a new file should be created.

Return:
  true on success.

fs.mv({from}, {to}, {onconflict})              vifm-l_vifm.fs.mv()
The interface matches that of vifm-l_vifm.fs.cp(), but {from} is moved instead
of being copied.

fs.rm({path})                                  vifm-l_vifm.fs.rm()
Removes a single file or a directory with all of its contents.  Fails if
{path} doesn't exist.

Parameters:
  {path}  Path to a file/directory that should be removed.

Return:
  true on success.

fs.rmdir({path})                               vifm-l_vifm.fs.rmdir()
Removes an empty directory.  Fails if {path} doesn't exist.

Parameters:
  {path}  Path to the empty directory that should be removed.

Return:
  true on success.

--------------------------------------------------------------------------------
vifm-l_vifm.keys

This global vifm.keys table provides means of managing key bindings.

keys.add({key})                                vifm-l_vifm.keys.add()
Registers in one or several modes:
 * a new user-defined key which might replace an existing one
 * a new selector which must not conflict with an existing one

Possible fields of {key}:
 - "shortcut" (string)
   Left-hand side of the mapping.
 - "description" (string) (default: "")
   Description of the key.
 - "modes" (array of strings)
   List of modes to register the key in.  Supported values: cmdline, nav,
   normal, visual, menus, view and dialogs (sort, attributes, change and file
   info).  Unsupported values are ignored.
 - "isselector" (boolean) (default: false)
   Whether this handler defines a selector rather than a regular key.
 - "followedby" (string) (default: "none")
   "none", "selector" (e.g., "j" in "dj") or "keyarg" (e.g., "q" in "'q").
 - "handler" (function)
   Handler which accepts {info} and returns a table for selector handlers.
   See below.

{key}.handler for selectors is executed in a safe environment and can't call
API marked as {unsafe}.

Fields of {info} argument for {key}.handler:
 - "count" (integer)
   Count preceding the key or nil if none.
 - "register" (string)
   Register name or nil if none was specified.
 - "indexes" (table) (present if key is followed by selector)
   Table of indexes returned by selector key.
 - "keyarg" (string) (present if key is followed by keyarg)
   Key argument (e.g., "x" in "mx" sequence).

Fields of table returned by {key}.handler for selectors:
 - "indexes" (array of integers)
   Table of indexes of entries of the current view (vifm-l_vifm.currview())
   that were selected for the operation.  Invalid, nonexistent and duplicate
   indexes are silently ignored.  Indexes are sorted before processing.
 - "cursorpos" (integer) (optional)
   New position of the cursor.  Non-integer values are ignored.

Parameters:
  {key}  Table with information about a key.

Return:
  true on success.

--------------------------------------------------------------------------------
vifm-l_vifm.menus

This global vifm.menus table groups items related to menus.

vifm.menus.loadcustom({menu})                   vifm-l_vifm.menus.loadcustom()
Loads a menu with a custom list of items.

Possible fields of {menu}:
 - "title" (string)
   Title of the menu.
 - "items" (array of strings)
   List of items.  Shouldn't be empty.
 - "view" (vifm-l_VifmView) (default: vifm.currview())
   View associated with the menu.  Navigation will happen in this view if
   enabled.  Note: the value is currently limited to views of the current
   tab(s).
 - "withnavigation" (boolean) (default: false)
   When true, the items are considered to be paths that terminate at :
   optionally followed by line and column numbers (like for vifm-%M).
   Otherwise, the behaviour is like for vifm-%m.

This function is {unsafe}.

Parameters:
  {menu}  Table with information about the custom view.

Return:
  false if the list of items is empty or if {menu}.view doesn't refer to the
        the view as vifm.currview() or vifm.otherview().
  true on success.

--------------------------------------------------------------------------------
vifm-l_vifm.opts

This global vifm.opts table groups items related to options in general.

opts.global (table)                            vifm-l_vifm.opts.global
Table that provides access to global options.  The mapping between option
types and Lua types is quite obvious:
 - boolean option   -> boolean type
 - integer option   -> number type
 - any other option -> string type
 - bad option       -> nil type

Assigning global options is {unsafe}.

--------------------------------------------------------------------------------
vifm-l_vifm.plugin

Table with information about current plugin and operations for it.

plugin.name (string)                           vifm-l_vifm.plugin.name
Name of the plugin.

plugin.path (string)                           vifm-l_vifm.plugin.path
Full path to plugin's root directory.

plugin.require({modname})                      vifm-l_vifm.plugin.require()
Plugin-specific require, which loads Lua modules relative to plugin's root.
Does not create a global variable for the module.

This function is {unsafe}.

Parameters:
  {modname}  Name of the module, similar to the argument for require.

Return:
  Return value of the module or nil on error.

Raises an error:
  On issues with finding or running the module.

--------------------------------------------------------------------------------
vifm-l_vifm.plugins

This global vifm.plugins table groups items related to plugins.

plugins.all (table)                            vifm-l_vifm.plugins.all
Table that contains all plugins indexed by their names.

--------------------------------------------------------------------------------
vifm-l_vifm.sb

This global vifm.sb table groups functions for managing status bar.  It
contains the following items:

sb.info({msg})                                 vifm-l_vifm.sb.info()
Displays a regular message on status bar.

Parameters:
  {msg}  Message to display.

sb.error({msg})                                vifm-l_vifm.sb.error()
Displays an error message on status bar.

Parameters:
  {msg}  Message to display.

sb.quick({msg})                                vifm-l_vifm.sb.quick()
Displays a quick message on status bar.  It's discarded on first redraw and
isn't stored in the history of messages.

Parameters:
  {msg}  Message to display.

--------------------------------------------------------------------------------
vifm-l_vifm.sessions

This global vifm.sessions table provides means for inspecting and
controlling sessions.

sessions.current()                             vifm-l_vifm.sessions.current
Retrieves name of the current session.

Return:
  nil if there is no active session or its name as a string otherwise.

--------------------------------------------------------------------------------
vifm-l_vifm.tabs

This global vifm.tabs table provides means for inspecting and controlling
tabs.

tabs.get([{query}])                            vifm-l_vifm.tabs.get()
Retrieves a tab.  Omitting {query} is equivalent to passing an empty one.

Possible fields of {query}:
 - "index" (integer) (default: tabs.getcurrent())
   Index of the tab.
 - "other" (boolean) (default: false)
   Whether to get a pane tab from inactive view.  Ignored if global tabs are
   active.

Return:
  Returns an instance of vifm-l_VifmTab or nil if index is out of range.

Raises an error:
  If tab index is out of range.

tabs.getcount([{query}])                       vifm-l_vifm.tabs.getcount()
Retrieves number of open tabs.

Possible fields of {query}:
 - "other" (boolean) (default: false)
   Whether to operate on tab from inactive view.  Ignored if global tabs are
   active.

Return:
  Returns the count as an integer.

tabs.getcurrent([{query}])                     vifm-l_vifm.tabs.getcurrent()
Retrieves index of current tab.

Possible fields of {query}:
 - "other" (boolean) (default: false)
   Whether to operate on tab from inactive view.  Ignored if global tabs are
   active.

Return:
  Returns the index as an integer.

--------------------------------------------------------------------------------
vifm-l_vifm.version

This global vifm.version table provides information about Vifm and Lua API.
It contains the following items:

version.app.str (string)                       vifm-l_vifm.version.app.str
Version of Vifm as a string.

version.api.major (integer)                    vifm-l_vifm.version.api.major
Major version of Lua API.  Should become 1 when API design settles and then
remain at 1.

version.api.minor (integer)                    vifm-l_vifm.version.api.minor
Minor version of Lua API.

version.api.patch (integer)                    vifm-l_vifm.version.api.patch
Patch version of Lua API.

version.api.has({feature})                     vifm-l_vifm.version.api.has()
Checks presence of a feature.  There are no features to test yet.

Parameters:
  {feature}  Name of the feature

Return:
  true if the feature is present and false otherwise.

                                             vifm-l_vifm.version.api.atleast()
version.api.atleast({major}, {minor}, {patch})
Checks version of Lua API.

Parameters:
  {major}  Value to check version.api.major against.
  {minor}  Value to check version.api.minor against. (default: 0)
  {patch}  Value to check version.api.patch against. (default: 0)

Return:
  true if the version is equal or more recent than the specified one.

--------------------------------------------------------------------------------
vifm-l_VifmEntry

Instances of this type are used in filetype vifm-lua-handlers and in
callbacks of vifm-l_vifm.addcolumntype().  They are also returned by:
 * vifm-l_VifmView:entries() iterator
 * vifm-l_VifmView:entry()
 * vifm-l_VifmView:selected() iterator

Fields of this table are just copies, changing their values won't affect state
of the application.

VifmEntry.classify (table)                     vifm-l_VifmEntry.classify
Table that describes name decorations.  Its fields:
 - "prefix" (string)
   File name prefix.
 - "suffix" (string)
   File name suffix.

VifmEntry.name (string)                        vifm-l_VifmEntry.name
Name of the file.

VifmEntry.location (string)                    vifm-l_VifmEntry.location
Location of the file.

VifmEntry.size (integer)                       vifm-l_VifmEntry.size
Size of the file in bytes.

VifmEntry.atime (integer)                      vifm-l_VifmEntry.atime
File access time (e.g., read, executed).  In seconds since the Unix epoch.

VifmEntry.ctime (integer)                      vifm-l_VifmEntry.ctime
File change time (changes in metadata, like mode).  In seconds since the
Unix epoch.

VifmEntry.mtime (integer)                      vifm-l_VifmEntry.mtime
File modification time (when file contents is changed).  In seconds since
the Unix epoch.

VifmEntry.type (string)                        vifm-l_VifmEntry.type
Type of the entry.  See vifm-filetype() for the list of values.

VifmEntry.isdir (boolean)                      vifm-l_VifmEntry.isdir
True if an entry is either a directory or a symbolic link to a directory.

VifmEntry.folded (boolean)                     vifm-l_VifmEntry.folded
Whether this entry is folded.

VifmEntry.selected (boolean)                   vifm-l_VifmEntry.selected
Whether this entry is selected.

VifmEntry.match (boolean)                      vifm-l_VifmEntry.match
Whether this entry is a search match.

VifmEntry.matchstart (integer)                 vifm-l_VifmEntry.matchstart
For a search match this is the start position of a substring found in name,
zero otherwise.

VifmEntry.matchend (integer)                   vifm-l_VifmEntry.matchend
For a search match this is the end position of a substring found in name,
zero otherwise.

VifmEntry:gettarget()                          vifm-l_VifmEntry.gettarget()
Gets target of a symbolic link (not to be confused with real path resolution).

Return:
  Returns target as a string.

Raises an error:
  If entry doesn't correspond to a symbolic link.
  If resolving symbolic link has failed.

VifmEntry:mimetype()                           vifm-l_VifmEntry.mimetype()
Gets a MIME type.  Resolves target of symbolic links.

Return:
  Returns MIME type as a string, or nil if no MIME type recognisers are
  available.

--------------------------------------------------------------------------------
vifm-l_VifmJob

Instances of this type are returned by vifm-l_vifm.startjob().

VifmJob:wait()                                 vifm-l_VifmJob:wait()
Waits for the job to finish.

Raises an error:
  If waiting has failed.

VifmJob:exitcode()                             vifm-l_VifmJob:exitcode()
Retrieves exit code of the command.

Waits for the job to finish.

Return:
  Returns an integer number that represents exit code.  The value is -x if
  the application was killed by signal x.  -127 or -128 means that
  tracking the application has failed in some way.

Raises an error:
  If waiting has failed.

VifmJob:pid()                                  vifm-l_VifmJob:pid()
Retrieves process ID of a command that is (or was) associated with the job.

Return:
  Returns an integer that represents the ID.

VifmJob:stdin()                                vifm-l_VifmJob:stdin()
Retrieves stream associated with standard input of the job.

Return:
  Returns file stream from standard I/O library of Lua.

Raises an error:
  If the job wasn't started with "w" I/O mode (see vifm-l_vifm.startjob()).
  If input stream object is already closed.

VifmJob:stdout()                               vifm-l_VifmJob:stdout()
Retrieves stream associated with standard output of the job.  Includes error
stream if mergestreams was set to true.

Return:
  Returns file stream from standard I/O library of Lua.

Raises an error:
  If the job wasn't started with "r" I/O mode (see vifm-l_vifm.startjob()).
  If output stream object is already closed.

VifmJob:terminate()                            vifm-l_VifmJob:terminate()
Terminates a process without giving it a chance to respond.  Does nothing if
the job has already stopped.

VifmJob:errors()                               vifm-l_VifmJob:errors()
Retrieves data collected from error stream of the job.  It's accumulated
automatically in background and contains all data collected so far, the call
doesn't wait for arrival of data.  Empty if mergestreams was set to true.

Return:
  Returns a string.

Raises an error:
  On failing to wait for errors of a finished job (timeout).

--------------------------------------------------------------------------------
vifm-l_VifmTab

Instances of this type are returned by vifm-l_vifm.tabs.get().

The corresponding tab exists independently of this type and once the tab is
closed accessing bound instance raises an error.

VifmTab:getlayout()                            vifm-l_VifmTab:getlayout()
Retrieves layout of a global tab or shared TUI state for a pane tab.

Fields of the result:
 - "only" (boolean)
   Whether there is only one visible window.
 - "split" (string)
   nil when in only one window is visible, "v" or "h" otherwise.

Return:
  Returns description of current layout as a table.

VifmTab:getname()                              vifm-l_VifmTab:getname()
Retrieves name of the tab if it was set.

Return:
  Returns name of the tab as a string, which is empty if unset.

VifmTab:getview([{query}])                     vifm-l_VifmTab:getview()

Possible fields of {query}:
 - "pane" (integer) (default: index of active pane)
   Which view to get from a global tab.  1 is left/top pane, 2 is right/bottom
   one.  Ignored for a pane tab.

Return:
  Returns an instance of vifm-l_VifmView.

--------------------------------------------------------------------------------
vifm-l_VifmView

Instances of this type are returned by:
 * vifm-l_vifm.currview()
 * vifm-l_vifm.otherview()
 * vifm-l_VifmTab:getview()

The corresponding view exists independently of this type and once the view is
gone (e.g., its tab is closed) accessing bound instance raises an error.

VifmView.locopts (table)                       vifm-l_VifmView.viewopts
Equivalent of vifm-l_vifm.opts.global for location-specific values of
view-specific options.  These are "local" values of view-specific options,
which are reset to "global" ones on file list change.

Assigning local options is {unsafe}.

VifmView.viewopts (table)                      vifm-l_VifmView.locopts
Equivalent of vifm-l_vifm.opts.global for view-specific options, see there
for details.  These are "global" values of view-specific options.

Assigning view options is {unsafe}.

VifmView.cursor (table)                        vifm-l_VifmView.cursor
Table related to cursor position in a view.

Fields:
 - "pos" (integer)
   Index of an entry under the cursor.  Moves cursor on assigning an integer.
 - "entry" (function)
   Retrieves vifm-l_VifmEntry under the cursor.  This is a shortcut to
   VifmView:entry(VifmView.cursor.pos).

Assigning fields is {unsafe}.

Raises an error:
  On assigning non-integer to "pos".

VifmView.currententry (integer)                vifm-l_VifmView.currententry
Index of the current entry.

This is {deprecated}.  See vifm-l_VifmView.cursor.pos instead.

VifmView.cwd (string)                          vifm-l_VifmView.cwd
Location of the current view.

VifmView.entrycount (integer)                  vifm-l_VifmView.entrycount
Number of entries in the view.

VifmView.custom (table)                        vifm-l_VifmView.custom
Table with information about custom file list.  The value is nil if custom
view isn't active.

Fields:
 - "title" (string)
   Title of a custom view which usually describes how it was created.
 - "type" (string)
   Values returned by vifm-getpanetype() except for "regular".

VifmView:cd({path})                            vifm-l_VifmView:cd()
Changes location of the view.  {path} isn't expanded in any way.

This function is {unsafe}.

Parameters:
  {path}  Path to visit.

Return:
  true on success.

VifmView:entry({index})                        vifm-l_VifmView:entry()
Retrieves an entry by index.

Parameters:
  {index}  Value in the range from 1 to VifmEntry.entrycount inclusive.

Return:
  vifm-l_VifmEntry on success and nil on wrong index.

VifmView:entries()                             vifm-l_VifmView:entries()
Creates an iterator over all entries of the view.  The behaviour is undefined
if the list of entries changes while the iteration is in progress.  The entries
are returned from first to last.

Return:
  An iterator function that returns the next vifm-l_VifmEntry on each call.

VifmView:focus()                               vifm-l_VifmView:focus()
Makes this view the current one, switching tabs and/or windows if necessary.

This function is {unsafe}.

Return:
  true on success (should always succeed at the moment).

VifmView:gotopath({path})                      vifm-l_VifmView:gotopath()
Changes directory, resets filters and/or moves the cursor to find a particular
file.

Parameters:
  {path}  Target path.

Return:
  false if {path} is root or doesn't exist.
  true on success.

VifmView:loadcustom({info})                    vifm-l_VifmView:loadcustom()
Replaces view contents with a custom list of paths.  Loads the list even if it
ends up being empty.

Possible fields of {info}:
 - "title" (string)
   Title of the view.
 - "paths" (array of strings)
   List of paths.  Can be empty.  Paths that don't correspond to an existing
   file or duplicates are ignored.
 - "type" (string) (default: "custom")
   What kind of custom view to create:
    - "custom"
      A normal sorted view.  Same as vifm-%u.
    - "very-custom"
      A view that preserves original order.  Same as vifm-%U.

Parameters:
  {info}  Table with information about the custom view.

Raises an error:
  If {info}.type has incorrect value.

VifmView:selected()                            vifm-l_VifmView:selected()
Creates an iterator over selected entries of the view.  The behaviour is
undefined if the list of entries changes while the iteration is in progress.
The order in which the entries are returned is implementation-specific and is
not guaranteed to remain the same between releases.

Return:
  An iterator function that returns the next vifm-l_VifmEntry on each call.

VifmView:select({entries})                     vifm-l_VifmView:select()
Selects entries.  Does nothing in visual non-amend mode.  See
vifm-l_VifmView:unselect() to unselect entries.

This function is {unsafe}.

Possible fields of {entries}:
 - "indexes" (array of integers)
   Indexes of entries to select.  Invalid and nonexistent indexes are
   silently ignored.

Return:
  Number of new selected entries.

VifmView:unselect({entries})                   vifm-l_VifmView:unselect()
Unselects entries.  Does nothing in visual non-amend mode.  See
vifm-l_VifmView:select() to select entries.

This function is {unsafe}.

Possible fields of {entries}:
 - "indexes" (array of integers)
   Indexes of entries to unselect.  Invalid and nonexistent indexes are
   silently ignored.

Return:
  Number of new unselected entries.

--------------------------------------------------------------------------------
vifm-lua-index

vifm (table)                               vifm-l_vifm
vifm.addcolumntype({column})               vifm-l_vifm.addcolumntype()
vifm.addhandler({handler})                 vifm-l_vifm.addhandler()
vifm.currview()                            vifm-l_vifm.currview()
vifm.errordialog({title}, {msg})           vifm-l_vifm.errordialog()
vifm.escape({what})                        vifm-l_vifm.escape()
vifm.executable({what})                    vifm-l_vifm.executable()
vifm.exists({path})                        vifm-l_vifm.exists()
vifm.expand({str})                         vifm-l_vifm.expand()
vifm.fnamemodify({path}, {mods}[, {base}]) vifm-l_vifm.fnamemodify()
vifm.input({info})                         vifm-l_vifm.input()
vifm.makepath({path})                      vifm-l_vifm.makepath()
vifm.otherview()                           vifm-l_vifm.otherview()
vifm.run({info})                           vifm-l_vifm.run()
vifm.startjob({job})                       vifm-l_vifm.startjob()
vifm.stdout()                              vifm-l_vifm.stdout()

vifm.abbrevs (table)                       vifm-l_vifm.abbrevs
vifm.abbrevs.add({abbrev})                 vifm-l_vifm.abbrevs.add()

vifm.cmds (table)                          vifm-l_vifm.cmds
vifm.cmds.add({cmd})                       vifm-l_vifm.cmds.add()
vifm.cmds.command({cmd})                   vifm-l_vifm.cmds.command()
vifm.cmds.delcommand({name})               vifm-l_vifm.cmds.delcommand()

vifm.events (table)                        vifm-l_vifm.events
vifm.events.listen({event})                vifm-l_vifm.events.listen()

vifm.fs (table)                            vifm-l_vifm.fs
vifm.fs.cp({from}, {to}, {onconflict})     vifm-l_vifm.fs.cp()
vifm.fs.ln({path}, {target})               vifm-l_vifm.fs.ln()
vifm.fs.mkdir({path}, {onmissingparent})   vifm-l_vifm.fs.mkdir()
vifm.fs.mkfile({path})                     vifm-l_vifm.fs.mkfile()
vifm.fs.mv({from}, {to}, {onconflict})     vifm-l_vifm.fs.mv()
vifm.fs.rm({path})                         vifm-l_vifm.fs.rm()
vifm.fs.rmdir({path})                      vifm-l_vifm.fs.rmdir()

vifm.keys (table)                          vifm-l_vifm.keys
vifm.keys.add({key})                       vifm-l_vifm.keys.add()

vifm.menus (table)                         vifm-l_vifm.menus
vifm.menus.loadcustom({menu})              vifm-l_vifm.menus.loadcustom()

vifm.opts (table)                          vifm-l_vifm.opts
vifm.opts.global (table)                   vifm-l_vifm.opts.global

vifm.plugin (table)                        vifm-l_vifm.plugin
vifm.plugin.name (string)                  vifm-l_vifm.plugin.name
vifm.plugin.path (string)                  vifm-l_vifm.plugin.path
vifm.plugin.require({modname})             vifm-l_vifm.plugin.require()

vifm.plugins (table)                       vifm-l_vifm.plugins
vifm.plugins.all (table)                   vifm-l_vifm.plugins.all

vifm.sb (table)                            vifm-l_vifm.sb
vifm.sb.error({msg})                       vifm-l_vifm.sb.error()
vifm.sb.info({msg})                        vifm-l_vifm.sb.info()
vifm.sb.quick({msg})                       vifm-l_vifm.sb.quick()

vifm.sessions (table)                      vifm-l_vifm.sessions
vifm.sessions.current()                    vifm-l_vifm.sessions.current

vifm.tabs (table)                          vifm-l_vifm.tabs
vifm.tabs.get([{query}])                   vifm-l_vifm.tabs.get()
vifm.tabs.getcount([{query}])              vifm-l_vifm.tabs.getcount()
vifm.tabs.getcurrent([{query}])            vifm-l_vifm.tabs.getcurrent()

vifm.version (table)                       vifm-l_vifm.version
vifm.version.api.atleast({major}, {minor}, {patch})
                                           vifm-l_vifm.version.api.atleast()
vifm.version.api.has({feature})            vifm-l_vifm.version.api.has()
vifm.version.api.major (integer)           vifm-l_vifm.version.api.major
vifm.version.api.minor (integer)           vifm-l_vifm.version.api.minor
vifm.version.api.patch (integer)           vifm-l_vifm.version.api.patch
vifm.version.app.str (string)              vifm-l_vifm.version.app.str

VifmEntry (type)                           vifm-l_VifmEntry
VifmEntry.atime (integer)                  vifm-l_VifmEntry.atime
VifmEntry.classify (table)                 vifm-l_VifmEntry.classify
VifmEntry.ctime (integer)                  vifm-l_VifmEntry.ctime
VifmEntry.folded (boolean)                 vifm-l_VifmEntry.folded
VifmEntry.isdir (boolean)                  vifm-l_VifmEntry.isdir
VifmEntry.location (string)                vifm-l_VifmEntry.location
VifmEntry.match (boolean)                  vifm-l_VifmEntry.match
VifmEntry.matchend (integer)               vifm-l_VifmEntry.matchend
VifmEntry.matchstart (integer)             vifm-l_VifmEntry.matchstart
VifmEntry.mtime (integer)                  vifm-l_VifmEntry.mtime
VifmEntry.name (string)                    vifm-l_VifmEntry.name
VifmEntry.selected (boolean)               vifm-l_VifmEntry.selected
VifmEntry.size (integer)                   vifm-l_VifmEntry.size
VifmEntry.type (string)                    vifm-l_VifmEntry.type
VifmEntry:gettarget()                      vifm-l_VifmEntry.gettarget()
VifmEntry:mimetype()                       vifm-l_VifmEntry.mimetype()

VifmJob (type)                             vifm-l_VifmJob
VifmJob:errors()                           vifm-l_VifmJob:errors()
VifmJob:exitcode()                         vifm-l_VifmJob:exitcode()
VifmJob:pid()                              vifm-l_VifmJob:pid()
VifmJob:stdin()                            vifm-l_VifmJob:stdin()
VifmJob:stdout()                           vifm-l_VifmJob:stdout()
VifmJob:terminate()                        vifm-l_VifmJob:terminate()
VifmJob:wait()                             vifm-l_VifmJob:wait()

VifmTab (type)                             vifm-l_VifmTab
VifmTab:getlayout()                        vifm-l_VifmTab:getlayout()
VifmTab:getname()                          vifm-l_VifmTab:getname()
VifmTab:getview([{query}])                 vifm-l_VifmTab:getview()

VifmView (type)                            vifm-l_VifmView
VifmView.currententry (integer)            vifm-l_VifmView.currententry
VifmView.cursor (table)                    vifm-l_VifmView.cursor
VifmView.custom (table)                    vifm-l_VifmView.custom
VifmView.cwd (string)                      vifm-l_VifmView.cwd
VifmView.entrycount (integer)              vifm-l_VifmView.entrycount
VifmView.locopts (table)                   vifm-l_VifmView.viewopts
VifmView.viewopts (table)                  vifm-l_VifmView.locopts
VifmView:cd({path})                        vifm-l_VifmView:cd()
VifmView:entries()                         vifm-l_VifmView:entries()
VifmView:entry({index})                    vifm-l_VifmView:entry()
VifmView:focus()                           vifm-l_VifmView:focus()
VifmView:gotopath({path})                  vifm-l_VifmView:gotopath()
VifmView:loadcustom({info})                vifm-l_VifmView:loadcustom()
VifmView:select({entries})                 vifm-l_VifmView:select()
VifmView:selected()                        vifm-l_VifmView:selected()
VifmView:unselect({entries})               vifm-l_VifmView:unselect()

--------------------------------------------------------------------------------
 vim:tw=78:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:sw=4:ft=help:norl: