2016-09-13 21:40:14 +00:00
|
|
|
//go:generate gen/docstring.sh
|
2018-07-05 20:09:53 +00:00
|
|
|
//go:generate gen/man.sh
|
2016-09-13 21:40:14 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
lf is a terminal file manager.
|
|
|
|
|
2016-09-14 23:18:50 +00:00
|
|
|
Source code can be found in the repository at https://github.com/gokcehan/lf.
|
2016-09-13 21:40:14 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
This documentation can either be read from terminal using 'lf -doc' or online
|
2018-07-07 14:50:47 +00:00
|
|
|
at https://godoc.org/github.com/gokcehan/lf. You can also use 'doc' command
|
|
|
|
(default '<f-1>') inside lf to view the documentation in a pager.
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
You can run 'lf -help' to see descriptions of command line options.
|
|
|
|
|
2016-09-14 23:18:50 +00:00
|
|
|
Reference
|
|
|
|
|
2016-12-19 21:19:07 +00:00
|
|
|
The following commands are provided by lf with default keybindings:
|
|
|
|
|
2019-03-03 19:12:33 +00:00
|
|
|
up (default 'k' and '<up>')
|
|
|
|
half-up (default '<c-u>')
|
|
|
|
page-up (default '<c-b>' and '<pgup>')
|
|
|
|
down (default 'j' and '<down>')
|
|
|
|
half-down (default '<c-d>')
|
|
|
|
page-down (default '<c-f>' and '<pgdn>')
|
|
|
|
updir (default 'h' and '<left>')
|
|
|
|
open (default 'l' and '<right>')
|
|
|
|
quit (default 'q')
|
|
|
|
top (default 'gg' and '<home>')
|
|
|
|
bottom (default 'G' and '<end>')
|
|
|
|
toggle (default '<space>')
|
|
|
|
invert (default 'v')
|
|
|
|
unselect (default 'u')
|
|
|
|
copy (default 'y')
|
|
|
|
cut (default 'd')
|
|
|
|
paste (default 'p')
|
|
|
|
clear (default 'c')
|
|
|
|
redraw (default '<c-l>')
|
|
|
|
reload (default '<c-r>')
|
|
|
|
read (default ':')
|
|
|
|
shell (default '$')
|
|
|
|
shell-pipe (default '%')
|
|
|
|
shell-wait (default '!')
|
|
|
|
shell-async (default '&')
|
|
|
|
find (default 'f')
|
|
|
|
find-back (default 'F')
|
|
|
|
find-next (default ';')
|
|
|
|
find-prev (default ',')
|
|
|
|
search (default '/')
|
|
|
|
search-back (default '?')
|
|
|
|
search-next (default 'n')
|
|
|
|
search-prev (default 'N')
|
|
|
|
mark-save (default 'm')
|
|
|
|
mark-load (default "'")
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-03-12 13:51:30 +00:00
|
|
|
The following commands are provided by lf without default keybindings:
|
|
|
|
|
2019-03-03 21:05:29 +00:00
|
|
|
draw draw the ui
|
|
|
|
load load modified files and directories
|
|
|
|
sync synchronize copied/cut files with server
|
|
|
|
echo print arguments to the message line
|
|
|
|
echomsg same as echo but logging
|
|
|
|
echoerr same as echomsg but red color
|
|
|
|
cd change working directory to the argument
|
|
|
|
select change current file selection to the argument
|
|
|
|
source read the configuration file in the argument
|
|
|
|
push simulate key pushes given in the argument
|
|
|
|
delete remove the current file or selected file(s)
|
2017-03-12 13:51:30 +00:00
|
|
|
|
2017-03-10 15:53:21 +00:00
|
|
|
The following command line commands are provided by lf with default
|
|
|
|
keybindings:
|
|
|
|
|
2019-03-03 19:12:33 +00:00
|
|
|
cmd-escape (default '<esc>')
|
|
|
|
cmd-complete (default '<tab>')
|
|
|
|
cmd-enter (default '<c-j>' and '<enter>')
|
|
|
|
cmd-history-next (default '<c-n>')
|
|
|
|
cmd-history-prev (default '<c-p>')
|
|
|
|
cmd-delete (default '<c-d>' and '<delete>')
|
|
|
|
cmd-delete-back (default '<bs>' and '<bs2>')
|
|
|
|
cmd-left (default '<c-b>' and '<left>')
|
|
|
|
cmd-right (default '<c-f>' and '<right>')
|
|
|
|
cmd-home (default '<c-a>' and '<home>')
|
|
|
|
cmd-end (default '<c-e>' and '<end>')
|
|
|
|
cmd-delete-home (default '<c-u>')
|
|
|
|
cmd-delete-end (default '<c-k>')
|
|
|
|
cmd-delete-unix-word (default '<c-w>')
|
|
|
|
cmd-yank (default '<c-y>')
|
|
|
|
cmd-transpose (default '<c-t>')
|
|
|
|
cmd-interrupt (default '<c-c>')
|
|
|
|
cmd-word (default '<a-f>')
|
|
|
|
cmd-word-back (default '<a-b>')
|
|
|
|
cmd-capitalize-word (default '<a-c>')
|
|
|
|
cmd-delete-word (default '<a-d>')
|
|
|
|
cmd-uppercase-word (default '<a-u>')
|
|
|
|
cmd-lowercase-word (default '<a-l>')
|
|
|
|
cmd-transpose-word (default '<a-t>')
|
2017-03-10 15:53:21 +00:00
|
|
|
|
2016-12-19 21:19:07 +00:00
|
|
|
The following options can be used to customize the behavior of lf:
|
|
|
|
|
2019-03-03 19:12:33 +00:00
|
|
|
anchorfind boolean (default on)
|
|
|
|
color256 boolean (default off)
|
|
|
|
dircounts boolean (default off)
|
|
|
|
dirfirst boolean (default on)
|
|
|
|
drawbox boolean (default off)
|
|
|
|
globsearch boolean (default off)
|
|
|
|
hidden boolean (default off)
|
|
|
|
ignorecase boolean (default on)
|
|
|
|
ignoredia boolean (default off)
|
|
|
|
incsearch boolean (default off)
|
|
|
|
preview boolean (default on)
|
|
|
|
reverse boolean (default off)
|
|
|
|
smartcase boolean (default on)
|
|
|
|
smartdia boolean (default off)
|
|
|
|
wrapscan boolean (default on)
|
2019-05-12 14:21:45 +00:00
|
|
|
wrapscroll boolean (default off)
|
2019-03-03 19:12:33 +00:00
|
|
|
number boolean (default off)
|
|
|
|
relativenumber boolean (default off)
|
|
|
|
findlen integer (default 1) (zero to prompt until single match)
|
|
|
|
period integer (default 0) (zero to disable periodic loading)
|
|
|
|
scrolloff integer (default 0)
|
|
|
|
tabstop integer (default 8)
|
2019-03-27 19:07:41 +00:00
|
|
|
errorfmt string (default "\033[7;31;47m%s\033[0m")
|
2019-03-03 19:12:33 +00:00
|
|
|
filesep string (default "\n")
|
|
|
|
ifs string (default '') (not exported if empty)
|
|
|
|
previewer string (default '') (not filtered if empty)
|
|
|
|
promptfmt string (default "\033[32;1m%u@%h\033[0m:\033[34;1m%w/\033[0m\033[1m%f\033[0m")
|
|
|
|
shell string (default 'sh')
|
|
|
|
sortby string (default 'natural')
|
|
|
|
timefmt string (default 'Mon Jan _2 15:04:05 2006')
|
|
|
|
ratios string (default '1:2:3')
|
|
|
|
info string (default '')
|
|
|
|
shellopts string (default '')
|
2016-12-19 21:19:07 +00:00
|
|
|
|
|
|
|
The following variables are exported for shell commands:
|
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
$f current file
|
2018-07-09 18:22:10 +00:00
|
|
|
$fs selected file(s) separated with 'filesep'
|
|
|
|
$fx current file or selected file(s) if any
|
2017-03-10 13:15:16 +00:00
|
|
|
$id id number of the client
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-08-29 16:28:22 +00:00
|
|
|
The following variables are set to the corresponding values:
|
|
|
|
|
|
|
|
$LF_LEVEL current nesting level
|
|
|
|
|
2018-06-28 18:51:24 +00:00
|
|
|
The following default values are set to the environmental variables on unix
|
|
|
|
when they are not set or empty:
|
|
|
|
|
|
|
|
$OPENER open # macos
|
|
|
|
$OPENER xdg-open # others
|
|
|
|
$EDITOR vi
|
|
|
|
$PAGER less
|
|
|
|
$SHELL sh
|
|
|
|
|
2018-06-28 20:37:01 +00:00
|
|
|
The following default values are set to the environmental variables on windows
|
|
|
|
when they are not set or empty:
|
|
|
|
|
|
|
|
%OPENER% start
|
|
|
|
%EDITOR% notepad
|
|
|
|
%PAGER% more
|
|
|
|
%SHELL% cmd
|
|
|
|
|
2018-03-02 20:15:36 +00:00
|
|
|
The following additional keybindings are provided by default:
|
|
|
|
|
|
|
|
map zh set hidden!
|
|
|
|
map zr set reverse!
|
|
|
|
map zn set info
|
|
|
|
map zs set info size
|
|
|
|
map zt set info time
|
|
|
|
map za set info size:time
|
|
|
|
map sn :set sortby natural; set info
|
|
|
|
map ss :set sortby size; set info size
|
|
|
|
map st :set sortby time; set info time
|
|
|
|
map gh cd ~
|
|
|
|
|
2018-06-28 20:37:01 +00:00
|
|
|
The following keybindings to applications are provided by default:
|
2018-03-02 20:15:36 +00:00
|
|
|
|
2018-06-28 20:37:01 +00:00
|
|
|
map e $$EDITOR $f
|
|
|
|
map i $$PAGER $f
|
2018-06-28 18:51:24 +00:00
|
|
|
map w $$SHELL
|
2018-03-02 20:15:36 +00:00
|
|
|
|
2016-09-15 14:08:05 +00:00
|
|
|
Configuration
|
|
|
|
|
2018-06-28 17:23:41 +00:00
|
|
|
Configuration files should be located at:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
os system-wide user-specific
|
2018-07-13 19:46:37 +00:00
|
|
|
unix /etc/lf/lfrc ~/.config/lf/lfrc
|
2018-06-28 17:23:41 +00:00
|
|
|
windows C:\ProgramData\lf\lfrc C:\Users\<user>\AppData\Local\lf\lfrc
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2018-07-12 18:47:19 +00:00
|
|
|
Marks file should be located at:
|
|
|
|
|
|
|
|
unix ~/.local/share/lf/marks
|
|
|
|
windows C:\Users\<user>\AppData\Local\lf\marks
|
|
|
|
|
|
|
|
History file should be located at:
|
|
|
|
|
|
|
|
unix ~/.local/share/lf/history
|
|
|
|
windows C:\Users\<user>\AppData\Local\lf\history
|
|
|
|
|
2018-06-28 17:23:41 +00:00
|
|
|
You can configure the default values of following variables to change these
|
|
|
|
locations:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2018-06-28 17:23:41 +00:00
|
|
|
$XDG_CONFIG_HOME ~/.config
|
2018-07-12 18:47:19 +00:00
|
|
|
$XDG_DATA_HOME ~/.local/share
|
2018-06-28 17:23:41 +00:00
|
|
|
%ProgramData% C:\ProgramData
|
|
|
|
%LOCALAPPDATA% C:\Users\<user>\AppData\Local
|
2016-12-19 21:19:07 +00:00
|
|
|
|
|
|
|
A sample configuration file can be found at
|
2016-09-14 23:18:50 +00:00
|
|
|
https://github.com/gokcehan/lf/blob/master/etc/lfrc.example.
|
|
|
|
|
|
|
|
Prefixes
|
|
|
|
|
|
|
|
The following command prefixes are used by lf:
|
|
|
|
|
2018-03-27 18:23:34 +00:00
|
|
|
: read (default) builtin/custom command
|
|
|
|
$ shell shell command
|
2018-04-06 19:49:50 +00:00
|
|
|
% shell-pipe shell command running with the ui
|
2018-03-27 18:23:34 +00:00
|
|
|
! shell-wait shell command waiting for key press
|
2018-04-06 19:49:50 +00:00
|
|
|
& shell-async shell command running asynchronously
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-05-20 17:30:41 +00:00
|
|
|
The same evaluator is used for the command line and the configuration file for
|
|
|
|
read and shell commands. The difference is that prefixes are not necessary in
|
|
|
|
the command line. Instead, different modes are provided to read corresponding
|
2019-05-14 17:27:16 +00:00
|
|
|
commands. These modes are mapped to the prefix keys above by default.
|
2016-09-14 23:18:50 +00:00
|
|
|
|
|
|
|
Syntax
|
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Characters from '#' to newline are comments and ignored:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
# comments start with '#'
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
There are three special commands ('set', 'map', and 'cmd') and their variants
|
2017-03-10 15:53:21 +00:00
|
|
|
for configuration.
|
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
Command 'set' is used to set an option which can be boolean, integer, or
|
|
|
|
string:
|
2017-03-10 15:53:21 +00:00
|
|
|
|
|
|
|
set hidden # boolean on
|
|
|
|
set nohidden # boolean off
|
|
|
|
set hidden! # boolean toggle
|
|
|
|
set scrolloff 10 # integer value
|
|
|
|
set sortby time # string value w/o quotes
|
|
|
|
set sortby 'time' # string value with single quotes (whitespaces)
|
|
|
|
set sortby "time" # string value with double quotes (backslash escapes)
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
Command 'map' is used to bind a key to a command which can be builtin command,
|
|
|
|
custom command, or shell command:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
map gh cd ~ # builtin command
|
2017-03-10 15:53:21 +00:00
|
|
|
map D trash # custom command
|
2017-09-08 20:46:31 +00:00
|
|
|
map i $less $f # shell command
|
2018-06-15 21:57:50 +00:00
|
|
|
map U !du -sh # waiting shell command
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
Command 'cmap' is used to bind a key to a command line command which can only
|
|
|
|
be one of the builtin commands:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-03-10 15:53:21 +00:00
|
|
|
cmap <c-g> cmd-escape
|
2016-12-19 21:19:07 +00:00
|
|
|
|
|
|
|
You can delete an existing binding by leaving the expression empty:
|
|
|
|
|
2017-03-10 15:53:21 +00:00
|
|
|
map gh # deletes 'gh' mapping
|
|
|
|
cmap <c-g> # deletes '<c-g>' mapping
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
Command 'cmd' is used to define a custom command:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2018-06-15 21:57:50 +00:00
|
|
|
cmd usage $du -h -d1 | less
|
2016-12-19 21:19:07 +00:00
|
|
|
|
|
|
|
You can delete an existing command by leaving the expression empty:
|
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
cmd trash # deletes 'trash' command
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
If there is no prefix then ':' is assumed:
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
map zt set info time
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
An explicit ':' can be provided to group statements until a newline which is
|
|
|
|
especially useful for 'map' and 'cmd' commands:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
map st :set sortby time; set info time
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
If you need multiline you can wrap statements in '{{' and '}}' after the proper
|
2016-12-19 21:19:07 +00:00
|
|
|
prefix.
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
map st :{{
|
|
|
|
set sortby time
|
|
|
|
set info time
|
|
|
|
}}
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-06-06 18:39:44 +00:00
|
|
|
Key Mappings
|
|
|
|
|
|
|
|
Regular keys are assigned to a command with the usual syntax:
|
|
|
|
|
|
|
|
map a down
|
|
|
|
|
|
|
|
Keys combined with the shift key simply use the uppercase letter:
|
|
|
|
|
|
|
|
map A down
|
|
|
|
|
|
|
|
Special keys are written in between '<' and '>' characters and always use
|
|
|
|
lowercase letters:
|
|
|
|
|
|
|
|
map <enter> down
|
|
|
|
|
|
|
|
Angle brackets can be assigned with their special names:
|
|
|
|
|
|
|
|
map <lt> down
|
|
|
|
map <gt> down
|
|
|
|
|
|
|
|
Function keys are prefixed with 'f' character:
|
|
|
|
|
|
|
|
map <f-1> down
|
|
|
|
|
|
|
|
Keys combined with the control key are prefixed with 'c' character:
|
|
|
|
|
|
|
|
map <c-a> down
|
|
|
|
|
|
|
|
Keys combined with the alt key are assigned in two different ways depending on
|
|
|
|
the behavior of your terminal. Older terminals (e.g. xterm) may set the 8th bit
|
|
|
|
of a character when the alt key is pressed. On these terminals, you can use the
|
|
|
|
corresponding byte for the mapping:
|
|
|
|
|
|
|
|
map á down
|
|
|
|
|
|
|
|
Newer terminals (e.g. gnome-terminal) may prefix the key with an escape key
|
2018-06-06 18:50:15 +00:00
|
|
|
when the alt key is pressed. lf uses the escape delaying mechanism to recognize
|
2018-06-06 18:39:44 +00:00
|
|
|
alt keys in these terminals (delay is 100ms). On these terminals, keys combined
|
|
|
|
with the alt key are prefixed with 'a' character:
|
|
|
|
|
|
|
|
map <a-a> down
|
|
|
|
|
|
|
|
Please note that, some key combinations are not possible due to the way
|
2018-06-06 18:50:15 +00:00
|
|
|
terminals work (e.g. control and h combination sends a backspace key instead).
|
|
|
|
The easiest way to find the name of a key combination is to press the key while
|
|
|
|
lf is running and read the name of the key from the unknown mapping error.
|
2018-06-06 18:39:44 +00:00
|
|
|
|
2018-04-06 19:49:50 +00:00
|
|
|
Push Mappings
|
2016-09-18 16:21:24 +00:00
|
|
|
|
|
|
|
The usual way to map a key sequence is to assign it to a named or unnamed
|
|
|
|
command. While this provides a clean way to remap builtin keys as well as other
|
2017-09-08 20:46:31 +00:00
|
|
|
commands, it can be limiting at times. For this reason 'push' command is
|
2016-09-18 16:21:24 +00:00
|
|
|
provided by lf. This command is used to simulate key pushes given as its
|
2017-09-08 20:46:31 +00:00
|
|
|
arguments. You can 'map' a key to a 'push' command with an argument to create
|
2016-09-18 16:21:24 +00:00
|
|
|
various keybindings.
|
|
|
|
|
|
|
|
This is mainly useful for two purposes. First, it can be used to map a command
|
2016-12-19 21:19:07 +00:00
|
|
|
with a command count:
|
2016-09-18 16:21:24 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
map <c-j> push 10j
|
2016-09-18 16:21:24 +00:00
|
|
|
|
2016-12-19 21:19:07 +00:00
|
|
|
Second, it can be used to avoid typing the name when a command takes arguments:
|
2016-09-18 16:21:24 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
map r push :rename<space>
|
2016-09-18 16:21:24 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
One thing to be careful is that since 'push' command works with keys instead of
|
2016-12-19 21:19:07 +00:00
|
|
|
commands it is possible to accidentally create recursive bindings:
|
2016-09-18 16:21:24 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
map j push 2j
|
2016-09-18 16:21:24 +00:00
|
|
|
|
|
|
|
These types of bindings create a deadlock when executed.
|
|
|
|
|
2018-04-06 19:52:15 +00:00
|
|
|
Shell Commands
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-04-06 19:49:50 +00:00
|
|
|
Regular shell commands are the most basic command type that is useful for many
|
|
|
|
purposes. For example, we can write a shell command to move selected file(s) to
|
|
|
|
trash. A first attempt to write such a command may look like this:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
cmd trash ${{
|
|
|
|
mkdir -p ~/.trash
|
2017-09-07 20:01:57 +00:00
|
|
|
if [ -z "$fs" ]; then
|
2017-09-16 19:11:43 +00:00
|
|
|
mv "$f" ~/.trash
|
2017-03-10 13:15:16 +00:00
|
|
|
else
|
2017-09-16 19:11:43 +00:00
|
|
|
IFS="`printf '\n\t'`"; mv $fs ~/.trash
|
2017-03-10 13:15:16 +00:00
|
|
|
fi
|
|
|
|
}}
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-07-09 18:22:10 +00:00
|
|
|
We check '$fs' to see if there are any selected files. Otherwise we just delete
|
2017-09-08 20:46:31 +00:00
|
|
|
the current file. Since this is such a common pattern, a separate '$fx'
|
2016-12-19 21:19:07 +00:00
|
|
|
variable is provided. We can use this variable to get rid of the conditional:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
cmd trash ${{
|
|
|
|
mkdir -p ~/.trash
|
2017-09-16 19:11:43 +00:00
|
|
|
IFS="`printf '\n\t'`"; mv $fx ~/.trash
|
2017-03-10 13:15:16 +00:00
|
|
|
}}
|
2016-09-14 23:18:50 +00:00
|
|
|
|
|
|
|
The trash directory is checked each time the command is executed. We can move
|
2016-12-19 21:19:07 +00:00
|
|
|
it outside of the command so it would only run once at startup:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
${{ mkdir -p ~/.trash }}
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-16 19:11:43 +00:00
|
|
|
cmd trash ${{ IFS="`printf '\n\t'`"; mv $fx ~/.trash }}
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Since these are one liners, we can drop '{{' and '}}':
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
$mkdir -p ~/.trash
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-16 19:11:43 +00:00
|
|
|
cmd trash $IFS="`printf '\n\t'`"; mv $fx ~/.trash
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Finally note that we set 'IFS' variable manually in these commands. Instead we
|
|
|
|
could use the 'ifs' option to set it for all shell commands (i.e. 'set ifs
|
|
|
|
"\n"'). This can be especially useful for interactive use (e.g. '$rm $f' or
|
|
|
|
'$rm $fs' would simply work). This option is not set by default as it can
|
2017-09-07 20:01:57 +00:00
|
|
|
behave unexpectedly for new users. However, use of this option is highly
|
|
|
|
recommended and it is assumed in the rest of the documentation.
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-04-06 19:52:15 +00:00
|
|
|
Piping Shell Commands
|
2018-04-06 19:49:50 +00:00
|
|
|
|
|
|
|
Regular shell commands have some limitations in some cases. When an output or
|
|
|
|
error message is given and the command exits afterwards, the ui is immediately
|
|
|
|
resumed and there is no way to see the message without dropping to shell again.
|
|
|
|
Also, even when there is no output or error, the ui still needs to be paused
|
|
|
|
while the command is running. This can cause flickering on the screen for short
|
|
|
|
commands and similar distractions for longer commands.
|
|
|
|
|
|
|
|
Instead of pausing the ui, piping shell commands connects stdin, stdout, and
|
|
|
|
stderr of the command to the statline in the bottom of the ui. This can be
|
|
|
|
useful for programs following the unix philosophy to give no output in the
|
|
|
|
success case, and brief error messages or prompts in other cases.
|
|
|
|
|
|
|
|
For example, following rename command prompts for overwrite in the statline if
|
|
|
|
there is an existing file with the given name:
|
|
|
|
|
|
|
|
cmd rename %mv -i $f $1
|
|
|
|
|
|
|
|
You can also output error messages in the command and it will show up in the
|
|
|
|
statline. For example, an alternative rename command may look like this:
|
|
|
|
|
|
|
|
cmd rename %[ -e $1 ] && printf "file exists" || mv $f $1
|
|
|
|
|
|
|
|
One thing to be careful is that although input is still line buffered, output
|
|
|
|
and error are byte buffered and verbose commands will be very slow to display.
|
|
|
|
|
2018-04-06 19:52:15 +00:00
|
|
|
Waiting Shell Commands
|
2018-04-06 19:49:50 +00:00
|
|
|
|
|
|
|
Waiting shell commands are similar to regular shell commands except that they
|
|
|
|
wait for a key press when the command is finished. These can be useful to see
|
|
|
|
the output of a program before the ui is resumed. Waiting shell commands are
|
|
|
|
more appropriate than piping shell commands when the command is verbose and the
|
|
|
|
output is best displayed as multiline.
|
|
|
|
|
2018-04-06 19:52:15 +00:00
|
|
|
Asynchronous Shell Commands
|
2018-04-06 19:49:50 +00:00
|
|
|
|
|
|
|
Asynchronous shell commands are used to start a command in the background and
|
|
|
|
then resume operation without waiting for the command to finish. Stdin, stdout,
|
|
|
|
and stderr of the command is neither connected to the terminal nor to the ui.
|
|
|
|
|
2017-02-11 13:14:41 +00:00
|
|
|
Remote Commands
|
|
|
|
|
|
|
|
One of the more advanced features in lf is remote commands. All clients connect
|
|
|
|
to a server on startup. It is possible to send commands to all or any of the
|
|
|
|
connected clients over the common server. This is used internally to notify
|
|
|
|
file selection changes to other clients.
|
|
|
|
|
|
|
|
To use this feature, you need to use a client which supports communicating with
|
|
|
|
a UNIX-domain socket. OpenBSD implementation of netcat (nc) is one such
|
|
|
|
example. You can use it to send a command to the socket file:
|
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
echo 'send echo hello world' | nc -U /tmp/lf.${USER}.sock
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2017-02-11 13:34:48 +00:00
|
|
|
Since such a client may not be available everywhere, lf comes bundled with a
|
2017-02-11 13:14:41 +00:00
|
|
|
command line flag to be used as such. When using lf, you do not need to specify
|
|
|
|
the address of the socket file. This is the recommended way of using remote
|
|
|
|
commands since it is shorter and immune to socket file address changes:
|
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
lf -remote 'send echo hello world'
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
In this command 'send' is used to send the rest of the string as a command to
|
2017-02-11 13:14:41 +00:00
|
|
|
all connected clients. You can optionally give it an id number to send a
|
|
|
|
command to a single client:
|
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
lf -remote 'send 1000 echo hello world'
|
2017-02-11 13:14:41 +00:00
|
|
|
|
|
|
|
All clients have a unique id number but you may not be aware of the id number
|
2017-09-08 20:46:31 +00:00
|
|
|
when you are writing a command. For this purpose, an '$id' variable is exported
|
2017-02-11 13:14:41 +00:00
|
|
|
to the environment for shell commands. You can use it to send a remote command
|
|
|
|
from a client to the server which in return sends a command back to itself. So
|
|
|
|
now you can display a message in the current client by calling the following in
|
|
|
|
a shell command:
|
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
lf -remote "send $id echo hello world"
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Since lf does not have control flow syntax, remote commands are used for such
|
2018-04-06 19:49:50 +00:00
|
|
|
needs. For example, you can configure the number of columns in the ui with
|
|
|
|
respect to the terminal width as follows:
|
|
|
|
|
2018-06-15 21:57:50 +00:00
|
|
|
cmd recol %{{
|
2018-04-06 19:49:50 +00:00
|
|
|
w=$(tput cols)
|
|
|
|
if [ $w -le 80 ]; then
|
|
|
|
lf -remote "send $id set ratios 1:2"
|
|
|
|
elif [ $w -le 160 ]; then
|
|
|
|
lf -remote "send $id set ratios 1:2:3"
|
2017-03-10 13:15:16 +00:00
|
|
|
else
|
2018-04-06 19:49:50 +00:00
|
|
|
lf -remote "send $id set ratios 1:2:3:5"
|
2017-03-10 13:15:16 +00:00
|
|
|
fi
|
|
|
|
}}
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Besides 'send' command, there are also two commands to get or set the current
|
|
|
|
file selection. Two possible modes 'copy' and 'move' specify whether selected
|
|
|
|
files are to be copied or moved. File names are separated by newline character.
|
|
|
|
Setting the file selection is done with 'save' command:
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2017-09-17 12:01:53 +00:00
|
|
|
lf -remote "$(printf 'save\ncopy\nfoo.txt\nbar.txt\nbaz.txt\n')"
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Getting the file selection is similarly done with 'load' command:
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
load=$(lf -remote 'load')
|
|
|
|
mode=$(echo "$load" | sed -n '1p')
|
|
|
|
list=$(echo "$load" | sed '1d')
|
2017-03-10 13:15:16 +00:00
|
|
|
if [ $mode = 'copy' ]; then
|
2017-09-08 20:46:31 +00:00
|
|
|
# do something with $list
|
2017-03-10 13:15:16 +00:00
|
|
|
elif [ $mode = 'move' ]; then
|
2017-09-08 20:46:31 +00:00
|
|
|
# do something else with $list
|
2017-03-10 13:15:16 +00:00
|
|
|
fi
|
2017-02-11 13:14:41 +00:00
|
|
|
|
2018-07-22 17:44:56 +00:00
|
|
|
There is a 'quit' command to close client connections and quit the server:
|
|
|
|
|
|
|
|
lf -remote 'quit'
|
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
Lastly, there is a 'conn' command to connect the server as a client. This
|
2017-02-11 13:14:41 +00:00
|
|
|
should not be needed for users.
|
|
|
|
|
2016-09-15 14:08:05 +00:00
|
|
|
File Operations
|
|
|
|
|
2019-03-03 19:12:33 +00:00
|
|
|
lf uses its own builtin copy and move operations by default. These are
|
|
|
|
implemented as asynchronous operations and progress is shown in the bottom
|
|
|
|
ruler. These commands do not overwrite existing files or directories with the
|
|
|
|
same name. Instead, a suffix that is compatible with '--backup=numbered' option
|
|
|
|
in GNU cp is added to the new files or directories. Only file modes are
|
|
|
|
preserved and all other attributes are ignored including ownership, timestamps,
|
|
|
|
context, links, and xattr. Special files such as character and block devices,
|
|
|
|
named pipes, and sockets are skipped and links are followed. Moving is
|
|
|
|
performed using the rename operation of the underlying OS. This can fail to
|
|
|
|
move files between different partitions when it needs to copy files. For these
|
|
|
|
cases, users are expected to explicitly copy files and then delete the old ones
|
|
|
|
manually. Operation errors are shown in the message line as well as the log
|
|
|
|
file and they do not preemptively finish the corresponding file operation.
|
|
|
|
|
|
|
|
File operations can be performed on the current selected file or alternatively
|
2019-03-13 19:28:20 +00:00
|
|
|
on multiple files by selecting them first. When you 'copy' a file, lf doesn't
|
2019-03-03 19:12:33 +00:00
|
|
|
actually copy the file on the disk, but only records its name to memory. The
|
|
|
|
actual file copying takes place when you 'paste'. Similarly 'paste' after a
|
|
|
|
'cut' operation moves the file.
|
|
|
|
|
|
|
|
You can customize copy and move operations by defining a 'paste' command. This
|
|
|
|
is a special command that is called when it is defined instead of the builtin
|
|
|
|
implementation. You can use the following example as a starting point:
|
2017-09-17 16:36:37 +00:00
|
|
|
|
2018-07-05 20:09:53 +00:00
|
|
|
cmd paste %{{
|
2017-09-17 16:36:37 +00:00
|
|
|
load=$(lf -remote 'load')
|
|
|
|
mode=$(echo "$load" | sed -n '1p')
|
|
|
|
list=$(echo "$load" | sed '1d')
|
|
|
|
if [ $mode = 'copy' ]; then
|
2019-03-03 19:12:33 +00:00
|
|
|
cp -R $list .
|
2017-09-17 16:36:37 +00:00
|
|
|
elif [ $mode = 'move' ]; then
|
2019-03-03 19:12:33 +00:00
|
|
|
mv $list .
|
2017-09-17 16:36:37 +00:00
|
|
|
fi
|
2018-06-15 21:57:50 +00:00
|
|
|
lf -remote 'send load'
|
2018-07-05 20:09:53 +00:00
|
|
|
lf -remote 'send clear'
|
2017-09-17 16:36:37 +00:00
|
|
|
}}
|
|
|
|
|
2019-03-03 19:12:33 +00:00
|
|
|
Some useful things to be considered are to use the backup ('--backup') and/or
|
|
|
|
preserve attributes ('-a') options with 'cp' and 'mv' commands if they support
|
|
|
|
it (i.e. GNU implementation), change the command type to asynchronous, or use
|
|
|
|
'rsync' command with progress bar option for copying and feed the progress to
|
|
|
|
the client periodically with remote 'echo' calls.
|
2017-09-17 16:36:37 +00:00
|
|
|
|
2019-01-31 19:15:31 +00:00
|
|
|
By default, lf does not assign 'delete' command to a key to protect new users.
|
|
|
|
You can customize file deletion by defining a 'delete' command. You can also
|
|
|
|
assign a key to this command if you like. An example command to move selected
|
|
|
|
files to a trash folder and remove files completely after a prompt are provided
|
|
|
|
in the example configuration file.
|
2017-02-11 13:28:45 +00:00
|
|
|
|
2019-01-18 17:41:17 +00:00
|
|
|
Searching Files
|
|
|
|
|
|
|
|
There are two mechanisms implemented in lf to search a file in the current
|
|
|
|
directory. Searching is the traditional method to move the selection to a file
|
|
|
|
matching a given pattern. Finding is an alternative way to search for a pattern
|
|
|
|
possibly using fewer keystrokes.
|
|
|
|
|
|
|
|
Searching mechanism is implemented with commands 'search' (default '/'),
|
|
|
|
'search-back' (default '?'), 'search-next' (default 'n'), and 'search-prev'
|
|
|
|
(default 'N'). You can enable 'globsearch' option to match with a glob pattern.
|
|
|
|
Globbing supports '*' to match any sequence, '?' to match any character, and
|
|
|
|
'[...]' or '[^...] to match character sets or ranges. You can enable
|
|
|
|
'incsearch' option to jump to the current match at each keystroke while typing.
|
|
|
|
In this mode, you can either use 'cmd-enter' to accept the search or use
|
2019-05-14 17:27:16 +00:00
|
|
|
'cmd-escape' to cancel the search. Alternatively, you can also map some other
|
|
|
|
commands with 'cmap' to accept the search and execute the command immediately
|
|
|
|
afterwards. Possible candidates are 'up', 'down' and their variants, 'updir',
|
|
|
|
and 'open' commands. For example, you can use arrow keys to finish the search
|
|
|
|
with the following mappings:
|
|
|
|
|
|
|
|
cmap <up> up
|
|
|
|
cmap <down> down
|
|
|
|
cmap <left> updir
|
|
|
|
cmap <right> open
|
2019-01-18 17:41:17 +00:00
|
|
|
|
|
|
|
Finding mechanism is implemented with commands 'find' (default 'f'),
|
|
|
|
'find-back' (default 'F'), 'find-next' (default ';'), 'find-prev' (default
|
|
|
|
','). You can disable 'anchorfind' option to match a pattern at an arbitrary
|
|
|
|
position in the filename instead of the beginning. You can set the number of
|
|
|
|
keys to match using 'findlen' option. If you set this value to zero, then the
|
|
|
|
the keys are read until there is only a single match. Default values of these
|
|
|
|
two options are set to jump to the first file with the given initial.
|
|
|
|
|
|
|
|
Some options effect both searching and finding. You can disable 'wrapscan'
|
|
|
|
option to prevent searches to wrap around at the end of the file list. You can
|
|
|
|
disable 'ignorecase' option to match cases in the pattern and the filename.
|
|
|
|
This option is already automatically overridden if the pattern contains upper
|
|
|
|
case characters. You can disable 'smartcase' option to disable this behavior.
|
|
|
|
Two similar options 'ignoredia' and 'smartdia' are provided to control matching
|
|
|
|
diacritics in latin letters.
|
|
|
|
|
2016-09-14 23:18:50 +00:00
|
|
|
Opening Files
|
|
|
|
|
2019-01-18 20:09:18 +00:00
|
|
|
You can define a an 'open' command (default 'l' and '<right>') to configure
|
|
|
|
file opening. This command is only called when the current file is not a
|
|
|
|
directory, otherwise the directory is entered instead. You can define it just
|
|
|
|
as you would define any other command:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-06-28 18:20:43 +00:00
|
|
|
cmd open $vi $fx
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2016-12-19 21:19:07 +00:00
|
|
|
It is possible to use different command types:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-06-28 18:20:43 +00:00
|
|
|
cmd open &xdg-open $f
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
You may want to use either file extensions or mime types from 'file' command:
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-06-28 18:20:43 +00:00
|
|
|
cmd open ${{
|
2017-09-07 20:01:57 +00:00
|
|
|
case $(file --mime-type $f -b) in
|
2017-09-08 20:46:31 +00:00
|
|
|
text/*) vi $fx;;
|
2017-09-07 20:01:57 +00:00
|
|
|
*) for f in $fx; do xdg-open $f > /dev/null 2> /dev/null & done;;
|
2017-03-10 13:15:16 +00:00
|
|
|
esac
|
|
|
|
}}
|
2016-09-14 23:18:50 +00:00
|
|
|
|
2018-06-28 20:37:01 +00:00
|
|
|
Following command is provided by default:
|
2018-03-02 20:15:36 +00:00
|
|
|
|
2018-06-28 20:37:01 +00:00
|
|
|
cmd open &$OPENER $f
|
2018-03-02 20:15:36 +00:00
|
|
|
|
|
|
|
You may also use any other existing file openers as you like. Possible options
|
|
|
|
are 'libfile-mimeinfo-perl' (executable name is 'mimeopen'), 'rifle' (ranger's
|
|
|
|
default file opener), or 'mimeo' to name a few.
|
2016-09-15 18:44:06 +00:00
|
|
|
|
|
|
|
Previewing Files
|
|
|
|
|
|
|
|
lf previews files on the preview pane by printing the file until the end or the
|
|
|
|
preview pane is filled. This output can be enhanced by providing a custom
|
|
|
|
preview script for filtering. This can be used to highlight source codes, list
|
|
|
|
contents of archive files or view pdf or image files as text to name few. For
|
|
|
|
coloring lf recognizes ansi escape codes.
|
|
|
|
|
2017-09-08 20:46:31 +00:00
|
|
|
In order to use this feature you need to set the value of 'previewer' option to
|
2016-09-15 18:44:06 +00:00
|
|
|
the path of an executable file. lf passes the current file name as the first
|
|
|
|
argument and the height of the preview pane as the second argument when running
|
|
|
|
this file. Output of the execution is printed in the preview pane. You may want
|
2016-12-19 21:19:07 +00:00
|
|
|
to use the same script in your pager mapping as well if any:
|
2016-09-15 18:44:06 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
set previewer ~/.config/lf/pv.sh
|
2017-09-07 20:01:57 +00:00
|
|
|
map i $~/.config/lf/pv.sh $f | less -R
|
2016-09-15 18:44:06 +00:00
|
|
|
|
|
|
|
Since this script is called for each file selection change it needs to be as
|
|
|
|
efficient as possible and this responsibility is left to the user. You may use
|
|
|
|
file extensions to determine the type of file more efficiently compared to
|
2017-09-08 20:46:31 +00:00
|
|
|
obtaining mime types from 'file' command. Extensions can then be used to match
|
2016-12-19 21:19:07 +00:00
|
|
|
cleanly within a conditional:
|
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
#!/bin/sh
|
2016-12-19 21:19:07 +00:00
|
|
|
|
2017-03-10 13:15:16 +00:00
|
|
|
case "$1" in
|
|
|
|
*.tar*) tar tf "$1";;
|
|
|
|
*.zip) unzip -l "$1";;
|
|
|
|
*.rar) unrar l "$1";;
|
|
|
|
*.7z) 7z l "$1";;
|
|
|
|
*.pdf) pdftotext "$1" -;;
|
|
|
|
*) highlight -O ansi "$1" || cat "$1";;
|
|
|
|
esac
|
2016-09-15 18:44:06 +00:00
|
|
|
|
|
|
|
Another important consideration for efficiency is the use of programs with
|
2017-09-08 20:46:31 +00:00
|
|
|
short startup times for preview. For this reason, 'highlight' is recommended
|
|
|
|
over 'pygmentize' for syntax highlighting. Besides, it is also important that
|
2016-09-15 18:44:06 +00:00
|
|
|
the application is processing the file on the fly rather than first reading it
|
|
|
|
to the memory and then do the processing afterwards. This is especially
|
|
|
|
relevant for big files. lf automatically closes the previewer script output
|
|
|
|
pipe with a SIGPIPE when enough lines are read. When everything else fails, you
|
|
|
|
can make use of the height argument to only feed the first portion of the file
|
|
|
|
to a program for preview.
|
2018-04-20 21:11:54 +00:00
|
|
|
|
|
|
|
Colorschemes
|
|
|
|
|
|
|
|
lf tries to automatically adapt its colors to the environment. On startup,
|
|
|
|
first '$LS_COLORS' environment variable is checked. This variable is used by
|
|
|
|
GNU ls to configure its colors based on file types and extensions. The value of
|
|
|
|
this variable is often set by GNU dircolors in a shell configuration file.
|
|
|
|
dircolors program itself can be configured with a configuration file. dircolors
|
|
|
|
supports 256 colors along with common attributes such as bold and underline.
|
|
|
|
|
|
|
|
If '$LS_COLORS' variable is not set, '$LSCOLORS' variable is checked instead.
|
|
|
|
This variable is used by ls programs on unix systems such as Mac and BSDs. This
|
|
|
|
variable has a simple syntax and supports 8 colors and bold attribute.
|
|
|
|
|
|
|
|
If both of these environment variables are not set, then lf fallbacks to its
|
|
|
|
default colorscheme. Default lf colors are taken from GNU dircolors defaults.
|
|
|
|
These defaults use 8 basic colors and bold attribute.
|
|
|
|
|
2019-01-08 19:47:41 +00:00
|
|
|
You should also note that lf uses 8 color mode by default which uses sgr 3-bit
|
|
|
|
color escapes (e.g. '\033[34m'). If you want to use 256 colors, you need to
|
|
|
|
enable 'color256' option which then makes lf use sgr 8-bit color escapes (e.g.
|
|
|
|
'\033[38;5;4m'). This option is intended to eliminate differences between
|
|
|
|
default colors used by ls and lf since terminals may render 3-bit and 8-bit
|
|
|
|
escapes differently even for the same color.
|
|
|
|
|
2018-04-20 21:11:54 +00:00
|
|
|
Keeping this mechanism in mind, you can configure lf colors in two different
|
|
|
|
ways. First, you can configure 8 basic colors used by your terminal and lf
|
|
|
|
should pick up those colors automatically. Depending on your terminal, you
|
|
|
|
should be able to select your colors from a 24-bit palette. This is the
|
|
|
|
recommended approach as colors used by other programs will also match each
|
|
|
|
other.
|
|
|
|
|
|
|
|
Second, you can set the values of environmental variables mentioned above for
|
|
|
|
fine grained customization. This is useful to change colors used for different
|
|
|
|
file types and extensions. '$LS_COLORS' is more powerful than '$LSCOLORS' and
|
|
|
|
it can be used even when GNU programs are not installed on the system. You can
|
|
|
|
combine this second method with the first method for best results.
|
2019-01-08 19:47:41 +00:00
|
|
|
|
|
|
|
Lastly, you may also want to configure the colors of the prompt line to match
|
|
|
|
the rest of the colors. Colors of the prompt line can be configured using the
|
|
|
|
'promptfmt' option which can include hardcoded colors as ansi escapes. See the
|
|
|
|
default value of this option to have an idea about how to color this line.
|
2016-09-13 21:40:14 +00:00
|
|
|
*/
|
|
|
|
package main
|