image/svg+xml R reload thisdirectory
# Compatible with ranger 1.4.2 through 1.7.*
#
# Automatically change the directory in bash after closing ranger
#
# This is a bash function for .bashrc to automatically change the directory to
# the last visited one after ranger quits.
# To undo the effect of this function, you can type "cd -" to return to the
# original directory.
# 
# On OS X 10 or later, replace `usr/bin/ranger` with `/usr/local/bin/ranger`.

function ranger-cd {
    tempfile="$(mktemp -t tmp.XXXXXX)"
    /usr/bin/ranger --choosedir="$tempfile" "${@:-$(pwd)}"
    test -f "$tempfile" &&
    if [ "$(cat -- "$tempfile")" != "$(echo -n `pwd`)" ]; then
        cd --pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888
bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
if __name__ == '__main__': from __init__ import init; init()

from ranger.container import History
from unittest import TestCase, main
import unittest

class Test(TestCase):
	def test_history(self):
		hist = History(3)
		for i in range(6):
			hist.add(i)
		self.assertEqual([3,4,5], list(hist))

		hist.back()

		self.assertEqual(4, hist.current())
		self.assertEqual([3,4], list(hist))

		self.assertEqual(5, hist.top())

		hist.back()
		self.assertEqual(3, hist.current())
		self.assertEqual([3], list(hist))

		# no change if current == bottom
		self.assertEqual(hist.current(), hist.bottom())
		last = hist.current()
		hist.back()
		self.assertEqual(hist.current(), last)

		self.assertEqual(5, hist.top())

		hist.forward()
		hist.forward()
		self.assertEqual(5, hist.current())
		self.assertEqual([3,4,5], list(hist))


		self.assertEqual(3, hist.bottom())
		hist.add(6)
		self.assertEqual(4, hist.bottom())
		self.assertEqual([4,5,6], list(hist))

if __name__ == '__main__': main()
normal;font-weight:bold;font-stretch:normal;font-size:15px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start" y="690.36218" x="178" id="tspan4249-4-89-3-3" sodipodi:role="line">` openbookmarks ! :shell 1 (1) ESC abort T t tag files Y y yank (3) U u undo ^U move uphalf page I i inspect file :rename(insert) O o sort P p paste (3) { [ move up inparent dir } traverse sub-directories ] move downin parent dir @ :shell %s 2 (1) # :shell -p 3 (1) $ 4 (1) % 5 (1) ^ 6 (1) & 7 (1) * 8 (1) ( 9 (1) ) 0 (1) _ - chmod (2) + chmod (2) = chmod (2) A :rename(append) a :rename (skipextension) S open shell s :shell D d cut (3) (4) move downhalf page ^D F f :find ^F move down1 page G go to top g :cd ... H back inhistory h go up 1directory ^H togglehidden files J move downhalf page j move down K move uphalf page k move up L forward inhistory l enter dir/open file ^L redraw : console ; console ' openbookmarks " tag files withcustom tag CAPSLOCK SHIFT Z ZZ/ZQ = quit z toggleoptions X x ^C C c select files incertain order abort task V visual mode v invertselection B b ^B move up1 page N searchprevious n search next ^N new tab M change (5)linemode m savebookmark < , > . ? show help / :search F1 help F3 inspect file F4 edit F5 copy F6 cut F7 :mkdir F8 :delete F10 quit F2 F9 F11 F12 ranger cheatsheet http://ranger.nongnu.org git clone https://github.com/hut/ranger Macros can be used in commands. They are likeglobal variables with dynamic content: %f%d%s%t%c%any%rangerdir%space The base name of the current fileThe path of the current directoryThe names of the currently selected filesThe names of all tagged files in this directoryThe paths of the currently copied filesThe key used in a key binding with "<any>"Example: map x<any> shell -w echo %anyThe path to the ranger python moduleJust a space, to avoid typing trailing spaces Example: map yp shell echo %d/%f | xsel -iThey can be escaped by replacing % with %%. (1) numbers can be used as a quantifier in various commands, for example 5j will movethe cursor down 5 by lines, 3<space> selects 3 files, 4<TAB> moves you to the 4th tab.(2) the keys -, + and = change the permissions of files. See "man chmod". [+-][augo][rwxXst] (e.g. +gw means "add write permissions to the group) [+-][rwxXst] (e.g. -x means "remove execute permissions from everybody") <octal>= (e.g. 777= means "give full permissions to everybody")(3) yank, copy, paste: To copy files, select them with the cursor (or <space>, in case ofmultiple files) → type dd (to cut) or yy (to copy) → move to the destination → type pp.Type da (or ya) to add files to the copy buffer, allowing you to copy from multiple folders.(4) d also starts the keybindings dc (calculate size of the content of a directory), du/dU(calculate directory size with the "du" program), dD (open the console with ":delete")(5) M<key> changes the linemode - the way files are drawn. Mf draws just the file name,Mp draws permissions, Mi draws file type information, Mt draws metadata, as definedwith the :meta command. You can add custom linemodes as described in/usr/share/doc/ranger/examples/plugin_linemode.py Config files: run "ranger --copy-config=all" tocopy the default config files to ~/.config/ranger/. rc.conf: A list of commands that are executed when rangerstarts. Options, key bindings and aliases are found here.Pro tip: Adding "export RANGER_LOAD_DEFAULT_RC=FALSE" toyour shell rc will skip loading the default rc.conf before your own.commands.py: A python script containing custom commandsrifle.conf: Rules for rifle, the file opener. Each line looks like list of conditions = commandWhen ranger opens a file, it tests those conditions. The firstcommand where all conditions are true will be executed.scope.sh: The script that generates file previews.Plugins can be put in the plugins/ subdirectory, colorschemesin colorschemes/. See /usr/share/doc/ranger/examples. #ranger on irc.freenode.net Commands can be typed in by pressing : or added to ~/.config/ranger/rc.conf to apply then wheneverranger starts. All commands are listed in the man page. Some important ones: :shell [<flags>] <command> calls the given <command> with the shell specified in the environmentvariable $SHELL. <flags> can be "-f" to fork the process or "-p" to pipe the output to a pager. Macros like%f and %s are especially useful here. Example: ":shell -f inkscape %f" or ":shell sudo cp %c ./":alias <new> <old> creates the command <new> that calls <old>. The neat thing is that you can passarguments to the next command. Example: ":alias touch shell touch" will allow you to type ":touch FILE",which will be translated to ":shell touch FILE".:map <key> <command> makes the <key> run <command> when pressed. This is the typical way todefine key bindings in rc.conf. There is also "pmap" to define keys in the pager and "unmap" and "punmap"to remove key bindings.