summary refs log tree commit diff stats
path: root/INSTALL
blob: d14d389183d53abff529ed0ef2cc455dfb1ccfe3 (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
Installing
==========

You don't need to install anything.

You can run ranger by simply starting the executable file ranger.py
in the top directory of this package.
Use the --clean option and it will leave no trace whatsoever on your system.


If you insist on conventionally install it, use the package manager
of your operating system.  If there is no package or it is out of date,
you can also follow these instructions:


Step by step
============

(This is all done automagically if you type `sudo make install',
though you might want to read the Makefile first)

0. Make sure you have a recent version of python, including the
   curses module, which is the case if this shell command prints no errors:
   python -c 'import curses'


1. Copy the file "ranger.py" into any of the directories in the PATH
   environment variable, for example to "/usr/bin/ranger"


2. Copy the directory "ranger" into one of the python module search
   paths, for example to "/usr/lib/python2.6/site-packages/ranger".

   Ensure that the path is listed by the command:
   python -c 'import sys; print("\n".join(sys.path))'


3. Optionally, you can activate an extra feature: When you exit ranger,
   the directory of the current shell can be changed to the last visited
   directory in ranger.  To do so, add this alias to your shell rc file:

   alias rng="source ranger ranger"

   (Unfortunately this feature is shell dependent.  It has been
   successfully tested with BASH and ZSH only.)


Uninstalling
============

Use your package manager to uninstall ranger.  If you manually installed
it, revert the steps described above.

Ranger can also create a configuration directory at ~/.ranger which
you might want to remove as well.
artik K. Agaram <vc@akkartik.com> 2015-05-10 08:55:18 -0700 1323 - keyboard supports backspace and newline' href='/akkartik/mu/commit/047jump_label.cc?h=hlt&id=dc1323e936fb79823767f85529be15e0456b3169'>dc1323e9 ^
363be37f ^
4071055a ^
dc1323e9 ^
363be37f ^
ac0e9db5 ^
4071055a ^
dc1323e9 ^
363be37f ^

ac0e9db5 ^
4071055a ^
dc1323e9 ^




363be37f ^
e4630643 ^



dc1323e9 ^
0f125d5f ^
dc1323e9 ^
e4630643 ^
827898fc ^
dc1323e9 ^






8ba8f0f6 ^
bc643692 ^
dc1323e9 ^









bc643692 ^

dc1323e9 ^









bc643692 ^

dc1323e9 ^




4071055a ^



bc643692 ^


8ba8f0f6 ^
bc643692 ^
4071055a ^
bc643692 ^
4071055a ^


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
                            



                                                                              


                         
                    
                    



                             
                                       
                          
 



                                        
                                               

                                                             


                                                    
                                                             
                                              
                                                   
                                                           
     
                                                                                                         
                                                           
     
                                                                                               
                                         
                                                           
     

                                                                                                                
                                         
                                                           




       
                                                                                                                                           



                                                                                                                     
                         
                                                                                           
                                          
                                                                                
                                             






                          
                         
                        









                             

                              









                                

                                                                                     




                             



                                                                   


                    
                    
                    
         
                    


                             
//: Support jumps to labels.
//: We'll also treat 'break' and 'loop' as jumps. The choice of name is
//: just documentation about intent; use 'break' to indicate you're exiting
//: one or more loop nests, and 'loop' to indicate you're skipping to the next
//: iteration of some containing loop nest.

:(scenario jump_to_label)
recipe main [
  jump +target:label
  1:number <- copy 0
  +target
]
-mem: storing 0 in location 1

:(before "End Mu Types Initialization")
Type_ordinal["label"] = 0;

:(after "int main")
  Transform.push_back(transform_labels);

:(code)
void transform_labels(const recipe_ordinal r) {
  map<string, long long int> offset;
  for (long long int i = 0; i < SIZE(Recipe[r].steps); ++i) {
    const instruction& inst = Recipe[r].steps.at(i);
    if (!inst.label.empty()) offset[inst.label] = i;
  }
  for (long long int i = 0; i < SIZE(Recipe[r].steps); ++i) {
    instruction& inst = Recipe[r].steps.at(i);
    if (inst.operation == Recipe_ordinal["jump"]) {
      replace_offset(inst.ingredients.at(0), offset, i, r);
    }
    if (inst.operation == Recipe_ordinal["jump-if"] || inst.operation == Recipe_ordinal["jump-unless"]) {
      replace_offset(inst.ingredients.at(1), offset, i, r);
    }
    if ((inst.operation == Recipe_ordinal["loop"] || inst.operation == Recipe_ordinal["break"])
        && SIZE(inst.ingredients) == 1) {
      replace_offset(inst.ingredients.at(0), offset, i, r);
    }
    if ((inst.operation == Recipe_ordinal["loop-if"] || inst.operation == Recipe_ordinal["loop-unless"]
            || inst.operation == Recipe_ordinal["break-if"] || inst.operation == Recipe_ordinal["break-unless"])
        && SIZE(inst.ingredients) == 2) {
      replace_offset(inst.ingredients.at(1), offset, i, r);
    }
  }
}

:(code)
void replace_offset(reagent& x, /*const*/ map<string, long long int>& offset, const long long int current_offset, const recipe_ordinal r) {
  if (!is_literal(x)) {
    raise << Recipe[r].name << ": jump target must be offset or label but is " << x.original_string << '\n' << end();
    return;
  }
  assert(!x.initialized);
  if (is_integer(x.name)) return;  // non-labels will be handled like other number operands
  if (offset.find(x.name) == offset.end())
    raise << Recipe[r].name << ": can't find label " << x.name << '\n' << end();
  x.set_value(offset[x.name]-current_offset);
}

:(scenario break_to_label)
recipe main [
#?   $print [aaa]
  {
    {
      break +target:label
      1:number <- copy 0
    }
  }
  +target
]
-mem: storing 0 in location 1

:(scenario jump_if_to_label)
recipe main [
  {
    {
      jump-if 1, +target:label
      1:number <- copy 0
    }
  }
  +target
]
-mem: storing 0 in location 1

:(scenario loop_unless_to_label)
recipe main [
  {
    {
      loop-unless 0, +target:label  # loop/break with a label don't care about braces
      1:number <- copy 0
    }
  }
  +target
]
-mem: storing 0 in location 1

:(scenario jump_runs_code_after_label)
recipe main [
  # first a few lines of padding to exercise the offset computation
  1:number <- copy 0
  2:number <- copy 0
  3:number <- copy 0
  jump +target:label
  4:number <- copy 0
  +target
  5:number <- copy 0
]
+mem: storing 0 in location 5
-mem: storing 0 in location 4