(selective-load "mu.arc" section-level) (test-only-settings) (add-code:readfile "trace.mu") (ero "running tests in trace.arc.t (takes ~10 mins)") (freeze function*) (load-system-functions) (reset2) (new-trace "print-trace") (run-code main (default-space:space-address <- new space:literal 30:literal/capacity) (x:string-address <- new "schedule: main run: main 0: (((1 integer)) <- ((copy)) ((1 literal))) run: main 0: 1 => ((1 integer)) mem: ((1 integer)): 1 <= 1 run: main 1: (((2 integer)) <- ((copy)) ((3 literal))) run: main 1: 3 => ((2 integer)) mem: ((2 integer)): 2 <= 3 run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) mem: ((1 integer)) => 1 mem: ((2 integer)) => 3 run: main 2: 4 => ((3 integer)) mem: ((3 integer)): 3 <= 4 schedule: done with routine") (s:stream-address <- init-stream x:string-address) (traces:instruction-trace-address-array-address <- parse-traces s:stream-address) (screen:terminal-address <- init-fake-terminal 70:literal 15:literal) (browser-state:space-address <- browser-state traces:instruction-trace-address-array-address 30:literal/screen-height) (print-traces-collapsed browser-state:space-address screen:terminal-address) (1:string-address/raw <- get screen:terminal-address/deref data:offset) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) ;? (prn memory*.1) (when (~screen-contains memory*.1 70 (+ "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - print-traces-collapsed works")) ;? (quit) ;? 1 (reset2) (new-trace "print-trace-from-middle-of-screen") (run-code main (default-space:space-address <- new space:literal 30:literal/capacity) (x:string-address <- new "schedule: main run: main 0: (((1 integer)) <- ((copy)) ((1 literal))) run: main 0: 1 => ((1 integer)) mem: ((1 integer)): 1 <= 1 run: main 1: (((2 integer)) <- ((copy)) ((3 literal))) run: main 1: 3 => ((2 integer)) mem: ((2 integer)): 2 <= 3 run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) mem: ((1 integer)) => 1 mem: ((2 integer)) => 3 run: main 2: 4 => ((3 integer)) mem: ((3 integer)): 3 <= 4 schedule: done with routine") (s:stream-address <- init-stream x:string-address) (traces:instruction-trace-address-array-address <- parse-traces s:stream-address) (1:terminal-address/raw <- init-fake-terminal 70:literal 15:literal) ; position the cursor away from top of screen (cursor-down 1:terminal-address/raw) (cursor-down 1:terminal-address/raw) (browser-state:space-address <- browser-state traces:instruction-trace-address-array-address 30:literal/screen-height) (print-traces-collapsed browser-state:space-address 1:terminal-address/raw traces:instruction-trace-address-array-address) (2:string-address/raw <- get 1:terminal-address/raw/deref data:offset) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) (when (~screen-contains memory*.2 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - print-traces-collapsed works anywhere on the screen")) (run-code main2 (print-character 1:terminal-address/raw ((#\* literal)))) (when (~screen-contains memory*.2 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) " "* ")) (prn "F - print-traces-collapsed leaves cursor at next line")) (reset2) (new-trace "process-key-move-up-down") (run-code main (default-space:space-address <- new space:literal 30:literal/capacity) (x:string-address <- new "schedule: main run: main 0: (((1 integer)) <- ((copy)) ((1 literal))) run: main 0: 1 => ((1 integer)) mem: ((1 integer)): 1 <= 1 run: main 1: (((2 integer)) <- ((copy)) ((3 literal))) run: main 1: 3 => ((2 integer)) mem: ((2 integer)): 2 <= 3 run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) mem: ((1 integer)) => 1 mem: ((2 integer)) => 3 run: main 2: 4 => ((3 integer)) mem: ((3 integer)): 3 <= 4 schedule: done with routine") (s:stream-address <- init-stream x:string-address) (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address) (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal) ; position the cursor away from top of screen (cursor-down 2:terminal-address/raw) (cursor-down 2:terminal-address/raw) (3:space-address/raw <- browser-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height) ; draw trace (print-traces-collapsed 3:space-address/raw/browser-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw) ; move cursor up ; we have no way yet to test special keys like up-arrow (s:string-address <- new "k") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) ; draw cursor (replace-character 2:terminal-address/raw ((#\* literal))) (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "* main/ 2 : 4 => ((3 integer)) ")) ;^cursor (prn "F - process-key can move up the cursor")) (run-code main2 (default-space:space-address <- new space:literal 30:literal/capacity) ; reset previous cursor (replace-character 2:terminal-address/raw ((#\+ literal))) ; move cursor up 3 more lines (s:string-address <- new "kkk") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (replace-character 2:terminal-address/raw ((#\* literal))) ) ; cursor is now at line 3 (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "* main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " ;^cursor "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key can move up multiple times")) ; try to move cursor up thrice more (run-code main3 (default-space:space-address <- new space:literal 30:literal/capacity) (replace-character 2:terminal-address/raw ((#\+ literal))) (s:string-address <- new "kkk") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (replace-character 2:terminal-address/raw ((#\* literal))) ) ; cursor doesn't go beyond the first line printed ; stuff on screen before browser-state was initialized is inviolate (when (~screen-contains memory*.4 70 (+ " " " " "* main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " ;^cursor "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key doesn't move above bounds")) ; now move cursor down 4 times (run-code main4 (default-space:space-address <- new space:literal 30:literal/capacity) (replace-character 2:terminal-address/raw ((#\+ literal))) (s:string-address <- new "jjjj") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (replace-character 2:terminal-address/raw ((#\* literal))) ) (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "* main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " ;^cursor "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key can move down multiple times")) ; try to move cursor down 4 more times (run-code main5 (default-space:space-address <- new space:literal 30:literal/capacity) (replace-character 2:terminal-address/raw ((#\+ literal))) (s:string-address <- new "jjjj") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (replace-character 2:terminal-address/raw ((#\* literal))) ) (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) " "* ")) (prn "F - process-key doesn't move below bounds")) (reset2) (new-trace "process-key-expand") (run-code main (default-space:space-address <- new space:literal 30:literal/capacity) (x:string-address <- new "schedule: main run: main 0: (((1 integer)) <- ((copy)) ((1 literal))) run: main 0: 1 => ((1 integer)) mem: ((1 integer)): 1 <= 1 run: main 1: (((2 integer)) <- ((copy)) ((3 literal))) run: main 1: 3 => ((2 integer)) mem: ((2 integer)): 2 <= 3 run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) mem: ((1 integer)) => 1 mem: ((2 integer)) => 3 run: main 2: 4 => ((3 integer)) mem: ((3 integer)): 3 <= 4 schedule: done with routine") (s:stream-address <- init-stream x:string-address) (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address) (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal) ; position the cursor away from top of screen (cursor-down 2:terminal-address/raw) (cursor-down 2:terminal-address/raw) (3:space-address/raw <- browser-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height) ; draw trace (print-traces-collapsed 3:space-address/raw/browser-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw) (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key: before expand")) (run-code main2 (default-space:space-address <- new space:literal 30:literal/capacity) ; move cursor to final line and expand (s:string-address <- new "k\n") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) ) ; final line is expanded (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "- main/ 2 : 4 => ((3 integer)) " " mem : ((3 integer)): 3 <= 4 " " schedule : done with routine ")) (prn "F - process-key expands the trace index at cursor on ")) ; and cursor should remain on the top-level line (run-code main3 (replace-character 2:terminal-address/raw ((#\* literal))) ) (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "* main/ 2 : 4 => ((3 integer)) " ;^cursor " mem : ((3 integer)): 3 <= 4 " " schedule : done with routine ")) (prn "F - process-key positions cursor at start of trace index after expanding")) (reset2) (new-trace "process-key-expand-nonlast") (run-code main (default-space:space-address <- new space:literal 30:literal/capacity) (x:string-address <- new "schedule: main run: main 0: (((1 integer)) <- ((copy)) ((1 literal))) run: main 0: 1 => ((1 integer)) mem: ((1 integer)): 1 <= 1 run: main 1: (((2 integer)) <- ((copy)) ((3 literal))) run: main 1: 3 => ((2 integer)) mem: ((2 integer)): 2 <= 3 run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) mem: ((1 integer)) => 1 mem: ((2 integer)) => 3 run: main 2: 4 => ((3 integer)) mem: ((3 integer)): 3 <= 4 schedule: done with routine") (s:stream-address <- init-stream x:string-address) (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address) (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal) ; position the cursor away from top of screen (cursor-down 2:terminal-address/raw) (cursor-down 2:terminal-address/raw) (3:space-address/raw <- browser-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height) ; draw trace (print-traces-collapsed 3:space-address/raw/browser-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw) ; expand penultimate line (s:string-address <- new "kk\n") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "- main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " " mem : ((1 integer)) => 1 " " mem : ((2 integer)) => 3 " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key: expanding a line continues to print lines after it")) (reset2) (new-trace "process-key-expanded") (run-code main (default-space:space-address <- new space:literal 30:literal/capacity) (x:string-address <- new "schedule: main run: main 0: (((1 integer)) <- ((copy)) ((1 literal))) run: main 0: 1 => ((1 integer)) mem: ((1 integer)): 1 <= 1 mem: ((1 integer)): 1 <= 1 run: main 1: (((2 integer)) <- ((copy)) ((3 literal))) run: main 1: 3 => ((2 integer)) mem: ((2 integer)): 2 <= 3 run: main 2: (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) mem: ((1 integer)) => 1 mem: ((2 integer)) => 3 run: main 2: 4 => ((3 integer)) mem: ((3 integer)): 3 <= 4 schedule: done with routine") (s:stream-address <- init-stream x:string-address) (1:instruction-trace-address-array-address/raw <- parse-traces s:stream-address) (2:terminal-address/raw <- init-fake-terminal 70:literal 15:literal) ; position the cursor away from top of screen (cursor-down 2:terminal-address/raw) (cursor-down 2:terminal-address/raw) (3:space-address/raw <- browser-state 1:instruction-trace-address-array-address/raw 30:literal/screen-height) ; draw trace (print-traces-collapsed 3:space-address/raw/browser-state 2:terminal-address/raw 1:instruction-trace-address-array-address/raw) ; expand penultimate line, then move one line down and draw cursor (s:string-address <- new "kk\nj") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (replace-character 2:terminal-address/raw ((#\* literal))) (4:string-address/raw <- get 2:terminal-address/raw/deref data:offset) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) ; cursor should be at next top-level 'run' line (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "- main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " " mem : ((1 integer)) => 1 " " mem : ((2 integer)) => 3 " "* main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key: navigation moves between top-level trace indices only")) (run-code main2 (default-space:space-address <- new space:literal 30:literal/capacity) ; reset previous cursor (replace-character 2:terminal-address/raw ((#\+ literal))) ; move cursor back up one line (s:string-address <- new "k") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) ; show cursor (replace-character 2:terminal-address/raw ((#\* literal))) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) ; cursor should be back at the top of the expanded line (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "* main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " " mem : ((1 integer)) => 1 " " mem : ((2 integer)) => 3 " "+ main/ 2 : 4 => ((3 integer)) ")) (prn "F - process-key: navigation moves between top-level indices only - 2")) (run-code main3 (default-space:space-address <- new space:literal 30:literal/capacity) ; reset previous cursor (replace-character 2:terminal-address/raw ((#\+ literal))) ; press enter (s:string-address <- new "\n") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) ) (each routine completed-routines* (awhen rep.routine!error (prn "error - " it))) ; expanded trace should now be collapsed (when (~screen-contains memory*.4 70 (+ " " " " "+ main/ 0 : (((1 integer)) <- ((copy)) ((1 literal))) " "+ main/ 0 : 1 => ((1 integer)) " "+ main/ 1 : (((2 integer)) <- ((copy)) ((3 literal))) " "+ main/ 1 : 3 => ((2 integer)) " "+ main/ 2 : (((3 integer)) <- ((add)) ((1 integer)) ((2 integer))) " "+ main/ 2 : 4 => ((3 integer)) " " " " ")) (prn "F - process-key: process-key collapses trace indices correctly after moving around")) (run-code main4 (default-space:space-address <- new space:literal 30:literal/capacity) ; move up a few lines, expand, then move down and expand again (s:string-address <- new "kkk\njjj\n") (k:keyboard-address <- init-keyboard s:string-address) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (process-key 3:space-address/raw/browser-state k:keyboard-address 2:terminal-address/raw) (
.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings.  \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
.    ds -- \(*W-
.    ds PI pi
.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
.    ds L" ""
.    ds R" ""
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds -- \|\(em\|
.    ds PI \(*p
.    ds L" ``
.    ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
.    de IX
.    tm Index:\\$1\t\\n%\t"\\$2"
..
.    nr % 0
.    rr F
.\}
.el \{\
.    de IX
..
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
.    \" fudge factors for nroff and troff
.if n \{\
.    ds #H 0
.    ds #V .8m
.    ds #F .3m
.    ds #[ \f1
.    ds #] \fP
.\}
.if t \{\
.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
.    ds #V .6m
.    ds #F 0
.    ds #[ \&
.    ds #] \&
.\}
.    \" simple accents for nroff and troff
.if n \{\
.    ds ' \&
.    ds ` \&
.    ds ^ \&
.    ds , \&
.    ds ~ ~
.    ds /
.\}
.if t \{\
.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
.    \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
.    \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
.    \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
.    ds : e
.    ds 8 ss
.    ds o a
.    ds d- d\h'-1'\(ga
.    ds D- D\h'-1'\(hy
.    ds th \o'bp'
.    ds Th \o'LP'
.    ds ae ae
.    ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "RANGER 1"
.TH RANGER 1 "ranger-1.4.3" "09/24/2011" "ranger manual"
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
ranger \- visual file manager
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
\&\fBranger\fR [\fIoptions\fR] [\fIpath/filename\fR]
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
Ranger is a file manager with an ncurses front-end written in Python.
.PP
It is designed to give you a broader overview of the file system by displaying
previews and backviews, dividing the screen into several columns.  The
key bindings are similar to those of other console programs like \fBvim\fR,
\&\fBmutt\fR or \fBncmpcpp\fR so the usage will be intuitive and efficient.
.SH "OPTIONS"
.IX Header "OPTIONS"
.IP "\fB\-\-verison\fR" 14
.IX Item "--verison"
Print the version and exit.
.IP "\fB\-h\fR, \fB\-\-help\fR" 14
.IX Item "-h, --help"
Print a list of options and exit.
.IP "\fB\-d\fR, \fB\-\-debug\fR" 14
.IX Item "-d, --debug"
Activate the debug mode: Whenever an error occurs, ranger will exit and print a
full traceback.  The default behavior is to merely print the name of the
exception in the statusbar/log and try to keep running.
.IP "\fB\-c\fR, \fB\-\-clean\fR" 14
.IX Item "-c, --clean"
Activate the clean mode:  Ranger will not access or create any configuration
files nor will it leave any traces on your system.  This is useful when your
configuration is broken, when you want to avoid clutter, etc.
.IP "\fB\-\-choosefile\fR=\fItargetfile\fR" 14
.IX Item "--choosefile=targetfile"
Allows you to pick a file with ranger.  This changes the behavior so that when
you open a file, ranger will exit and write the name of that file into
\&\fItargetfile\fR.
.IP "\fB\-\-choosedir\fR=\fItargetfile\fR" 14
.IX Item "--choosedir=targetfile"
Allows you to pick a directory with ranger.  When you exit ranger, it will
write the last visited directory into \fItargetfile\fR.
.IP "\fB\-\-copy\-config\fR=\fIfile\fR" 14
.IX Item "--copy-config=file"
Create copies of the default configuration files in your local configuration
directory.  Existing ones will not be overwritten.  Possible values: \fIall\fR,
\&\fIapps\fR, \fIcommands\fR, \fIkeys\fR, \fIoptions\fR, \fIscope\fR.
.IP "\fB\-\-fail\-unless\-c\fRd" 14
.IX Item "--fail-unless-cd"
Return the exit code 1 if ranger is used to run a file instead of used for file
browsing. (For example, \*(L"ranger \-\-fail\-unless\-cd test.txt\*(R" returns 1.)
.IP "\fB\-m\fR \fIn\fR, \fB\-\-mode\fR=\fIn\fR" 14
.IX Item "-m n, --mode=n"
When a filename is supplied, run it in mode \fIn\fR.  This has no effect unless
the execution of this file type is explicitly handled in the configuration.
.IP "\fB\-f\fR \fIflags\fR, \fB\-\-flags\fR=\fIflags\fR" 14
.IX Item "-f flags, --flags=flags"
When a filename is supplied, run it with the given \fIflags\fR to modify
behavior.  The execution of this file type is explicitly handled in the
configuration.
.SH "KEY BINDINGS"
.IX Header "KEY BINDINGS"
Many key bindings take an additional numeric argument.  Type \fI5j\fR to move
down 5 lines, \fI2l\fR to open a file in mode 2, \fI10<Space>\fR to mark 10 files
or \fI3?\fR to read the third chapter of the documentation.
.PP
Key bindings can be changed.  Detailed instructions for this are in the
key binding configuration file at ranger/defaults/keys.py. You can copy it to
your local configuration directory with the \-\-copy\-config option.
.IP "h, j, k, l" 14
.IX Item "h, j, k, l"
Move left, down, up or right
.IP "^D or J, ^U or K" 14
.IX Item "^D or J, ^U or K"
Move a half page down, up
.IP "H, L" 14
.IX Item "H, L"
Move back and forward in the history
.IP "gg" 14
.IX Item "gg"
Move to the top
.IP "G" 14
.IX Item "G"
Move to the bottom
.IP "^R" 14
.IX Item "^R"
Reload everything
.IP "^L" 14
.IX Item "^L"
Redraw the screen
.IP "S" 14
.IX Item "S"
Open a shell in the current directory
.IP "yy" 14
.IX Item "yy"
Yank the selection to the \*(L"copy\*(R" buffer and mark them as to be copied
.IP "dd" 14
.IX Item "dd"
Cut the selection to the \*(L"copy\*(R" buffer and mark them as to be moved
.IP "pp" 14
.IX Item "pp"
Paste the files from the \*(L"copy\*(R" buffer here (by moving or copying, depending on
how they are marked.) By default, this will not overwrite existing files.  To
overwrite them, use \fIpo\fR.
.IP "m\fIX\fR" 14
.IX Item "mX"
Create a bookmark with the name \fIX\fR
.IP "`\fIX\fR" 14
.IX Item "`X"
Move to the bookmark with the name \fIX\fR
.IP "n, N" 14
.IX Item "n, N"
Find the next file.  By default, this gets you to the newest file in the
directory, but if you search something using the keys /, cm, ct, ..., it will
get you to the next found entry.
.IP "N" 14
.IX Item "N"
Find the previous file.
.IP "o\fIX\fR" 14
.IX Item "oX"
Change the sort method (like in mutt)
.IP "z\fIX\fR" 14
.IX Item "zX"
Change settings.  See the settings section for a list of settings and their
hotkey.
.IP "f" 14
.IX Item "f"
Quickly navigate by entering a part of the filename.
.IP "Space" 14
.IX Item "Space"
Mark a file.
.IP "v" 14
.IX Item "v"
Toggle the mark-status of all files, unmark all files.
.IP "V, uv" 14
.IX Item "V, uv"
Unmark all files
.IP "^V\fIdirection\fR" 14
.IX Item "^Vdirection"
Mark all files in the given direction.  Works just like d\fIdirection\fR.
.IP "u^V\fIdirection\fR" 14
.IX Item "u^Vdirection"
Unmark all files in the given direction.  Works just like d\fIdirection\fR.
.IP "g\fIN\fR" 14
.IX Item "gN"
Open a tab. N has to be a number from 0 to 9. If the tab doesn't exist yet, it
will be created.
.IP "gn, ^N" 14
.IX Item "gn, ^N"
Create a new tab.
.IP "gt, gT" 14
.IX Item "gt, gT"
Go to the next or previous tab. You can also use \s-1TAB\s0 and \s-1SHIFT+TAB\s0 instead.
.IP "gc, ^W" 14
.IX Item "gc, ^W"
Close the current tab.  The last tab cannot be closed this way.
.IP "/" 14
Search for files in the current directory.
.IP ":" 14
Open the console.
.IP "?" 14
Opens the help screen with more key bindings and documentation
.SS "\s-1MIDNIGHT\s0 COMMANDER-LIKE \s-1BINDINGS\s0"
.IX Subsection "MIDNIGHT COMMANDER-LIKE BINDINGS"
.IP "<F1>" 14
.IX Item "<F1>"
Display Help.
.IP "<F3>" 14
.IX Item "<F3>"
Display the file.
.IP "<F4>" 14
.IX Item "<F4>"
Edit the file.
.IP "<F5>" 14
.IX Item "<F5>"
Copy the file.
.IP "<F6>" 14
.IX Item "<F6>"
Cut the file.
.IP "<F7>" 14
.IX Item "<F7>"
Open the console with \*(L":mkdir \*(R".
.IP "<F8>" 14
.IX Item "<F8>"
Prompt for deletion of the selected files.
.IP "<F10>" 14
.IX Item "<F10>"
Exit ranger.
.SS "READLINE-LIKE \s-1BINDINGS\s0 \s-1IN\s0 \s-1THE\s0 \s-1CONSOLE\s0"
.IX Subsection "READLINE-LIKE BINDINGS IN THE CONSOLE"
.IP "^B, ^F" 14
.IX Item "^B, ^F"
Move left and right (B for back, F for forward)
.IP "^P, ^N" 14
.IX Item "^P, ^N"
Move up and down (P for previous, N for Next)
.IP "^A, ^E" 14
.IX Item "^A, ^E"
Move to the start or to the end
.IP "^D" 14
.IX Item "^D"
Delete the current character.
.IP "^H" 14
.IX Item "^H"
Backspace.
.SH "MOUSE BUTTONS"
.IX Header "MOUSE BUTTONS"
.IP "Left Mouse Button" 4
.IX Item "Left Mouse Button"
Click on something and you'll move there.  To run a file, \*(L"enter\*(R" it, like a
directory, by clicking on the preview.
.IP "Right Mouse Button" 4
.IX Item "Right Mouse Button"
Enter a directory or run a file.
.IP "Scroll Wheel" 4
.IX Item "Scroll Wheel"
Scrolls up or down.  You can point at the column of the parent directory to
switch directories.
.SH "SETTINGS"
.IX Header "SETTINGS"
This section lists all built-in settings of ranger.  The valid types for the
value are in [brackets].  The hotkey to toggle the setting is in <brokets>, if
a hotkey exists.
.PP
Settings can be changed in the file ~/.config/ranger/options.py or on the fly
with the command \fB:set option value\fR.  Examples: \f(CW\*(C`:set column_ratios (1,2,3)\*(C'\fR, 
\&\f(CW\*(C`:set show_hidden=True\*(C'\fR
.IP "autosave_bookmarks [bool]" 4
.IX Item "autosave_bookmarks [bool]"
Save bookmarks (used with mX and `X) instantly?  This helps to synchronize
bookmarks between multiple ranger instances but leads to *slight* performance
loss.  When false, bookmarks are saved when ranger is exited.
.IP "collapse_preview [bool] <zc>" 4
.IX Item "collapse_preview [bool] <zc>"
When no preview is visible, should the last column be squeezed to make use of
the whitespace?
.IP "colorscheme_overlay [python function, None]" 4
.IX Item "colorscheme_overlay [python function, None]"
An overlay function for colorschemes.  See the default options.py for an
explanation and an example.
.IP "colorscheme [string]" 4
.IX Item "colorscheme [string]"
Which colorscheme to use?  These colorschemes are available by default:
\&\fBdefault\fR, \fBdefault88\fR, \fBtexas\fR, \fBjungle\fR, \fBsnow\fR. Snow is monochrome,
texas and default88 use 88 colors.
.IP "column_ratios [tuple, list]" 4
.IX Item "column_ratios [tuple, list]"
How many columns are there, and what are their relative widths?  For example, a
value of (1, 1, 1) would mean 3 even sized columns. (1, 1, 1, 1, 4) means 5 columns
with the preview column being as large as the other columns combined.
.IP "dirname_in_tabs [bool]" 4
.IX Item "dirname_in_tabs [bool]"
Display the directory name in tabs?
.IP "display_size_in_main_column [bool]" 4
.IX Item "display_size_in_main_column [bool]"
Display the file size in the main column?
.IP "display_size_in_status_bar [bool]" 4
.IX Item "display_size_in_status_bar [bool]"
Display the file size in the status bar?
.IP "display_tags_in_all_columns [bool]" 4
.IX Item "display_tags_in_all_columns [bool]"
Display tags in all columns?
.IP "draw_bookmark_borders [bool]" 4
.IX Item "draw_bookmark_borders [bool]"
Draw borders around the bookmark window?
.IP "draw_borders [bool]" 4
.IX Item "draw_borders [bool]"
Draw borders around columns?
.IP "flushinput [bool] <zi>" 4
.IX Item "flushinput [bool] <zi>"
Flush the input after each key hit?  One advantage is that when scrolling down
with \*(L"j\*(R", ranger stops scrolling instantly when you release the key.  One
disadvantage is that when you type commands blindly, some keys might get lost.
.IP "hidden_filter [regular expression]" 4
.IX Item "hidden_filter [regular expression]"
A regular expression pattern for files which should be hidden.
.IP "max_console_history_size [integer, None]" 4
.IX Item "max_console_history_size [integer, None]"
How many console commands should be kept in history?
.IP "max_history_size [integer, None]" 4
.IX Item "max_history_size [integer, None]"
How many directory changes should be kept in history?
.IP "mouse_enabled [bool] <zm>" 4
.IX Item "mouse_enabled [bool] <zm>"
Enable mouse input?
.IP "padding_right [bool]" 4
.IX Item "padding_right [bool]"
When collapse_preview is on and there is no preview, should there remain a
little padding on the right?  This allows you to click into that space to run
the file.
.