xaizek / vifm (License: GPLv2+) (since 2018-12-07)
Vifm is a file manager with curses interface, which provides Vi[m]-like environment for managing objects within file systems, extended with some useful ideas from mutt.
Commit d22dc53fe2b1ddcf136316d1ddd583dad7560098

Rewrite documentation about command-line ranges
The old version didn't cover many aspects of range processing and was
not very readable.

Thanks to CaptainFantastic.
Author: xaizek
Author date (UTC): 2026-03-19 09:57
Committer name: xaizek
Committer date (UTC): 2026-03-21 13:54
Parent(s): fe56f1a1ab3768ed7fd6a216883f1f7d69bf9a71
Signing key: 99DC5E4DB05F6BE2
Tree: 07f91c1285bd2d68f7ddfcd856599ac2d470980f
File Lines added Lines deleted
ChangeLog 3 0
data/man/vifm.1 53 31
data/vim/doc/app/vifm-app.txt 54 17
File ChangeLog changed (mode: 100644) (index c6909c694..7f4b4b4cf)
104 104 Don't offer "append the tail" conflict resolution option for al and rl Don't offer "append the tail" conflict resolution option for al and rl
105 105 operations because it's inappropriate for creation of symbolic links. operations because it's inappropriate for creation of symbolic links.
106 106
107 Rewrote documentation about command-line ranges to make it complete and
108 more readable. Thanks to CaptainFantastic.
109
107 110 Fixed 'trashdir' with "%r" on BSD-like systems (those with getmntinfo() Fixed 'trashdir' with "%r" on BSD-like systems (those with getmntinfo()
108 111 instead of getmntent() API). The regression was apparently introduced in instead of getmntent() API). The regression was apparently introduced in
109 112 v0.9.1-beta. Thanks to sublimal. v0.9.1-beta. Thanks to sublimal.
File data/man/vifm.1 changed (mode: 100644) (index 57ad1a229..2093fe199)
1 .TH VIFM 1 "11 March 2026" "vifm 0.15"
1 .TH VIFM 1 "19 March 2026" "vifm 0.15"
2 2 .\" --------------------------------------------------------------------------- .\" ---------------------------------------------------------------------------
3 3 .SH NAME .SH NAME
4 4 .\" --------------------------------------------------------------------------- .\" ---------------------------------------------------------------------------
 
... ... remove user mapping of lhs from visual mode.
3580 3580 .\" --------------------------------------------------------------------------- .\" ---------------------------------------------------------------------------
3581 3581 .SH Ranges .SH Ranges
3582 3582 .\" --------------------------------------------------------------------------- .\" ---------------------------------------------------------------------------
3583 The ranges implemented include:
3584 2,3 \- from second to third file in the list (including it)
3585 % \- the entire directory.
3586 . \- the current position in the filelist.
3587 $ \- the end of the filelist.
3588 't \- the mark position t.
3583 A range is a sequence of one or more address elements separated by
3584 commas (`,`) or semicolons (`;`). The addresses are processed left-to-right
3585 to produce a two-element range where the first element is not numerically
3586 larger than the second one:
3587 \- a single-element range `X` is equivalent to `X,X`
3588 \- a range with more than two elements is reduced to the last two, for
3589 example: `X;Y,Z` becomes `Y,Z` (yet `X` is not completely ignored as it can
3590 affect evaluation of `Y` and then `Z` through offsets)
3591 \- a user is prompted to determine whether a decreasing range should be
3592 swapped instead of being rejected
3593
3594 A range will be deemed invalid if:
3595 - its second element is less than the first one
3596 - it references a mark which doesn't point within the current file list
3597
3598 Each address can take several forms described below, but all of them can be
3599 followed by an unspecified number of offsets: increments (`+{n}`) or
3600 decrements (`-{n}`). When an element starts with an offset, the offset is
3601 applied to either the current position or the preceeding address depending on
3602 the separator:
3603 \- for `,` the current cursor position is used
3604 \- for `;` the previous range element is used
3605
3606 Addresses are positive integers in the range from 1 (the first item, which
3607 could be ../) to the number of items in the list (inclusive, represents the last
3608 item). All values are normalized to fit this range.
3609
3610 The following addresses are supported:
3611 . \- position of the cursor
3612 {n} \- position {n}
3613 $ \- position of the last item
3614 't \- position of the mark `t`
3615
3616 The following shorthand range also exists:
3617 % \- all items in the list (equivalent to `1,$`)
3589 3618
3590 3619 Examples: Examples:
3591 3620 .EX .EX
3592 3621
3593 :%delete
3622 :.gr[ep] ... grep the file under the cursor.
3623 :.d[elete] delete the file under the cursor.
3624 :%d[elete] delete all visible files.
3625 :1,4d[elete] delete the files at the list positions 1, 2, 3 and 4.
3626 Note: parent directory ../ is not handled by operations and \
3627 can be safely included as part of various ranges.
3628 :2,4d[elete] delete the files at the list positions 2, 3 and 4.
3629 :2d[elete]4 delete the files at the list positions 2, 3, 4 and 5.
3630 :.,$d[elete] delete the files from the current position to the end of \
3631 the filelist.
3632 :'a+1y[ank] yank the file below the file marked with 'a.
3633 :+1,+1y[ank] yank the file below the cursor.
3634 :+1;+1y[ank] yank two files below the cursor.
3635 :+1;+1;+1y[ank] skip two files below and yank the next two.
3636 :-3;+1 move two files up.
3594 3637
3595 3638 .EE .EE
3596 would delete all files in the directory.
3597 .EX
3598
3599 :2,4delete
3600
3601 .EE
3602 would delete the files in the list positions 2 through 4.
3603 .EX
3604
3605 :.,$delete
3606
3607 .EE
3608 would delete the files from the current position to the end of the filelist.
3609 .EX
3610
3611 :3delete4
3612
3613 .EE
3614 would delete the files in the list positions 3, 4, 5, 6.
3615
3616 If a backward range is given :4,2delete \- an query message is given and
3617 user can chose what to do next.
3618 3639
3619 The builtin commands that accept a range are :d[elete] and :y[ank].
3640 All commands documented with `[range]` in front of them accept and handle
3641 ranges. Those which accept a position use only the last element of the range.
3620 3642 .\" --------------------------------------------------------------------------- .\" ---------------------------------------------------------------------------
3621 3643 .SH :command parameters .SH :command parameters
3622 3644 .\" --------------------------------------------------------------------------- .\" ---------------------------------------------------------------------------
File data/vim/doc/app/vifm-app.txt changed (mode: 100644) (index a79360bf5..ed40d1ebf)
1 *vifm-app.txt* For Vifm version 0.15 Last change: 2026 March 11
1 *vifm-app.txt* For Vifm version 0.15 Last change: 2026 March 19
2 2
3 3 Email for bugs and suggestions: <xaizek@posteo.net> Email for bugs and suggestions: <xaizek@posteo.net>
4 4
 
