fbi improved (lightweight customizable image viewer) home page

✨ Read this awesome post from Hacker News 📖

📂 **Category**:

💡 **What You’ll Learn**:

FIM NEWS -- history of main user-visible changes in FIM.

                Version 0.7.1

A release with small fixes at build, test, and runtime:

 * Documentation and self-documentation improved and updated
 * Command  "help '/str'"  will also search on occurrences of 'str' among set variable identifiers and their help
 * Default binding of 'N' and 'P' changed to be more flexible: either page goto or category or directory goto
 * Fix: GTK (-o gtk) mode had mouse coordinates slightly wrong (were including the menu bar)
 * Fix: SDL mode (-o sdl) now allows fim (emergency) exit per windows quit button also in case no key is bound to 'quit'
 * Fix: now in 'goto "+1p" "+1f"' the page jump takes precedence over the file jump
 * Fix: had potential memory error after --sort and with absent files
 * Fix: Before testing PS pr PDF functionality, Makefile will check if respective sample files are there
 * Fix: --load-image-descriptions-file (-D)  was opening files in append mode for no reason
 * Fix: --mark-from-descriptions-file  was opening files in append mode for no reason
 * Fix: don't omit last Tab multiple autocompletion entry
 * Fix: alias command to complain if being provided with one argument which is no alias
 * Fix: more resilience on missing groff
 * More and better tests
 * Fix: SDL-1.2 compilation fix
 * Fix: 32-bit build fix for GTK3
 * Fix: pass CFLAGS, CPPFLAGS and LDFLAGS to helper programs
 * Fix: configure was disabling crop tests by mistake
 * Fix: configure now uses PKG_CONFIG to determine pkg-config
 * Fix: configure had mistake leading to a few wrong src/Makefile rules
 * Fix: configure poppler check: improved diagnostics, reflecting closer required headers, extend check to poppler-cpp
 * Fix: in configure and Makefile when building with emscripten (WebAssembly)
 * Fix: input of non-ASCII values to -k and -K was not being carried out correctly on systems with char being unsigned (e.g. aarch64)
 * Misc minor fixes (e.g.: in tests, djvu error verbosity, readline, configure, configuration ...)

                Version 0.7.0

A major release:

 * New graphical windowed output mode via GTK3 (similar to SDL, but with menus), selected with -o gtk
 * -o =OPTS / --output-device==OPTS / --output-device =OPTS will pass OPTS to the auto-selected output device
 * Key presses passed at startup via the -k and -K options are executed in the order the options appear
 * When auto-selecting the output device, also take in consideration environment variable  WAYLAND_DISPLAY
 * Closer behaviour of readline and history keys across the graphical modes
 * --slideshow option now accepts decimal values
 * Given string variables a and b, a-b is the value with all occurrences of regexp b removed from a (experimental)
 * Introduce expansion-only variable description syntax "#!fim:@var=VAL"
 * Support @-expansion of "@id" within "VAL" of "#!fim:var@=VAL" or "#!fim:@var@=VAL"
 * When loading via an external converter, keep track of it in i:_external_decoder_program
 * Load XCF (Gimp) files via the xcf2pnm utility
 * Files with name ending in .NEF are now viewable via wrapper call to dcraw (if present)
 * Support for reading QOI files via libqoi (experimental)
 * Support for reading AVIF images via libavif (experimental)
 * Support for reading WebP images via libwebp (experimental)
 * Searches via '/' or '?' are now replayable via "recording 'repeat_last'"
 * Simultaneous specification of file and page to 'goto' now possible
 * Enable descriptions to be searched in "goto /PATTERN/" by keeping the newly introduced 'D' in _re_search_opts
 * If there's only one file, passing a numeric argument to 'goto' will do a page jump
 * Fix with SDL2 (-o sdl): reduce chance of intercepting Tab key during window switch
 * Mouse scroll in SDL (-o sdl) and GTK (-o gtk) modes
 * Mouse click and help grid map support for -o ca
 * Move-trigged pan support for -o ca=w
 * Specify a dithering algorithm  DA  as string or numeric index in  -o ca=d:DA  (e.g. -o ca=d:0)
 * Scaling fix when starting with -o ca
 * Introduce variable _lastpageindex to allow jump to last page
 * Variable "_device_string" now contains the entire output device (graphical mode) specification
 * The expandos of the form %:VAR: will first check for i:VAR, and then for VAR (experimental)
 * Add configure option  --disable-mouse
 * Bugfix: in some cases the "#!fim:VAR=..." description syntax would not propagate VAR properly
 * Fixes in the configure script (remove bashisms by SDL version recognition)
 * Bugfix: configure --disable-system  was bogus
 * Bugfix: avoid terminal clutter after interruption of "endless_slideshow"
 * Bugfix: avoid memory leak while decoding PDF
 * Improve error handling when encountering corrupt or unsupported TIFF files
 * More tests
 * FIM requires a compiler supporting at least C++11
 * Documentation and self-documentation improved and updated

                Version 0.6-rc2

 * File dropping support in SDL2 mode and more responsive readline mode

                Version 0.6-rc1

 * Experimental support for SDL2.

                Version 0.6-rc0

A summary of major improvements:

 * Colour ASCII-Art output via libcaca, selected with -o ca
 * better mechanism to determine best output device
 * font magnification by integer factors, good for higher resolutions
 * runtime font selection
 * new options to commands "scale", "goto", "limit", "list", ...
 * 'limit' view to relevant image files based on properties (like in 'mutt')
 * pass key presses to be automated at startup with -k and -K options
 * pretty free from memory leaks
 * -X switch inhibits custom external converters
 * new powerful subcommand "list 'mark'"
 * new command-line switches (--sort..) to sort the initial files list
 * use mipmaps for faster scaling
 * open files from a files list with -L
 * load image description files with -D 
 * background recursive scan and load of files with -B
 * search files at startup based on description with -/ and --//
 * new verbosity and debug options
 * better error handling when encountering corrupt files
 * fast in-place switch to high-res file via --load-shadow-directory 
 * improvements in -o aa (ASCII-art output device with aalib)
 * more options for window size selection in -o sdl
 * Keys F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12 now usable with 'bind'

