about summary refs log tree commit diff stats
path: root/html/114error.subx.html
blob: b59f5cb88b1122193f7c5cb35ee437151a4629a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<!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 - 114error.subx</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.subxComment { color: #005faf; }
.subxS2Comment { color: #8a8a8a; }
.LineNr { }
.SpecialChar { color: #d70000; }
.subxS1Comment { color: #0000af; }
.subxFunction { color: #af5f00; text-decoration: underline; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.Constant { color: #008787; }
-->
</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;
  }
  var 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();'>
<a href='https://github.com/akkartik/mu/blob/master/114error.subx'>https://github.com/akkartik/mu/blob/master/114error.subx</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr"> 1 </span><span class="subxComment"># Print an error message and exit.</span>
<span id="L2" class="LineNr"> 2 </span>
<span id="L3" class="LineNr"> 3 </span>== code
<span id="L4" class="LineNr"> 4 </span><span class="subxComment">#   instruction                     effective address                                                   register    displacement    immediate</span>
<span id="L5" class="LineNr"> 5 </span><span class="subxS1Comment"># . op          subop               mod             rm32          base        index         scale       r32</span>
<span id="L6" class="LineNr"> 6 </span><span class="subxS1Comment"># . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes</span>
<span id="L7" class="LineNr"> 7 </span>
<span id="L8" class="LineNr"> 8 </span><span class="subxComment"># write(out, &quot;Error: &quot;+msg+&quot;\n&quot;) then stop(ed, 1)</span>
<span id="L9" class="LineNr"> 9 </span><span class="subxFunction">error</span>:  <span class="subxComment"># ed: (addr exit-descriptor), out: fd or (addr stream byte), msg: (addr array byte)</span>
<span id="L10" class="LineNr">10 </span>    <span class="subxS1Comment"># . prologue</span>
<span id="L11" class="LineNr">11 </span>    55/push-ebp
<span id="L12" class="LineNr">12 </span>    89/copy                         3/mod/direct    5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          4/r32/esp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy esp to ebp</span>
<span id="L13" class="LineNr">13 </span>    <span class="subxComment"># write(out, &quot;Error: &quot;)</span>
<span id="L14" class="LineNr">14 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L15" class="LineNr">15 </span>    68/push  <span class="Constant">&quot;Error: &quot;</span>/imm32
<span id="L16" class="LineNr">16 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L17" class="LineNr">17 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L18" class="LineNr">18 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L19" class="LineNr">19 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L20" class="LineNr">20 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L21" class="LineNr">21 </span>    <span class="subxComment"># write(out, msg)</span>
<span id="L22" class="LineNr">22 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L23" class="LineNr">23 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0x10/disp8     <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+16)</span>
<span id="L24" class="LineNr">24 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L25" class="LineNr">25 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L26" class="LineNr">26 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L27" class="LineNr">27 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L28" class="LineNr">28 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L29" class="LineNr">29 </span>    <span class="subxComment"># write(out, &quot;\n&quot;)</span>
<span id="L30" class="LineNr">30 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L31" class="LineNr">31 </span>    68/push  <span class="SpecialChar"><a href='102test.subx.html#L82'>Newline</a></span>/imm32
<span id="L32" class="LineNr">32 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          0xc/disp8      <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+12)</span>
<span id="L33" class="LineNr">33 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L34" class="LineNr">34 </span>    e8/call  <a href='108write.subx.html#L24'>write</a>/disp32
<span id="L35" class="LineNr">35 </span>    <span class="subxS2Comment"># . . discard args</span>
<span id="L36" class="LineNr">36 </span>    81          0/subop/add         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>         <span class="Normal"> . </span>              8/imm32           <span class="subxComment"># add to esp</span>
<span id="L37" class="LineNr">37 </span>    <span class="subxComment"># stop(ed, 1)</span>
<span id="L38" class="LineNr">38 </span>    <span class="subxS2Comment"># . . push args</span>
<span id="L39" class="LineNr">39 </span>    68/push  1/imm32
<span id="L40" class="LineNr">40 </span>    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>         <span class="Normal"> . </span>          8/disp8        <span class="Normal"> . </span>                <span class="subxComment"># push *(ebp+8)</span>
<span id="L41" class="LineNr">41 </span>    <span class="subxS2Comment"># . . call</span>
<span id="L42" class="LineNr">42 </span>    e8/call  <a href='110stop.subx.html#L92'>stop</a>/disp32
<span id="L43" class="LineNr">43 </span>    <span class="subxComment"># should never get past this point</span>
<span id="L44" class="LineNr">44 </span><span class="Constant">$error:dead-end</span>:
<span id="L45" class="LineNr">45 </span>    <span class="subxS1Comment"># . epilogue</span>
<span id="L46" class="LineNr">46 </span>    89/copy                         3/mod/direct    4/rm32/esp   <span class="Normal"> . </span>         <span class="Normal"> . </span>           <span class="Normal"> . </span>          5/r32/ebp  <span class="Normal"> . </span>             <span class="Normal"> . </span>                <span class="subxComment"># copy ebp to esp</span>
<span id="L47" class="LineNr">47 </span>    5d/pop-to-ebp
<span id="L48" class="LineNr">48 </span>    c3/return
<span id="L49" class="LineNr">49 </span>
<span id="L50" class="LineNr">50 </span><span class="subxS2Comment"># . . vim&#0058;nowrap:textwidth=0</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->
): flags = part1 elif len(split) >= 3: part0 = split[0] part1 = split[1] part2 = split[2] if self._is_app(part0): app = part0 if self._is_flags(part1): flags = part1 if self._is_mode(part2): mode = part2 elif self._is_mode(part1): mode = part1 if self._is_flags(part2): flags = part2 elif self._is_flags(part0): flags = part0 if self._is_mode(part1): mode = part1 elif self._is_mode(part0): mode = part0 if self._is_flags(part1): flags = part1 return app, flags, int(mode) def _get_tab(self): line = parse(self.line) data = line.rest(1) if ' ' not in data: all_apps = self.fm.apps.all() if all_apps: return (app for app in all_apps if app.startswith(data)) return None def _is_app(self, arg): return self.fm.apps.has(arg) or \ (not self._is_flags(arg) and arg in get_executables()) def _is_flags(self, arg): return all(x in ALLOWED_FLAGS for x in arg) def _is_mode(self, arg): return all(x in '0123456789' for x in arg) class find(Command): """ :find <string> The find command will attempt to find a partial, case insensitive match in the filenames of the current directory and execute the file automatically. """ count = 0 tab = Command._tab_directory_content def execute(self): if self.count == 1: self.fm.move(right=1) self.fm.block_input(0.5) else: self.fm.cd(parse(self.line).rest(1)) def quick(self): self.count = 0 line = parse(self.line) cwd = self.fm.env.cwd try: arg = line.rest(1) except IndexError: return False if arg == '.': return False if arg == '..': return True deq = deque(cwd.files) deq.rotate(-cwd.pointer) i = 0 case_insensitive = arg.lower() == arg for fsobj in deq: if case_insensitive: filename = fsobj.basename_lower else: filename = fsobj.basename if arg in filename: self.count += 1 if self.count == 1: cwd.move(to=(cwd.pointer + i) % len(cwd.files)) self.fm.env.cf = cwd.pointed_obj if self.count > 1: return False i += 1 return self.count == 1 class set_(Command): """ :set <option name>=<python expression> Gives an option a new value. """ name = 'set' # don't override the builtin set class def execute(self): line = parse(self.line) name = line.chunk(1) name, value, _ = line.parse_setting_line() if name and value: from re import compile as regexp try: value = eval(value) except: pass self.fm.settings[name] = value def tab(self): line = parse(self.line) name, value, name_done = line.parse_setting_line() settings = self.fm.settings if not name: return (line + setting for setting in settings) if not value and not name_done: return (line + setting for setting in settings \ if setting.startswith(name)) if not value: return line + repr(settings[name]) if bool in settings.types_of(name): if 'true'.startswith(value.lower()): return line + 'True' if 'false'.startswith(value.lower()): return line + 'False' class quit(Command): """ :quit Closes the current tab. If there is only one tab, quit the program. """ def execute(self): if len(self.fm.tabs) <= 1: self.fm.exit() self.fm.tab_close() class quitall(Command): """ :quitall Quits the program immediately. """ def execute(self): self.fm.exit() class quit_bang(quitall): """ :quit! Quits the program immediately. """ name = 'quit!' allow_abbrev = False class terminal(Command): """ :terminal Spawns an "x-terminal-emulator" starting in the current directory. """ def execute(self): self.fm.run('x-terminal-emulator', flags='d') class delete(Command): """ :delete Tries to delete the selection. "Selection" is defined as all the "marked files" (by default, you can mark files with space or v). If there are no marked files, use the "current file" (where the cursor is) When attempting to delete non-empty directories or multiple marked files, it will require a confirmation: The last word in the line has to start with a 'y'. This may look like: :delete yes :delete seriously? yeah! """ allow_abbrev = False def execute(self): line = parse(self.line) lastword = line.chunk(-1) if lastword.startswith('y'): # user confirmed deletion! return self.fm.delete() elif self.line.startswith(DELETE_WARNING): # user did not confirm deletion return cwd = self.fm.env.cwd cf = self.fm.env.cf if cwd.marked_items or (cf.is_directory and not cf.is_link \ and len(os.listdir(cf.path)) > 0): # better ask for a confirmation, when attempting to # delete multiple files or a non-empty directory. return self.fm.open_console(DELETE_WARNING) # no need for a confirmation, just delete self.fm.delete() class mark(Command): """ :mark <regexp> Mark all files matching a regular expression. """ do_mark = True def execute(self): import re cwd = self.fm.env.cwd line = parse(self.line) input = line.rest(1) searchflags = re.UNICODE if input.lower() == input: # "smartcase" searchflags |= re.IGNORECASE pattern = re.compile(input, searchflags) for fileobj in cwd.files: if pattern.search(fileobj.basename): cwd.mark_item(fileobj, val=self.do_mark) self.fm.ui.status.need_redraw = True self.fm.ui.need_redraw = True class console(Command): """ :console <command> Open the console with the given command. """ def execute(self): position = None if self.arg(1)[0:2] == '-p': try: position = int(self.arg(1)[2:]) self.shift() except: pass self.fm.open_console(self.rest(1), position=position) class load_copy_buffer(Command): """ :load_copy_buffer Load the copy buffer from confdir/copy_buffer """ copy_buffer_filename = 'copy_buffer' def execute(self): from ranger.fsobject import File from os.path import exists try: fname = self.fm.confpath(self.copy_buffer_filename) f = open(fname, 'r') except: return self.fm.notify("Cannot open %s" % \ (fname or self.copy_buffer_filename), bad=True) self.fm.env.copy = set(File(g) \ for g in f.read().split("\n") if exists(g)) f.close() self.fm.ui.redraw_main_column() class save_copy_buffer(Command): """ :save_copy_buffer Save the copy buffer to confdir/copy_buffer """ copy_buffer_filename = 'copy_buffer' def execute(self): fname = None try: fname = self.fm.confpath(self.copy_buffer_filename) f = open(fname, 'w') except: return self.fm.notify("Cannot open %s" % \ (fname or self.copy_buffer_filename), bad=True) f.write("\n".join(f.path for f in self.fm.env.copy)) f.close() class unmark(mark): """ :unmark <regexp> Unmark all files matching a regular expression. """ do_mark = False class mkdir(Command): """ :mkdir <dirname> Creates a directory with the name <dirname>. """ def execute(self): from os.path import join, expanduser, lexists from os import mkdir line = parse(self.line) dirname = join(self.fm.env.cwd.path, expanduser(line.rest(1))) if not lexists(dirname): mkdir(dirname) else: self.fm.notify("file/directory exists!", bad=True) class touch(Command): """ :touch <fname> Creates a file with the name <fname>. """ def execute(self): from os.path import join, expanduser, lexists from os import mkdir line = parse(self.line) fname = join(self.fm.env.cwd.path, expanduser(line.rest(1))) if not lexists(fname): open(fname, 'a').close() else: self.fm.notify("file/directory exists!", bad=True) class edit(Command): """ :edit <filename> Opens the specified file in vim """ def execute(self): line = parse(self.line) if not line.chunk(1): self.fm.edit_file(self.fm.env.cf.path) else: self.fm.edit_file(line.rest(1)) def tab(self): return self._tab_directory_content() class eval_(Command): """ :eval [-q] <python code> Evaluates the python code. `fm' is a reference to the FM instance. To display text, use the function `p'. Examples: :eval fm :eval len(fm.env.directories) :eval p("Hello World!") """ name = 'eval' resolve_macros = False def execute(self): if self.arg(1) == '-q': code = self.rest(2) quiet = True else: code = self.rest(1) quiet = False import ranger global cmd, fm, p, quantifier fm = self.fm cmd = self.fm.execute_console p = fm.notify quantifier = self.quantifier try: try: result = eval(code) except SyntaxError: exec(code) else: if result and not quiet: p(result) except Exception as err: p(err) class rename(Command): """ :rename <newname> Changes the name of the currently highlighted file to <newname> """ def execute(self): from ranger.fsobject import File from os import access from os.path import join line = parse(self.line) new_name = line.rest(1) if not new_name: return self.fm.notify('Syntax: rename <newname>', bad=True) if new_name == self.fm.env.cf.basename: return if access(new_name, os.F_OK): return self.fm.notify("Can't rename: file already exists!", bad=True) self.fm.rename(self.fm.env.cf, new_name) f = File(new_name) self.fm.env.cwd.pointed_obj = f self.fm.env.cf = f def tab(self): return self._tab_directory_content() class chmod(Command): """ :chmod <octal number> Sets the permissions of the selection to the octal number. The octal number is between 0 and 777. The digits specify the permissions for the user, the group and others. A 1 permits execution, a 2 permits writing, a 4 permits reading. Add those numbers to combine them. So a 7 permits everything. """ def execute(self): mode = self.rest(1) if not mode: mode = str(self.quantifier) try: mode = int(mode, 8) if mode < 0 or mode > 0o777: raise ValueError except ValueError: self.fm.notify("Need an octal number between 0 and 777!", bad=True) return for file in self.fm.env.get_selection(): try: os.chmod(file.path, mode) except Exception as ex: self.fm.notify(ex) try: # reloading directory. maybe its better to reload the selected # files only. self.fm.env.cwd.load_content() except: pass class bulkrename(Command): """ :bulkrename This command opens a list of selected files in an external editor. After you edit and save the file, it will generate a shell script which does bulk renaming according to the changes you did in the file. This shell script is opened in an editor for you to review. After you close it, it will be executed. """ def execute(self): import sys import tempfile from ranger.fsobject.file import File from ranger.ext.shell_escape import shell_escape as esc py3 = sys.version > "3" # Create and edit the file list filenames = [f.basename for f in self.fm.env.get_selection()] listfile = tempfile.NamedTemporaryFile() if py3: listfile.write("\n".join(filenames).encode("utf-8")) else: listfile.write("\n".join(filenames)) listfile.flush() self.fm.execute_file([File(listfile.name)], app='editor') listfile.seek(0) if py3: new_filenames = listfile.read().decode("utf-8").split("\n") else: new_filenames = listfile.read().split("\n") listfile.close() if all(a == b for a, b in zip(filenames, new_filenames)): self.fm.notify("No renaming to be done!") return # Generate and execute script cmdfile = tempfile.NamedTemporaryFile() cmdfile.write(b"# This file will be executed when you close the editor.\n") cmdfile.write(b"# Please double-check everything, clear the file to abort.\n") if py3: cmdfile.write("\n".join("mv -vi " + esc(old) + " " + esc(new) \ for old, new in zip(filenames, new_filenames) if old != new).encode("utf-8")) else: cmdfile.write("\n".join("mv -vi " + esc(old) + " " + esc(new) \ for old, new in zip(filenames, new_filenames) if old != new)) cmdfile.flush() self.fm.run(['vim', cmdfile.name]) self.fm.run(['/bin/sh', cmdfile.name], flags='w') cmdfile.close() class help_(Command): """ :help Display ranger's manual page. """ name = 'help' def execute(self): self.fm.display_help() class map_(Command): """ :map <keysequence> <command> Maps a command to a keysequence in the "browser" context. Example: map j move down map J move down 10 """ name = 'map' context = 'browser' resolve_macros = False def execute(self): self.fm.env.keymaps.bind(self.context, self.arg(1), self.rest(2)) class cmap(map_): """:cmap <keysequence> <command> Maps a command to a keysequence in the "console" context. Example: cmap <ESC> console_close cmap <C-x> console_type test """ context = 'console' class tmap(map_): """:tmap <keysequence> <command> Maps a command to a keysequence in the "taskview" context. """ context = 'taskview' class pmap(map_): """:pmap <keysequence> <command> Maps a command to a keysequence in the "pager" context. """ context = 'pager' class filter(Command): """ :filter <string> Displays only the files which contain <string> in their basename. """ def execute(self): line = parse(self.line) self.fm.set_filter(line.rest(1)) self.fm.reload_cwd() class grep(Command): """ :grep <string> Looks for a string in all marked files or directories """ def execute(self): line = parse(self.line) if line.rest(1): action = ['grep', '--color=always', '--line-number'] action.extend(['-e', line.rest(1), '-r']) action.extend(f.path for f in self.fm.env.get_selection()) self.fm.execute_command(action, flags='p')