xiki 0.5.0a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +11 -0
- data/LICENSE +22 -0
- data/README.markdown +83 -0
- data/Rakefile +8 -0
- data/bin/xiki +46 -0
- data/etc/command/xiki_command.rb +203 -0
- data/etc/command/xiki_process.rb +52 -0
- data/etc/command/xiki_wrapper +2 -0
- data/etc/js/menu1.js +55 -0
- data/etc/js/xiki.js +259 -0
- data/etc/logo.png +0 -0
- data/etc/presentations/bootstrap.deck +5 -0
- data/etc/presentations/databases.deck +41 -0
- data/etc/presentations/diffs.deck +23 -0
- data/etc/presentations/documentation.deck +14 -0
- data/etc/presentations/effects.deck +5 -0
- data/etc/presentations/face.deck +297 -0
- data/etc/presentations/files.deck +79 -0
- data/etc/presentations/icons.deck +22 -0
- data/etc/presentations/images.deck +24 -0
- data/etc/presentations/key_shortcuts.deck +16 -0
- data/etc/presentations/macros.deck +18 -0
- data/etc/presentations/menu_classes.deck +44 -0
- data/etc/presentations/menu_directories.deck +30 -0
- data/etc/presentations/notes.deck +19 -0
- data/etc/presentations/other_languages.deck +55 -0
- data/etc/presentations/other_wiki_syntaxes.deck +4 -0
- data/etc/presentations/piano.deck +5 -0
- data/etc/presentations/potential/diffs.deck +38 -0
- data/etc/presentations/potential/evolution.deck +18 -0
- data/etc/presentations/potential/intro.deck +711 -0
- data/etc/presentations/potential/intro1.deck +711 -0
- data/etc/presentations/potential/intro2.deck +97 -0
- data/etc/presentations/potential/make_mysql_menu.deck +36 -0
- data/etc/presentations/potential/ruby_development.deck +17 -0
- data/etc/presentations/potential/ui_prototyping.deck +50 -0
- data/etc/presentations/potential/web_dev.deck +4 -0
- data/etc/presentations/potential/web_development.deck +10 -0
- data/etc/presentations/potential/wiki.deck +45 -0
- data/etc/presentations/presentations.deck +24 -0
- data/etc/presentations/rails_development.deck +29 -0
- data/etc/presentations/search_key_shortcuts.deck +37 -0
- data/etc/presentations/simplest_possible_ui.deck +37 -0
- data/etc/presentations/svg.deck +5 -0
- data/etc/presentations/testing.deck +28 -0
- data/etc/presentations/the_end.deck +13 -0
- data/etc/presentations/type_something_and_double_click.deck +57 -0
- data/etc/presentations/type_the_acronym.deck +144 -0
- data/etc/presentations/web_browser.deck +56 -0
- data/etc/presentations/xiki_command.deck +20 -0
- data/etc/presentations/xiki_url.deck +14 -0
- data/etc/shark.icns +0 -0
- data/etc/shark_script.icns +0 -0
- data/etc/snippets/html.notes +7 -0
- data/etc/snippets/notes.notes +20 -0
- data/etc/snippets/rb.notes +38 -0
- data/etc/templates/menu_template.menu +2 -0
- data/etc/templates/menu_template.rb +8 -0
- data/etc/templates/template.rb +5 -0
- data/etc/themes/Dark_Metal.notes +28 -0
- data/etc/themes/Orange_Path.notes +15 -0
- data/etc/themes/Shiny_Blue.notes +27 -0
- data/etc/themes/Shiny_Green.notes +27 -0
- data/etc/wrappers/wrapper.js +17 -0
- data/etc/wrappers/wrapper.py +20 -0
- data/etc/wrappers/wrapper.rb +25 -0
- data/lib/block.rb +72 -0
- data/lib/bookmarks.rb +352 -0
- data/lib/buffers.rb +170 -0
- data/lib/clipboard.rb +333 -0
- data/lib/code.rb +860 -0
- data/lib/code_tree.rb +476 -0
- data/lib/color.rb +274 -0
- data/lib/console.rb +557 -0
- data/lib/control_lock.rb +9 -0
- data/lib/control_tab.rb +176 -0
- data/lib/core_ext.rb +31 -0
- data/lib/cursor.rb +111 -0
- data/lib/deletes.rb +65 -0
- data/lib/diff_log.rb +297 -0
- data/lib/effects.rb +145 -0
- data/lib/environment.rb +5 -0
- data/lib/file_tree.rb +1875 -0
- data/lib/files.rb +334 -0
- data/lib/hide.rb +259 -0
- data/lib/history.rb +286 -0
- data/lib/image.rb +51 -0
- data/lib/incrementer.rb +15 -0
- data/lib/insert.rb +7 -0
- data/lib/irc.rb +22 -0
- data/lib/key_bindings.rb +658 -0
- data/lib/keys.rb +754 -0
- data/lib/launcher.rb +1351 -0
- data/lib/line.rb +429 -0
- data/lib/links.rb +6 -0
- data/lib/location.rb +175 -0
- data/lib/macros.rb +48 -0
- data/lib/man.rb +19 -0
- data/lib/menu.rb +708 -0
- data/lib/merb.rb +259 -0
- data/lib/message.rb +5 -0
- data/lib/meths.rb +56 -0
- data/lib/mode.rb +34 -0
- data/lib/move.rb +248 -0
- data/lib/notes.rb +1000 -0
- data/lib/numbers.rb +45 -0
- data/lib/ol.rb +203 -0
- data/lib/ol_helper.rb +44 -0
- data/lib/overlay.rb +167 -0
- data/lib/pause_means_space.rb +68 -0
- data/lib/php.rb +22 -0
- data/lib/projects.rb +21 -0
- data/lib/relinquish_exception.rb +2 -0
- data/lib/remote.rb +206 -0
- data/lib/requirer.rb +46 -0
- data/lib/rest_tree.rb +108 -0
- data/lib/ruby.rb +57 -0
- data/lib/ruby_console.rb +165 -0
- data/lib/search.rb +1572 -0
- data/lib/search_term.rb +40 -0
- data/lib/snippet.rb +68 -0
- data/lib/specs.rb +229 -0
- data/lib/styles.rb +274 -0
- data/lib/svn.rb +682 -0
- data/lib/text_util.rb +110 -0
- data/lib/tree.rb +1871 -0
- data/lib/tree_cursor.rb +87 -0
- data/lib/trouble_shooting.rb +27 -0
- data/lib/url_tree.rb +11 -0
- data/lib/view.rb +1474 -0
- data/lib/window.rb +133 -0
- data/lib/xiki.rb +404 -0
- data/menus/accounts.rb +5 -0
- data/menus/address_book.rb +21 -0
- data/menus/agenda.rb +28 -0
- data/menus/all.rb +5 -0
- data/menus/amazon.rb +16 -0
- data/menus/app.rb +16 -0
- data/menus/applescript.rb +46 -0
- data/menus/as.rb +15 -0
- data/menus/bookmarklet.rb +63 -0
- data/menus/bootstrap.rb +568 -0
- data/menus/browse.rb +13 -0
- data/menus/browser.rb +78 -0
- data/menus/cassandra_db.rb +36 -0
- data/menus/chmod.rb +27 -0
- data/menus/classes.rb +5 -0
- data/menus/coffee_script.rb +35 -0
- data/menus/computer.rb +24 -0
- data/menus/contacts.rb +5 -0
- data/menus/cookies.rb +25 -0
- data/menus/couch.rb +184 -0
- data/menus/crop.rb +45 -0
- data/menus/css.rb +55 -0
- data/menus/current.rb +5 -0
- data/menus/db.rb +12 -0
- data/menus/deck.rb +219 -0
- data/menus/dictionary.rb +9 -0
- data/menus/dir.rb +8 -0
- data/menus/disk.rb +5 -0
- data/menus/do.rb +13 -0
- data/menus/docs.rb +58 -0
- data/menus/dotsies.rb +107 -0
- data/menus/edited.rb +18 -0
- data/menus/emacs.rb +17 -0
- data/menus/enter.rb +13 -0
- data/menus/eval.rb +17 -0
- data/menus/executable.rb +16 -0
- data/menus/filter.rb +46 -0
- data/menus/firefox.rb +607 -0
- data/menus/foo.rb +30 -0
- data/menus/french.rb +7 -0
- data/menus/git.rb +185 -0
- data/menus/gito.rb +785 -0
- data/menus/google.rb +35 -0
- data/menus/google_images.rb +11 -0
- data/menus/google_patents.rb +10 -0
- data/menus/gutenberg.rb +13 -0
- data/menus/head.rb +10 -0
- data/menus/headings.rb +39 -0
- data/menus/html.rb +61 -0
- data/menus/icon.rb +40 -0
- data/menus/images.menu +2 -0
- data/menus/img.rb +15 -0
- data/menus/info.rb +9 -0
- data/menus/ip.rb +10 -0
- data/menus/iterm.rb +36 -0
- data/menus/itunes.rb +78 -0
- data/menus/javascript.rb +74 -0
- data/menus/layout.rb +18 -0
- data/menus/local_storage.rb +67 -0
- data/menus/ls.rb +19 -0
- data/menus/mac.rb +87 -0
- data/menus/maps.rb +18 -0
- data/menus/matches.rb +18 -0
- data/menus/memcache.rb +117 -0
- data/menus/mkdir.rb +23 -0
- data/menus/mongo.rb +83 -0
- data/menus/mysql.rb +294 -0
- data/menus/node.rb +88 -0
- data/menus/open.rb +19 -0
- data/menus/outline.rb +24 -0
- data/menus/piano.rb +746 -0
- data/menus/postgres.rb +34 -0
- data/menus/pre.rb +5 -0
- data/menus/python.rb +39 -0
- data/menus/rails.rb +160 -0
- data/menus/rake.rb +12 -0
- data/menus/redmine.rb +168 -0
- data/menus/riak_tree.rb +204 -0
- data/menus/rss.rb +15 -0
- data/menus/safari.rb +11 -0
- data/menus/sass.rb +15 -0
- data/menus/say.rb +6 -0
- data/menus/scale.rb +49 -0
- data/menus/serve.rb +78 -0
- data/menus/shuffle.rb +24 -0
- data/menus/spanish.rb +7 -0
- data/menus/standalone.rb +57 -0
- data/menus/tail.rb +41 -0
- data/menus/technologies.rb +19 -0
- data/menus/themes.rb +32 -0
- data/menus/thesaurus.rb +13 -0
- data/menus/to.rb +24 -0
- data/menus/twitter.rb +57 -0
- data/menus/wikipedia.rb +34 -0
- data/menus/words.rb +11 -0
- data/spec/code_tree_spec.rb +59 -0
- data/spec/diff_log_spec.rb +40 -0
- data/spec/file_tree_spec.rb +102 -0
- data/spec/keys_spec.rb +24 -0
- data/spec/line_spec.rb +68 -0
- data/spec/menu_spec.rb +50 -0
- data/spec/ol_spec.rb +98 -0
- data/spec/remote_spec.rb +43 -0
- data/spec/search_spec.rb +162 -0
- data/spec/text_util_spec.rb +119 -0
- data/spec/tree_cursor_spec.rb +91 -0
- data/spec/tree_spec.rb +955 -0
- data/tests/console_test.rb +11 -0
- data/tests/couch_db_test.rb +12 -0
- data/tests/diff_log_test.rb +43 -0
- data/tests/el_mixin.rb +16 -0
- data/tests/git_test.rb +95 -0
- data/tests/keys_test.rb +19 -0
- data/tests/line_test.rb +38 -0
- data/tests/merb_test.rb +11 -0
- data/tests/redmine_test.rb +50 -0
- data/tests/remote_test.rb +31 -0
- data/tests/rest_tree_test.rb +70 -0
- data/xiki.gemspec +37 -0
- metadata +332 -0
data/lib/numbers.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class Numbers
|
|
2
|
+
def self.menu
|
|
3
|
+
['.sum_numbers_in_clipboard',
|
|
4
|
+
'.sum_dollars_in_clipboard'
|
|
5
|
+
]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.sum_numbers txt
|
|
9
|
+
numbers = txt.scan(/[\d.]+/)
|
|
10
|
+
numbers.map!{|o| o.to_f}
|
|
11
|
+
numbers.inject(0){|i, o| i + o}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.sum_numbers_in_clipboard
|
|
15
|
+
self.sum_numbers Clipboard[0]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.sum_dollars txt
|
|
19
|
+
numbers = txt.scan(/\$([\d.]+)/).map{|o| o.first}
|
|
20
|
+
numbers.map!{|o| o.to_f}
|
|
21
|
+
numbers.inject(0){|i, o| i + o}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.sum_dollars_in_clipboard
|
|
25
|
+
self.sum_dollars Clipboard[0]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.enter_as_added
|
|
29
|
+
txt = Clipboard[0]
|
|
30
|
+
|
|
31
|
+
# If it has amount after " = ", make nure only they are added
|
|
32
|
+
if txt =~ / = \$?\d/
|
|
33
|
+
txt.gsub! /.* = /, ''
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# If it has dollars, just add dollars
|
|
37
|
+
if txt =~ /\$\d/
|
|
38
|
+
View.insert self.sum_dollars(txt).to_s
|
|
39
|
+
return
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
View.insert self.sum_numbers(txt).to_s
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/ol.rb
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
# Meant to log short succinct messages to help with troubleshooting
|
|
2
|
+
# while coding. Log statements hyperlink back to the line that logged it.
|
|
3
|
+
class Ol
|
|
4
|
+
@@last = [Time.now - 1000]
|
|
5
|
+
@@timed_last = Time.now
|
|
6
|
+
|
|
7
|
+
# For when the caller constructs what to log on its own
|
|
8
|
+
def self.log_directly txt, line, name=nil
|
|
9
|
+
path = name ? "/tmp/#{name}_ol.notes" : self.file_path
|
|
10
|
+
self.write_to_file path, txt
|
|
11
|
+
self.write_to_file_lines path, line
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.log txt, l=nil, name=nil, time=nil
|
|
15
|
+
|
|
16
|
+
path = name ? "/tmp/#{name}_ol.notes" : self.file_path
|
|
17
|
+
|
|
18
|
+
if l.nil? # If just txt, delegate to line
|
|
19
|
+
self
|
|
20
|
+
return self.line(txt, caller(0)[1])
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# If n seconds passed since last call
|
|
24
|
+
heading = self.pause_since_last?(time) ? "\n>\n" : nil
|
|
25
|
+
|
|
26
|
+
if l.is_a?(Array) # If an array of lines was passed
|
|
27
|
+
result = ""
|
|
28
|
+
result_lines = ""
|
|
29
|
+
if heading
|
|
30
|
+
result << heading
|
|
31
|
+
result_lines << "\n\n"
|
|
32
|
+
end
|
|
33
|
+
l.each_with_index do |o, i|
|
|
34
|
+
next unless o
|
|
35
|
+
h = Ol.parse_line(o)
|
|
36
|
+
result << "#{' '*i}#{self.extract_label(h)}#{i+1 == l.size ? " #{txt}" : ''}\n"
|
|
37
|
+
result_lines << "#{h[:path]}:#{h[:line]}\n"
|
|
38
|
+
end
|
|
39
|
+
self.write_to_file path, result
|
|
40
|
+
self.write_to_file_lines path, result_lines
|
|
41
|
+
return txt
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Indent lines if multi-line (except for first)
|
|
45
|
+
txt.gsub!("\n", "\n ")
|
|
46
|
+
txt.sub!(/ +\z/, '') # Remove trailing
|
|
47
|
+
|
|
48
|
+
h = Ol.parse_line(l)
|
|
49
|
+
|
|
50
|
+
self.write_to_file path, "#{heading}#{txt}\n"
|
|
51
|
+
|
|
52
|
+
# Multiline txt: Write path to .line file once for each number of lines
|
|
53
|
+
l = "#{h[:path]}:#{h[:line]}\n"
|
|
54
|
+
result = ""
|
|
55
|
+
result << "\n\n" if heading
|
|
56
|
+
txt.split("\n", -1).size.times { result << l }
|
|
57
|
+
self.write_to_file_lines "#{path}", result
|
|
58
|
+
|
|
59
|
+
txt
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.write_to_file path, txt
|
|
63
|
+
existed = File.exists? path # If file doesn't exist, chmod it to world writable later
|
|
64
|
+
|
|
65
|
+
File.open(path, "a") do |f|
|
|
66
|
+
f << txt
|
|
67
|
+
f.chmod 0666 if ! existed
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.write_to_file_lines path, txt
|
|
72
|
+
path = "#{path}.lines"
|
|
73
|
+
existed = File.exists? path # If file doesn't exist, chmod it to world writable later
|
|
74
|
+
|
|
75
|
+
File.open(path, "a", 0666) do |f|
|
|
76
|
+
f << txt
|
|
77
|
+
f.chmod 0666 if ! existed
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.pause_since_last? time=nil, no_reset=nil
|
|
82
|
+
time ||= @@last
|
|
83
|
+
difference = Time.now - time[0]
|
|
84
|
+
time[0] = Time.now unless no_reset
|
|
85
|
+
difference > 3
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.<< txt
|
|
89
|
+
self.line txt, caller(0)[1]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def self.time nth=1
|
|
93
|
+
now = Time.now
|
|
94
|
+
elapsed = self.pause_since_last? ? nil : (now - @@timed_last)
|
|
95
|
+
|
|
96
|
+
self.line "#{elapsed ? "(#{elapsed}) " : ''}#{now.strftime('%I:%M:%S').sub(/^0/, '')}:#{now.usec.to_s.rjust(6, '0')}", caller(0)[nth]
|
|
97
|
+
@@timed_last = now
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def self.line txt=nil, l=nil, indent="", name=nil, time=nil
|
|
103
|
+
l ||= caller(0)[1]
|
|
104
|
+
|
|
105
|
+
l.sub! /^\(eval\)/, 'eval' # So "(" doesn't mess up the label
|
|
106
|
+
|
|
107
|
+
h = self.parse_line(l)
|
|
108
|
+
|
|
109
|
+
txt = txt ? " #{txt}" : ''
|
|
110
|
+
|
|
111
|
+
if h[:clazz]
|
|
112
|
+
self.log "#{indent}#{self.extract_label(h)}#{txt}", l, name, time
|
|
113
|
+
else
|
|
114
|
+
display = l.sub(/_html_haml'$/, '')
|
|
115
|
+
display.sub!(/.+(.{18})/, "\\1...")
|
|
116
|
+
self.log "#{indent}- #{display})#{txt}", l, name, time
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def self.extract_label h
|
|
121
|
+
"- #{h[:clazz]}.#{h[:method]} #{h[:line]})"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def self.parse_line path
|
|
126
|
+
method = path[/`(.+)'/, 1] # `
|
|
127
|
+
path, l = path.match(/(.+):(\d+)/)[1..2]
|
|
128
|
+
path = File.expand_path path
|
|
129
|
+
clazz = path[/.+\/(.+)\.rb/, 1]
|
|
130
|
+
clazz = self.camel_case(clazz) if clazz
|
|
131
|
+
{:path=>path, :line=>l, :method=>method, :clazz=>clazz}
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def self.file_path
|
|
135
|
+
"/tmp/output_ol.notes"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def self.camel_case s
|
|
139
|
+
s.gsub(/_([a-z]+)/) {"#{$1.capitalize}"}.sub(/(.)/) {$1.upcase}.gsub("_", "")
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Logs short succinct stack trace
|
|
143
|
+
def self.stack n=6, nth=1
|
|
144
|
+
ls ||= caller(0)[nth..(n+nth)]
|
|
145
|
+
|
|
146
|
+
self.line "stack...", ls.shift, ""
|
|
147
|
+
|
|
148
|
+
ls.each do |l|
|
|
149
|
+
self.line nil, l, " "
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def self.limit_stack stack, pattern=/^\/projects\//
|
|
154
|
+
# Cut off until it doesn't match
|
|
155
|
+
first = stack.first
|
|
156
|
+
stack.delete_if{|o| o !~ pattern}
|
|
157
|
+
stack.reverse!
|
|
158
|
+
# Be sure to leave one, if they're all deleted
|
|
159
|
+
stack << first if stack == []
|
|
160
|
+
stack
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Remove parents from stack that are common to last_stack
|
|
164
|
+
def self.remove_redundance stack, last_stack
|
|
165
|
+
result = []
|
|
166
|
+
# For each stack, copy it over if different, or nil if the same
|
|
167
|
+
stack.each_with_index do |o, i|
|
|
168
|
+
# If it's the last one, don't nil it out
|
|
169
|
+
if i+1 == stack.size
|
|
170
|
+
result << o
|
|
171
|
+
next
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
result << (o == last_stack[i] ? nil : o)
|
|
175
|
+
end
|
|
176
|
+
result
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def self.browser html
|
|
180
|
+
path = "/tmp/browser.#{Time.now.usec}.html"
|
|
181
|
+
url = "file://#{path}"
|
|
182
|
+
File.open(path, "w") { |f| f << html }
|
|
183
|
+
|
|
184
|
+
`open '#{url}'`
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def self.open_last_output
|
|
188
|
+
|
|
189
|
+
prefix = Keys.prefix :clear=>1
|
|
190
|
+
View.layout_output
|
|
191
|
+
if prefix == :u
|
|
192
|
+
View.to_highest
|
|
193
|
+
Search.forward "^-"
|
|
194
|
+
else
|
|
195
|
+
View.to_bottom
|
|
196
|
+
Line.previous
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
Launcher.launch
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
end
|
data/lib/ol_helper.rb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
class OlHelper
|
|
2
|
+
def self.source_to_output file, line
|
|
3
|
+
|
|
4
|
+
target = "#{file}:#{line}\n"
|
|
5
|
+
|
|
6
|
+
lines = IO.readlines("/tmp/output_ol.notes.lines").reverse
|
|
7
|
+
|
|
8
|
+
lines_total = lines.length
|
|
9
|
+
|
|
10
|
+
# Get how far from bottom
|
|
11
|
+
distance, found = 0, nil
|
|
12
|
+
while distance < lines_total do
|
|
13
|
+
break found = distance if lines[distance] == target
|
|
14
|
+
distance += 1
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
found
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.launch
|
|
21
|
+
prefix = Keys.prefix :clear=>1
|
|
22
|
+
|
|
23
|
+
# Get path from end
|
|
24
|
+
path = Ol.file_path #[/\/.+/]
|
|
25
|
+
|
|
26
|
+
# TODO: get total_lines - current_line
|
|
27
|
+
distance_to_end = Line.number(View.bottom) - Line.number
|
|
28
|
+
|
|
29
|
+
# Go to log.lines and get n from end
|
|
30
|
+
arr = IO.readlines("#{path}.lines")
|
|
31
|
+
line = arr[- distance_to_end]
|
|
32
|
+
|
|
33
|
+
path, line = line.split(':')
|
|
34
|
+
|
|
35
|
+
View.open path
|
|
36
|
+
View.to_line line.to_i
|
|
37
|
+
|
|
38
|
+
if prefix == 0
|
|
39
|
+
View.layout_output
|
|
40
|
+
Line.next
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
data/lib/overlay.rb
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Wrapper around the elisp 'overlay'.
|
|
2
|
+
#
|
|
3
|
+
# Represents an overlay and has finder methods for getting overlays
|
|
4
|
+
# for more, see http://www.gnu.org/software/emacs/elisp/html_node/Overlays.html
|
|
5
|
+
# represents an elisp overlay. the Overlay class finder methods for getting overlays
|
|
6
|
+
#-- IMPORTANT NOTES:
|
|
7
|
+
# start/end have been renamed to left/right respectively
|
|
8
|
+
class Overlay
|
|
9
|
+
|
|
10
|
+
def initialize(elisp_overlay)
|
|
11
|
+
# raise TypeError.new("argument must be elisp overlay") if overlayp(elisp_overlay)
|
|
12
|
+
@overlay = elisp_overlay
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.menu
|
|
16
|
+
"
|
|
17
|
+
- api/
|
|
18
|
+
| Make some text have a style
|
|
19
|
+
@ Overlay.face :underline, :left=>1, :right=>300
|
|
20
|
+
|
|
|
21
|
+
| Remove all overlays
|
|
22
|
+
@ Overlay.delete_all
|
|
23
|
+
"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# create elisp overlay and wrap it in a ruby object
|
|
27
|
+
def self.make(left, right)
|
|
28
|
+
Overlay.new($el.make_overlay(left, right))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# returns all overlays that contain at least one character between left and right
|
|
32
|
+
# empty overlays are included
|
|
33
|
+
def self.between(left, right)
|
|
34
|
+
overlays = $el.overlays_in(left, right).to_a
|
|
35
|
+
overlays.map { |o| Overlay.new(o) }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# returns all overlays for current buffer
|
|
39
|
+
def self.all
|
|
40
|
+
between(View.top, View.bottom)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# returns all overlays that have left and right exactly
|
|
44
|
+
def self.on(left, right)
|
|
45
|
+
between(left, right).select { |o| o.left == left && o.right == right }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# returns all overlays that cover pos
|
|
49
|
+
def self.at(pos)
|
|
50
|
+
overlays = $el.overlays_at(pos).to_a
|
|
51
|
+
overlays.map { |o| Overlay.new(o) }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def self.overlays_with(left, right, properties = {})
|
|
55
|
+
# implementation needed
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def self.find_or_make(left, right)
|
|
59
|
+
overlays = on(left, right)
|
|
60
|
+
if overlays.any?
|
|
61
|
+
puts "warning: more than 1 overlay" if overlays.size > 1
|
|
62
|
+
overlays.first
|
|
63
|
+
else
|
|
64
|
+
make(left, right)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# maybe subclass NamedOverlay
|
|
69
|
+
# what about uniqueness of name?
|
|
70
|
+
def self.find_overlay_by_name(name)
|
|
71
|
+
# search overlays for all overlays with property name
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def self.remove_overlays
|
|
75
|
+
# implementation needed
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Code Sample: Overlay.face :trailing_whitespace, :what=>:line
|
|
79
|
+
# Apply face to region
|
|
80
|
+
def self.face(face, options={})
|
|
81
|
+
left ||= options[:left]
|
|
82
|
+
right ||= options[:right]
|
|
83
|
+
if options[:what] == :line or left.nil?
|
|
84
|
+
left, right = Line.left, Line.right+1
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
o = Overlay.find_or_make(left, right)
|
|
88
|
+
o[:face] = face
|
|
89
|
+
o
|
|
90
|
+
nil
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.delete_all
|
|
94
|
+
$el.overlays_in(View.top, View.bottom).to_a.each{|o| $el.delete_overlay o}
|
|
95
|
+
nil
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# returns the buffer that overlay belongs to. It returns nil if overlay has been deleted.
|
|
99
|
+
def buffer
|
|
100
|
+
$el.overlay_buffer @overlay
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# returns a copy of the property list.
|
|
104
|
+
def properties
|
|
105
|
+
$el.overlay_properties @overlay
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# returns the position at which overlay starts, as an integer.
|
|
109
|
+
def left
|
|
110
|
+
$el.overlay_start @overlay
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# returns the position at which overlay ends, as an integer.
|
|
114
|
+
def right
|
|
115
|
+
$el.overlay_end @overlay
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# deletes overlay. The overlay continues to exist as a Lisp object,
|
|
119
|
+
# and its property list is unchanged, but it ceases to be attached
|
|
120
|
+
# to the buffer it belonged to, and ceases to have any effect on
|
|
121
|
+
# display.
|
|
122
|
+
# A deleted overlay is not permanently disconnected. You
|
|
123
|
+
# can give it a position in a buffer again by calling move-overlay.
|
|
124
|
+
def delete
|
|
125
|
+
$el.delete_overlay @overlay
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# def move
|
|
129
|
+
# end
|
|
130
|
+
|
|
131
|
+
def to_elisp
|
|
132
|
+
@overlay
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# method missing candidate. name space with 'set' or 'propset'
|
|
136
|
+
def invisible
|
|
137
|
+
$el.overlay_get(@overlay, :invisible)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def invisible=(arg)
|
|
141
|
+
if arg
|
|
142
|
+
$el.overlay_put(@overlay, :invisible, true)
|
|
143
|
+
else
|
|
144
|
+
$el.overlay_put(@overlay, :invisible, nil)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def isearch_open_invisible_temporary
|
|
149
|
+
$el.overlay_get(@overlay, :isearch_open_invisible_temporary)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def isearch_open_invisible_temporary=(arg)
|
|
153
|
+
if arg
|
|
154
|
+
$el.overlay_put(@overlay, :isearch_open_invisible_temporary, true)
|
|
155
|
+
else
|
|
156
|
+
$el.overlay_put(@overlay, :isearch_open_invisible_temporary, nil)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def []= key, val
|
|
161
|
+
$el.overlay_put(@overlay, key, val)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def [] key
|
|
165
|
+
$el.overlay_get(@overlay, key)
|
|
166
|
+
end
|
|
167
|
+
end
|