summary refs log tree commit diff stats
path: root/TODO
blob: 1577f97afb66b0e2079b7e587a4ebc0cf926a921 (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
114
115
116
117
118
119
Console

   (X) #0   09/12/06  console commands
   (X) #1   09/12/06  quick find
   (X) #2   09/12/06  open with
   (X) #4   09/12/06  history for console
   (X) #13  09/12/27  display docstring of a command


General

   (X) #5   09/12/06  move code from fm into objects
   (X) #6   09/12/06  move main to __init__
   (X) #7   09/12/06  cooler titlebar
   (X) #8   09/12/17  Add operations to modify files/directories
   (X) #9   09/12/24  add a widget for managing running operations
   (X) #10  09/12/24  sorting
   (X) #11  09/12/27  filter
   (X) #12  09/12/27  jump through the list in a specific order
   (X) #14  09/12/29  make filelists inherit from pagers
   (X) #15  09/12/29  better way of running processes!!~
   (X) #16  10/01/01  list of bookmarks
   (X) #21  10/01/01  write help!
   (X) #22  10/01/03  add getopt options to change flags/mode
   (X) #29  10/01/06  add chmod command
   (X) #30  10/01/06  add a way to create symlinks
   (X) #32  10/01/08  place the (hidden) cursor to a meaningful position
   (X) #34  10/01/09  display free disk space
   (X) #35  10/01/09  display disk usage of files in current directory
   ( ) #36  10/01/11  help coloring is terribly inefficient
   (X) #37  10/01/13  better tab completion for OpenConsole
   ( ) #38  10/01/16  searching in pager
   (X) #39  10/01/17  flushinput not always good
   (X) #42  10/01/17  memorize directory for `` when using :cd
   (X) #43  10/01/18  internally treat the bookmarks ` and ' the same
   ( ) #44  10/01/18  more error messages :P
   (X) #47  10/01/19  less restricive auto preview
   (X) #48  10/01/19  abbreviate commands with first unambiguous substring
   ( ) #50  10/01/19  add more unit tests
   ( ) #51  10/01/21  remove directory.marked_items ?
   (X) #55  10/01/24  allow change of filename when pasting
          you're given the choice between overwriting or appending a "_"
   ( ) #56  10/01/30  warn before deleting mount points
   ( ) #57  10/01/30  warn before deleting unseen marked files
   (X) #58  10/02/04  change the title of the terminal
   (X) #61  10/02/09  show sum of size of marked files
   (X) #63  10/02/15  limit filesize in previews
   ( ) #64  10/02/25  scroll in previews
   (X) #66  10/02/28  explain how colorschemes work
   (X) #70  10/03/14  mouse handler for titlebar
   (X) #71  10/03/21  previews: black/whitelist + read file
   (X) #79  10/04/08  tab number zero
   ( ) #80  10/04/08  when closing tabs, avoid gaps?
   (X) #81  10/04/15  system crash when previewing /proc/kcore with root permissions
   (X) #83  10/04/19  better ways to mark files. eg by regexp, filetype,..
   ( ) #86  10/04/21  narg for move_parent
   ( ) #60  10/02/05  utf support improvable
   ( ) #91  10/05/12  in keys.py, fm.move(right=N) should run with mode=N
   ( ) #92  10/05/14  allow to enter the realpath of a directory
   ( ) #93  10/05/15  pause after running program


Bugs

   (X) #17  10/01/01  why do bookmarks disappear sometimes?
   (X) #18  10/01/01  fix notify widget (by adding a LogView?)
   (X) #19  10/01/01  resizing after pressing g
   (X) #23  10/01/04  stop dir loading with ^C -> wont load anymore
   (X) #25  10/01/06  directories sometimes dont reload correctly
   (X) #26  10/01/06  :delete on symlinks of directories fails
   (X) #31  10/01/06  ^C breaks cd-after-exit by stopping sourced shell script
   (X) #40  10/01/17  freeze with unavailable sshfs
          Not rangers fault (?)
   (X) #41  10/01/17  capital file extensions are not recognized
   (X) #46  10/01/19  old username displayed after using su
   (X) #49  10/01/19  fix unit tests :'(
   (X) #52  10/01/23  special characters in tab completion
   (X) #54  10/01/23  max_dirsize_for_autopreview not working
   (X) #62  10/02/15  curs_set can raise an exception
   (X) #65  10/02/16  "source ranger ranger some/file.txt" shouldn't cd after exit
   (X) #67  10/03/08  terminal title in tty
   (X) #69  10/03/11  tab-completion breaks with Apps subclass
   (X) #73  10/03/21  when clicking on the first column, it goes 1x down
   (X) #74  10/03/21  console doesn't scroll
   (X) #78  10/03/31  broken preview when deleting all files in a directory
   (X) #85  10/04/26  no automatic reload of directory after using :filter
   (X) #87  10/05/10  files are not properly closed after previewing
   ( ) #88  10/05/10  race conditions for data loading from FS
   (X) #90  10/05/11  no link target for broken links
   ( ) #94  10/05/26  "pressed keys" text cut off when chaining ctrl-XYZ keys


Ideas

   ( ) #20  10/01/01  use inotify to monitor filesystem changes
   ( ) #24  10/01/06  progress bar
   (X) #27  10/01/06  hide bookmarks in list which contain hidden dir
   (X) #28  10/01/06  use regexp instead of string for searching
   (X) #33  10/01/08  accelerate mousewheel speed
          won't do this
   (X) #45  10/01/18  hooks for events like setting changes
   (X) #53  10/01/23  merge fm and environment
          won't do this
   (X) #68  10/03/10  threads, to seperate ui and loading
          won't do this
   ( ) #72  10/03/21  ranger daemon which does the slow io tasks
   ( ) #75  10/03/28  navigate in history
   (X) #76  10/03/28  save history between sessions
   (X) #77  10/03/28  colorscheme overlay in options.py
   ( ) #82  10/04/19  :s command for batch renaming
   ( ) #84  10/04/25  use pygments for syntax highlighting
   ( ) #89  10/05/10  branch view


Blocking

   ( ) #60  10/02/05  utf support improvable
   (X) #81  10/04/15  system crash when previewing /proc/kcore with root permissions
mber"} <- copy {0: "literal"} # back out to main +run: {1: "number"} <- copy {0: "literal"} +run: {2: "number"} <- copy {0: "literal"} +run: {3: "number"} <- copy {0: "literal"} :(before "struct routine {") // Everytime a recipe runs another, we interrupt it and start running the new // recipe. When that finishes, we continue this one where we left off. // This requires maintaining a 'stack' of interrupted recipes or 'calls'. struct call { recipe_ordinal running_recipe; int running_step_index; // End call Fields call(recipe_ordinal r) { running_recipe = r; running_step_index = 0; // End call Constructor } ~call() { // End call Destructor } }; typedef list<call> call_stack; :(replace{} "struct routine") struct routine { call_stack calls; // End routine Fields routine(recipe_ordinal r); bool completed() const; const vector<instruction>& steps() const; }; :(code) routine::routine(recipe_ordinal r) { if (Trace_stream) { ++Trace_stream->callstack_depth; trace(9999, "trace") << "new routine; incrementing callstack depth to " << Trace_stream->callstack_depth << end(); assert(Trace_stream->callstack_depth < 9000); // 9998-101 plus cushion } calls.push_front(call(r)); // End routine Constructor } :(code) inline call& current_call() { return Current_routine->calls.front(); } //:: now update routine's helpers :(replace{} "inline int& current_step_index()") inline int& current_step_index() { assert(!Current_routine->calls.empty()); return current_call().running_step_index; } :(replace{} "inline const string& current_recipe_name()") inline const string& current_recipe_name() { assert(!Current_routine->calls.empty()); return get(Recipe, current_call().running_recipe).name; } :(replace{} "inline const instruction& current_instruction()") inline const instruction& current_instruction() { assert(!Current_routine->calls.empty()); return to_instruction(current_call()); } :(code) inline const instruction& to_instruction(const call& call) { return get(Recipe, call.running_recipe).steps.at(call.running_step_index); } :(after "Defined Recipe Checks") // not a primitive; check that it's present in the book of recipes if (!contains_key(Recipe, inst.operation)) { raise << maybe(get(Recipe, r).name) << "undefined operation in '" << to_original_string(inst) << "'\n" << end(); break; } :(replace{} "default:" following "End Primitive Recipe Implementations") default: { const instruction& call_instruction = current_instruction(); if (Recipe.find(current_instruction().operation) == Recipe.end()) { // duplicate from Checks // stop running this instruction immediately ++current_step_index(); continue; } // not a primitive; look up the book of recipes if (Trace_stream) { ++Trace_stream->callstack_depth; trace(9999, "trace") << "incrementing callstack depth to " << Trace_stream->callstack_depth << end(); assert(Trace_stream->callstack_depth < 9000); // 9998-101 plus cushion } Current_routine->calls.push_front(call(current_instruction().operation)); finish_call_housekeeping(call_instruction, ingredients); continue; // not done with caller; don't increment step_index of caller } :(code) void finish_call_housekeeping(const instruction& call_instruction, const vector<vector<double> >& ingredients) { // End Call Housekeeping } :(scenario calling_undefined_recipe_fails) % Hide_errors = true; def main [ foo ] +error: main: undefined operation in 'foo ' :(scenario calling_undefined_recipe_handles_missing_result) % Hide_errors = true; def main [ x:number <- foo ] +error: main: undefined operation in 'x:number <- foo ' //:: finally, we need to fix the termination conditions for the run loop :(replace{} "inline bool routine::completed() const") inline bool routine::completed() const { return calls.empty(); } :(replace{} "inline const vector<instruction>& routine::steps() const") inline const vector<instruction>& routine::steps() const { assert(!calls.empty()); return get(Recipe, calls.front().running_recipe).steps; } :(before "Running One Instruction") // when we reach the end of one call, we may reach the end of the one below // it, and the one below that, and so on while (current_step_index() >= SIZE(Current_routine->steps())) { // Falling Through End Of Recipe if (Trace_stream) { trace(9999, "trace") << "fall-through: exiting " << current_recipe_name() << "; decrementing callstack depth from " << Trace_stream->callstack_depth << end(); --Trace_stream->callstack_depth; assert(Trace_stream->callstack_depth >= 0); } Current_routine->calls.pop_front(); if (Current_routine->calls.empty()) return; // Complete Call Fallthrough // todo: fail if no products returned ++current_step_index(); }