In detail, in no particular order:

 * Experimental support for SDL2.
 * More responsive readline mode.
 * Switch --resolution 'fullscreen' appends 'W' if in SDL mode.
 * If a "matrix market" file is loaded, its rows, columns and nnz are image variables, too.
 * Introduce special 'early' form  -C =var=val  where variable var is assigned to unquoted and non-interpreted value val immediately.
 * Variable i:__exif_orientation renamed into i:_exif_orientation
 * Fix: --cd-and-readdir was not jumping back to first file.
 * Fix: --device option not ignored anymore.
 * Rename --no-etc-rc-file switch to --no-etc-fimrc-file .
 * fimgs: bunzip2, wget, and xz are now optional.
 * Bugfix: fimgs to properly remove temporary directory after loading downloaded files.
 * Misc small improvements in documentation text output and reporting (no cursor in post-search output line; misc messages).
 * Key 'Z' now assigned to 'sleep 1'.
 * Key 'Del' now assigned to 'list "remove"'.
 * Add -= as short form of the --no-auto-scale option.
 * Experimental: add command "crop", also activated after selecting the area by holding Shift and clicking with left mouse button (if running with -o sdl).
 * Add command "pan 'vsteps%' 'hsteps%'" and "'pan 'vsteps' 'hsteps'".
 * Keys F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12 are now usable with 'bind' with modes -o aa, -o ca, -o dumb.
 * Fix for -o sdl: when flipped or mirrored, it used to draw a smaller box by mistake.
 * Only filenames matching "^[/A-Za-z0-9_.][/A-Za-z0-9_.-]*$" can occur in a conversion command involving an external program.
 * --pread-cmd=command  substitutes any occurrence of ''-/'' in command with the actual filename, executes the result and reads an image from its stdout.
 * -o fb=S will not tolerate running under screen.
 * Bugfix in --script-from-stdin now prevents possible crashes.
 * Removed configure options --enable-c++11 -- use CXXFLAGS instead.
 * Bugfix: 'autocmd_del' with no arguments would crash.
 * Bugfix: autocommand "PostHardcodedConfigLoading" now triggers even if --disable-fimrc .
 * Internals: considerably expanded 'make tests'.
 * Add command 'stderr', similar to 'stdout'.
 * This is the last FIM version supporting the C++03 standard.
 * Refresh configure and Makefile templates.
 * Build fixes for the MinGW environment.
 * man fim: improve manual contents (on ~/.fim_history, individual options, wording, etc.).
 * man fimrc: added a section with default aliases,
 * Where appropriate, 'make tests' uses 'timeout' to prevent possible hangs.
 * Switch  -K   aka  --chars-press  simulates input of characters at startup.
 * Fix: slideshow function (e.g. `fim --slideshow=5 media/`) will now cycle forever, unless --once/-1 option specified (as in fbi).
 * Fix: after 'quit' no command shall execute anymore (unless in -F).
 * With SDL one can specify window size as percentage of allowed size (-o sdl=w55%), or draw a help grid map (-o sdl=h).
 * With SDL (-o sdl), center window by default.
 * Fix: now pressing keys "1n1n" will not execute 'n' 11 times, but twice.
 * configure --enable-debug is a developer option now.
 * libcaca (-o ca) mode is now complete and is the default ASCII Art mode.
 * Slideshow function (e.g `fim --slideshow=5 *.jpg`) now more responsive.
 * Arrow keys are now working in aalib (-o aa).
 * Bugfix with aalib (-o aa): don't truncate long lines.
 * Avoid memory leak in language parser.
 * Avoid console buffer memory corruption.
 * Eliminate a memory leak from file loading code. 
 * Eliminate memory leaks in PNG, JPG, TIFF, EXIF, and font decoding code.
 * Fix possibly broken `make -j` in rebuilding fimgs.man and fimrc.man.
 * Correct configure script check for regcomp() -- could lead to false negatives.
 * Don't break build on missing 'gs'.
 * Experimental: use --load-shadow-directory  to add a "shadow directory".
   Then 'scale "shadow"' (bound to key '"') will substitute the current displayed image
   with that of the first same-named file located under a shadow directory.
 * When loading a directory, regular expression from default "_pushdir_re" variable now matches filenames with .webp extension.
 * Fix: `fim -c '/'` was broken.
 * Add " INTEGER , INTEGER IDENTIFIER arguments" syntax to repeat a command 
   on each file in the interval and substitute its name to '+' in the arguments
   to an iterated command IDENTIFIER.
 * If a key is bound to e.g. 'goto "+1F"', keep pressing it to accelerate (not if e.g. "+1f").
 * Internal fix: piping from external commands was using 0 instead of 'WNOHANG', leading to hanging.
 * Internal fix: error handling was missing.
 * fimgs now to handle tar.xz archives.
 * Reload automatically image on file change.
 * Command 'list' 'sort_var' 'var' to sort file list according to values of 'i:var'.
 * Command 'list' 'sort_comment' to sort file list according to 'i:_comment' value.
 * Add a --verbose-font-load switch to set '_fbfont_verbosity=1'.
 * Variable '_fbfont_verbosity' sets verbose font loading.
 * Fix: short options -b, -h, -R were not getting optional argument (e.g. -b1).
 * Key combination C-r now assigned to "reload ''".
 * Fix: symbol from fbi sources clashed with gcc-6 onwards, breaking compilation.
 * Key combination C-w assigned to setting auto-scaling to width.
 * Smoother scroll of large images.
 * If SSH_TTY set and no output device specified, give precedence to aalib, then libcaca.
 * Bugfix: in --as-text will avoid repeated reload of file.
 * Hardcoded font (if configured in) will serve as fallback font.
 * Add a --no-pipe-load / -X switch to _no_external_loader_programs=1;
 * Description variables beginning with '_' will not go into i: .
 * List variables in all i:* read from description file with "list 'vars|variables'".
 * Expansion of @variables and @# comments from description files.
 * The menu key in SDL mode shows a temporary mouse click actions menu.
 * Bugfix: description file reading was crashing due to wrong check.
 * Caption text of "_caption_over_image" takes at most half of the screen.
 * If _caption_over_image=3, image is possibly drawn below the caption.
 * The 'v' and 'S' keys now cause a redraw.
 * The description line can be of any length.
 * New configure option, defaulting to: --enable-paths-in-man; it generates man pages with configure specified paths (e.g. sysconfdir, docdir).
 * Fix: -s switch was broken.
 * Add a semicolon (;) to -C arguments if not present already.
 * Framebuffer console switch off while loading: configure with the 
   --enable-framebuffer-switch-while-loading switch to have it back.
 * Fix: configure would fail on --disable-aa and absent aalib.
 * Now configure has --enable-seek-magic by default. And is more verbose.
 * Command 'help' also shows key bindings, and give multiple answers if matching.
 * For each word following switch --help, an individual help message is shown.
 * Command 'goto' accepts multiple arguments; evaluating them until the first one triggering a jump.
 * Command goto [’w’[C] jumps to a file based on character C (default 'S').
   If C is 's', to prev/next file with same directory name.
   If C is 'd', to prev/next file with directory name down the same hierarchy.
   If C is 'u', to prev/next file with directory name up the same hierarchy.
   If C is 'b', to prev/next file with same basename.
   If C is as above but uppercase, to the prev/next file not matching the criteria.
 * Accordingly, aliases 'next_file_dir_same', 'next_file_dir_other', 'next_file_dir_up',
   'next_file_dir_down', 'next_file_same_basename', 'prev_file_dir_same',
   'prev_file_dir_other', 'prev_file_dir_up' 'prev_file_dir_down' 'prev_file_same_basename'.
 * Fix: 'recording' command was not functioning properly.
 * Fix: don't pop back last command if "recording 'stop'" executed outside of recording mode.
 * Fix: won't clear recorded list if calling recording 'start' multiple times.
 * Specifying more than once any of -p -i - causes a warning.
 * New switch --verbose-interpreter to execute interpreter verbosely by setting adequately _debug_commands='ackC'.
 * Strings specified within single quotes have single quotes escaped, just as double quotes.
   So that e.g.: '\'hello\'' equals "'hello'" and "\"hello\"" equals '"hello"'.
 * Variable '_debug_commands' is now a string with several verbosity options.
 * Fix: misc fixes for --offset, e.g. avoiding probing for external loader programs.
 * Add --verbose-load option for verbose file loading.
 * -C '_seek_magic=..' probes whole range of specified signature when loading a file.
 * Fix in _seek_magic documentation.
 * Option --offset accepts numbers suffixed by one of K, M, and G for respectively kibi-, mebi-, and gibi- (2^10, 2^20 and 2^30) units.
 * Bugfix: --offset option was ignoring lower bytes-offset.
 * Fix: a check was missing in the PS decoder when reading from stdin.
 * Command 'pan' accepts '-' and '+' to jump to prev/next file if border is reached.
 * Command 'font' controls displayed font and scans font directories.
 * Keys '’prev’' cycle through available consolefonts.
 * Variable _fbfont_magnify_factor scales text font at runtime.
 * Variable _fbfont_as_screen_fraction; if >0, font is scaled to exceed 1/_fbfont_as_screen_fraction of both width and height.  If _fbfont_as_screen_fraction<0, font scaling is fixed.
 * Keys '[' and ']' bound to new aliases "font_reduce" and "font_magnify".
 * Key '|' bound to new alias "toggle_font_auto_scale".
 * Switch -r ’+/’ / --resolution ’+’ behaves as expected in SDL mode.
 * Variable _downscale_huge_at_load, if 1 (default), downscale automatically huge images at load time. To avoid loading images exceeding too much screen size.
 * Variable i:_buffered_in_tmpfile stores temporary decoding image filename, if any.
 * Internally load SVG files by invoking inkscape  --without-gui --export-png . A file beginning with "1; 1/16 if 1, no tolerance if <1.
 * Variable "_want_wm_mouse_ctrl" controls mouse click/movement behaviour in SDL mode.
 * Variable "_min_cached_images" is the minimum number of images to keep from eviction.
 * Commands  scale '<'  /  scale '>' shrinks/magnifies the image using cached mipmaps.
 * By default, show mouse cursor in full screen SDL mode.
 * Autocommand "PostInteractiveCommand" does not trigger anymore after 'quit' command.
 * In case of a CBZ,CBR,PDF,PS,DVI file, the fimgs script now uses '--autotop --autowidth'.
 * The fimgs script now probes for unrar-nonfree/rar/unrar-free (in this order).
 * Customize overlay text via variable '_caption_over_image_fmt'.
 * Command syntax 'goto identifieridentifier[+]' (new) jumps to next file having a different value of i:identifier, also empty if without trailing &grave;+'.
 * Command "limit '-set_union'" merges current limited list with the new one.
 * Command "limit '-merge'" merges current limited list with the new one.
 * Command "desc 'reload'" loads once again description files specified at the command line with --load-image-descriptions-file.
 * FIM only checks for filename duplicates if a sorting option is specified.
 * Switch -P/--text-reading fixed. Seems to be broken in version 0.5.
 * Command "color": "color 'negate'" and "color 'desaturate'" introduced.
 * Commands 'negate' and 'desaturate' deleted.
 * Command "color CVS" (CVS among 'protanopia', 'deuteranopia', 'tritanopia', 'p', 'd', 't') simulates a color vision deficiency; adding 'daltonize' applies a tentative color correction;  "color 'colorblind'" is short for "color 'deuteranopia'".
 * Command "color 'identity'": populate the image with 'RGB identity' pixels.
 * Introduce a "#!fim:/=dir" special description line to specify directory prepended to basename.
 * Introduce a "#!fim:\=dir" special description line to specify directory prepended to filepath.
 * Command limit '-list'      lists existing variables identifiers as set via 'desc'
 * Command limit '-list' 'id' lists existing values for instances of variable 'id' as set via 'desc'
 * Command "limit '~i' MINIDX[-MAXIDX]", with MINIDX and MAXIDX numbers (possibly with K as x 1000 multiplier) restricts filenames list to the specified interval.
 * Command "limit '~d'", limits to files having exact current file's modify date +- one day.
 * Command "limit '~z'" limits to files having same file size as the current.
 * Command "limit '~z' MINSIZE[-MAXSIZE]", with MINSIZE and MAXSIZE numbers with possibly K (x 1024) or M (x 1024 1024) multipliers, limits according to file size.
 * Command "limit '~d' MINTIME[-MAXTIME]", with MINTIME and MAXTIME numbers, limits files list according to file modify date (expressed as seconds since the epoch, see 'man 2 time').
 * Command "limit '~d' MINDATE[-MINDATE]", with MINDATE and MAXDATE dates as in DD/MM/YYYY, and after 1900.
 * Command "limit '-further' ..." makes 'limit' act on the current list, rather than on the full anew. 
 * Command "limit" uses new criteria:
   If invoked with '~!' it restricts to files with unique basename.
   If with '~=', to files with duplicate basename;
   if with '~^', to the first of the files with duplicate basename;
   if with '~$', to the last of the files with duplicate basename. 
 * Alias "unlimit" resets the limited list.
 * Add variable '_all_file_loaders': a space-separated list of hardcoded file loaders usable with '_file_loader'.
 * Switch -R/--recursive[=arg] has now an optional argument; overwrites (if set) or appends to (if beginning with + or |) the "_pushdir_re" variable (recursed filename extensions).
 * Introduce a "#!fim:+=" special description line to append to cached description.
 * Introduce a "#!fim:^=" special description line to prepend to cached description.
 * Introduce a "#!fim:!=" special description line to reset all variables of the cached namespace.
 * Command 'desc        "save"' functionality to save descriptions file data from the currently browsable images list.
 * Command 'desc "-append" "save"' works in append mode.
 * Command 'desc "-all" "save"' saves also all descriptions file variables.
 * Command 'desc "-nooverw" "save"' does not force overwrite.
 * To ease reproducible builds: imposing LC_ALL=C to $(YACC) and $(SORT), vim2html.pl reads SOURCE_DATE_EPOCH
 * New switch --mark-from-image-descriptions-file: read file names from a description file and use them to mark current list files.
 * Introduced alphanumeric restriction in the descriptions shebang variables: must begin with underscore or alphabetic, continue with underscore or alphanumeric.
 * Keys '(' and ')' are now bound respectively to "goto '^p'" and "goto '$p'"; that is jump to first or last page.
 * Available symkeys are now documented in a section of man fimrc.
 * Switch -k --keysym-press  to simulate press of keysym at startup.
   Keysym can be prefixed by a repetition count number.
 * New switch  -/   as short form of of -c /.
 * New switch --//  as short form of of -c / with _re_search_opts='f'.
 * Tehe space key (' ') is now assigned to 'scrollforward' (earlier was 's').
 * Introduced context prepend/append shebang syntax "#!fim:^=" and "#!fim:+=" in description files.
 * Switch --read-from-stdin-elds supports now the ASCII NUL terminator (via '').
 * Switch -V (--version) prints to stdout (not anymore to stderr).
 * The -B switch is now shorthand for --background-recursive.
 * If compiled in pre-C++11 flags, -B / --background-recursive behaves as -R.
 * Switch -S is now short form of --image-descriptions-file-separator (not anymore for --sanity-check).
 * Switch -D is now short form of --load-image-descriptions-file (not anymore for --dump-default-fimrc).
 * Switch -L/--read-from-file: read an image list from file (similarly to the - switch).
 * Now caching of mipmaps is on by default; can be turned off with new variable '_cache_control'.
 * Variable "_push_pushes_dirs"; if it is 2, also push hidden files and directories; that is, ones whose names begin with a dot (.).
 * configure --with-font-magnifying-factor=FACTOR controls text magnification by an integer factor.
   If FACTOR is positive, this value is hardcoded and cannot be changed at runtime.
   If FACTOR is negative, -FACTOR is default, but can be changed at runtime.
   If FACTOR is 0 (default) a default of 1 applies, and can be changed at runtime.
   This option is meant to be used on configurations with high resolutions and small consolefonts.
 * configure --with-tmpfile specifies a new temporary directory. 
 * configure tries to detect curses/ncurses.
 * Fix: mouse movement under SDL used to trigger unnecessary screen redraws.
 * Fix: the last used image is to be evicted from the cache as last, after possibly prefetched images.
 * Fix: in configure script, the regex_t check was unnecessarily broken.
 * Fix: ./configure --disable-pcx was not properly disabling PCX format support
 * With C++11 flags, --background-recursive loads images in the background recursively (experimental, unfinished).
 * Use variable "i:_file_load_time" to store the time taken to load the file and decode the image.
 * Use variable "_use_mipmaps=2" to compute the mipmaps faster, using every fourth source pixel.  This can be a good solution for speeding up large photographs scaling.
 * Description files beginning with "#!fim:desc" (of whatever extension) can now be loaded as they were normal image files.
 * Add switch --reverse to reverse the file list.
 * Add switch --sort-mtime to sort file list according to modification time.
 * Add switch --sort-fsize to sort file list according to file size.
 * Command "list 'sort_mtime'" to sort file list according to modification time.
 * Command "list 'sort_fsize'" to sort file list according to file size.
 * Command "list 'mark' ’-listall’" accepts now exactly what "limit ’up’" does.
 * Command syntax 'list "markall"' introduced.
 * Command syntax 'list "dumpmarked"' and 'list "unmarkall"' introduced.
 * Command 'list "swap"' introduced.
 * New '_lastgotodirection' variable, with the last file goto direction.
 * Key 'Enter' now marks and goes forward or back according to variable '_lastgotodirection'.
 * Fix: the largest mipmap was not always being used.
 * Fix: -lfl linkage is not really necessary: removed it.
 * Fix: support for PPM files with 2 bytes per sample.
 * Fix: a few more checks when reading PCX files.
 * Fix: documented that switch --sanity-check terminates the program, rather than continuing.
 * Fix: when stdint.h is available use uint8_t, uint16_t, uint32_t instead of non-portable __u8, __u16, __u32
 * Fix: compilation was broken without framebuffer (FIM_WITH_NO_FRAMEBUFFER)
 * Fix: cleaned up the internal keysyms initialization code.
 * Fix: removed obsolete documentation for the "window" command, now disabled.
 * Bugfix: improve GIF error handling.
 * Bugfix: on certain framebuffer configurations part of the screen was not being redrawn.
 * Bugfix: conversion from external program was vulnerable to failure due to a missing check.
 * Bugfix: avoiding data corruption when handling %k expando.
 * Bugfix: repeating "recording 'repeat_last'" (default '.' key) by prepending a number now works.
 * Fix: configure uses &grave;sdl-config --static-lib&grave;.

                Version 0.5

 * -R / --recursive switch to turn on recursive push of command line specified directories
 * added --sort and --sort-basename to sort the images list
 * introduced mipmap mechanism (_use_mipmaps) for faster display/scaling of images
 * status bar customizable with _display_status_fmt and _info_fmt_str, which can be
   controlled by the use of special image variable specifiers ('expandos'):
    "%T" expando to get (and display) total memory used by the program 
    "%C" expando to get (and display) file/memory usage by image cache
    "%M" expando to get (and display) memory used by the current (displayed) image
    "%c" expando to get (and display) centering information
    "%m" expando to get (and display) current image mipmap occupation information
    "%k" expando to get (and display) current image i:_comment value
    "%?PRE?VAR?POST?" expando to get (and display) "PRE".i:VAR."POST"
    ...
 * search (and jump) on image descriptions via 'goto' and key '/'
 * when repeating search with 'repeat_last', will use last direction
 * '?' key is now assigned to backward search (goto '-//')
 * default 'C-p' key is now assigned to repeat last backward search (goto '-//')
 * image cache will remember alignment within viewport
 * jump back and forth from the last viewed image with the ' (single quote aka apostrophe)
   key and the _lastfileindex variable
 * added --load-image-descriptions-file (equivalent to 'desc' 'load') to populate 
   the i:_comment values of each loaded image file and set _caption_over_image=2
   (with it added also --image-descriptions-file-separator)
 * added the 'desc "load"' command to load a textual files comments description file
 * introduced a 'limit' command, with comment, file name, or marked file criteria
 * the '&grave;' key is bound to toggle limit'ing to the marked files list
 * introduced 'list "mark"' and 'list "unmark"' subcommands styled as 'limit'
 * load i:_comment and i:var from description file, with forms:
   "filename comment" (to i:_comment),
   "#!fim:var=value" (to   set i:var=value on all all the files following)
   "#!fim:var="      (to unset i:var=value on all all the files following)
   "filename #!fim:=" (to i:_comment from the value read last)
   "filename #!fim:+comment" (similar, but will append the new comment)
   "filename #!fim:^comment" (similar, but will prepend the new comment)
   "filename #!fim:s/f/t" (similar, but replace string f with string t)
 * EXIF tags will be read with libexif and become i:EXIF_-prefixed variables
 * if _want_exif_orientation is set, images will be reoriented according to EXIF
   metadata (i:__exif_orientation, i:__exif_mirrored, i:__exif_flipped).
 * the 'help' command will search also in fim command options
 * will optionally use C++11 constructs with ./configure --enable-cxx11 (no user level impact)
 * scaling image code faster (thanks to __restrict__ pointers)
 * customizable SDL window caption line with _want_wm_caption_status
 * BMP format support is now optional
 * PCX format support (optional)
 * changed meaning of variable _ignorecase: now it affects autocommands
 * introduced variable _re_search_opts affecting regexp-based search
 * default key 'r' is bound to 'rotate90', key 'R' to 'rotate270'
 * can be invoked without stdin; e.g. from an X menu
 * added "display 'resize'" to resize the SDL window, optionally to the image size
 * default SDL mode is windowed now
 * by default, the 'C-w' key will resize the SDL window to the original image size
 * by default, the 'W' key will resize the SDL window to the image size,
   and added an --autowindow switch to adapt window size to picture size
 * the 'help' command will search in help items if argument starts with /
 * special variable i:* expanding to all the variable name/value pairs of the current image
 * opening image files in archives (e.g. CBZ,CBR,RAR,TAR,fim-0.7.1.tar.gz,TBZ,7Z,ISO,...)
   with libarchive (experimental)
 * JPEG-2000 file support via JasPer (experimental)
 * added a ':- INTEGER' syntax, so one can specify the file in the list counting from the end
 * added an _archive_files variable to specify which file name types specify archives
 * added a 'list "pushdirr"' command, working like "pushdir" but recursively
 * the _fbfont variable will contain the current console font file string
 * mirror/flip are now being applied with respect to the viewport borders
 * stat() checking of files on load can be disabled with _push_checks
 * added --no-stat-push to set _push_checks=0 before initialization
 * added the _caption_over_image variable (which is 0 unless --load-image-descriptions-file)
 * 'Pause' and 'Menu' keys are now available in SDL (-o sdl) mode
 * added  'list' 'marked'  to show the list of marked files
 * key 'Del' bound to pop (delete) the current image from the list
 * i:_file loader will store the used loader string
 * switch --offset accepts a range now (using the new _open_offset_retry variable)
 * if an image has been opened with an offset, i:_open_offset will be set accordingly
 * variable i:pagecount is now replaced by i:pages
 * put aside (disabled) the v: b: and w: namespaces until they make more sense
 * panning on mouse movement in SDL mode
 * &grave;make fim' goal has been deleted
 * changed librsb library detection: now it's e.g.:
   LIBS="&grave;librsb-config  --ldflags --extra_libs&grave; " CXXFLAGS="&grave;librsb-config --cflags&grave; "\
   ./configure --enable-matrices-rendering
 * bugfix: in some situations fim -o fb was not clearing the screen before drawing the image
 * bugfix in the "list 'remove'" internals
 * --binary=1/--binary=24 will not pad tiny renderings to _preferred_rendering_width pixels
 * fix: corrected the quiet mode (-q) to be quieter
 * fix: no zlib.h build time dependency (this will be reintroduced in the future)

                Version 0.4

 * changed --random semantics and introduced --random-no-seed switch
 * customizable status bar file info string
 * introduced --as-text to render printable bytes as text
 * key r is bound to 'rotate90', key R to 'rotate270'
 * bug fixes for the g: namespace, SDL/X mode, "list 'pop'" command, 
   the --offset option, 'ascale' and rotation, documentation.

                Version 0.4-beta

 * interface to the GraphicsMagic library (more graphics formats supported)
 * introduced bitwise AND and OR operators
 * support for rendering "matrix market" numerical matrix files (with librsb)
 * X mode not anymore default in aalib, available at option 
 * libjpeg usage fixes
 * libpng usage fixes (support for PNG_LIBPNG_VER>=10209)
 * documentation improvements (e.g.: fim man page is auto-generated)
 * "imlib2" X-based output device support 
 * "sdl" output device improvements (fullscreen/mouse/windowed options, I/O, ..)
 * more default consolefont options (e.g.: hardcoded consolefonts support)
 * configure option to disable the fim history file
 * improvements to scale, goto, other commands
 * improved directories reading
 * introduced --no-commandline, --no-internal-config switches
 * aggregated some commands for clarity
 * output console can be disabled at configure time
 * important fbdev bug fixes 
 * autocompletion of variable identifiers

                Version 0.3

 * minor strchr compilation problem on some systems
 * better consolefonts support  
 * much better SDL support (different color modes)
 * 'negate' feature
 * -S, or 'sanity-check' switch [changed meaning in v0.6]

               Version 0.3-beta-prerelease

 * auto-generated documentation: more consistency 
 * grammar specification, in man fimrc
 * internal commands,variables,autocommands  reference man page, in man fimrc
 * better internal help mechanisms
 * more control (resolution change,windowed mode) in experimental sdl mode
 * new commands (pread,reverse,shuffle,...) 
 * (temporarily) disabled internal windows splitting 
 * pushing files from a directory
 * several minor and major bugfixes

                Version 0.3-beta

 * full         support for AAlib (ASCII-art rendering) (-o aa)
 * experimental support for SDLlib (Simple Directmedia Layer) (-o sdl) (X!)
 * experimental PDF, PS, DJVU file support
 * history file support (~/.fim_history)
 * seamless caching and prefetching integration
 * viewing of any type files as bitmaps (unset bits black, set bits white)
 * viewing of any type files as pixmaps (as RGB triples)
 * framebuffer driver now can be disabled at compile time
 * colors inversion: saves a significant fraction of power when viewing documents 

                Version 0.3-alpha

 * experimental support for AAlib (ASCII-art rendering) (-t)
 * reading image files (-i) and scripts (-p) from stdin
 * runs on the powerpc architecure
 * rewritten from scratch the debug console, now buffered and with scrolling
 * achieved speedup in magnifying pictures
 * achieved speedup in displaying dithered images
 * smarter quoting rules (looser quote checking) when "push"ing files
 * dumping to file execution logs as executable scripts (-W/--write-scriptout)
 * implemented regular expressions matching operator (=~)
 * new default key bindings for split windows control
 * could be compiled with no readline library (--disable-readline)

                Version 0.2
 
 * internal windowing (with splitting, resizing, swapping) support
 * .xcf, .fig, .dia, .svg files now viewable via wrapper calls
 * introduced interactive command iteration ( in the [n] form )
 * fim will try to run under screen and over ssh now
 * custom framebuffer device, fonts and gamma are supported
 * enriched compile-time options via the ./configure script
 * vim-styled variable scoping g:,i:,v:,w: (local variables)
 * eradicated some bugs
 * introduced new variables, commands

                Version 0.2-alpha
 
 * first windowing functionalities
 * bugs and subtle flaws handling
 * introduced new variables, commands

                Version 0.1

 * regular expressions for filtering the viewed image list
 * vim-like autocommands
 * command line autocompletion
 * command line history
 * completely customizable key bindings
 * external/internal scriptability

 

NAME
SYNOPSIS
DESCRIPTION
USAGE
OPTIONS
PROGRAM RETURN STATUS
COMMON KEYS AND COMMANDS
AFFECTING ENVIRONMENT VARIABLES
COMMON PROBLEMS
INVOCATION EXAMPLES
NOTES
BUGS
FILES
SEE ALSO
AUTHOR
COPYRIGHT


NAME

fim –
Fbi (linux framebuffer
imageviewer) IMproved, an universal image
viewer

SYNOPSIS

fim
[” “] [–]
[[’w’]
fim
–output-device
[fb|sdl|gtk|ca|aa|dumb][=’next’]
… | fim
[’+/’] [–] [’-’]

fim
[identifier2…] [–] [’-listall’] – <
’sw’
fim
–image-from-stdin [” “] <

fim
–script-from-stdin [’W’]] <
’next’
fim
–help[=s|d|l|m] [’-/’ …]

DESCRIPTION

fim is a
’swiss army knife’ for displaying image files.
It is capable of displaying image files using different
graphical devices while offering a uniform look and feel.
Key bindings are customizable and specified in an
initialization file. Interaction with standard input and
output is possible, especially in shell scripts. An internal
scripting language specialized for image viewing allows
image navigation, scaling, manipulation of internal
variables, command aliases, and Vim-like autocommands. The
internal language can be interacted with via a command line
mode capable of autocompletion and history (the readline
mode). Further features are display of EXIF tags, JPEG
comments, EXIF rotation/orientation, load of
“description files”, faster load via image
caching, command recording, and much more.

As a default,
fim displays the specified file(s) on the detected,
most convenient graphical device. This can be with SDL if
running under X, an ASCII-art driver (aalib or libcaca) if
running behind ssh without X forwarding, or the linux
framebuffer device. Graphical file formats BMP, PCX are
supported natively, while JPEG, PNG, GIF, TIFF, PPM, PGM,
PBM, QOI, AVIF, WEBP are supported via third party
libraries. Further formats are supported via external
converters. For XCF (Gimp’s) images,
’xcftopnm’ or ’xcf2pnm’ is used. For
FIG vectorial images, ’fig2dev’ is used. For DIA
vectorial images, ’dia’ is used. For NEF raw
camera images, ’dcraw’ is used. For SVG
vectorial images, ’inkscape’ is used. For other
formats ImageMagick’s ’convert’ is used.
The converter is given 15 seconds for the conversion before
a timeout.

If
’-’ is a file, its format is guessed not by
its name but by its contents. See the _file_loader
variable to change this default.

If
identifier2… is a directory, load files of supported
formats contained there. If ’-list’ contains a
trailing slash (/), it is treated as a directory; otherwise
that is checked via stat(2). To change this default,
see description of the _pushdir_re variable and the
–no-stat-push and –recursive options.

This man page
describes fim command line options and usage. See man
fimrc(5) for a full specification of the fim
language, commands, keysyms, autocommands, variables,
aliases, examples for a configuration file and readline
usage samples.

USAGE

You may invoke
fim from an interactive shell and control it with the
keyboard, as you would do with any image viewer with
reasonable key bindings.

fim is
keyboard oriented: there are no user menus or buttons
available. If you need some feature or setting which is not
accessible from the default keyboard configuration, you
probably need a custom configuration or simply need to type
a custom command. For these, you can use the internal
command and configuration language.

See options
–read-from-stdin, –script-from-stdin, and
–image-from-stdin for more script-oriented
usages.

The full
commands specification is also accessible at runtime using
the internal help system (typing :help).

OPTIONS

Accepted
command line ’se’:

Treat arguments after as filenames. Treat
arguments before as command line options if these
begin with , and as filenames otherwise.

-a,
–autozoom

Enable autozoom. Automagically
pick a reasonable zoom factor when displaying a new image
(as in fbi).

-b[24|1],
–binary[=24|1]

Display contents of binary
files (of any filetype) as these were raw 24 or 1 bits per
pixel pixelmaps. The width of this image will not exceed the
value of the _preferred_rendering_width variable.
Regard this as an easter bunny option.

–as-text

Display contents of files (of
any filetype) as these were text. The width of this image
will not exceed the value of the
_preferred_rendering_width variable. Non-printable
characters are then displayed as ” “. Regard this
as another easter bunny option.

–cd-and-readdir

Step in the directory of the
first file to be loaded, push other files from that
directory, and jump back to the first file. Useful when
invoking from a desktop environment.

-c ” “,
–execute-commands

Execute [’w’ after
reading the initialization file, just before entering the
interactive mode. No semicolon (;) is required at the
end of ’prev’. Do not forget quoting
’+/’ in a manner suitable to your shell. So -c
next is fine as it is. A more complicated example, with
quotings: -c ’*2;2pan_up;display;while(1)’-’’ (with the single quotes) tells fim
to: double the displayed image size, pan twice up, display
the image, and finally do an endless loop consisting of
bottom and top aligning, alternated.

-C identifier,
–execute-commands-early ’-listall’

Similar to the
–execute-commands option, but execute
’up’ earlier, just before reading the
initialization file. If ” “ takes the special
’early’ form =var=val, it assigns value
val to variable var immediately, before the
interpreter is started, and with no value quoting
needed.

For example, -C
_scale_style=” “’ starts fim
no auto-scaling; the equivalent early form is: -C
’=_scale_style= ’.

-d 💬,
–device {fbdev}

Framebuffer device to use.
Default is the one your vc is mapped to (as in fbi).

–dump-reference-help[=man]

Dump to stdout language
reference help and quit.

–dump-default-fimrc

Dump default configuration (the
one hardcoded in the fim executable) to standard output and
quit.

-E {scriptfile},
–execute-script {scriptfile}

Execute {scriptfile}
after the default initialization file is read, and before
executing –execute-commands commands.

-f {fimrc},
–etc-fimrc {fimrc}

Specify an alternative
system-wide initialization file (default:
/usr/local/etc/fimrc), to be read prior to any other
configuration file. See also –no-etc-fimrc-file.

-F {commands},
–final-commands {commands}

Similar to the
–execute-commands option, but execute
{commands} after exiting the interactive mode, just
before terminating the program.

-h[s|d|l|m],
–help[=s|d|l|m]

Print program invocation help,
and exit. Depending on the option, output can be: short,
descriptive, long from man, or complete man. For each
further argument {help-item} passed to fim, an
individual help message is shown. If {help-item}
starts with a /, it is treated as a search string (not a
regexp, though).

-k {keysym},
–keysym-press {keysym}

Execute any command bound (via
the bind command) to a specified keysym at startup. A keysym
can be prefixed by a repetition count number. You can
specify the option multiple times to simulate multiple
keystrokes. Presses entered via –keysym-press are
processed with the same priority as those entered via
–chars-press, that is, as they appear. See man
fimrc(5) for a list of keysyms and the use of
bind.

-K {chars},
–chars-press {chars}

Input one or more keyboard
characters at program startup (simulate keyboard presses).
This option can be specified multiple times. Each additional
time (or if the string is empty), a press of Enter (ASCII
code 0x0D) key is prepended. Examples: -K ’’
simulates press of an Enter; -K ’:next;’
activates the command line and enter “next;”
without executing it; -K “:next;” -K
“next” executes “next”, stays in the
command line and enter keys “next”; -K
“:next;” -K “” -K “next”
executes “next”, leaves the command line, and
executes in sequence any command bound to keys
’n’, ’e’, ’x’,
’t’. Presses entered via –chars-press
are processed with the same priority as those entered via
–keysym-press, that is, as they appear.

-D {filename},
–load-image-descriptions-file {filename}

Load image descriptions from
file {filename}. Each line begins with the basename
of an image file, followed by a Tab character (or a
different character if specified via
–image-descriptions-file-separator), then the
description text. The description text is copied into the
i:_comment variable of the image at load time,
overriding the comment possibly loaded from the file (e.g.
JPEG, PNG or TIFF comment). If a ’@’ followed by
an identifier {identifier} is encountered, and
i:{var} is set, its value is substituted here. If
“@#” is encountered, the remainder of the
description line is ignored. Special comment lines like
“#!fim:{var}={val}” lead
i:{var} to be assigned value {val} (unquoted)
at image loading time (cached variable), unless {var}
starts with an underscore (’_’). Special comment
lines like “#!fim:@{var}={val}
create a variable {var} that are only valid in
expanding @{var} in comments. Special comment lines
like “#!fim:{var}@={val}” or
“#!fim:@{var}@={val} (notice @ before =)
also expand whatever @{identifier} encountered in
{val} . Special comment lines like
“#!fim:+={val}” add {val} to current
description. Special comment lines like
“#!fim:^={val}” set {val} to be the
base of each description. Special comment lines like
“#!fim:!=” reset all cached variables. Special
comment lines like “#!fim:/={dir}” prepend
{dir} to each file’s basename. Special comment
lines like “#!fim:\={dir}” prepend
{dir} to each file’s name. Special description
text (to be associated to an image) begins with markers:
with “#!fim:=”, the last description line is
reused; with “#!fim:+”, what follows is appended
to the last description line; with “#!fim:^”, what
follows is prepended to the last description line; with
“#!fim:s/{f}/{t}“, the last
description line is used and substituted substring
{t} to occurrences of substring {f}
({f} and {t} cannot contain newlines or a
’/’). If {val} is empty that variable is
unset. These variables are stored also in an internal index
used by the limit command. This option sets
_caption_over_image=2, so that a caption is displayed
over the image. A description file beginning with
“#!fim:desc” can be loaded without specifying this
switch.

-S {sepchar},
–image-descriptions-file-separator
{sepchar}

A character to be used as a
separator between the filename and the description part of
lines specified just before a
–load-image-descriptions-file.

-i,
–image-from-stdin

Read one single image from the
standard input (the image data, not the filename). May not
work with all supported file formats. In the image list,
this image takes the special name
“.

–mark-from-image-descriptions-file
{filename}

Set those files specified in
{filename} (see –load-image-descriptions-file for
the file format) as marked (see the list command).

-m {vmode},
–mode {vmode}

Name of the video mode to use
video mode (must be listed in /etc/fb.modes). Default is not
to change the video mode. In the past, the XF86 config file
(/etc/X11/XF86Config) used to contain Modeline information,
which could be fed to the modeline2fb perl script
(distributed with fbset). On many modern xorg based systems,
there is no direct way to obtain a fb.modes file from the
xorg.conf file. So instead one could obtain useful fb.modes
info by using the (fbmodes (no man page AFAIK)) tool,
written by bisqwit. An unsupported mode should make fim exit
with failure. But it is possible the kernel could trick fim
and set a supported mode automatically, thus ignoring the
user set mode.

-N,
–no-rc-file

No personal initialization file
is read (default is ~/.fimrc) at startup.

–no-etc-fimrc-file

No system-wide initialization
file is read (default is /usr/local/etc/fimrc) at startup.
See also –etc-fimrc.

–no-internal-config

No internal default
configuration at startup (uses internal variable
_no_default_configuration). Will only provide a
minimal working configuration.

–no-commandline

With internal command line mode
disabled.

–no-history-save

Do not save execution history
at finalization (uses internal variable
_save_fim_history).

–no-history-load

Do not load execution history
at startup.

–no-history

Do not load or save execution
history at startup.

-p,
–script-from-stdin

Read commands from stdin before
entering in interactive mode.

-o
[fb|sdl|gtk|ca|aa|dumb][=
{gfxopts}],
–output-device
[fb|sdl|gtk|ca|aa|dumb][=
{gfxopts}]

Use the specified device
(one among fb|sdl|gtk|ca|aa|dumb) as fim video output
device, overriding automatic checks. If the device is
empty and followed by {gfxopts}, it will be selected
automatically. The available devices depend on the current
environment and on the configuration and compilation
options. You can get the list of available output devices
issuing fim –version. The possible values to
{gfxopts} that we describe here can also be passed as
“display ’reinit’ {gfxopts}” —
see man fimrc for this. The device name with options
(perhaps with modifications due to auto-detection) is stored
in variable _device_string. The fb option
selects the Linux framebuffer. Presence of {gfxopts}
with value ’S’ (e.g.
fb=S’) makes framebuffer initialization
more picky: it does not tolerate running in a screen
session. The ca option (coloured ASCII-art) can be
specified as
ca[={[’w’][’h’][’H’][’d:’DITHERMODE]}]
; if supplied, ’w’ selects windowed mode,
provided libcaca is running under X; by default (or with
’W’), windowed mode is being turned off
internally during initialization by unsetting the DISPLAY
environment variable. If ’d:’ is present,
the DITHERMODE following it will be passed as dither
algorithm string (alternatively, it can be a non-negative
number, too). The aa (monochrome ASCII-art) option
can be specified as
aa[={[’w’|’W’]}]; if
supplied, ’w’ selects windowed mode,
provided aalib is running under X; by default (or with
’W’), windowed mode is being turned off
internally during initialization by unsetting the DISPLAY
environment variable. Please note that the readline
(internal command line) functionality in ca and
aa modes is limited. If the graphical windowed mode
is sdl or gtk it can be followed by
={[’w’][’m’][’r’][’h’][’W’][’M’][’R’][’H’][width[:height]][’%’]},
where width and height are integer numbers
specifying the desired resolution (if height not
specified, it takes the value of width); the
’w’ character requests windowed mode
(instead of ’W’ for fullscreen); the
’m’ character requests mouse pointer
display; the ’h’ character requests help
grid map draw (can be repeated for variants); the
’r’ character requests support for window
resize; the ’%’ character requests to
treat width and height as percentage of
possible window resolution. The same letters uppercase
request explicit negation of the mentioned features.
Additionally, in gtk mode: ’b’
hides the menu bar, ’e’ starts with empty
menus, ’f’ rebuilds the menus, and
’D’ removes the menus. Note: the
gtk mode is a recent addition and may have defects.
The sdl mode works best with libsdl-2; libsdl-1.2
support is being discontinued.
The imlib2 option requests imlib2 and is unfinished:
do not use it.
The dumb test mode is there only for test purposes
and is not interactive.

–offset
{bytes-offset[{:upper-offset}|{+offset-range}]}

Use the specified offset
(in bytes) for opening the specified files. If
:upper-offset is specified, further bytes until
upper-offset are probed. If +offset-range is
specified instead, that many additional bytes are to be
probed. Use this option to search damaged file systems for
image files. Appending a modifier among
’K’,’M’,’G’ (case
irrelevant) to an offset number changes the unit to be
respectively 2^10, 2^20, or 2^30 bytes.

–pread-cmd
{cmd-filter-pipeline}

Specify a shell command with
{cmd-filter-pipeline}. If the current filename
matches “^[/A-Za-z0-9_.][/A-Za-z0-9_.-]*$”, it is
be substituted to any occurrence of ’{}’. The
resulting command output is assumed to be file data, which
is read, decoded, and displayed. This works by setting the
internal _pread_cmd variable (empty by default).

-P,
–text-reading

Enable textreading mode. This
has the effect that fim displays images scaled to the width
of the screen, and aligned to the top. If the images you are
watching are text pages, all you have to do to get the next
piece of text is to press space (in the default key
configuration, of course).

-s {value},
–scroll {value}

Set scroll steps for internal
variable _steps (default is “20%”).

–slideshow
{number}

Interruptible slideshow mode.
Wait for {number} of seconds (can have a decimal
part, and is assigned to the _slideshow_sleep_time variable)
after each image. Implemented by executing reload;
i:fresh=1; while(_fileindex <=
_filelistlen-_loop_only_once){sleep _slideshow_sleep_time;
next;} _loop_only_once=0; sleep _slideshow_sleep_time; as a
first command. Can be interrupted by : or Esc. The other
keys execute accordingly to their function but do not
interrupt the slideshow. Like in fbi, this cycles forever,
unless –once is specified.

–sanity-check

Perform a quick sanity check,
just after the initialization, and terminate.

-t,
–no-framebuffer

fim Use an ASCII Art
driver. If present, use either of libcaca (coloured), or
aalib (monochrome). For more, see (man fimrc), (info aalib)
or (apropos caca)). If no ASCII Art driver had been enabled
at compile time, fim does not display any image at all.

-T {terminal},
–vt {terminal}

The {terminal} is to be
used as virtual terminal device file (as in fbi). See (chvt
(1)), (openvt (1)) for more info about this. Use (con2fb
(1)) to map a terminal to a framebuffer device.

–reverse

Reverse files list before
browsing (can be combined with the other sorting
options).

–sort

Sort files list before browsing according to full
filename.

–sort-basename

Sort files list before browsing
according to file basename’s.

–sort-mtime

Sort files list before browsing
according to file modification time.

–sort-fsize

Sort files list before browsing
according to file size.

-u, –random

Randomly shuffle the files list
before browsing (seed depending on time() function).

–random-no-seed

Pseudo-random shuffle the files
list before browsing (no seeding).

-v, –verbose

Be verbose: show status
bar.

–verbose-load

Load files verbosely (repeat
option to increase verbosity).

–verbose-font-load

Load font verbosely (sets
_fbfont_verbosity).

–verbose-interpreter

Execute interpreter verbosely
(Sets immediately _debug_commands=”ackCm”
if specified once,
_debug_commands=”ackCmmi” if specified
twice).

-V, –version

Print to stdout program
version, compile flags, enabled features, linked libraries
information, supported filetypes/file loaders, and then
exit.

-w,
–autowidth

Scale the image according to
the screen width.

-=,
–no-auto-scale

Do not scale the images after
loading (sets ’_scale_style=”
“’;).

–autowindow

Resize the window size (if
supported by the video mode) to the image size. Don’t
use this with other image scaling options.

–no-stat-push

Sets _push_checks=0
before initialization, thus disabling file/dir existence
checks with stat(2) at push push time (and speeding up
startup).

-H,
–autoheight

Scale the image according to
the screen height.

-W {scriptfile},
–write-scriptout {scriptfile}

All the characters that you
type are recorded in the file {scriptfile}, until you
exit fim. This is useful if you want to create a
script file to be used with “fim -c” or
“:exec” (analogous to Vim’s -s and
“:source!”). If the {scriptfile} file
exists, it is not touched (as in Vim’s -w).

-L
{fileslistfile}, –read-from-file
{fileslistfile}

Read file list from a file:
each line one file to load (similar to
–read-from-stdin; use –read-from-stdin-elds
to control line breaking).

-, –read-from-stdin

Read file list from stdin: each
line one file to load; use with –read-from-stdin-elds to
control line breaking).

