about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--doc/ranger.1122
-rw-r--r--doc/ranger.pod140
-rwxr-xr-xranger/config/commands.py2
-rw-r--r--ranger/config/rc.conf11
4 files changed, 240 insertions, 35 deletions
diff --git a/doc/ranger.1 b/doc/ranger.1
index 3521d762..54d35c8c 100644
--- a/doc/ranger.1
+++ b/doc/ranger.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35)
+.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35)
 .\"
 .\" Standard preamble:
 .\" ========================================================================
@@ -133,7 +133,7 @@
 .\" ========================================================================
 .\"
 .IX Title "RANGER 1"
-.TH RANGER 1 "ranger-1.9.2" "2019-10-02" "ranger manual"
+.TH RANGER 1 "ranger-1.9.2" "2019-12-27" "ranger manual"
 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
 .\" way too many mistakes in technical documents.
 .if n .ad l
@@ -717,12 +717,6 @@ Close the current tab.  The last tab cannot be closed this way.
 A key chain that allows you to quickly change the line mode of all the files of
 the current directory.  For a more permanent solution, use the command
 \&\*(L"default_linemode\*(R" in your rc.conf.
-.IP ".n" 14
-.IX Item ".n"
-Apply a new filename filter.
-.IP ".m" 14
-.IX Item ".m"
-Apply a new mimetype filter.
 .IP ".d" 14
 .IX Item ".d"
 Apply the typefilter \*(L"directory\*(R".
@@ -732,19 +726,32 @@ Apply the typefilter \*(L"file\*(R".
 .IP ".l" 14
 .IX Item ".l"
 Apply the typefilter \*(L"symlink\*(R".
+.IP ".m" 14
+.IX Item ".m"
+Apply a new mimetype filter.
+.IP ".n" 14
+.IX Item ".n"
+Apply a new filename filter.
+.IP ".#" 14
+Apply a new hash filter.
+.IP ".""" 14
+Apply a new duplicate filter.
+.IP ".'" 14
+Apply a new unique filter.
 .IP ".|" 14
-Combine the two topmost filters from the filter stack in the \*(L"\s-1OR\*(R"\s0
-relationship, instead of the \*(L"\s-1AND\*(R"\s0 used implicitly.
+Combine the two topmost filters from the filter stack in the \f(CW\*(C`OR\*(C'\fR
+relationship, instead of the \f(CW\*(C`AND\*(C'\fR used implicitly.
 .IP ".&" 14
-Explicitly combine the two topmost filters in the \*(L"\s-1AND\*(R"\s0
-relationship. Usually not needed though might be useful in more
-complicated scenarios.
+Explicitly combine the two topmost filters in the \f(CW\*(C`AND\*(C'\fR relationship.
+Usually not needed because filters are implicitly in this relationship though
+might be useful in more complicated scenarios.
 .IP ".!" 14
 Negate the topmost filter.
 .IP ".r" 14
 .IX Item ".r"
-Rotate the filter stack by N elements. Just confirm with enter to
-rotate by 1, i.e. move the topmost element to the bottom of the stack.
+Rotate the filter stack by N elements. Where N is provided as a numeric prefix
+like vim's \fIcount\fR and defaults to 1, i.e. move the topmost element to the
+bottom of the stack.
 .IP ".c" 14
 .IX Item ".c"
 Clear the filter stack.
@@ -1326,6 +1333,91 @@ Displays only the files of specified inode type. To display only directories,
 use the 'd' parameter. To display only files, use the 'f' parameter. To display
 only links, use the 'l' parameter. Parameters can be combined. To remove this
 filter, use no parameter.
+.IP "filter_stack [\fIcommand\fR [\fIargs\fR]]" 2
+.IX Item "filter_stack [command [args]]"
+Manage the filter stack, adding, removing and manipulating filters. For
+example, to show only duplicate files and symlinks:
+.Sp
+.Vb 5
+\&  :filter_stack add type f
+\&  :filter_stack add duplicate
+\&  :filter_stack add and
+\&  :filter_stack add type l
+\&  :filter_stack add or
+.Ve
+.Sp
+Or using the mapped keys:
+.Sp
+.Vb 1
+\&  .f ." .& .l .|
+.Ve
+.Sp
+Available subcommands:
+.RS 2
+.IP "add \s-1FILTER_TYPE\s0 [\s-1ARGS...\s0]" 2
+.IX Item "add FILTER_TYPE [ARGS...]"
+Add a new filter to the top of the filter stack. Each filter on the stack is
+applied in turn, resulting in an implicit logical \f(CW\*(C`AND\*(C'\fR relation. The
+following \f(CW\*(C`FILTER_TYPE\*(C'\fRs are available:
+.RS 2
+.IP "duplicate" 2
+.IX Item "duplicate"
+Filter files so only files that have duplicates in the same directory are
+shown. Useful when cleaning up identical songs and memes that were saved using
+distinct file names.
+.IP "filename \s-1NAME\s0" 2
+.IX Item "filename NAME"
+Filter files that contain \s-1NAME\s0 in the filename, regular expression syntax is
+allowed.
+.IP "hash \s-1PATH\s0" 2
+.IX Item "hash PATH"
+Filter files so only files with the same hash as \s-1PATH\s0 are shown.
+.IP "mimetype \s-1TYPE\s0" 2
+.IX Item "mimetype TYPE"
+Filter files of a certain \s-1MIME\s0 type, regular expression syntax is allowed.
+.IP "typefilter [d|f|l]" 2
+.IX Item "typefilter [d|f|l]"
+Filter files of a certain type, \f(CW\*(C`d\*(C'\fR for directories, \f(CW\*(C`f\*(C'\fR for files and \f(CW\*(C`l\*(C'\fR
+for symlinks.
+.IP "unique" 2
+.IX Item "unique"
+Filter files so only unique files and the oldest file of every set of
+duplicates is shown.
+.IP "and" 2
+.IX Item "and"
+Explicitly combine the two topmost filters in the \*(L"\s-1AND\*(R"\s0 relationship.
+Usually not needed because filters are implicitly in this relationship though
+might be useful in more complicated scenarios.
+.IP "not" 2
+.IX Item "not"
+Negate the topmost filter.
+.IP "or" 2
+.IX Item "or"
+Combine the two topmost filters from the filter stack in the \*(L"\s-1OR\*(R"\s0
+relationship, instead of the \*(L"\s-1AND\*(R"\s0 used implicitly.
+.RE
+.RS 2
+.RE
+.IP "pop" 2
+.IX Item "pop"
+Pop the topmost filter from the filter stack.
+.IP "decompose" 2
+.IX Item "decompose"
+Decompose the topmost filter combinator (e.g. \f(CW\*(C`.!\*(C'\fR, \f(CW\*(C`.|\*(C'\fR).
+.IP "rotate [N=1]" 2
+.IX Item "rotate [N=1]"
+Rotate the filter stack by N elements. Where N is passed as argument or as a
+numeric prefix like vim's \fIcount\fR, default to 1, i.e. move the topmost element
+to the bottom of the stack.
+.IP "clear" 2
+.IX Item "clear"
+Clear the filter stack.
+.IP "show" 2
+.IX Item "show"
+Show the current filter stack state.
+.RE
+.RS 2
+.RE
 .IP "find \fIpattern\fR" 2
 .IX Item "find pattern"
 Search files in the current directory that contain the given (case-insensitive)
diff --git a/doc/ranger.pod b/doc/ranger.pod
index be964b37..ed3e98e1 100644
--- a/doc/ranger.pod
+++ b/doc/ranger.pod
@@ -671,14 +671,6 @@ A key chain that allows you to quickly change the line mode of all the files of
 the current directory.  For a more permanent solution, use the command
 "default_linemode" in your rc.conf.
 
-=item .n
-
-Apply a new filename filter.
-
-=item .m
-
-Apply a new mimetype filter.
-
 =item .d
 
 Apply the typefilter "directory".
@@ -691,16 +683,36 @@ Apply the typefilter "file".
 
 Apply the typefilter "symlink".
 
+=item .m
+
+Apply a new mimetype filter.
+
+=item .n
+
+Apply a new filename filter.
+
+=item .#
+
+Apply a new hash filter.
+
+=item ."
+
+Apply a new duplicate filter.
+
+=item .'
+
+Apply a new unique filter.
+
 =item .|
 
-Combine the two topmost filters from the filter stack in the "OR"
-relationship, instead of the "AND" used implicitly.
+Combine the two topmost filters from the filter stack in the C<OR>
+relationship, instead of the C<AND> used implicitly.
 
 =item .&
 
-Explicitly combine the two topmost filters in the "AND"
-relationship. Usually not needed though might be useful in more
-complicated scenarios.
+Explicitly combine the two topmost filters in the C<AND> relationship.
+Usually not needed because filters are implicitly in this relationship though
+might be useful in more complicated scenarios.
 
 =item .!
 
@@ -708,8 +720,9 @@ Negate the topmost filter.
 
 =item .r
 
-Rotate the filter stack by N elements. Just confirm with enter to
-rotate by 1, i.e. move the topmost element to the bottom of the stack.
+Rotate the filter stack by N elements. Where N is provided as a numeric prefix
+like vim's I<count> and defaults to 1, i.e. move the topmost element to the
+bottom of the stack.
 
 =item .c
 
@@ -1394,6 +1407,103 @@ use the 'd' parameter. To display only files, use the 'f' parameter. To display
 only links, use the 'l' parameter. Parameters can be combined. To remove this
 filter, use no parameter.
 
+=item filter_stack [I<command> [I<args>]]
+
+Manage the filter stack, adding, removing and manipulating filters. For
+example, to show only duplicate files and symlinks:
+
+  :filter_stack add type f
+  :filter_stack add duplicate
+  :filter_stack add and
+  :filter_stack add type l
+  :filter_stack add or
+
+Or using the mapped keys:
+
+  .f ." .& .l .|
+
+Available subcommands:
+
+=over 2
+
+=item add FILTER_TYPE [ARGS...]
+
+Add a new filter to the top of the filter stack. Each filter on the stack is
+applied in turn, resulting in an implicit logical C<AND> relation. The
+following C<FILTER_TYPE>s are available:
+
+=over 2
+
+=item duplicate
+
+Filter files so only files that have duplicates in the same directory are
+shown. Useful when cleaning up identical songs and memes that were saved using
+distinct file names.
+
+=item filename NAME
+
+Filter files that contain NAME in the filename, regular expression syntax is
+allowed.
+
+=item hash PATH
+
+Filter files so only files with the same hash as PATH are shown.
+
+=item mimetype TYPE
+
+Filter files of a certain MIME type, regular expression syntax is allowed.
+
+=item typefilter [d|f|l]
+
+Filter files of a certain type, C<d> for directories, C<f> for files and C<l>
+for symlinks.
+
+=item unique
+
+Filter files so only unique files and the oldest file of every set of
+duplicates is shown.
+
+=item and
+
+Explicitly combine the two topmost filters in the "AND" relationship.
+Usually not needed because filters are implicitly in this relationship though
+might be useful in more complicated scenarios.
+
+=item not
+
+Negate the topmost filter.
+
+=item or
+
+Combine the two topmost filters from the filter stack in the "OR"
+relationship, instead of the "AND" used implicitly.
+
+=back
+
+=item pop
+
+Pop the topmost filter from the filter stack.
+
+=item decompose
+
+Decompose the topmost filter combinator (e.g. C<.!>, C<.|>).
+
+=item rotate [N=1]
+
+Rotate the filter stack by N elements. Where N is passed as argument or as a
+numeric prefix like vim's I<count>, default to 1, i.e. move the topmost element
+to the bottom of the stack.
+
+=item clear
+
+Clear the filter stack.
+
+=item show
+
+Show the current filter stack state.
+
+=back
+
 =item find I<pattern>
 
 Search files in the current directory that contain the given (case-insensitive)
diff --git a/ranger/config/commands.py b/ranger/config/commands.py
index cb6fa132..cbff8098 100755
--- a/ranger/config/commands.py
+++ b/ranger/config/commands.py
@@ -1690,7 +1690,7 @@ class filter_stack(Command):
         elif subcommand == "clear":
             self.fm.thisdir.filter_stack = []
         elif subcommand == "rotate":
-            rotate_by = int(self.arg(2) or 1)
+            rotate_by = int(self.arg(2) or self.quantifier or 1)
             self.fm.thisdir.filter_stack = (
                 self.fm.thisdir.filter_stack[-rotate_by:]
                 + self.fm.thisdir.filter_stack[:-rotate_by]
diff --git a/ranger/config/rc.conf b/ranger/config/rc.conf
index 666a99cf..e62f4ecd 100644
--- a/ranger/config/rc.conf
+++ b/ranger/config/rc.conf
@@ -593,16 +593,19 @@ map zf    console filter%space
 copymap zf zz
 
 # Filter stack
-map .n console filter_stack add name%space
-map .m console filter_stack add mime%space
-map .# console filter_stack add hash%space
 map .d filter_stack add type d
 map .f filter_stack add type f
 map .l filter_stack add type l
+map .m console filter_stack add mime%space
+map .n console filter_stack add name%space
+map .# console filter_stack add hash%space
+# alternatively .: and .;?
+map ." filter_stack add duplicate
+map .' filter_stack add unique
 map .| filter_stack add or
 map .& filter_stack add and
 map .! filter_stack add not
-map .r console filter_stack rotate
+map .r filter_stack rotate
 map .c filter_stack clear
 map .* filter_stack decompose
 map .p filter_stack pop