.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" 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" '' . ds C` . ds C' '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 >0, 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. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" 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.9.3" "2022-02-05" "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 ranger \- visual file manager .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fBranger\fR [\fB\-\-version\fR] [\fB\-\-help\fR] [\fB\-\-debug\fR] [\fB\-\-clean\fR] [\fB\-\-cachedir\fR=\fIdirectory\fR] [\fB\-\-confdir\fR=\fIdirectory\fR] [\fB\-\-datadir\fR=\fIdirectory\fR] [\fB\-\-copy\-config\fR=\fIwhich\fR] [\fB\-\-choosefile\fR=\fItarget\fR] [\fB\-\-choosefiles\fR=\fItarget\fR] [\fB\-\-choosedir\fR=\fItarget\fR] [\fB\-\-selectfile\fR=\fIfilepath\fR] [\fB\-\-show\-only\-dirs\fR] [\fB\-\-list\-unused\-keys\fR] [\fB\-\-list\-tagged\-files\fR=\fItag\fR] [\fB\-\-profile\fR] [\fB\-\-cmd\fR=\fIcommand\fR] [\fIpath ...\fR] .SH "DESCRIPTION" .IX Header "DESCRIPTION" ranger is a console file manager with \s-1VI\s0 key bindings. .SH "RESOURCES" .IX Header "RESOURCES" This \fImanual\fR contains instructions on how to use and configure ranger. .PP Inside \fIranger\fR, you can press \fI?\fR for a list of key bindings, commands or settings. .PP The \fI\s-1README\s0\fR contains install instructions. .PP The file \fI\s-1HACKING\s0.md\fR contains guidelines for code modification. .PP The directory \fIdoc/configs\fR contains configuration files. They are usually installed to \fI/usr/share/doc/ranger/config\fR and can be obtained with ranger's \&\-\-copy\-config option. .PP The directory \fIexamples\fR contains reference implementations for ranger plugins, sample configuration files and some programs for integrating ranger with other software. They are usually installed to \&\fI/usr/share/doc/ranger/examples\fR. .PP The man page of \fBrifle\fR\|(1) describes the functions of the file opener .PP The section \fI\s-1LINKS\s0\fR of this man page contains further resources. .SH "POSITIONAL ARGUMENTS" .IX Header "POSITIONAL ARGUMENTS" .IP "\fIpath ...\fR" 14 .IX Item "path ..." Each path will be opened in a tab and if the path is a file it will be selected. Omitting this is equivalent to providing the current directory. .SH "OPTIONS" .IX Header "OPTIONS" .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\-\-cachedir\fR=\fIdir\fR" 14 .IX Item "--cachedir=dir" Change the cache directory of ranger from \f(CW$XDG_CACHE_HOME\fR or ~/.cache/ranger to \*(L"dir\*(R". .IP "\fB\-r\fR \fIdir\fR, \fB\-\-confdir\fR=\fIdir\fR" 14 .IX Item "-r dir, --confdir=dir" Change the configuration directory of ranger from \f(CW$XDG_CONFIG_HOME\fR or ~/.config/ranger to \*(L"dir\*(R". .IP "\fB\-\-datadir\fR=\fIdir\fR" 14 .IX Item "--datadir=dir" Change the data directory of ranger from \f(CW$XDG_DATA_HOME\fR or ~/.local/share/ranger to \*(L"dir\*(R". .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, \&\fIcommands\fR, \fIcommands_full\fR, \fIrc\fR, \fIrifle\fR, \fIscope\fR. .Sp Note: You may want to disable loading of the global configuration files by exporting \fIRANGER_LOAD_DEFAULT_RC=FALSE\fR in your environment. See also: \&\fB\s-1FILES\s0\fR, \fB\s-1ENVIRONMENT\s0\fR .Sp \&\-\-copy\-config=\fBcommands\fR will copy only a small sample configuration file with a thoroughly commented example. It is recommended to keep this file tidy to avoid getting defunct commands on ranger upgrades. The full default commands.py can be copied with \-\-copy\-config=\fBcommands_full\fR, but that file will be ignored by ranger and serves only as a reference for making your own commands. .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 absolute path of that file into \&\fItargetfile\fR. .IP "\fB\-\-choosefiles\fR=\fItargetfile\fR" 14 .IX Item "--choosefiles=targetfile" Allows you to pick multiple files with ranger. This changes the behavior so that when you open a file, ranger will exit and write the absolute paths of all selected files into \fItargetfile\fR, adding one newline after each filename. .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\-\-selectfile\fR=\fItargetfile\fR" 14 .IX Item "--selectfile=targetfile" Open ranger with \fItargetfile\fR selected. This is a legacy option, superseded by the behavior for the \s-1POSITIONAL ARGUMENTS.\s0 .IP "\fB\-\-show\-only\-dirs\fR" 14 .IX Item "--show-only-dirs" Display only the directories. May be used in conjunction with \&\fB\-\-choosedir\fR=\fItargetfile\fR. .IP "\fB\-\-list\-unused\-keys\fR" 14 .IX Item "--list-unused-keys" List common keys which are not bound to any action in the \*(L"browser\*(R" context. This list is not complete, you can bind any key that is supported by curses: use the key code returned by \f(CW\*(C`getch()\*(C'\fR. .IP "\fB\-\-list\-tagged\-files\fR=\fItag\fR" 14 .IX Item "--list-tagged-files=tag" List all files which are tagged with the given tag. Note: Tags are single characters. The default tag is \*(L"*\*(R" .IP "\fB\-\-profile\fR" 14 .IX Item "--profile" Print statistics of \s-1CPU\s0 usage on exit. .IP "\fB\-\-cmd\fR=\fIcommand\fR" 14 .IX Item "--cmd=command" Execute the command after the configuration has been read. Use this option multiple times to run multiple commands. .IP "\fB\-\-version\fR" 14 .IX Item "--version" Print the version and exit. .IP "\fB\-h\fR, \fB\-\-help\fR" 14 .IX Item "-h, --help" Print a list of options and exit. .SH "CONCEPTS" .IX Header "CONCEPTS" This part explains how certain parts of ranger work and how they can be used efficiently. .SS "\s-1TAGS\s0" .IX Subsection "TAGS" Tags are single characters which are displayed left of a filename. You can use tags however you want. Press \*(L"t\*(R" to toggle tags and \*(L"ut\*(R" to remove any tags of the selection. The default tag is an Asterisk (\*(L"*\*(R"), but you can use any tag by typing \fI"\fR. .SS "\s-1PREVIEWS\s0" .IX Subsection "PREVIEWS" By default, only text files are previewed, but you can enable external preview scripts by setting the option \f(CW\*(C`use_preview_script\*(C'\fR and \f(CW\*(C`preview_files\*(C'\fR to true. .PP This default script is \fI\f(CI%rangerdir\fI/data/scope.sh\fR. It contains more documentation and calls to many external programs to generate previews. They are automatically used when available but completely optional. .IP "For general usage:" 2 .IX Item "For general usage:" .RS 2 .PD 0 .IP "\-" 2 .PD \&\f(CW\*(C`file\*(C'\fR for determining file types .IP "\-" 2 \&\f(CW\*(C`chardet\*(C'\fR (Python package) for improved encoding detection of text files .IP "\-" 2 \&\f(CW\*(C`sudo\*(C'\fR to use the \*(L"run as root\*(R" feature .IP "\-" 2 \&\f(CW\*(C`python\-bidi\*(C'\fR (Python package) to display right-to-left file names correctly (Hebrew, Arabic) .RE .RS 2 .RE .IP "For enhanced file previews (with scope.sh):" 2 .IX Item "For enhanced file previews (with scope.sh):" .RS 2 .PD 0 .IP "\-" 2 .PD \&\f(CW\*(C`img2txt\*(C'\fR (from \f(CW\*(C`caca\-utils\*(C'\fR) for ASCII-art image previews .IP "\-" 2 \&\f(CW\*(C`w3mimgdisplay\*(C'\fR, \f(CW\*(C`ueberzug\*(C'\fR, \f(CW\*(C`mpv\*(C'\fR, \f(CW\*(C`iTerm2\*(C'\fR, \f(CW\*(C`kitty\*(C'\fR, \f(CW\*(C`terminology\*(C'\fR or \&\f(CW\*(C`urxvt\*(C'\fR for image previews .IP "\-" 2 \&\f(CW\*(C`convert\*(C'\fR (from \f(CW\*(C`imagemagick\*(C'\fR) to auto-rotate images .IP "\-" 2 \&\f(CW\*(C`rsvg\-convert\*(C'\fR (from \f(CW\*(C`librsvg\*(C'\fR) for \s-1SVG\s0 previews .IP "\-" 2 \&\f(CW\*(C`ffmpegthumbnailer\*(C'\fR for video thumbnails .IP "\-" 2 \&\f(CW\*(C`highlight\*(C'\fR, \f(CW\*(C`bat\*(C'\fR or \f(CW\*(C`pygmentize\*(C'\fR for syntax h
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 088file.mu</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #eeeeee; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #eeeeee; background-color: #080808; }
* { font-size: 12pt; font-size: 1em; }
.muData { color: #ffff00; }
.muControl { color: #c0a020; }
.Special { color: #c00000; }
.Delimiter { color: #800080; }
.Comment { color: #9090ff; }
.Constant { color: #00a0a0; }
.LineNr { color: #444444; }
.muRecipe { color: #ff8700; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="Comment"># Wrappers around file system primitives that take a 'resources' object and</span>
<span id="L2" class="LineNr">  2 </span><span class="Comment"># are thus easier to test.</span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">#</span>
<span id="L4" class="LineNr">  4 </span><span class="Comment"># - start-reading - asynchronously open a file, returning a channel source for</span>
<span id="L5" class="LineNr">  5 </span><span class="Comment">#   receiving the results</span>
<span id="L6" class="LineNr">  6 </span><span class="Comment"># - start-writing - asynchronously open a file, returning a channel sink for</span>
<span id="L7" class="LineNr">  7 </span><span class="Comment">#   the data to write</span>
<span id="L8" class="LineNr">  8 </span><span class="Comment"># - slurp - synchronously read from a file</span>
<span id="L9" class="LineNr">  9 </span><span class="Comment"># - dump - synchronously write to a file</span>
<span id="L10" class="LineNr"> 10 </span>
<span id="L11" class="LineNr"> 11 </span><span class="muData">container</span> resources [
<span id="L12" class="LineNr"> 12 </span>  lock:bool
<span id="L13" class="LineNr"> 13 </span>  data:&amp;:@:resource
<span id="L14" class="LineNr"> 14 </span>]
<span id="L15" class="LineNr"> 15 </span>
<span id="L16" class="LineNr"> 16 </span><span class="muData">container</span> resource [
<span id="L17" class="LineNr"> 17 </span>  name:text
<span id="L18" class="LineNr"> 18 </span>  contents:text
<span id="L19" class="LineNr"> 19 </span>]
<span id="L20" class="LineNr"> 20 </span>
<span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> start-reading resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char, error?:bool [
<span id="L22" class="LineNr"> 22 </span>  <span class="Constant">local-scope</span>
<span id="L23" class="LineNr"> 23 </span>  <span class="Constant">load-ingredients</span>
<span id="L24" class="LineNr"> 24 </span>  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L25" class="LineNr"> 25 </span>  <span class="Delimiter">{</span>
<span id="L26" class="LineNr"> 26 </span>    <span class="muControl">break-unless</span> resources
<span id="L27" class="LineNr"> 27 </span>    <span class="Comment"># fake file system</span>
<span id="L28" class="LineNr"> 28 </span>    contents, error? <span class="Special">&lt;-</span> start-reading-from-fake-resource resources, filename
<span id="L29" class="LineNr"> 29 </span>    <span class="muControl">return</span>
<span id="L30" class="LineNr"> 30 </span>  <span class="Delimiter">}</span>
<span id="L31" class="LineNr"> 31 </span>  <span class="Comment"># real file system</span>
<span id="L32" class="LineNr"> 32 </span>  file:num <span class="Special">&lt;-</span> $open-file-for-reading filename
<span id="L33" class="LineNr"> 33 </span>  <span class="muControl">return-unless</span> file, <span class="Constant">0/contents</span>, <span class="Constant">1/error?</span>
<span id="L34" class="LineNr"> 34 </span>  contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
<span id="L35" class="LineNr"> 35 </span>  start-running receive-from-file file, sink
<span id="L36" class="LineNr"> 36 </span>]
<span id="L37" class="LineNr"> 37 </span>
<span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> slurp resources:&amp;:resources, filename:text<span class="muRecipe"> -&gt; </span>contents:text, error?:bool [
<span id="L39" class="LineNr"> 39 </span>  <span class="Constant">local-scope</span>
<span id="L40" class="LineNr"> 40 </span>  <span class="Constant">load-ingredients</span>
<span id="L41" class="LineNr"> 41 </span>  source:&amp;:source:char, error?:bool <span class="Special">&lt;-</span> start-reading resources, filename
<span id="L42" class="LineNr"> 42 </span>  <span class="muControl">return-if</span> error?, <span class="Constant">0/contents</span>
<span id="L43" class="LineNr"> 43 </span>  buf:&amp;:buffer <span class="Special">&lt;-</span> new-buffer <span class="Constant">30/capacity</span>
<span id="L44" class="LineNr"> 44 </span>  <span class="Delimiter">{</span>
<span id="L45" class="LineNr"> 45 </span>    c:char, done?:bool, source <span class="Special">&lt;-</span> read source
<span id="L46" class="LineNr"> 46 </span>    <span class="muControl">break-if</span> done?
<span id="L47" class="LineNr"> 47 </span>    buf <span class="Special">&lt;-</span> append buf, c
<span id="L48" class="LineNr"> 48 </span>    <span class="muControl">loop</span>
<span id="L49" class="LineNr"> 49 </span>  <span class="Delimiter">}</span>
<span id="L50" class="LineNr"> 50 </span>  contents <span class="Special">&lt;-</span> buffer-to-array buf
<span id="L51" class="LineNr"> 51 </span>]
<span id="L52" class="LineNr"> 52 </span>
<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> start-reading-from-fake-resource resources:&amp;:resources, resource:text<span class="muRecipe"> -&gt; </span>contents:&amp;:source:char, error?:bool [
<span id="L54" class="LineNr"> 54 </span>  <span class="Constant">local-scope</span>
<span id="L55" class="LineNr"> 55 </span>  <span class="Constant">load-ingredients</span>
<span id="L56" class="LineNr"> 56 </span>  error? <span class="Special">&lt;-</span> copy <span class="Constant">0/no-error</span>
<span id="L57" class="LineNr"> 57 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L58" class="LineNr"> 58 </span>  data:&amp;:@:resource <span class="Special">&lt;-</span> get *resources, <span class="Constant">data:offset</span>
<span id="L59" class="LineNr"> 59 </span>  len:num <span class="Special">&lt;-</span> length *data
<span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">{</span>
<span id="L61" class="LineNr"> 61 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L62" class="LineNr"> 62 </span>    <span class="muControl">break-if</span> done?
<span id="L63" class="LineNr"> 63 </span>    tmp:resource <span class="Special">&lt;-</span> index *data, i
<span id="L64" class="LineNr"> 64 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L65" class="LineNr"> 65 </span>    curr-resource:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">name:offset</span>
<span id="L66" class="LineNr"> 66 </span>    found?:bool <span class="Special">&lt;-</span> equal resource, curr-resource
<span id="L67" class="LineNr"> 67 </span>    <span class="muControl">loop-unless</span> found?
<span id="L68" class="LineNr"> 68 </span>    contents:&amp;:source:char, sink:&amp;:sink:char <span class="Special">&lt;-</span> new-channel<span class="Constant"> 30</span>
<span id="L69" class="LineNr"> 69 </span>    curr-contents:text <span class="Special">&lt;-</span> get tmp, <span class="Constant">contents:offset</span>
<span id="L70" class="LineNr"> 70 </span>    start-running receive-from-text curr-contents, sink
<span id="L71" class="LineNr"> 71 </span>    <span class="muControl">return</span>
<span id="L72" class="LineNr"> 72 </span>  <span class="Delimiter">}</span>
<span id="L73" class="LineNr"> 73 </span>  <span class="muControl">return</span> <span class="Constant">0/not-found</span>, <span class="Constant">1/error</span>
<span id="L74" class="LineNr"> 74 </span>]
<span id="L75" class="LineNr"> 75 </span>
<span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> receive-from-file file:num, sink:&amp;:sink:char<span class="muRecipe"> -&gt; </span>sink:&amp;:sink:char [
<span id="L77" class="LineNr"> 77 </span>  <span class="Constant">local-scope</span>
<span id="L78" class="LineNr"> 78 </span>  <span class="Constant">load-ingredients</span>
<span id="L79" class="LineNr"> 79 </span>  <span class="Delimiter">{</span>
<span id="L80" class="LineNr"> 80 </span>    c:char, eof?:bool <span class="Special">&lt;-</span