Note that these
three standard input reading functionalities (-i,-p and -)
conflict : if two or more of them occur in fim invocation,
fim exits with an error and warn about the ambiguity.

See the section
INVOCATION EXAMPLES below to read some useful (and
unique) ways of employing fim.

–read-from-stdin-elds
{delimiter-char}

Specify an endline delimiter
character for breaking lines read via
-/–read-from-stdin/–read-from-file (which shall be
specified after this). Line text before the delimiter are be
treated as names of files to load; the text after is
ignored. This is also useful e.g. to load description files
(see –load-image-descriptions-file) as filename list files.
Default is the newline character (0x0A); to specify an ASCII
NUL byte (0x00) use ’’.

-A, –autotop

Align images to the top border
(by setting ’_autotop=1’ after
initialization).

-q, –quiet

Quiet execution mode. Sets
_display_status=0;_display_busy=0;.

-r
{{width:height}|’fullscreen’},
–resolution
{{width:height}|’fullscreen’}

Set resolution specification in
pixels dimensions. Supported only by GTK and SDL. Will be
appended to the argument to –output-device. Shorthand value
’fullscreen’ is translated as
’W’.

-R[{exp}],
–recursive[={exp}]

Push files/directories to the
files list recursively. The expression in variable
_pushdir_re (default:
“.(JPG|PNG|GIF|BMP|TIFF|TIF|JPEG|JFIF|PPM|PGM|PBM|PCX|QOI|AVIF|WEBP)$”)
lists extensions of filenames which are loaded in the list.
You can overwrite its value by optionally passing an
expression {exp} here as argument. If starting with
’+’ or ’|’, the expression following
is to be appended to it.

-X,
–no-pipe-load

Do not load via external
converter programs: only use built-in file decoders.

-B,
–background-recursive

Push files/directories to the
files list recursively, in background during program
execution. Any sorting options are ignored. Experimental
feature, unfinished.

–load-shadow-directory
{dirname}

Add {dirname} to the
shadow directory list. Then ’scale
“shadow”’ temporarily substitutes the image
being displayed with that of the first same-named file
located under a shadow directory. Useful to browse low-res
images, but still being able to quickly view the hi-res
original residing in a shadow directory. This works as
intended as long as unique filenames are involved.

-/ {pattern},
–/ {pattern}

After startup jump to pattern;
short for -c ’/’ {pattern}.

–//
{pattern}

After startup jump to pattern;
as -c ’/’{pattern} but with search on the
full path (with _re_search_opts=”f”).

-1, –once

If running –slideshow, loop
only once (as in fbi).

PROGRAM RETURN STATUS

The program
return status is 0 on correct operation; 252 on unsupported
device specification; 248 on bad input; 255 on a generic
error; 42 on a signal-triggered program exit; or a different
value in case of an another error.
The return status may be controlled by the use of the quit
command.

