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.
Files changed (252) hide show
  1. data/Gemfile +11 -0
  2. data/LICENSE +22 -0
  3. data/README.markdown +83 -0
  4. data/Rakefile +8 -0
  5. data/bin/xiki +46 -0
  6. data/etc/command/xiki_command.rb +203 -0
  7. data/etc/command/xiki_process.rb +52 -0
  8. data/etc/command/xiki_wrapper +2 -0
  9. data/etc/js/menu1.js +55 -0
  10. data/etc/js/xiki.js +259 -0
  11. data/etc/logo.png +0 -0
  12. data/etc/presentations/bootstrap.deck +5 -0
  13. data/etc/presentations/databases.deck +41 -0
  14. data/etc/presentations/diffs.deck +23 -0
  15. data/etc/presentations/documentation.deck +14 -0
  16. data/etc/presentations/effects.deck +5 -0
  17. data/etc/presentations/face.deck +297 -0
  18. data/etc/presentations/files.deck +79 -0
  19. data/etc/presentations/icons.deck +22 -0
  20. data/etc/presentations/images.deck +24 -0
  21. data/etc/presentations/key_shortcuts.deck +16 -0
  22. data/etc/presentations/macros.deck +18 -0
  23. data/etc/presentations/menu_classes.deck +44 -0
  24. data/etc/presentations/menu_directories.deck +30 -0
  25. data/etc/presentations/notes.deck +19 -0
  26. data/etc/presentations/other_languages.deck +55 -0
  27. data/etc/presentations/other_wiki_syntaxes.deck +4 -0
  28. data/etc/presentations/piano.deck +5 -0
  29. data/etc/presentations/potential/diffs.deck +38 -0
  30. data/etc/presentations/potential/evolution.deck +18 -0
  31. data/etc/presentations/potential/intro.deck +711 -0
  32. data/etc/presentations/potential/intro1.deck +711 -0
  33. data/etc/presentations/potential/intro2.deck +97 -0
  34. data/etc/presentations/potential/make_mysql_menu.deck +36 -0
  35. data/etc/presentations/potential/ruby_development.deck +17 -0
  36. data/etc/presentations/potential/ui_prototyping.deck +50 -0
  37. data/etc/presentations/potential/web_dev.deck +4 -0
  38. data/etc/presentations/potential/web_development.deck +10 -0
  39. data/etc/presentations/potential/wiki.deck +45 -0
  40. data/etc/presentations/presentations.deck +24 -0
  41. data/etc/presentations/rails_development.deck +29 -0
  42. data/etc/presentations/search_key_shortcuts.deck +37 -0
  43. data/etc/presentations/simplest_possible_ui.deck +37 -0
  44. data/etc/presentations/svg.deck +5 -0
  45. data/etc/presentations/testing.deck +28 -0
  46. data/etc/presentations/the_end.deck +13 -0
  47. data/etc/presentations/type_something_and_double_click.deck +57 -0
  48. data/etc/presentations/type_the_acronym.deck +144 -0
  49. data/etc/presentations/web_browser.deck +56 -0
  50. data/etc/presentations/xiki_command.deck +20 -0
  51. data/etc/presentations/xiki_url.deck +14 -0
  52. data/etc/shark.icns +0 -0
  53. data/etc/shark_script.icns +0 -0
  54. data/etc/snippets/html.notes +7 -0
  55. data/etc/snippets/notes.notes +20 -0
  56. data/etc/snippets/rb.notes +38 -0
  57. data/etc/templates/menu_template.menu +2 -0
  58. data/etc/templates/menu_template.rb +8 -0
  59. data/etc/templates/template.rb +5 -0
  60. data/etc/themes/Dark_Metal.notes +28 -0
  61. data/etc/themes/Orange_Path.notes +15 -0
  62. data/etc/themes/Shiny_Blue.notes +27 -0
  63. data/etc/themes/Shiny_Green.notes +27 -0
  64. data/etc/wrappers/wrapper.js +17 -0
  65. data/etc/wrappers/wrapper.py +20 -0
  66. data/etc/wrappers/wrapper.rb +25 -0
  67. data/lib/block.rb +72 -0
  68. data/lib/bookmarks.rb +352 -0
  69. data/lib/buffers.rb +170 -0
  70. data/lib/clipboard.rb +333 -0
  71. data/lib/code.rb +860 -0
  72. data/lib/code_tree.rb +476 -0
  73. data/lib/color.rb +274 -0
  74. data/lib/console.rb +557 -0
  75. data/lib/control_lock.rb +9 -0
  76. data/lib/control_tab.rb +176 -0
  77. data/lib/core_ext.rb +31 -0
  78. data/lib/cursor.rb +111 -0
  79. data/lib/deletes.rb +65 -0
  80. data/lib/diff_log.rb +297 -0
  81. data/lib/effects.rb +145 -0
  82. data/lib/environment.rb +5 -0
  83. data/lib/file_tree.rb +1875 -0
  84. data/lib/files.rb +334 -0
  85. data/lib/hide.rb +259 -0
  86. data/lib/history.rb +286 -0
  87. data/lib/image.rb +51 -0
  88. data/lib/incrementer.rb +15 -0
  89. data/lib/insert.rb +7 -0
  90. data/lib/irc.rb +22 -0
  91. data/lib/key_bindings.rb +658 -0
  92. data/lib/keys.rb +754 -0
  93. data/lib/launcher.rb +1351 -0
  94. data/lib/line.rb +429 -0
  95. data/lib/links.rb +6 -0
  96. data/lib/location.rb +175 -0
  97. data/lib/macros.rb +48 -0
  98. data/lib/man.rb +19 -0
  99. data/lib/menu.rb +708 -0
  100. data/lib/merb.rb +259 -0
  101. data/lib/message.rb +5 -0
  102. data/lib/meths.rb +56 -0
  103. data/lib/mode.rb +34 -0
  104. data/lib/move.rb +248 -0
  105. data/lib/notes.rb +1000 -0
  106. data/lib/numbers.rb +45 -0
  107. data/lib/ol.rb +203 -0
  108. data/lib/ol_helper.rb +44 -0
  109. data/lib/overlay.rb +167 -0
  110. data/lib/pause_means_space.rb +68 -0
  111. data/lib/php.rb +22 -0
  112. data/lib/projects.rb +21 -0
  113. data/lib/relinquish_exception.rb +2 -0
  114. data/lib/remote.rb +206 -0
  115. data/lib/requirer.rb +46 -0
  116. data/lib/rest_tree.rb +108 -0
  117. data/lib/ruby.rb +57 -0
  118. data/lib/ruby_console.rb +165 -0
  119. data/lib/search.rb +1572 -0
  120. data/lib/search_term.rb +40 -0
  121. data/lib/snippet.rb +68 -0
  122. data/lib/specs.rb +229 -0
  123. data/lib/styles.rb +274 -0
  124. data/lib/svn.rb +682 -0
  125. data/lib/text_util.rb +110 -0
  126. data/lib/tree.rb +1871 -0
  127. data/lib/tree_cursor.rb +87 -0
  128. data/lib/trouble_shooting.rb +27 -0
  129. data/lib/url_tree.rb +11 -0
  130. data/lib/view.rb +1474 -0
  131. data/lib/window.rb +133 -0
  132. data/lib/xiki.rb +404 -0
  133. data/menus/accounts.rb +5 -0
  134. data/menus/address_book.rb +21 -0
  135. data/menus/agenda.rb +28 -0
  136. data/menus/all.rb +5 -0
  137. data/menus/amazon.rb +16 -0
  138. data/menus/app.rb +16 -0
  139. data/menus/applescript.rb +46 -0
  140. data/menus/as.rb +15 -0
  141. data/menus/bookmarklet.rb +63 -0
  142. data/menus/bootstrap.rb +568 -0
  143. data/menus/browse.rb +13 -0
  144. data/menus/browser.rb +78 -0
  145. data/menus/cassandra_db.rb +36 -0
  146. data/menus/chmod.rb +27 -0
  147. data/menus/classes.rb +5 -0
  148. data/menus/coffee_script.rb +35 -0
  149. data/menus/computer.rb +24 -0
  150. data/menus/contacts.rb +5 -0
  151. data/menus/cookies.rb +25 -0
  152. data/menus/couch.rb +184 -0
  153. data/menus/crop.rb +45 -0
  154. data/menus/css.rb +55 -0
  155. data/menus/current.rb +5 -0
  156. data/menus/db.rb +12 -0
  157. data/menus/deck.rb +219 -0
  158. data/menus/dictionary.rb +9 -0
  159. data/menus/dir.rb +8 -0
  160. data/menus/disk.rb +5 -0
  161. data/menus/do.rb +13 -0
  162. data/menus/docs.rb +58 -0
  163. data/menus/dotsies.rb +107 -0
  164. data/menus/edited.rb +18 -0
  165. data/menus/emacs.rb +17 -0
  166. data/menus/enter.rb +13 -0
  167. data/menus/eval.rb +17 -0
  168. data/menus/executable.rb +16 -0
  169. data/menus/filter.rb +46 -0
  170. data/menus/firefox.rb +607 -0
  171. data/menus/foo.rb +30 -0
  172. data/menus/french.rb +7 -0
  173. data/menus/git.rb +185 -0
  174. data/menus/gito.rb +785 -0
  175. data/menus/google.rb +35 -0
  176. data/menus/google_images.rb +11 -0
  177. data/menus/google_patents.rb +10 -0
  178. data/menus/gutenberg.rb +13 -0
  179. data/menus/head.rb +10 -0
  180. data/menus/headings.rb +39 -0
  181. data/menus/html.rb +61 -0
  182. data/menus/icon.rb +40 -0
  183. data/menus/images.menu +2 -0
  184. data/menus/img.rb +15 -0
  185. data/menus/info.rb +9 -0
  186. data/menus/ip.rb +10 -0
  187. data/menus/iterm.rb +36 -0
  188. data/menus/itunes.rb +78 -0
  189. data/menus/javascript.rb +74 -0
  190. data/menus/layout.rb +18 -0
  191. data/menus/local_storage.rb +67 -0
  192. data/menus/ls.rb +19 -0
  193. data/menus/mac.rb +87 -0
  194. data/menus/maps.rb +18 -0
  195. data/menus/matches.rb +18 -0
  196. data/menus/memcache.rb +117 -0
  197. data/menus/mkdir.rb +23 -0
  198. data/menus/mongo.rb +83 -0
  199. data/menus/mysql.rb +294 -0
  200. data/menus/node.rb +88 -0
  201. data/menus/open.rb +19 -0
  202. data/menus/outline.rb +24 -0
  203. data/menus/piano.rb +746 -0
  204. data/menus/postgres.rb +34 -0
  205. data/menus/pre.rb +5 -0
  206. data/menus/python.rb +39 -0
  207. data/menus/rails.rb +160 -0
  208. data/menus/rake.rb +12 -0
  209. data/menus/redmine.rb +168 -0
  210. data/menus/riak_tree.rb +204 -0
  211. data/menus/rss.rb +15 -0
  212. data/menus/safari.rb +11 -0
  213. data/menus/sass.rb +15 -0
  214. data/menus/say.rb +6 -0
  215. data/menus/scale.rb +49 -0
  216. data/menus/serve.rb +78 -0
  217. data/menus/shuffle.rb +24 -0
  218. data/menus/spanish.rb +7 -0
  219. data/menus/standalone.rb +57 -0
  220. data/menus/tail.rb +41 -0
  221. data/menus/technologies.rb +19 -0
  222. data/menus/themes.rb +32 -0
  223. data/menus/thesaurus.rb +13 -0
  224. data/menus/to.rb +24 -0
  225. data/menus/twitter.rb +57 -0
  226. data/menus/wikipedia.rb +34 -0
  227. data/menus/words.rb +11 -0
  228. data/spec/code_tree_spec.rb +59 -0
  229. data/spec/diff_log_spec.rb +40 -0
  230. data/spec/file_tree_spec.rb +102 -0
  231. data/spec/keys_spec.rb +24 -0
  232. data/spec/line_spec.rb +68 -0
  233. data/spec/menu_spec.rb +50 -0
  234. data/spec/ol_spec.rb +98 -0
  235. data/spec/remote_spec.rb +43 -0
  236. data/spec/search_spec.rb +162 -0
  237. data/spec/text_util_spec.rb +119 -0
  238. data/spec/tree_cursor_spec.rb +91 -0
  239. data/spec/tree_spec.rb +955 -0
  240. data/tests/console_test.rb +11 -0
  241. data/tests/couch_db_test.rb +12 -0
  242. data/tests/diff_log_test.rb +43 -0
  243. data/tests/el_mixin.rb +16 -0
  244. data/tests/git_test.rb +95 -0
  245. data/tests/keys_test.rb +19 -0
  246. data/tests/line_test.rb +38 -0
  247. data/tests/merb_test.rb +11 -0
  248. data/tests/redmine_test.rb +50 -0
  249. data/tests/remote_test.rb +31 -0
  250. data/tests/rest_tree_test.rb +70 -0
  251. data/xiki.gemspec +37 -0
  252. metadata +332 -0
@@ -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
@@ -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
@@ -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
@@ -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