... ... destination rather than refusing to perform the operation.
3002 3002
3003 3003 Ranges~ Ranges~
3004 3004 *vifm-ranges* *vifm-ranges*
3005 The ranges implemented include:
3006 2,3 - from second to third file in the list (including it)
3007 % - the entire directory.
3008 . - the current position in the filelist.
3009 $ - the end of the filelist.
3010 't - the mark position t.
3005 A range is a sequence of one or more address elements separated by
3006 commas (`,`) or semicolons (`;`). The addresses are processed left-to-right
3007 to produce a two-element range where the first element is not numerically
3008 larger than the second one:
3009 - a single-element range `X` is equivalent to `X,X`
3010 - a range with more than two elements is reduced to the last two, for
3011 example: `X;Y,Z` becomes `Y,Z` (yet `X` is not completely ignored as it can
3012 affect evaluation of `Y` and then `Z` through offsets)
3013 - a user is prompted to determine whether a decreasing range should be
3014 swapped instead of being rejected
3015
3016 A range will be deemed invalid if:
3017 - its second element is less than the first one
3018 - it references a mark which doesn't point within the current file list
3019
3020 Each address can take several forms described below, but all of them can be
3021 followed by an unspecified number of offsets: increments (`+{n}`) or
3022 decrements (`-{n}`). When an element starts with an offset, the offset is
3023 applied to either the current position or the preceeding address depending on
3024 the separator:
3025 - for `,` the current cursor position is used
3026 - for `;` the previous range element is used
3027
3028 Addresses are positive integers in the range from 1 (the first item, which
3029 could be ../) to the number of items in the list (inclusive, represents the last
3030 item). All values are normalized to fit this range.
3031
3032 The following addresses are supported:
3033 . - position of the cursor
3034 {n} - position {n}
3035 $ - position of the last item
3036 't - position of the mark `t`
3037
3038 The following shorthand range also exists:
3039 % - all items in the list (equivalent to `1,$`)
3011 3040
3012 3041 Examples: Examples:
3013 :%delete would delete all files in the directory.
3014 :2,4delete would delete the files in the list positions 2 through 4.
3015 :.,$delete would delete the files from the current position to the end
3016 of the filelist.
3017 :3delete4 would delete the files in the list positions 3, 4, 5, 6.
3018
3019 If a backward range is given :4,2delete - an query message is given and
3020 user can chose what to do next.
3021
3022 The builtin commands that accept a range are :d[elete] and :y[ank].
3042 :.gr[ep] ... grep the file under the cursor.
3043 :.d[elete] delete the file under the cursor.
3044 :%d[elete] delete all visible files.
3045 :1,4d[elete] delete the files at the list positions 1, 2, 3 and 4.
3046 Note: parent directory ../ is not handled by operations and
3047 can be safely included as part of various ranges.
3048 :2,4d[elete] delete the files at the list positions 2, 3 and 4.
3049 :2d[elete]4 delete the files at the list positions 2, 3, 4 and 5.
3050 :.,$d[elete] delete the files from the current position to the end of
3051 the filelist.
3052 :'a+1y[ank] yank the file below the file marked with 'a.
3053 :+1,+1y[ank] yank the file below the cursor.
3054 :+1;+1y[ank] yank two files below the cursor.
3055 :+1;+1;+1y[ank] skip two files below and yank the next two.
3056 :-3;+1 move two files up.
3057
3058 All commands documented with `[range]` in front of them accept and handle
3059 ranges. Those which accept a position use only the last element of the range.
3023 3060
3024 3061 Command macros~ Command macros~
3025 3062 *vifm-macros* *vifm-macros*
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vifm

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vifm

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master