COMMON KEYS AND COMMANDS

The following
keys and commands are default hardcoded in the minimal
configuration. These are working by default before any
configuration file loading, and before the hardcoded config
loading (see variable
_fim_default_config_file_contents).

n goto
’+1f’
p goto ’-1f’
+ scale ’+’
– scale ’-’
h pan ’left’
l pan ’right’
k pan ’up-’
j pan ’down+’
q quit
You can type a number before a command binding to iterate
the assigned command:
3k 3pan ’up-’

: enter command
line mode (here one can use readline bindings as C-r, C-s,
M-b, M-f, …)
:{number} jump to {number}^th image in the
list

:^

jump to first image in the list

:$

jump to last image in the list

:*{factor} scale the
image by {factor}
:{scale}% scale the image to the desired
{scale}
:+{scale}% scale the image up to the desired
percentage {scale} (relatively to the original)
:-{scale}% scale the image down to the desired
percentage {scale} (relatively to the original)

/{regexp}

entering the pattern {regexp} (with
’/’) makes fim jump to the next image whose
filename matches {regexp}

/*.png$

entering this pattern (with ’/’) makes fim
jump to the next image whose filename ends with
’png’

/png

a shortcut for ’/.*png.*’

2,4 stdout ’{}’

print three filenames to standard output.

!{syscmd}

executes the {syscmd} quoted string as an
argument to the “system” fim command.

You can
visualize all of the default bindings invoking fim
–dump-default-fimrc | grep bind .
You can visualize all of the default aliases invoking fim
–dump-default-fimrc | grep alias .

The Return vs.
Space key thing can be used to create a file list while
reviewing the images and use the list for batch processing
later on.

All of the key
bindings are reconfigurable; see the default fimrc
file for examples on this, or read the complete manual: the
FIM.TXT file distributed with fim.

AFFECTING ENVIRONMENT VARIABLES

FBFONT

(just like in fbi) a Linux consolefont font file.

If using a gzipped font file,
the zcat program is used to uncompress it (via
execvp(3)).
If FBFONT is unset, the following files are probed and the
first existing one is selected:

/usr/share/kbd/consolefonts/cp866-8×16.psf.gz

/usr/share/consolefonts/Uni3-TerminusBoldVGA14.psf.gz
/usr/lib/kbd/consolefonts/lat9-16.psf.gz
/usr/share/consolefonts/lat1-16.psf
/usr/share/consolefonts/lat1-16.psf.gz
/usr/share/consolefonts/lat1-16.psfu.gz
/usr/share/kbd/consolefonts/lat1-16.psf
/usr/share/kbd/consolefonts/lat1-16.psf.gz
/usr/share/kbd/consolefonts/lat1-16.psfu.gz
/usr/lib/kbd/consolefonts/lat1-16.psf
/usr/lib/kbd/consolefonts/lat1-16.psf.gz
/usr/lib/kbd/consolefonts/lat1-16.psfu.gz
/lib/kbd/consolefonts/lat1-16.psf
/lib/kbd/consolefonts/lat1-16.psf.gz
/lib/kbd/consolefonts/lat1-16.psfu.gz
/lib/kbd/consolefonts/Lat2-VGA14.psf.gz
/lib/kbd/consolefonts/Lat2-VGA16.psf.gz
/lib/kbd/consolefonts/Lat2-VGA8.psf.gz
/lib/kbd/consolefonts/Uni2-VGA16.psf.gz
/usr/share/consolefonts/default8x16.psf.gz
/usr/share/consolefonts/default8x9.psf.gz
/usr/share/consolefonts/Lat15-Fixed16.psf.gz
/usr/share/consolefonts/default.psf.gz
fim://

If the special
fim:// string is specified, a hardcoded font is used.

FBGAMMA

(just like in fbi) gamma correction (applies to dithered
8 bit mode only). Default is 1.0.

FRAMEBUFFER

(just like in fbi) user set framebuffer device file
(applies only to the fb mode).

If unset, fim probes for
/dev/fb0.

TERM

(only in fim) influences the output device selection
algorithm, especially if $TERM==”screen”.

SSH_TTY

if set and no output device specified, assume
we’re over ssh, and give precedence to ca, then
aa (if present).

TERMUX_VERSION

if set and no output device specified, assume
we’re over termux, and give precedence to ca,
then aa (if present).

WAYLAND_DISPLAY

if set and no output device specified, assume
we’re over Wayland, and give precedence to gtk,
then sdl, then ca, then aa (if present).

DISPLAY

If this variable is set, then the gtk driver has
precedence, then sdl.

COMMON PROBLEMS

fim -o
fb
needs read-write access to the framebuffer devices
(/dev/fbN or /dev/fb/N), i.e you (our your admin) have to
make sure fim can open the devices in rw mode. The IMHO most
elegant way is to use pam_console (see
/etc/security/console.perms) to chown the devices to the
user logged in on the console. Another way is to create some
group, chown the special files to that group and put the
users which are allowed to use the framebuffer device into
the group. You can also make the special files world
writable, but be aware of the security implications this
has. On a private box it might be fine to handle it this way
through.

If using udev,
you can edit: /etc/udev/permissions.d/50-udev.permissions
and set these lines like here:
# fb devices
fb:root:root:0600
fb[0-9]*:root:root:0600
fb/*:root:root:0600

fim -o
fb
also needs access to the linux console (i.e.
/dev/ttyN) for sane console switch handling. That is
obviously no problem for console logins, but any kind of
pseudo tty (xterm, ssh, screen, …) will not
work.

INVOCATION EXAMPLES

fim –help
-R -B

# get help for options -R and -B

fim
media/

# load files from the directory media/

fim -R
media/ –sort

# open files found by recursive traversal of directory
media, then sorting the list

find
/mnt/media/ -name *.jpg | fim –

# read input files list from standard input

find
/mnt/media/ -name *.jpg | shuf | fim –

# read input files list from standard input, randomly
shuffled

cat
script.fim | fim -p images/*

# read a script file script.fim from standard input
before displaying files in the directory images

scanimage
… | tee scan.ppm | fim -i

# read the image scanned from a flatbed scanner as soon as
it is read

h5topng -x 1
-y 2 dataset.hdf -o /dev/stdout | fim -i

# visualize a slice from an HDF5 dataset file

fim * >
selection.txt

# output the file names marked interactively with the
’list “mark”’ command in fim to a
file

fim * | fim

# output the file names marked with ’m’ in fim
to a second instance of fim, in which these could be marked
again

fim -c
’pread “vgrabbj -d /dev/video0 -o
png”;reload’
# display an image grabbed from a webcam

fim -o
aa -c ’pread “vgrabbj -d /dev/video0 -o
png”;reload;system “fbgrab”
“asciime.png”’
# if running in framebuffer mode, saves a png screenshot
with an ASCII rendering of an image grabbed from a
webcam

fim -c
’while(1){pread “vgrabbj -d /dev/video0 -o
png”;reload;sleep 1;};’

# display a
sequence of images grabbed from a webcam; circa 1 per
second

NOTES

This manual
page is neither accurate nor complete. In particular, issues
related to driver selection shall be described more
accurately. Also the accurate sequence of autocommands
execution, variables application is critical to
understanding fim, and should be documented. The filename
” is reserved for images read from
standard input (view this as a limitation), and thus
handling files with such name may incur in limitations.

BUGS

fim has
bugs. Please read the BUGS file shipped in the
documentation directory to discover the known ones. There
are also inconsistencies in the way the internal command
line works across the different graphical devices.

FILES

/usr/local/share/doc/fim

The directory with fim
documentation files.

/usr/local/etc/fimrc

The system-wide fim
initialization file (executed at startup, after executing
the hardcoded configuration).

~/.fimrc

The personal fim initialization file (executed at
startup, after the system-wide initialization file).

~/.fim_history

File where to load from or save command history. See
(man fimrc(5), man readline(3)).

~/.inputrc

If fim is built with GNU readline support, it is
susceptible to changes in the user set ~/.inputrc
configuration file contents. For details, see (man
readline(3)).

SEE ALSO

Other
fim man pages: fimgs(1), fimrc(1).
Conversion programs: convert(1), dia(1),
xcftopnm(1), fig2dev(1), inkscape(1).

Related programs: fbset(1), con2fb(1),
vim(1), mutt(1), exiftool(1),
exiftags(1), exiftime(1), exifcom(1),
fbi(1), fbida(1), feh(1),
qiv(1), sxiv(1), fbgrab(1).
Related documentation: fbdev(4), vcs(4),
fb.modes(8), fbset(8), setfont(8).

AUTHOR

Michele Martone
is the author of
fim, “Fbi IMproved”.

COPYRIGHT

Copyright (C)
2007-2024 Michele Martone (author of fim)
Copyright (C) 1999-2004 Gerd Hoffmann is the author of “fbi”, upon which
fim was originally based.

This program is
free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is
distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have
received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA.


 

NAME
SYNOPSIS
DESCRIPTION
FIM LANGUAGE GRAMMAR
COMMANDS REFERENCE
KEYSYMS REFERENCE
AUTOCOMMANDS REFERENCE
VARIABLES REFERENCE
DEFAULT ALIASES REFERENCE
COMMAND LINE USAGE EXAMPLES
CONFIGURATION FILE EXAMPLE
NOTES
BUGS
SEE ALSO
AUTHOR
COPYRIGHT


NAME

fimrc –
fim configuration file and language reference

SYNOPSIS

~/.fimrc

/usr/local/etc/fimrc
fim
–script-from-stdin [ {options} ] <
{scriptfile}
fim
–execute-script {scriptfile} [
{options} ]
fim
–execute-commands {commands} [
{options} ]
fim
–final-commands {commands} [
{options} ]
fim
–write-scriptout {scriptfile} [
{options} ]
fim
–write-scriptout /dev/stdout [ {options} ]

fim
–chars-press :{commands} [ {options}
]
fim
–chars-press :{commands} –chars-press
’’ [ {options} ]
fim
–keysym-press {keysym} [ {options}
]

DESCRIPTION

This page
explains the fim scripting language, which is used
for the fimrc configuration files,
{scriptfile}s, or {commands} passed via
command line {options}. This language can be used to
issue commands (or programs) from the internal program
command line accessed interactively by default through the
“:” key (which can be customized via the
_console_key” variable). One may exit from
command line mode by pressing the Enter key on an empty line
(a non empty command line would be submitted for execution),
or the Esc key (only in SDL mode). The general form of a fim
command/program is shown in the next section.

FIM LANGUAGE GRAMMAR

This section
specifies the grammar of the fim language.

Language
elements surrounded by a single quote (“’”)
are literals.

Warning: at the
present state, this grammar has conflicts. A future release
shall fix them.

program: %empty

| statement_list

statement_list:
statement
| statement ’;’ statement_list
| non_atomic_statements_block statement_list
| statements_block

non_atomic_statements_block:
’{’ statement_list ’}’
| INTEGER ’{’ statement_list ’}’

| conditional_statement

statements_block:
atomic_statements_block
| non_atomic_statements_block

conditional_statement:
if_statement
| loop_statement

if_statement:
’if’ ’(’ expression ’)’
statements_block
| ’if’ ’(’ expression
’)’ statements_block ’else’
statements_block

loop_statement:
’while’ ’(’ expression
’)’ statements_block
| ’do’ statements_block ’while’
’(’ expression ’)’

atomic_statements_block:
statement ’;’
| statement ’;’ ’;’
| statement ’;’ ’;’
’;’

statement:
’!’ arguments
| INTEGER ’,’ INTEGER IDENTIFIER
| INTEGER ’,’ INTEGER IDENTIFIER arguments
| INTEGER IDENTIFIER
| SLASH_AND_REGEXP
| ’+’ UNQUOTED_FLOAT ’%’
| ’+’ QUOTED_FLOAT ’%’
| ’+’ INTEGER ’%’
| ’*’ UNQUOTED_FLOAT
| ’*’ QUOTED_FLOAT
| ’*’ INTEGER
| UNQUOTED_FLOAT ’%’
| QUOTED_FLOAT ’%’
| INTEGER ’%’
| ’-’ UNQUOTED_FLOAT ’%’
| ’-’ QUOTED_FLOAT ’%’
| ’-’ INTEGER ’%’
| INTEGER
| ’-’ INTEGER
| IDENTIFIER
| IDENTIFIER FILE_PATH
| IDENTIFIER arguments
| INTEGER IDENTIFIER arguments
| IDENTIFIER ’=’ expression

arguments:
expression
| expression arguments

expression:
’(’ expression ’)’
| expression ’.’ expression
| ’!’ expression
| expression ’%’ expression
| expression ’+’ expression
| expression ’-’ expression
| expression ’*’ expression
| expression ’/’ expression
| expression ’<’ expression
| expression ’>’ expression
| expression ’||’ expression
| expression BOR expression
| expression ’&&’ expression
| expression BAND expression
| expression ’>=’ expression
| expression ’<=’ expression
| expression ’!=’ expression
| expression ’==’ expression
| expression ’=~’ expression
| ’-’ expression
| IDENTIFIER
| INTEGER
| QUOTED_FLOAT
| UNQUOTED_FLOAT
| STRING

A STRING can be
either a single quoted string or a double quoted string. A
floating point number can be either unquoted
(UNQUOTED_FLOAT) or quoted (QUOTED_FLOAT). A QUOTED_FLOAT is
a floating point number, either single (“’”)
or double (“””) quoted. An INTEGER shall be
an unsigned integer number. An IDENTIFIER shall be one of
the valid fim commands (see COMMANDS REFERENCE ) or a
valid alias. A VARIABLE shall be an already declared or
undeclared variable identifier (see VARIABLES
REFERENCE
) or a valid alias, created using the
alias command. The “=~” operator treats the
right expression as a STRING, and uses it as a regular
expression for matching purposes. The SLASH_AND_REGEXP is a
slash (“/”) followed by a STRING, interpreted as a
regular expression. If ’INTEGER , INTEGER IDENTIFIER
arguments’ is encountered, command IDENTIFIER will be
repeated on each file in the interval between the two
INTEGERs, and substituting the given file name to any
’{}’ found in the commands arguments (which must
be quoted in order to be treated as strings). See
regex(1) for regular expression syntax.

The way some
one-line statements are evaluated:

: enter command
line mode (here one can use readline bindings as C-r, C-s,
M-b, M-f, …)
:{number} jump to {number}^th image in the
list

:^

jump to first image in the list

:$

jump to last image in the list

:*{factor} scale the
image by {factor}
:{scale}% scale the image to the desired
{scale}
:+{scale}% scale the image up to the desired
percentage {scale} (relatively to the original)
:-{scale}% scale the image down to the desired
percentage {scale} (relatively to the original)

/{regexp}

entering the pattern {regexp} (with
’/’) makes fim jump to the next image whose
filename matches {regexp}

/*.png$

entering this pattern (with ’/’) makes fim
jump to the next image whose filename ends with
’png’

/png

a shortcut for ’/.*png.*’

2,4 stdout ’{}’

print three filenames to standard output.

!{syscmd}

executes the {syscmd} quoted string as an
argument to the “system” fim command.

COMMANDS REFERENCE

alias

alias [{identifier} [{commands}
[{description}]]]
Without arguments, lists the current aliases.
With one, shows an identifier’s assigned command.
With two, assigns to an identifier a user defined command or
sequence of commands.
With three, also assigns a help string.

align

align
[’bottom’|’top’|’left’|right’]:
if image larger than drawing area, align one side of the
image to the border.
align ’center’: align equally far from all
sides.
align ’info’: print internal alignment
information.

autocmd

autocmd {event} {pattern} {commands}: manipulate
autocommands (inspired from Vim autocmd’s).
Without arguments, list autocommands.
With arguments, specifies for which type of event and which
current file open, which commands to execute.
See the default built-in configuration files for
examples.

autocmd_del

autocmd_del: specify autocommands to delete.
Usage: autocmd_del {event} {pattern} {commands}.

basename

basename {filename}: returns the basename of
{filename} in the ’_last_cmd_output’
variable.

bind

bind [{keysym} [{commands}
[{description}]]]: bind a key {keysym} to
{commands}.
Optional {description} specifies a documentation
string.
If {keysym} is at least two characters long and
begins with 0 (zero), the integer number after the 0 will be
treated as a raw keycode to bind the specified
{keysym} to.
Use the ’_verbose_keys’ variable to discover
(display device dependent) raw keys.
Key binding is dynamical, so you can bind keys even during
program’s execution.
You can get a list of valid symbols (keysyms) by invoking
dump_key_codes or in the man page.

cd
cd {path}: change the current directory to
{path}.
If {path} is a file, use its base directory name.

cd ’-’ changes to the previous current directory
(before the last ’:cd {path}
command).

clear

clear: clear the virtual console.

commands

commands: display the existing commands.

color

color [’desaturate’]: desaturate the displayed
image colors.
color [’negate’]: negate the displayed image
colors.
color
[’colorblind’|’c’|’deuteranopia’|’d’]:
simulate a form of the deuteranopia color vision deficiency
(cvd).
color [’protanopia’|’p’]: simulate a
form of the protanopia cvd.
color [’tritanopia’|’t’]: simulate a
form of the tritanopia cvd.
color [’daltonize’|’D’]: if
following a cvd specification, attempts correcting it.
color [’identity’]: populate the image with
’RGB identity’ pixels.
To get back the original, you have to reload the image.

crop

crop: crop image to a centered rectangle, half the width and
half the height.
crop {p}: crop image to the middle {p}
horizontal percent and {p} vertical percent of the
image.
crop {w} {h}: crop image to the middle {w}
horizontal percent and {h} vertical percent of the
image.
crop {x1} {y1} {x2} {y2}: crop image to the area
between the upper left ({x1},{y1}) and lower
right ({x2},{y2}) corner.
Units are intended as percentage (0 to 100).
Note: still experimental functionality.

desc

desc ’load’ {filename}
[{sepchar}]: load description file {filename},
using the optional {sepchar} character as separator.

desc ’reload’: load once again description files
specified at the command line with
–load-image-descriptions-file, with respective separators.

desc [’-all’] [’-append’]
[’-nooverw’] ’save’
{filename} [{sepchar}]: save current list
descriptions to file {filename}, using the optional
{sepchar} character as separator, and if
’-all’ is present then save the variables, and
if ’-append’ is present then only append, and if
’-nooverw’ is present then do not overwrite
existing files.
See documentation of –load-image-descriptions-file for the
format of {filename}.

display

display [’reinit’ {string} |
’resize’ {w} {h} | [’menuadd’
{menuspec}|’menudel’|’v’|’V’]
]: display the current file contents or change display
settings.
If ’reinit’ switch is supplied, the
{string} specifier is used to reinitialize the
display device parameters like e.g. resolution, window
system options; see the –output-device command line switch
for allowed values.
If ’resize’ and no argument, ask the window
manager to resize the window like the image.
If ’resize’ and two arguments, these are used to
reset width and height of the current window.
In the ’menuadd’ case, use {menuspec} as
GTK window menu specification. This specification string
argument can be repeated. Each argument has form M/S. M is a
slash-separated submenu location, with optional
’_’ (underscore) before a GTK accelerator
character (e.g. “File”, “_File”,
“View/Scale”, “_View/Scale”). M cannot
be empty and must be followed by a ’/’. S can
specify a simple entry, a toggle entry, or radio buttons. If
a simple entry, it consists of one to three sections
separated by ” ” (two spaces). If M begins with
two non-alphanumeric symbols, these will be used as
separators, instead of the two spaces. The first section is
the name of the menu entry (a label), the second is a
command specification, the third is a shortcut character.
The following labels are special and if followed by
’/’, they create custom menus: FimMenuLimit
(pre-categorized “limit”-based commands based on
actual “desc” command data), FimMenuCommands (with
commands), FimMenuAliases (with aliases), FimMenuKeyBindings
(with bindings), FimMenuVariables (with variables’
values), FimMenuCommandsHelp (commands help),
FimMenuAliasesHelp (aliases help), FimMenuKeyBindingsHelp
(bindings help), FimMenuVariablesHelp (variables’
help). A toggle button specification can take the form
’toggle__’{identifier}’__’{value}’__’{value}
and starts the toggle button with the second {value}
(which has to be different). Actually, between
’toggle’ and the second value, instead of
’__’ you can use any two same punctuation signs
or Tab characters consistently. E.g. “menu/label
toggle___v__1__2 ” or “menu/label toggle::_v::1::2
” are ok, but “menu/label toggle___v__1__1 ”
or “menu/label toggle___v::1::2 ” are not. A radio
buttons specification has as many sections as radio buttons,
separated internally by double spaces, and consisting each
by a string, two spaces, an assignment
{identifier}={value} (notice no quotes are
necessary around {value}, and repetitions are
illegal), two spaces, and an optional accelerator character
(e.g. “m/first: v=1 a second: v=2 b third: v=3 c”
is ok, but “m/first: v=1 a second: v=2 b third: v=2
c” is not).
Option ’menudel’ removes all menus.
Note: ’menuadd’ and ’menudel’ are
only valid for the gtk mode and are experimental. In
particular, currently there are limitations on which
characters are allowed in menu command specifications; the
recommended workaround is to use aliases.
Experimental option ’v’ increases internal
verbosity for some graphical outputs; experimental option
’V’ decreases it.
See also the ’_debug_commands’ variable.

dump_key_codes

dump_key_codes: dump the active key codes (unescaped, for
inspection purposes).

echo

echo {args}: print the {args} on console.

else

if(expression){action;}[’else’{action;}]:
see if.

eval

eval {args}: evaluate {args} as commands,
executing them.

exec

exec {filename(s)}: execute script
{filename(s)}.

font

font ’scan’ [{dirname}]: scan
{dirname} or /usr/share/consolefonts looking for
fonts in the internal fonts list.
font ’load’ {filename}: load font
{filename}.
font {’next’|’prev’}: load next or
previous font from the internal fonts list.
font ’info’: print current font filename.

getenv

getenv {identifier}: create a variable with the same
value as the ’{identifier}’ environment
variable, but with an identifier prefixed by
’ENV_’. So e.g. getenv ’DISPLAY’
creates ’ENV_DISPLAY’. Nothing is being printed;
no variable is created if {identifier} is empty.

goto

goto
{[’+’|’-’]{number}[’%’][’f’|’p’|’F’|’P’]}+
| {/{regexp}/} | {?{filename}} |
{’+//’} |
{’+/’|’-/’}[C] |
{{’+’|’-’}{identifier}[’+’]}:
jump to an image.
If {number} is given, and not surrounded by any
specifier, go to image at index {number}.
If followed by ’%’, the effective index is
computed as a percentage to the current available images.

If prepended by ’-’ or ’+’, the jump
is relative to the current index.
The ’f’ specifier asks for the jump to occur
within the files (same for ’F’, but accelerates
if keep pressing).
The ’p’ specifier asks for the jump to occur in
terms of pages, within the current file (same for
’P’, but accelerates if keep pressing).
If there’s only one file in the list and no
’f’ specified, a ’p’ will be
implied, for a page jump.
The above form can be concatenated several times, but only
the last occurrence of either file or page goto will be
effective.
If /{regexp}/ is given, jump to the first image
matching the given /{regexp}/ regular expression
pattern.
If the argument starts with ?, jump to the filename
following ?.
If given ’+//’, jump to the first different
image matching the last given regular expression pattern.

With ’+/’C or ’-/’C,
jump to the next or the previous file according to C:
if ’s’ if same directory, if ’d’ if
down the directory hierarchy, if ’u’ if down the
directory hierarchy, if ’b’ if same basename, if
upper case match is negative, if missing defaults to
’S’ (jump to file in different dir).
If {identifier|identifier2…}] is encountered after
a ’+’ or ’-’ sign, jump to the next
or the previous image having a different value for any
corresponding i:{identifier} (a trailing
’+’ requires a non empty value).
Matching can occur on both file name and description,
possibly loaded via desc or –load-image-descriptions-file;
see also ’_lastgotodirection’ and
’_re_search_opts’.
You can specify multiple arguments to goto: those after the
first one triggering a jump are ignored.
Executes autocommands for events PreGoto and PostGoto.
Keeping pressed shall accelerate images browsing.

help

help [{identifier}]: provide online help, assuming
{identifier} is a variable, alias, or command
identifier.
If {identifier} begins with ’/’, search
on the help contents, and show a list of matching items.

A list of commands can be obtained simply invoking
’commands’; a list of aliases with
’alias’; a list of bindings with
’bind’; a list of variables with
’variables’.

if
if(expression){action;}[’else’{action;}]:
see ’else’.

info

info: display information about the current file.

limit

limit {’-list’|’-listall’}
’variable’|[’-further’|’-merge’|’-subtract’]
[{expression} |{variable} {value}]: A
browsable file list filtering function (like limiting in the
’mutt’ program). Uses information loaded via
–load-image-descriptions-file.
If invoked with ’-list’/’-listall’
only, will list the current description variable ids.
If invoked with ’-list’/’-listall’
’id’, will list set values for the variable
’id’.
If ’-further’ is present, will start with the
current list; if not, with the full list.
If ’-merge’ is present, new matches will be
merged in the existing list and sorted.
If ’-subtract’ is present, sort and filter out
matches.
If {variable} and {value} are provided, limit to
files having property {variable} set to
{value}.
If {expression} is one exclamation point
(’!’), will limit to the currently marked files
only.
If {expression} is ’~!’ will limit to
files with unique basename.
if ’~=’, to files with duplicate basename.
if ’~^’, to the first of the files with
duplicate basename.
if ’~$’, to the last of the files with duplicate
basename.
On ’~i’ [MINIDX][-][MAXIDX], (each
a number possibly followed by a multiplier ’K’)
will limit on filenames in position MINIDX to
MAXIDX.
On ’~z’ will limit to files having the current
file’s size.
on ’~z’ [MINSIZE][-][MAXSIZE],
(each a number possibly followed by a multiplier among
’k’,’K’,’m’,’M’)
will limit on filesize within these limits.
on ’~d’ will limit to files having the current
file’s date +- one day.
on ’~d’ [MINTIME][-][MAXTIME],
(each the count of seconds since the Epoch (First of Jan. of
1970) or a date as DD/MM/YYYY) will
limit on file time (struct stat’s
’st_mtime’, in seconds) within this interval.

For other values of {expression}, limit to files
whose description string matches {expression}.
Invoked with no arguments, the original browsable files list
is restored.

list

list: display the files list.
list ’random_shuffle’: randomly shuffle the file
list.
list ’reverse’: reverse the file list.
list ’clear’: clear the file list.
list ’sort’: sort the file list.
list ’sort_basename’: sort the file list
according to base name.
list ’sort_comment’: sort the file list
according to the value of the _comment variable.
list ’sort_var’ {var}: sort the file list
according to the value of the i:{var} variable.
list ’vars’|’variables’: list
variables in all i:* read from description file.
list ’sort_fsize’: sort the file list according
to file size.
list ’sort_mtime’: sort the file list according
to modification date.
list ’pop’: remove the current file from the
files list, and step back.
list ’remove’ [{filename(s)}]: remove the
current file, or the {filename(s)}, if specified.

list ’push’ {filename(s)}: push
{filename(s)} to the back of the files list.
list ’filesnum’: display the number of files in
the files list.
list ’mark’ [{args}]: mark image file
names for stdout printing at exit, with {args} mark
the ones matching according to the rules of the
’limit’ command, otherwise the current file.

list ’unmark’ [{args}]: unmark marked
image file names, with {args} unmark the ones
matching according to the rules of the ’limit’
command, otherwise the current file.
list ’marked’: show which files have been marked
so far.
list ’dumpmarked’: dump to stdout the marked
files (you usually want to ’unmarkall’
afterwards).
list ’markall’: mark all the current list files.

list ’unmarkall’: unmark all the marked files.

list ’pushdir’ {dirname}: push all the
files in {dirname}, when matching the regular
expression in variable _pushdir_re or, if empty, from
constant regular expression
’.(JPG|PNG|GIF|BMP|TIFF|TIF|JPEG|JFIF|PPM|PGM|PBM|PCX|QOI|AVIF|WEBP)$’.

list ’pushdirr’ {dirname}: like pushdir,
but also push encountered directory entries recursively.

list ’swap’: move the current image filename to
the first in the list (you’ll have to invoke reload to
see the effect).
Of the above commands, several are temporarily not available
for the duration of a background load (enabled by
–background-recursive), which lasts until
_loading_in_background is 0.

load

load: load the image, if not yet loaded (see also
’reload’).
Executes autocommands for events PreLoad and PostLoad.

pan
pan {vsteps}% {hsteps}%: pan the image to
{vsteps} percentage steps from the top and
{hsteps} percentage steps from left.
pan {vsteps} {hsteps}: pan the image to
{vsteps} pixels from the top and {hsteps}
pixels from left.
pan
{’down’|’up’|’left’|’right’|’ne’|’nw’|’se’|’sw’}[+-]
[{steps}[’%’]]: pan the image
{steps} pixels in the desired direction.
If the ’%’ specifier is present, {steps}
is treated as a percentage of current screen dimensions.

If {steps} is not specified, the ’_steps’
variable is used.
If present, the ’_hsteps’ variable is considered
for horizontal panning.
A ’+’ (or ’-’) sign at the end of
the first argument jumps to next (or previous) if border is
reached.
If present, the ’_vsteps’ variable is considered
for vertical panning.
The variables may be terminated by the ’%’
specifier.
Executes autocommands for events PrePan and PostPan.

popen

popen {syscmd}: pipe a command, invoking popen():
spawns a shell, invoking ’{syscmd}’ and
executing as fim commands the output of
{syscmd}’. Can be disabled at configure
time with –disable-system.

pread

pread {args}: execute {args} as a shell
command and read the output as an image file (using
’popen’). Can be disabled at configure time with
–disable-system.

prefetch

prefetch: prefetch (read into the cache) the two nearby
image files (next and previous), for a faster subsequent
opening.
Executes autocommands for events PrePrefetch and
PostPrefetch.
See also the ’_want_prefetch’ variable.

pwd
pwd: print the current directory name, and updates the
’_pwd’ variable.

quit

quit [{number}]: terminate the program.
If {number} is specified, use it as the program
return status.
Note that autocommand ’PostInteractiveCommand’
does not trigger after this command.

recording

recording ’start’: start recording the executed
commands.
recording ’stop’: stop recording the executed
commands.
recording ’dump’: dump in the console the record
buffer.
recording ’execute’: execute the record buffer.

recording ’repeat_last’: repeat the last
performed action.

redisplay

redisplay: re-display the current file contents.

reload

reload [{arg}]: load the image into memory.
If {arg} is present, force reloading, bypassing the
cache (see also ’load’).
Executes autocommands for events PreReload and
PostReload.

rotate

rotate {number}: rotate the image the specified
amount of degrees. If unspecified, by one. If you are
interested in orthogonal rotations, see
’_orientation’ and related aliases.
Executes autocommands for events PreScale and PostScale.

scale

scale
{[’+’|’-’]{value}[’%’]|’*’{value}|’w’|’h’|’a’|’b’|’+[+-*/]’|[’<’|’>’]|’shadow’}:
scale the image according to a scale {value} (e.g.:
0.5,40%,’w’,’h’,’a’,’b’).

If given ’*’ and a value, multiply the current
scale by that value.
If given ’w’, scale according to the screen
width.
If given ’h’, scale to the screen height.
If given ’a’, to the minimum of ’w’
and ’h’.
If given ’b’, like ’a’, provided
that the image width exceeds ’w’ or
’h’.
If {value} is a number, scale relatively to the
original image width.
If the number is followed by ’%’, the relative
scale is treated as a percentage.
If given ’++’(’+-’), increment
(decrement) the ’_magnify_factor’,
’_reduce_factor’ variables by
’_scale_factor_delta’.
If given ’+*’(’+/’), multiply
(divide) the ’_magnify_factor’,
’_reduce_factor’ variables by
’_scale_factor_multiplier’.
If given ’<’ (or ’>’), shrink
(or magnify) image using nearest mipmap (cached pre-scaled
version). If given ’shadow’ as a parameter,
search a same-named file in one of the directories specified
to –load-shadow-dir.
Executes autocommands for events PreScale and PostScale.

scroll

scroll: scroll down the image, going next when hitting the
bottom.
scroll ’forward’: scroll the image as we were
reading left to right (see
’_scroll_skip_page_fraction’ variable).
Executes autocommands for events PrePan and PostPan.

set
set: returns a list of variables which are set.
set {identifier}: returns the value of variable
{identifier}.
set {identifier} {value}: sets variable
{identifier} to value {value}.

set_commandline_mode

set_commandline_mode: set console mode. Note that the mode
will change only after the current block of commands is
evaluated.

set_interactive_mode

set_interactive_mode: set interactive mode. Note that the
mode will change only after the current block of commands is
evaluated.

sleep

sleep [{number}]: sleep for the specified number of
seconds (or 1, if unspecified).

status

status: set the status line to the collation of the given
arguments.

stderr

stderr {args}: writes to stderr its arguments
{args}.

stdout

stdout {args}: writes to stdout its arguments
{args}.

system

system {syscmd}: get the output of executing the
{syscmd} system command. Uses the popen() system
call. Usually popen invokes “/bin/sh -c
{syscmd}“. This might not handle a multi-word
command; in that case you have to put it into a script. See
’man popen’ for more. Can be disabled at
configure time with –disable-system.

variables

variables: display the existing variables.

unalias

unalias {identifier} | ’-a’: delete the
alias {identifier} or all aliases (use
’-a’, not -a).

unbind

unbind {keysym}: unbind the action associated to a
specified {keysym}
If {keysym} is at least two characters long and
begins with 0 (zero), the integer number after the 0 will be
treated as a raw keycode to bind the specified
{keysym} to.
Use the ’_verbose_keys’ variable to discover
(display device dependent) raw keys.

while

while(expression){action;}: A conditional
cycle construct.
May be interrupted by hitting the ’Esc’ or the
’:’ key.

window

window {args}: this command is disabled.

KEYSYMS REFERENCE

” ”
“!” ’”’ “#”
“$” “%” “&”
“’” “(” “)”
“*” “+” “,” “-”
“.” “/” “0” “1”
“2” “3” “4” “5”
“6” “7” “8” “9”
“:” “;” “<” “=”
“>” “?” “@” “A”
“Any” “B” “Backspace”
“C” “C-a” “C-b”
“C-c” “C-d” “C-e”
“C-f” “C-g” “C-h”
“C-i” “C-j” “C-k”
“C-l” “C-m” “C-n”
“C-o” “C-p” “C-q”
“C-r” “C-s” “C-t”
“C-u” “C-v” “C-w”
“C-x” “C-y” “C-z”
“D” “Del” “Down” “E”
“End” “Enter” “Esc”
“F” “F1” “F10” “F11”
“F12” “F2” “F3” “F4”
“F5” “F6” “F7” “F8”
“F9” “G” “H” “Home”
“I” “Ins” “J” “K”
“L” “Left” “M” “N”
“O” “P” “PageDown”
“PageUp” “Q” “R”
“Right” “S” “T”
“Tab” “U” “Up” “V”
“W” “X” “Y” “Z”
“[” “\” “]” “^”
“_” “’” “a”
“b” “c” “d” “e”
“f” “g” “h” “i”
“j” “k” “l” “m”
“n” “o” “p” “q”
“r” “s” “t” “u”
“v” “w” “x” “y”
“z” “{” “|” “}”
“~”

AUTOCOMMANDS REFERENCE

Available
autocommands are: PreScale, PostScale, PrePan, PostPan,
PreRedisplay, PostRedisplay, PreDisplay, PostDisplay,
PrePrefetch, PostPrefetch, PreReload, PostReload, PreLoad,
PostLoad, PreGoto, PostGoto, PreConfigLoading,
PostConfigLoading, PreHardcodedConfigLoading,
PostHardcodedConfigLoading, PreUserConfigLoading,
PostUserConfigLoading, PreGlobalConfigLoading,
PostGlobalConfigLoading, PreInteractiveCommand,
PostInteractiveCommand, PreExecutionCycle,
PostExecutionCycle, PreExecutionCycleArgs, PreWindow,
PostWindow, and they are triggered on actions as suggested
by their name.
Those associated to actual commands are mentioned in the
associated commands reference.

VARIABLES REFERENCE

If undeclared,
a variable will evaluate to 0.

When assigning
a variable to a string, use single or double quoting,
otherwise it will be treated as a number.

The namespaces
in which variables may exist are: current image, global. A
namespace is specified by a prefix, which can be:
’i:’, be prepended to the variable name. The
global namespace is equivalent to the empty
one:’’. The special variable i:* expands to the
collation of all the name-value pairs for the current
image.

In the
following, the [internal] variables are the ones referenced
in the source code (not including the hardcoded
configuration, which may be inspected and/or invalidated by
the user at runtime).

_TERM
[out,g:] the environment TERM variable.
__exif_flipped
[out,i:] flipping information, read from
the EXIF tags of a given image.
__exif_mirrored
[out,i:] mirroring information, read
from the EXIF tags of a given image.
_all_file_loaders
[out,g:] space-separated list of
hardcoded file loaders usable with _file_loader.
_archive_files
[in,g:] If non-empty, a regular
expression matching the filenames to be treated as archives
(multipage files). If empty,
“.(RAR|ZIP|TAR|TAR.GZ|fim-0.7.1.tar.gz|TAR.BZ2|TBZ|TBZ2|CBR|CBZ|LHA|7Z|XAR|ISO)$”
is used. Within each archive, only filenames matching the
regular expression in the _pushdir_re variable are
considered for loading.
_autocmd_trace_stack
[in,g:] dump to stdout autocommands
(autocmd) stack trace during their execution (for debugging
purposes).
_autodesaturate
[in,g:] if 1, desaturate all images.

_autoflip
[in,g:] if 1, flip all images.
_automirror
[in,g:] if 1, mirror all images.
_autonegate
[in,g:] if 1, negate all images.
_autotop
[in,g:] if 1, align to the top freshly loaded
images.
_buffered_in_tmpfile
[out,i:] if an image has been
temporarily converted and decoded from a temporary file, its
name is here.
_cache_control
[in,g:] string for cache control. If it
starts with ’m’, cache mipmaps; if it starts
with ’M’ then do not not cache them. Otherwise
defaults apply.
_cache_status
[out,g:] string with current information
on cache status.
_cached_images
[out,g:] the number of images currently
cached.
_caption_over_image
[in,g:] if set to a value different
than 0, display a custom comment string specified according
to the value of _caption_over_image_fmt; if larger than 1,
with black background; if 3, draw above the image, with no
overlap. Occupies at most half of the screen.
_caption_over_image_fmt
[in,g:] custom info format
string, displayed in a caption over the image; if unset:
i:_comment; otherwise a custom format string specified just
as _info_fmt_str.
_command_expansion
[in,g:] if 1, enable autocompletion
(on execution) of alias and command strings.
_comment
[i:,out] the image comment, extracted from the
image file (if any).
_console_buffer_free
[out,g:] amount of unused memory in
the output console buffer.
_console_buffer_total
[out,g:] amount of memory
allocated for the output console buffer.
_console_buffer_used
[out,g:] amount of used memory in
the output console buffer.
_console_key
[in,g:] the key bound (an integer variable)
to spawn the command line; overrides any other binding.
It’s set -1 if command line disabled.
_console_lines
[out,g:] the number of buffered output
console text lines.
_console_offset
[in,out,g:] position of the text
beginning in the output console, expressed in lines.
_debug_commands
[in,g:] debugging option string for
printing out . if containing ’a’, print out
autocmd info; if containing ’c’, print out each
command; if containing ’k’, print out each
pressed key in command line mode; if containing
’i’, print interpreter internal steps; if
containing ’B’, clear screen and print
background loading files; if containing ’C’,
print cache activity; if containing ’m’, gtk
mode menus tooltips will contain also specification strings;
if containing ’mm’, gtk mode menu building will
also be very verbose.
_device_string
[out,g:] the current display device
string, in the form
[fb|sdl|gtk|ca|aa|dumb][={gfxopts}]. See option
–output-device for a description.
_display_as_binary
[in,g:] force loading files as
pixelmaps (no image decoding is performed); if 1, using one
bit per pixel; if 24, using 24 bits per pixel. If empty,
load and decode the files as usual.
_display_as_rendered_text
[in,g:] if 1, force loading
specified files as text files (no image decoding is
performed); otherwise load and decode the files as usual.

_display_busy
[in,g:] if 1, display a message on the
status bar when processing.
_display_console
[in,g:] if 1, display the output
console.
_display_status
[in,g:] if 1, display the status bar.

_display_status_bar
[in,g:] if 1, display the status
bar.
_display_status_fmt
[in,g:] custom info format string,
displayed in the lower left corner of the status bar; if
unset: full pathname; otherwise a custom format string
specified just as _info_fmt_str.
_do_sanity_check
[in,experimental,g:] if 1, execute a
sanity check on startup.
_downscale_huge_at_load
[in,g:] if 1, downscale at load
time huge images (that is, ones exceeding by 1.5 times the
screen size).
_exif_orientation
[out,i:] orientation information in
the same format of _orientation, read from the orientation
EXIF tags (i:EXIF_Orientation).
_exiftool_comment
[out,g:] comment extracted via the
exiftool interface; see _use_exiftool.
_external_decoder_program
[out,i:] if an image has been
decoded via an external program, its name is here.
_fbfont
[out,g:] The current console font file string.
If the internal hardcoded font has been used, then its value
is “fim://”.
_fbfont_as_screen_fraction
[in,g:] Scale the rendered
text to at least this (integer) fraction of the screen.
Disable font autoscaling with -1. (Only enabled if
configured with –with-font-magnifying-factor=FACTOR, with
FACTOR<1).
_fbfont_magnify_factor
[in,g:] For the rendered text use
a font magnified by this (integer) factor. Maximal value is
“16”. (Only enabled if configured with
–with-font-magnifying-factor=FACTOR, with FACTOR<1).

_fbfont_verbosity
[in,g:] if > 0, verbose font
loading
_file_load_time
[out,i:] time taken to load the file and
decode the image, in seconds.
_file_loader
[in,i:,g:] specify a file loader to use
(among the ones listed in the -V switch output); [out]
i:_file_loader stores the loader of the current image.

_fileindex
[out,g:] the current image numeric index.

_filelistlen
[out,g:] current image list length (number
of visible images).
_filename
[out,i:] the current file name string.
_fim_bpp
[out,g:] the bits per pixel count.
_fim_default_config_file_contents
[out,g:] the contents
of the default (hardcoded) configuration file (executed
after the minimal hardcoded config).
_fim_default_grammar_file_contents
[out,g:] the contents
of the default (hardcoded) grammar file.
_fim_scriptout_file
[in,g:] the name of the file to
write to when recording sessions.
_fim_version
[out,g:] fim version number; may be used
for keeping compatibility of fim scripts across evolving
versions.
_hide_gtk_menus
[out,g:] internal
_hsteps
[in,g:] the default steps, in pixels, when
panning images horizontally (overrides steps).
_ignorecase
[in,g:] if 1, allow for case-insensitive
regexp-based match in autocommands (autocmd).
_info_fmt_str
[in,g:] custom info format string,
displayed in the lower right corner of the status bar; may
contain ordinary text and special ’expando’
sequences. These are: %p for current scale, in percentage;
%w for width; %h for height; %i for image index in list; %k
for the value of i:_comment (comment description) variable
in square brackets (if non empty); %l for current image list
length; %L for flip/mirror/orientation information; %P for
page information; %F for file size; %M for screen image
memory size; %m for memory used by mipmap; %C for memory
used by cache; %T for total memory used (approximation); %R
for total max memory used (as detected by getrusage()); %n
for the current file path name; %N for the current file path
name basename; ; %c for centering information; %v for the
fim program/version identifier string; %% for an ordinary %.
A sequence like %?VAR?EXP? expands to EXP if i:VAR is set
(or, otherwise, if VAR); EXP is copied verbatim except for
contained sequences of the form %:VAR:, which expand to the
value of variable i:VAR (or, if unset, VAR); this is meant
to be used like in e.g.
’%?EXIF_DateTimeOriginal?[%:EXIF_DateTimeOriginal:]?’,
where the EXIF-set variable EXIF_DateTimeOriginal (make sure
you have libexif for this) are used only if present.
_inhibit_display
[internal,g:] if 1, inhibit display.

_last_cmd_output
[out,experimental,g:] the last command
output.
_last_file_loader
[out,g:] set to the name of the last
file loader used.
_last_system_output
[out,experimental,g:] the standard
output of the last call to the system command.
_lastfileindex
[out,g:] the last visited image numeric
index (different than _fileindex). Useful for jumping back
and forth easily between two images with ’goto
_lastfileindex’.
_lastgotodirection
[out,g:] the last file goto direction
(either string ’+1’ or string ’-1’).

_lastpageindex
[out,g:] the last visited file page
index.
_load_default_etc_fimrc
[in,g:] if 1 at startup, load
the system wide initialization file.
_load_fim_history
[in,g:] if 1 on startup, load the
~/.fim_history file on startup.
_load_hidden_dirs
[in,g:] if not 1, when pushing
directories/files, those with name beginning with a dot (.)
are skipped.
_loading_in_background
[out,g:] 1 if program has been
invoked with –background-recursive and still loading in
background.
_loop_only_once
[internal,g:] if 1 and doing a
–slideshow, do it once.
_lwidth
[in,g:] if>0, force the output console text
width.
_magnify_factor
[in,g:] the image scale multiplier used
when magnifying images size.
_max_cached_images
[in,g:] the maximum number of images
after which forcing evictions. Setting this to 0 (no limits)
is ok provided _max_cached_memory is set meaningfully.

_max_cached_memory
[in,g:] the maximum amount of memory
(in KiB) at which images continue being added to the cache.
Setting this to 0 (no limit) leads to a crash (there is no
protection currently).
_max_iterated_commands
[g:] the iteration limit for N in
“N[commandname]” iterated command invocations.

_min_cached_images
[in,g:] the minimum number of images
to keep from eviction; if less than four can lead to
inefficiencies: e.g. when jumping between two images, each
time an erase and a prefetch of neighboring images would
trigger. default value is 4.
_no_default_configuration
[in,g:] if 0, a default,
hardcoded configuration is loaded at startup, after the
minimal hardcoded one.
_no_external_loader_programs
[in,g:] if 1, do not
attempt using external programs to decode a file of an
unknown format.
_no_rc_file
[in,g:] if 1, do not load the ~/.fimrc
configuration file at startup.
_open_offset
[in,optional,g:,i:] offset (specified in
bytes) used when opening a file; [out] i:_open_offset is
assigned to images opened at a nonzero offset.
_open_offset_retry
[in,optional,g:] number of adjacent
bytes to probe in opening the file.
_orientation
[internal,i:] Orthogonal clockwise rotation
(orientation) is controlled by:
’i:_orientation’, ’g:_orientation’
and applied on a per-image basis. In particular, the values
of the three variables are summed up and the sum is
interpreted as the image orientation. If the sum is 0, no
rotation applies; if it is 1, a single ( 90’) rotation
applies; if it is 2, a double (180’) rotation applies;
if it is 3, a triple (270’) rotation applies. If the
sum is not one of 0,1,2,3, the value of the sum modulo 4 is
considered. Therefore, “:i:_orientation=1” and
“:i:_orientation=5” are equivalent: they rotate
the image one time by 90’.
_pread_cmd
[in,g:] a user-specified shell command
emitting an image on stdout, in a format readable by the
convert utility. If the current filename matches
“^[/A-Za-z0-9_.][/A-Za-z0-9_.-]*$”, substitute it
to any occurrence of ’{}’.
_preferred_rendering_dpi
[in,optional,g:] if >0,
rendering of pdf, ps, djvu use this value for a default
document dpi; if unset, use an internal default value.

_preferred_rendering_width
[in,optional,g:] if >0,
bit-based (see _display_as_binary) rendering uses this value
for a default document width (instead of a default value).

_push_checks
[in,experimental,g:] if 1 (default), check
with stat() the existence of input files before
push’ing them (set this to 0 to speed up loading very
long file lists; in these cases a trailing slash (/) must be
used to tell fim a pathname is a directory). This only works
after initialization (thus, after command line files have
been push’ed); use –no-stat-push if you wish to set
this to 0 at command line files specification.
_push_pushes_dirs
[in,g:] if 1, the push command also
accepts and pushes directories (using pushdir). if 2, also
push hidden files/directories, that is, ones whose names
begin with a dot (.).
_pushdir_re
[in] regular expression to match against
when pushing files from a directory or an archive. By
default this is
“.(JPG|PNG|GIF|BMP|TIFF|TIF|JPEG|JFIF|PPM|PGM|PBM|PCX|QOI|AVIF|WEBP)$”.

_pwd
[out,g:] the current working directory; variable
updated at startup and whenever the working directory
changes.
_re_search_opts
[in,g:] affects regexp-based searches;
if an empty string, defaults apply; if it contains
’i’ (’I’), case insensitive
(sensitive) searches occur; if it contains ’b’,
match on basename, if contains ’f’ on full
pathname; if it contains ’D’, match on
description.
_reduce_factor
[in,g:] the image scale multiplier used
when reducing images size.
_retry_loader_probe
[in,g:] if set to 1 and a
user-specified file loader fails, probe for a different
loader.
_rows
[in,g:] if >0, set the number of text lines in
the console to be displayed .
_save_fim_history
[in,g:] if 1 on exit, save the
~/.fim_history file on exit.
_scale_factor_delta
[in,g:] value used for
incrementing/decrementing the scaling factors.
_scale_factor_multiplier
[in,g:] value used for scaling
up/down the scaling factors.
_scale_style
[in,g:] if non empty, pass it to the scale
command; see its documentation for possible values.
_screen_height
[out] the screen height.
_screen_width
[out,g:] the screen width.
_scroll_skip_page_fraction
[int,g:] if >1, fraction
of page to skip when scrolling (e.g.
’scrollforward’); if 1, auto chosen; if <1,
disabled.
_seek_magic
[optional,g:] seek a ’magic’
signature in the file after opening it, and try decoding it
starting within the range of that signature (use like this:
fim -C ’_seek_magic=MAGIC_STRING;push
filename’).
_slideshow_sleep_time
[in,g:] number of seconds of sleep
during slideshow mode.
_status_line
[in,g:] if 1, display the status bar.

_steps
[in,g:] the default steps, in pixels, when
panning images.
_stop_slideshow
[internal,g:] if it becomes 1 during a
slideshow, stop it; gets unset before each
’while’.
_sys_rc_file
[in,g:] string with the global
configuration file name.
_use_exiftool
[in,g:] if >0 and supported, use
exiftool to get additional information. If 1, append this
information to _comment; if 2, to _exiftool_comment.
_use_mipmaps
[in,g:] if >0, use mipmaps to speed up
downscaling of images (this has a memory overhead equivalent
to one image copy); mipmaps are not cached. If 2, use every
fourth source pixel instead of averaging (good for photos,
not for graphs).
_verbose_errors
[in,g:] if 1, display on stdout internal
errors, while parsing commands.
_verbose_keys
[in,g:] if 1, display on the console the
raw keycode of each key hit interactively.
_verbosity
[in,experimental,g:] program verbosity.

_vsteps
[in,g:] the default steps, in pixels, when
panning images vertically (overrides steps).
_want_autocenter
[in,g:] if 1, center the image when
displayed.
_want_exif_orientation
[in,g:] if 1, reorient images
using information from EXIF metadata (and stored in in
_exif_orientation, __exif_mirrored, __exif_flipped ).

_want_prefetch
[in,g:] if 1, prefetch further files just
after displaying the first file; if 2 (and configured with
–enable-cxx11) load in the background.
_want_wm_caption_status
[in,g:] this works only if
supported by the display device. If set to a number that is
not 0, show the status (or command) line in the window
manager caption; if set to a non-empty string, interpret it
just as a file info format string (see _info_fmt_str); if
empty, show the program version.
_want_wm_mouse_ctrl
[in,g:] if at least 9 chars long,
enable mouse click/movement behaviour when in GTK, SDL or
libcaca mode; the 9 chars correspond to a 3×3 screen
clickable grid and the equivalent command keys; clicking
middle or right button toggle on-screen usage info.
angle
[in,out,i:] a floating point number specifying the
rotation angle, in degrees.
ascale
[in,out,i:] the asymmetric scaling of the current
image.
desaturated
[out,i:] 1, if the image is desaturated.

flipped
[out,i:] 1, if the image is flipped.
fresh
[in,out,i:,experimental] 1 if the image was
loaded, before all autocommands (autocmd) execution.
height
[out,i:] the current image original height.

mirrored
[out,i:] 1, if the image is mirrored.
negated
[out,i:] 1, if the image is negated.
page
[out,experimental,g:] the current page.
pages
[out,experimental,i:] the current number of pages
of an image.
random
[out] a pseudorandom number.
scale
[in,i:] the scale of the current image.
sheight
[out,i:] the current image scaled height.

swidth
[out,i:] the current image scaled width.
width
[out,i:] the current image original width.

DEFAULT ALIASES REFERENCE

Hardcoded
aliases are:

alias
“A” “_autotop=1-_autotop;”
alias “magnify” “scale
’+’” # magnify the displayed image by the
_magnify_factor variable or {args}
alias “next” “goto
’+1’” # go to the next page or file
alias “next_file” “goto
’+1f’” # go to the next file in the list

alias “next_page” “goto
’+1p’” # go to the next page in the file

alias “prev” “goto
’-1’” # go to the previous page or file

alias “prev_file” “goto
’-1f’” # go to the previous file in the
list
alias “prev_page” “goto
’-1p’” # go to the previous page in the
file
alias “reduce” “scale
’-’” # reduce the displayed image by
_reduce_factor or {args}
alias “scale_factor_decrease” “scale
’+-’” # subtract _scale_factor_delta to the
scale factors _reduce_factor and _magnify_factor
alias “scale_factor_grow” “scale
’+*’” # multiply the scale factors
_reduce_factor and _magnify_factor by
_scale_factor_multiplier
alias “scale_factor_increase” “scale
’++’” # add _scale_factor_delta to the
scale factors _reduce_factor and _magnify_factor
alias “scale_factor_shrink” “scale
’+/’” # divide the scale factors
_reduce_factor and _magnify_factor by
_scale_factor_multiplier

They can be
redefined with alias or deleted with the
unalias command.
Further default aliases are usually loaded at startup — see
the CONFIGURATION FILE EXAMPLE section below.

COMMAND LINE USAGE EXAMPLES

# jump to the
third image:
3;
# jump to first image:
^;
# jump to last image:
$;
# magnify the image two times:
*2;
# scale the image to the 30% of the original:
30%;
# scale the image up by 30%:
+30%;
# scale the image down by 30%:
-30%;
# jump to the next image whose filename matches the
“.*jpg” regular expression:
/.*jpg;
# execute the “date” system command
!”date”;

CONFIGURATION FILE EXAMPLE

Part of the
default configuration comes from the
_fim_default_config_file_contents variable, shown
here.
One can skip its loading by using the
_no_default_configuration variable.

#
$LastChangedDate: 2024-05-15 01:34:42 +0200 (Wed, 15 May
2024) $
# Contents of the default ’fimrc’ file,
hardcoded in the fim executable.
# Read the documentation (man fimrc) to discover how to
change this default hardcoded file and how to make your own.

# Note that usually a ~/.fimrc file is read after these
options take effect, so you could reset all of this with
ease.
# Lines beginning with a pound (#) are ignored by fim (they
are treated as comments).
#
# Internal variables.
# Some of these variables influence fim’s behaviour
(input variables), some are set by fim (output variables).

# It is wise the input variables are set at the beginning of
the file, so the bottom may issue commands correctly
affected by them.
if(_cache_control==’’){_cache_control=’m’;}

if(_debug_commands==’’){_debug_commands=’’;}

if(_command_expansion==’’){_command_expansion=1;}

if(_display_status==’’){_display_status=0;}
if(_max_cached_images==’’){_max_cached_images=5;}

if(_min_cached_images==’’){_min_cached_images=4;}

if(_max_cached_memory==’’){_max_cached_memory=81920;}

if(_max_iterated_commands==’’){_max_iterated_commands=100;}

if(_want_prefetch==’’){_want_prefetch=1;}
if(_no_external_loader_programs==’’){_no_external_loader_programs=0;}

if(_scale_style==’’){_scale_style=’b’;}

if(_save_fim_history==’’){_save_fim_history=1;}

if(_load_fim_history==’’){_load_fim_history=1;}

if(_verbose_keys==’’){_verbose_keys=0;}
if(_display_busy==’’){_display_busy=1;}
if(_ignorecase==’’){_ignorecase=1;}
if(_re_search_opts==’’){_re_search_opts=’biD’;}

if(_console_offset==’’){_console_offset=0;}
if(_console_key==’’){_console_key=58;}
if(_display_as_binary==’’){_display_as_binary=0;}

if(_push_checks==’’){_push_checks=1;}
#if(_want_wm_caption_status==’’){_want_wm_caption_status=0;}

if(_want_exif_orientation==’’){_want_exif_orientation=1;}

if(ascale==’’){ascale=”1.0″;}
if(_use_mipmaps==’’){_use_mipmaps=1;}
if(_downscale_huge_at_load==’’){_downscale_huge_at_load=1;}

if(_scroll_skip_page_fraction==’’){_scroll_skip_page_fraction=0;}

if(_want_wm_mouse_ctrl==’’){_want_wm_mouse_ctrl=”’pP+a-=nN”;}

if(_slideshow_sleep_time==’’){_slideshow_sleep_time=1;}

#
# External variables (not used internally).
if(allow_round_scroll==’’){allow_round_scroll=0;}

if(console_scroll_n==’’){console_scroll_n=3;}

#
alias “toggleautoflip”
“_autoflip=1-_autoflip” “”;
alias “toggleautonegate”
“_autonegate=1-_autonegate” “”;
alias “toggleflip”
“i:flipped=1-i:flipped” “toggles flipped
property on the current image”;
alias “flip” “toggleflip;redisplay”
“flip the current image along the horizontal
axis”;
alias “fliponce” “flip;toggleflip”
“flip, but just for one display”;
alias “toggleautomirror”
“_automirror=1-_automirror” “”;
alias “togglemirror”
“i:mirrored=1-i:mirrored” “toggles mirrored
property on the current image”;
alias “mirror” “togglemirror;redisplay”
“mirror the image along the vertical axis”
“”;
alias “mirroronce” “mirror;togglemirror”
“mirror, but just for one display”;
alias ’toggleLimitMarked’
’__pre_limit_fileindex=_fileindex;_limit_mode=1-_limit_mode;
if(_limit_mode==1){limit “!”;} else { limit; }
if(_filelistlen<1){_limit_mode=0;limit;goto
__pre_limit_fileindex;} i:fresh=1;redisplay; ’
“toggle between limiting file list to the marked files
and the full list”;
alias “unlimit”
“limit;i:fresh=1;reload;redisplay” “calling
limit with no arguments restores the original list”;

#alias ’mark_current_file’
’_markedfile=i:_filename’;
#alias ’goto_marked_file’ ’goto
“?”._markedfile’;
alias ’mark_current_file’
’_markedfile=_fileindex’; # Note: temporary;
_markedfile undocumented.
alias ’goto_marked_file’ ’goto
_markedfile’; # Note: temporary.
# Warning : binding to C-s, C-z and C-c won’t make
effect, as these
# codes are get caught by the console driver and will have
no effect in fim.
# Moreover, C-z will crash fim and C-c will terminate it.

# Some other combinations (e.g.:C-l) may have similar
problems in your console.
bind ’f’ “flip”;
bind ’F’ “fliponce”;
bind ’m’ “mirror”;
bind ’M’ “mirroronce”;
bind ’q’ “quit”;
bind ’Esc’ “quit”;
#bind ’n’ “next_file”;
#bind ’n’ “next”;
bind ’C-h’ “help”;
#bind ’?’ “help”; # assigned to
back-search
#bind ’/’ “help”; # assigned to
forward-search
bind ’=’ “scale ’100%’”;

#bind ’p’ “prev_file”;
#alias ’list_remove_and_reload’ “list
’remove’;reload”; # once menus commands can
support ;, remove this
bind ’Del’ “list
’remove’;reload”; # no quit on last file

#bind ’Del’ “list_remove_and_reload”;
# no quit on last file
#bind ’Del’ “if(_filelistlen<2)quit;list
’remove’;reload;”; # quit if no files left

#bind ’s’ “list ’sort’”;

bind ’ ’ “scroll
’forward’”;
bind ’S’ “toggleDisplayStatus”;
bind ’I’ “toggleautonegate”;
bind ’i’ “color
’negate’;redisplay”;
bind ’g’ “color
’desaturate’;redisplay”;
bind ’[’ ’font_reduce;redisplay’;

bind ’]’ ’font_magnify;redisplay’;

bind ’|’
’toggle_font_auto_scale;redisplay’;
bind ’{’ ’font
“prev”;redisplay’;
bind ’}’ ’font
“next”;redisplay’;
bind ’G’ “toggleDesaturate”;
bind ’r’ “rotate90”;
bind ’R’ “rotate270”;
bind ’+’ “magnify”;
bind ’a’ “scale ’a’”;
bind ’H’ “scale ’H’”;
bind ’Tab’ “toggleVerbosity”;
bind ’Menu’ “toggleVerbosity”;
bind ’v’ “toggleDisplayStatus”;
bind ’A’ “A”;
#bind ’C-m’ “list ’mark’”;

bind ’C-m’ “mark_current_file”;
bind ’C-j’ “goto_marked_file”;
bind ’u’ “list ’unmark’”;

bind ’Enter’ “list ’mark’;goto
_lastgotodirection”;
bind ’-’ “reduce”;
bind “Up” “pan_up”;
bind ’k’ “pan_up”;
bind “Right” “pan_right”;
bind ’l’ “pan_right”;
bind “Down” “pan_down”;
bind ’j’ “pan_down”;
bind “Left” “pan_left”;
bind ’h’ “pan_left”;
bind ’t’ “align ’top’”;

bind ’C-g’ “system ’fbgrab’
’fim_’._device_string.’.png’”;
# grab a screenshot
#bind ’C-r’ “recording
’start’”;
bind ’C-r’ “reload ’’”;

bind ’Q’ “recording
’stop’”;
bind ’D’ “recording
’dump’”;
bind ’E’ “recording
’execute’”;
bind ’C-e’ “recording
’execute’”;
bind ’C-x’ “recording
’execute’”;
bind ’.’ “recording
’repeat_last’”;
bind ’’’ “toggleLimitMarked”;

alias “toggleVerbosity”
“_display_console=1-_display_console;i:fresh=1;redisplay”
“”;
alias “toggleKeyVerbosity”
“_verbose_keys=1-_verbose_keys;redisplay”
“”;
alias “toggleDesaturate”
“_autodesaturate=1-_autodesaturate;redisplay”
“”;
alias “idempotent_cmd” “goto
’’”;
#
# Autocommands examples:
#autocmd “PostInteractiveCommand”
“fim.png” “echo ’\nmatched an
interactive command on fim.png\n’”;
#autocmd “PostDisplay” “.*png”
“echo ’this is a png file’”;
#autocmd “PostDisplay” “.*jpg”
“echo ’this is a jpg file’”;
#autocmd “PostDisplay” “” “echo
’\nthis is a file\n’”;
#autocmd “PostGoto” “”
“set_interactive_mode”;
autocmd “PostGoto” “”
“reload”;
autocmd “PostWindow” “”
“i:fresh=1;redisplay;”;
autocmd “PreRedisplay” “”
“i:_will_display=1”;
autocmd “PreRedisplay” “”
“if(_scale_style!=’’ &&
i:fresh){i:fresh=0;scale _scale_style ;i:fresh=0;}”;

autocmd “PostRedisplay” “”
“i:_will_display=0”;
# Display device specific config
alias “aalib_fix_do”
“{if(aascale==’’){ascale=’2.0’;}else{ascale=aascale;}
i:fresh=1;display;if(_TERM=~’screen’){echo
’Detected screen+aalib: key bindings may not work as
intended.’}}” “See aalib_fix.”;
alias “aalib_fix”
“if(_device_string=~’^aa’){aalib_fix_do;scale
’a’;}” “When using the aalib (ASCII
art) library we face a problem: glyph proportions are seldom
square (as pixels are), and are tricky to detect; for this
reason, we need to reshape the image with respect to the
font ratio, but we have to make a guess in the scaling
factor to compensate. If at runtime a better value is known
for the terminal font height/with ratio, it may be fed in
the ’aascale’ variable for an accurate
scaling.”;
alias “cacalib_fix_do”
“{if(cacascale==’’){ascale=’1.18’;}else{scale=cacascale;}
i:fresh=1;display;if(_TERM=~’screen’){echo
’Detected screen+cacalib: key bindings may not work as
intended.’}}” “See cacalib_fix.”;
alias “cacalib_fix” “getenv
’DISPLAY’;if(_device_string=~’^ca’
&& ENV_DISPLAY==’’){cacalib_fix_do;scale
’a’;}” “When using the libcaca
(Coloured ASCII art) library we face a problem: glyph
proportions are seldom square (as pixels are), and are
tricky to detect; for this reason, we need to reshape the
image with respect to the font ratio, but we have to make a
guess in the scaling factor to compensate. If at runtime a
better value is known for the terminal font height/with
ratio, it may be fed in the ’cacascale’ variable
for an accurate scaling.”;
autocmd “PostReload” “”
“aalib_fix”;
autocmd “PostLoad” “”
“aalib_fix”;
autocmd “PostReload” “”
“cacalib_fix”;
autocmd “PostLoad” “”
“cacalib_fix”;
alias “refresh” “desc
’reload’;redisplay;” “reloads and
displays image description”;
bind “F5” “refresh”;
alias “toggle_fullscreen” “if(
(_device_string=~’^sdl’ ||
_device_string=~’^gtk’ ) &&
!_fullscreen){_old_sw=_screen_width;_old_sh=_screen_height;display
’reinit’ ’mW0:0’;_fullscreen=1;}else
if( (_device_string=~’^sdl’ ||
_device_string=~’^gtk’ ) &&
_old_sw*_old_sh*_fullscreen){display ’reinit’
’rwm’._old_sw.’:’._old_sh;_fullscreen=0;}_gtk_fullscreen=_fullscreen;”
“Toggles full screen. Will show mouse cursor in full
screen.”;
alias “_gtk_check_for_toggle_fullscreen” “if(
_device_string=~’^gtk’ &&
_gtk_fullscreen != _fullscreen){toggle_fullscreen;}”;

alias “_gtk_check_for_toggle_gtk_menus”
“if(_device_string=~’^gtk’){if(_hide_gtk_menus){display
’reinit’ ’b’;}else{display
’reinit’ ’B’;}}”;
bind “F11” “toggle_fullscreen”;

autocmd
“PostReload” “” “i:fresh=1” ;

autocmd “PostScale” “”
“if(0==i:_will_display){i:fresh=1;display;}” ;

autocmd “PostPan” “”
“{i:fresh=1;display;}” ;
#autocmd “PostReload” “pdf|ps|djvu|dvi”
“scale ’w’;align ’top’”;

autocmd “PostReload” “”
“if(i:fresh){redisplay;}”;
autocmd “PostInteractiveCommand” “”
“if(i:fresh){display;i:fresh=0;}”;
autocmd “PostInteractiveCommand” “”
“if(_want_prefetch>0){prefetch;}”;
autocmd “PostInteractiveCommand” “”
“if(_display_console==0 &&
i:fresh){redisplay;i:fresh=0;}”;
autocmd “PostInteractiveCommand” “”
“idempotent_cmd”; # Bug workaround: without it
console scroll is broken.
autocmd “PostInteractiveCommand” “”
“_gtk_check_for_toggle_gtk_menus;_gtk_check_for_toggle_fullscreen”;

#alias
“next10”
“i=0;while(i<10){i=i+1;next;display;sleep
’1’;}” “goes forward 10 images”;

#alias “prev10”
“i=0;while(i<10){i=i+1;prev;display;sleep
’1’;}” “goes backward 10 images”;

bind ’N’ “goto ’+1p’
’+museum|series|city|category|artist+’
’+/S’ ’+10’;” “goto by
jump or category or directory or just ahead”;
bind ’P’ “goto ’-1p’
’-museum|series|city|category|artist+’
’-/S’ ’-10’;” “goto by
jump or category or directory or just back “;
bind ’C-n’ “goto ’+//’”;

bind ’C-p’ “goto ’-//’”;

bind ’C-b’ “goto ’-//’”; #
Warning: many configurations cannot detect C-b.
bind ’W’ “display
’resize’” “if supported, resizes the
window to match the current image pixels size”;
#bind ’C-w’ “scale
’100%’;display ’resize’”
“if supported, scales the image to 100% and resizes the
window to match its size (if fits)”;
bind ’C-w’
“if(_scale_style!=’w’){_scale_style=’w’;scale
’w’;}else{_scale_style=’’;scale
’100%’;}” “scale to width”;
alias “endless_slideshow”
“while(1){display;sleep
_slideshow_sleep_time;next;}” “performs an
automated slideshow, endlessly”;
alias “bookview” “while(1){display;sleep
’2’;scroll ’down’;}”
“”;
alias “comicview” “while(1){display;sleep
’2’;scroll ’down’;}”
“”;
alias “read” “while(1){display;sleep
’2’;scroll ’forward’;}”
“”;
alias “slowread”
“while(_fileindex<=_filelistlen-1){display;sleep
’2’;scroll ’forward’;}”
“loop once slowly”;
alias “fastread”
“while(_fileindex<=_filelistlen-1){display;sleep
’0.1’;scroll ’forward’;}”
“proceeds like in a book but very fast, once”;

alias “pornview” “echo ’press any key
repeatedly to terminate’ ;endless_slideshow”
“enters an endless slideshow (alias name from an actual
image viewer)”;
autocmd “PreExecutionCycle” “/fbps-”
“_display_busy=0;_display_status=0” ;
autocmd “PreExecutionCycle” “”
“i:fresh=1;reload”;
autocmd “PreExecutionCycle”
“/fbps-.*ps001.png”
“i:fresh=1;redisplay”;
## Example in imposing a file loader to an extension:
#autocmd “PreReload” “.*mtx.gz”
“_file_loader=’MatrixMarket’”;
#autocmd “PostReload” “.*mtx.gz”
“_file_loader=’’”;
bind ’*’
“_display_console=0;toggleVerbosity;echo i:*”;

bind ’w’ “scale ’w’”;
bind ’<’ “rotate10_ccw;display”;

bind ’>’ “rotate10;display”;
bind ’_’ “_scale_style=’’;scale
’100%’”;
bind ’,’ “_display_console=1;echo
_last_system_output”;
bind ’C-a’
“if(_scale_style!=’a’){_scale_style=’a’;scale
’a’;}else{_scale_style=’’;scale
’100%’;}” “scale to height”;
#
alias “pan_nw” “pan ’nw’”
“pans the image to the upper left”;
alias “pan_ne” “pan ’ne’”
“pans the image to the upper right”;
alias “pan_se” “pan ’se’”
“pans the image to the lower left”;
alias “pan_sw” “pan ’sw’”
“pans the image to the lower right”;
alias “pan_down” “if(_display_console==0){pan
’down’;}else{scd;}” “pans the image
down / scrolls console down”;
alias “pan_up” “if(_display_console==0){pan
’up’ ;}else{scu;}” “pans the image up
/ scrolls console up”;
alias “pan_left” “pan
’left’” “pans the image left”;

alias “pan_right” “pan
’right’” “pans the image right”;

alias “diagonal_nw” “pan_nw” “pans
the image to the upper left”;
alias “diagonal_ne” “pan_ne” “pans
the image to the upper right”;
alias “diagonal_se” “pan_se” “pans
the image to the lower left”;
alias “diagonal_sw” “pan_sw” “pans
the image to the lower right”;
bind ’d’ “diagonal_nw”;
bind ’D’ “diagonal_se”;
bind ’x’ “diagonal_ne”;
bind ’X’ “diagonal_sw”;
alias “toggleDisplayStatus”
“_display_status=1-_display_status;redisplay”
“”;
alias “toggleDisplayBusy”
“_display_busy=1-_display_busy” “”;
alias “sort” “list ’sort’”
“sorts the files list ordered”;
bind ’o’ “sort”;
bind ’b’ “prev”;
bind ’B’ “toggleDisplayBusy”;
alias “random_slideshow”
“while(1){display;sleep _slideshow_sleep_time; eval
’r=random’;goto r;}” “performs a
shuffled slideshow, endlessly”;
alias “rotate90_ccw”
“i:_orientation=i:_orientation+3;i:fresh=1;redisplay”
“rotate 90 degrees counter clockwise”;
alias “rotate90_cw”
“i:_orientation=i:_orientation+1;i:fresh=1;redisplay”
“rotate 90 degrees clockwise”;
alias “rotate180”
“i:_orientation=i:_orientation+2;i:fresh=1;redisplay”
“rotate 180 degrees”;
alias “rotate90” “rotate90_cw;display”
“rotate 90 degrees clockwise”;
alias “rotate270” “rotate90_ccw;display”
“rotate 90 degrees counter clockwise”;
alias “rotate10” “rotate
’10’;display” “rotate 10 degrees
counter clockwise”;
alias “rotate10_ccw” “rotate -10
;display” “rotate 10 degrees clockwise”;

bind
’K’ ’if(_display_console==0){echo
i:_filename.”:
“.i:_comment;toggleVerbosity}else{toggleVerbosity;}’;

bind ’C-k’ ’crop’ # still
experimental

alias
’cache’ ’echo _cache_status’
“displays cached images status”;
bind ’c’ ’align “center”’;

alias ’widen’
’i:ascale=i:ascale*”1.1″;*1.0’
“widen the current image”;
alias ’narrow’
’i:ascale=i:ascale/”1.1″;*1.0’
“narrow the current image”;
bind ’y’ “widen” “widen
horizontally the image”;
bind ’Y’ “narrow” “shrink
horizontally the image”;
alias ’console_scroll_up’
’if(_console_offset<_console_lines+console_scroll_n-_rows){_console_offset=_console_offset+console_scroll_n;}’
“scrolls up the virtual console”;
alias ’console_scroll_down’
’if(allow_round_scroll ||
(_console_offset>=console_scroll_n)){_console_offset=_console_offset-console_scroll_n;}’
“scrolls down the virtual console”;
alias ’console_scroll_reset’
’{_console_offset=0;}’;
alias ’scu’ ’console_scroll_up’
“”;
alias ’scd’ ’console_scroll_down’
“”;
alias ’scz’ ’console_scroll_reset’
“”;
alias ’center’ ’align
“center”’;
alias ’left’ ’align
“left”’;
alias ’right’ ’align
“right”’;
alias ’top’ ’align “top”’;

alias ’bottom’ ’align
“bottom”’;
alias “font_magnify_auto”
“if(_fbfont_as_screen_fraction>1){_fbfont_as_screen_fraction=_fbfont_as_screen_fraction-1;}else{_fbfont_as_screen_fraction=_screen_width/100+_screen_height/100;}”
“”;
alias “font_magnify_manual”
“_fbfont_magnify_factor=_fbfont_magnify_factor+1”
“”;
alias “font_reduce_auto”
“if(_fbfont_as_screen_fraction>1){_fbfont_as_screen_fraction=_fbfont_as_screen_fraction+1;}”
“”;
alias “font_reduce_manual”
“_fbfont_magnify_factor=_fbfont_magnify_factor-1”
“”;
alias “toggle_font_auto_scale”
“if(_fbfont_as_screen_fraction<0){_fbfont_as_screen_fraction=0;echo
’Auto font scaling
on.’;}else{_fbfont_as_screen_fraction=-1;echo
’Auto font scaling off.’;}” “toggles
between manual and auto font scaling control”;
alias ’next_file_same_search’ “goto
’+//’;” “go to next file with same
search criteria”;
alias ’next_file_dir_same’ “goto
’+/s’;” “go to next file in same
dir”;
alias ’next_file_dir_other’ “goto
’+/S’;” “go to next file in other
dir”;
alias ’next_file_dir_up’ “goto
’+/u’;” “go to next file up the dir
hierarchy”;
alias ’next_file_dir_down’ “goto
’+/d’;” “go to next file down the dir
hierarchy”;
alias ’next_file_same_basename’ “goto
’+/b’;” “go to next file with same
basename”;
alias ’prev_file_dir_same’ “goto
’-/s’;” “go to prev file in same
dir”;
alias ’prev_file_dir_other’ “goto
’-/S’;” “go to prev file in other
dir”;
alias ’prev_file_dir_up’ “goto
’-/u’;” “go to prev file up the dir
hierarchy”;
alias ’prev_file_dir_down’ “goto
’-/d’;” “go to prev file down the dir
hierarchy”;
alias ’prev_file_same_basename’ “goto
’-/b’;” “go to prev file with same
basename”;
#alias “font_magnify”
“if(_fbfont_as_screen_fraction<0)
{font_magnify_manual;}else{font_magnify_auto;}”
“increase font size (either relative or
absolute)”;
#alias “font_reduce”
“if(_fbfont_as_screen_fraction<0)
{font_reduce_manual;} else{font_reduce_auto;}”
“increase font size (either relative or
absolute)”;
alias “font_magnify”
“_fbfont_as_screen_fraction=-1;font_magnify_manual”
“increase absolute font size and set manual font
control”;
alias “font_reduce”
“_fbfont_as_screen_fraction=-1;font_reduce_manual”
“decrease absolute font size and set manual font
control”;
bind “PageUp”
“if(_display_console==0){prev;}else{scu;}”;
bind “PageDown”
“if(_display_console==0){next;}else{scd;}”;
bind “Home” “0;”;
bind “End” “$;”;
bind “^” “0;”;
bind “$” “$;”;
#bind “Backspace” “prev”; # console code
for C-h and Backspace is the same 🙂
bind “’” “goto
_lastfileindex.’f’.(_lastpageindex+1).’p’”;

bind ’”’ “scale
’shadow’;i:fresh=1;redisplay;”;
bind ’(’ “goto ’^p’”;
bind ’)’ “goto ’$p’”;
bind ’Z’ “sleep 1”;
_display_status=1; # lower status line
_want_wm_caption_status=”fim:%N@%p%%%L[%i/%l]”;

_caption_over_image_fmt=”%?_comment?%:_comment:?”;

_info_fmt_str=”%p%% %wx%h%L %i/%l%P %F %T %c”; #
lower right line part
#_display_status_fmt=”%N:%k”; #
_display_status_fmt=”%N%?EXIF_DateTimeOriginal?[%:EXIF_DateTimeOriginal:]?%?EXIF_ExposureTime?[%:EXIF_ExposureTime:]?%?EXIF_FNumber?[%:EXIF_FNumber:]?%?EXIF_ApertureValue?[%:EXIF_ApertureValue:]?%?EXIF_ISOSpeedRatings?[ISO%:EXIF_ISOSpeedRatings:]?%?_markedfile?[mark
on %:_markedfile:]?:%k”; # lower left line part
# funny aliases:
alias “webcam” “pread ’vgrabbj -d
/dev/video0’;$” “say cheese”;
alias ’espeak’ ’system
\’espeak\’ i:_filename.”
“.i:_comment’ ’say something’;
#_fbfont_as_screen_fraction=-1; # disable auto font scaling

if( _device_string=~’^gtk[^e]*$’ ) {

alias “man_fim” “system ’man’
’fim’;
_display_console=0;toggleVerbosity;”;

alias “man_fimrc” “system
’man’
’fimrc’;_display_console=0;toggleVerbosity;”;

alias ’_rebuild_menus’ ’display
“reinit” “f”;’;

alias ’_rebuild_quieter_menus’
’_debug_commands=_debug_commands-“m”;display
“reinit” “fV”;’; # remove
“m” occurrences from _debug_commands and
rebuild

alias ’_rebuild_verboser_menus’
’_debug_commands=_debug_commands.”m”;_rebuild_menus;’;

alias ’_rebuild_verbosest_menus’
’_debug_commands=_debug_commands.”mm”;_rebuild_menus;’;

alias ’toggle_gtk_menus’
’if(!_hide_gtk_menus){_hide_gtk_menus=1;}else{_hide_gtk_menus=0;}’;

autocmd “PreInteractiveCommand” “”
“if(__internal_state_changed){_rebuild_menus;__internal_state_changed=0;}”;

autocmd “PostInteractiveCommand” “”
“if(__internal_state_changed){_rebuild_menus;__internal_state_changed=0;}”;

autocmd “PreExecutionCycle” “”
“if(__internal_state_changed){_rebuild_menus;__internal_state_changed=0;}”;

display “menuadd”

“_File/”

“_File/_Open file open C-o”

“_File/Open _directory open_dir “

“_File/_Next file or page next “

“_File/_Next file next_file “

“_File/_Next in other directory
next_file_dir_other”

“_File/_Next in this directory
next_file_dir_same”

#

“_File/_Next as last search goto + ” # Note
that slashes are not supported currently.

“_File/_Next as last search next_file_same_search

“_File/_Go back to last file goto _lastfileindex

“_File/_Previous in list prev p”

#

“_File/Remove from list list
’pop’”

#

“_File/Remove from list list_remove_and_reload

“_File/Remove from list list
’remove’;reload “

“_File/Mark list ’mark’”

“_File/Unmark list ’unmark’”

“_File/_Quit quit q”

“_List/Show list”

“_List/_Limit FimMenuLimit/”

“_List/Limit to…/files sized as current one limit
’~z’” #

“_List/Limit to…/files dated as current one limit
’~d’”

“_List/Limit to…/files with duplicate basename
limit ’~=’”

“_List/_Unlimit list (reset) unlimit u”

“_List/Reverse list ’reverse’

“_List/Sort by name list ’sort’

“_List/Sort by size list ’sort_fsize’

“_List/Sort by time list ’sort_mtime’

“_List/Shuffle randomly list
’random_shuffle’ “

“_List/Mark all list ’markall’

“_List/Slideshow/Random random_slideshow “

“_List/Slideshow/Endless endless_slideshow

“_List/Slideshow/Slideshow time: 0 s
_slideshow_sleep_time=0 0.5 s _slideshow_sleep_time=0.5 1 s
_slideshow_sleep_time=1 2 s _slideshow_sleep_time=2 3 s
_slideshow_sleep_time=3 “

“_List/Slideshow/Stop _stop_slideshow=1 “

“_List/Slideshow/Slow read slowread “

“_List/Slideshow/Fast read fastread “

“_View/ Automirror toggle||_automirror||1||0 ”
# ’ ’ as external separator, || as internal
separator

“_View/||Autoflip||toggle.._autoflip..1..0||”
# || as external separator, .. as internal separator

#

“_View/Scale: _auto _scale_style=a a Scale: by
_hand (manual) _scale_style=m m Scale: by _width
_scale_style=w w Scale: by _height _scale_style=h
h”

“_View/**Scale: 1x**_scale_style= ** **Scale:
_auto**_scale_style=a**a**Scale: _auto (till
100%)**_scale_style=b**b**Scale: by _hand
(manual)**_scale_style=m**m**Scale: by window
_width**_scale_style=w**w**Scale: by window
_height**_scale_style=h**h”

“_View/Orientation: normal _orientation=0
Orientation: 90’right _orientation=1 Orientation:
upside down _orientation=2 Orientation: 90’ left
_orientation=3 “

“_View/Desaturate toggle___autodesaturate__1__0

“_View/Autonegate toggle___autonegate__1__0

“_View/Vertical scroll/** Default steps:
auto**_vsteps=****10%**_vsteps=10%****20%**_vsteps=20%****50%**_vsteps=50%****100%**_vsteps=100%**”

“_View/Vertical scroll/** Skip page fraction if
smaller than
…auto**_scroll_skip_page_fraction=****disabled**_scroll_skip_page_fraction=-1****1/8**_scroll_skip_page_fraction=8****1/16**_scroll_skip_page_fraction=16**”

“_View/Refresh description & co refresh

“_View/||Apply EXIF
Orientation||toggle.._want_exif_orientation..1..0||”

“_Image/_Mirror toggle__i:mirrored__1__0
m”

“_Image/_Flip
toggle&&i:flipped&&1&&0 f” #
&& as internal separator

#

“_Image Extras/_Let’s Flip again
toggle&&i:flipped&&1&&0 f” #
&& as internal separator

“_Image/Orientation: normal i:_orientation=0
Orientation: 90’right i:_orientation=1 Orientation:
upside down i:_orientation=2 Orientation: 90’ left
i:_orientation=3 “

“_Image/EXIF Orientation: normal
i:_exif_orientation=0 EXIF Orientation: 90’right
i:_exif_orientation=1 EXIF Orientation: upside down
i:_exif_orientation=2 EXIF Orientation: 90’ left
i:_exif_orientation=3 ” # previously __exif_orientation
but renamed for the double-symbol-separator convention

“_Window/_Fullscreen toggle**_gtk_fullscreen**1**0
F11”

“_Window/Hide the menu bar (press mouse button to
restore) toggle_gtk_menus”

#

“_Window/Hide menu bar (press mouse button to
restore) toggle||_hide_gtk_menus||0||1” # not yet ready
to replace toggle_gtk_menus

“_Window/Resize window to image size display
’resize’”

“_Window/Text size reduce font_reduce”

“_Window/Text size magnify font_magnify”

“_Window/Text font: next font
’next’”

“_Window/Text font: prev font
’prev’”

“_Window/Show status line
toggle||_display_status||1||0 “

“_Window/Caption over image: None
_caption_over_image=0 Caption over image: No background
_caption_over_image=1 Caption over image: Black background
_caption_over_image=2 Caption over image: Above image, no
overlap _caption_over_image=3 “

“_Window/Window caption: minimal
_want_wm_caption_status=FIM Window caption: reasonable
_want_wm_caption_status=fim:[%i/%l] Window caption: rich
_want_wm_caption_status=fim:%N@%p%%%L[%i/%l]%?EXIF_DateTimeOriginal?[%:EXIF_DateTimeOriginal:]?

“_Window/Mouse click help grid: default
_want_wm_mouse_ctrl=’pP+a-=nN Mouse click help grid:
simplified _want_wm_mouse_ctrl=ppp+a-nnn “

“_Advanced/Show output console (then hide with Tab)
toggleVerbosity v”

“_Advanced/Verbose keys toggle___verbose_keys__1__0

“_Advanced/Low execution verbosity
_debug_commands=0 Intermediate execution verbosity
_debug_commands=ackCm High execution verbosity
_debug_commands=ackCmmi “

“_Advanced/Rebuild menus with no verbosity
_rebuild_quieter_menus”

“_Advanced/Rebuild menus with tooltips
_rebuild_verboser_menus”

“_Advanced/Rebuild menus very verbosely
_rebuild_verbosest_menus”

“_Advanced/Verbose menu
toggle||_display_busy||1||0”

“_Advanced/Downscale huge images on load
toggle||_downscale_huge_at_load||1||0”

“_Advanced/Background prefetch _want_prefetch=2
Foreground prefetch _want_prefetch=1 No prefetch
_want_prefetch=0 “

“_Custom actions/_Mark current file
mark_current_file”

“_Custom actions/_Go to marked file
goto_marked_file”

“_Custom actions/Webcam shot (needs vgrabbj)
webcam”

“_Custom actions/Say something (needs espeak)
espeak”

“_Custom actions/Max cached memory: 256MiB
_max_cached_memory=262144 unlimited _max_cached_memory=0
very little _max_cached_memory=1 80MiB
_max_cached_memory=81920 “

“_Custom actions/Max cached images: unlimited
_max_cached_images=0 5 _max_cached_images=5 10
_max_cached_images=10 100 _max_cached_images=100 “

“_All actions/_Commands FimMenuCommands/”

“_All actions/_Aliases FimMenuAliases/”

“_All actions/_Key Bindings
FimMenuKeyBindings/”

“_All actions/_Variables
FimMenuVariables/”

“_Help/_Commands FimMenuCommandsHelp/”

“_Help/_Aliases FimMenuAliasesHelp/”

“_Help/_Key Bindings
FimMenuKeyBindingsHelp/”

“_Help/_Variables FimMenuVariablesHelp/”

“_Help/_man FIM man_fim”

“_Help/_man fimrc man_fimrc”;

#”_Custom actions/scaling: _auto _scale_style=a a
scaling: _auto to original _scale_style=b b scaling: manual
_scale_style=m m scaling: by _width _scale_style=w w” #
copy for demo purposes

#”_Custom actions/_Toggle flipped flag
toggle__i:flipped__1__0 f”

#”_Custom actions/_Submenu/_Frobnicate unmapped_cmd
/”

#”_Custom actions/_Submenu/_Defrobnicate
unmapped_cmd u”

#”_Custom actions/_Submenu/FimMenuLimit
FimMenuLimit/”

#”_Custom actions/_Submenu/_Do-frobnicate
unmapped_cmd *” # bad specification

#”_Custom actions/_Submenu/_Fribnikate frobnicate
unmapped_cmd *” # bad specification

#”_Custom actions/_Submenu/_Next next *” # bad
specification

#”_Custom actions/_Add menu…
menu_dialog”

#”_Custom actions/_Toggle full screen view
toggle

_gtk_fullscreen

1

0″

if (_last_cmd_output!=””) quit -1;

}
help ’’; # WELCOME…
# More examples:
#alias “plisten” ’popen “nc -l -p 9999
“’ “executes fim commands coming from port
9999 on this computer”;
#alias “wlisten”
“while(1){sleep;plisten;}” “listen to a pipe,
endlessly”;
#alias “musicplay” “system ’mpc’
’play’” “”;
#alias “musicpause” “system ’mpc’
’pause’” “”;
#alias “rdjpgcom” ’system
“rdjpgcom” i:_filename’;
# offsetscan usage : need a mechanism for popping all images
before.
#alias “offsetscan” “while(i:width<1){list
’push’ ’blob.jpg’;stdout
_open_offset ;_open_offset=_open_offset+1;reload;}”;

#alias “webcam_cycle”
“while(1){webcam;reload;sleep 1;}”;
# This is a FIM initialization file.
# Without it FIM cannot work like it should.
# Feel free to modify it, but with caution!

NOTES

This manual
page could be improved. Certain side effects of commands are
not documented. Neither a formal description of the various
commands. Interaction of commands and variables is also not
completely documented.

BUGS

The fim
language shall be more liberal with quoting.

SEE ALSO

fim(1),
fimgs(1), regex(1).

AUTHOR

Michele Martone

COPYRIGHT

See copyright
notice in fim(1).


 

{💬|⚡|🔥} **What’s your take?**
Share your thoughts in the comments below!

#️⃣ **#fbi #improved #lightweight #customizable #image #viewer #home #page**

🕒 **Posted on**: 1776415117

🌟 **Want more?** Click here for more info! 🌟

By

Leave a Reply

Your email address will not be published. Required fields are marked *