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,259 @@
1
+ require "launcher"
2
+
3
+ class Merb
4
+
5
+ def self.menu name=nil, port=nil
6
+ unless name # Print menu
7
+ r = "+ current dir: #{View.dir}, 4000\n"
8
+ r << "+ upper: #{View.dir_of_after_bar}, 4000\n" if View.in_bar?
9
+ r + "
10
+ + tmp: /tmp/merb1, 4000
11
+ + .links/
12
+ - .snippets/
13
+ + .version/
14
+ ".unindent
15
+ else # Print options
16
+ "
17
+ - .create
18
+ - .start
19
+ - .url '/'
20
+ + .shells/
21
+ + .generate/
22
+ + .rake/
23
+ + .models/
24
+ + .db/
25
+ + .files/
26
+ "
27
+ end
28
+ end
29
+
30
+ def self.shells dir, port=nil
31
+ puts "
32
+ - .console
33
+ - .shell
34
+ "
35
+ end
36
+
37
+ def self.files dir, port=nil
38
+ puts "- #{self.path_from_dir(dir)}/"
39
+ end
40
+
41
+ def self.generate dir, port=nil
42
+ puts "
43
+ - .merb_gen 'controller posts'
44
+ - .merb_gen 'model post body:string'
45
+ - .merb_gen 'resource post body:string'
46
+ "
47
+ end
48
+
49
+ def self.rake dir, port, task=nil
50
+ unless task
51
+ #puts self.path_from_dir(dir)
52
+ out = Console.run "rake -T", :dir => self.path_from_dir(dir), :sync => true
53
+ # Pull out tasks
54
+ out.scan(/^rake ([\w:]+)/) do |m|
55
+ puts "- #{m[0]}"
56
+ end
57
+ return
58
+ end
59
+
60
+ Console.run "rake #{task}", :dir => self.path_from_dir(dir), :buffer => "*rake #{dir}"
61
+
62
+ end
63
+
64
+ def self.merb_gen command, dir, port=nil
65
+ Console.run "merb-gen #{command} --no-color", :dir => self.path_from_dir(dir), :buffer => "*merb-gen #{dir}"
66
+ end
67
+
68
+ def self.links
69
+ puts "
70
+ - home: http://www.merbivore.com/
71
+ - open-source book: http://book.merbist.com/
72
+ "
73
+ end
74
+
75
+ def self.db dir, port
76
+ puts "
77
+ - .db_create
78
+ - .migrate
79
+ "
80
+ end
81
+
82
+ def self.db_create dir, port
83
+ Mysql.create_db self.name_from_dir(dir) + "_development"
84
+ end
85
+
86
+ def self.snippets
87
+ puts "- create (o): Foo.create(:a => 'aa')"
88
+ puts "- find first (o): y Foo.first"
89
+ end
90
+
91
+ def self.create dir, port=nil
92
+ # Split into dir and name
93
+ dir = self.path_from_dir(dir)
94
+ path, name = dir.match(/(.+)\/(.+)/)[1..2]
95
+ Console.run "merb-gen app -f --no-color #{name}", :dir=>path, :buffer=>"*merb-gen app #{name}" #, :sync=>true
96
+ end
97
+
98
+ def self.start dir, port
99
+ Console.run "merb -a thin -p #{port}", :dir=>self.path_from_dir(dir), :buffer=>"*merb #{dir}"
100
+ # Console.run "merb -p #{port}", :dir=>self.path_from_dir(dir), :buffer=>"*merb #{dir}"
101
+ end
102
+
103
+ def self.shell dir, port
104
+ Console.run "", :dir=>self.path_from_dir(dir)#, :buffer=>"*merb #{dir}"
105
+
106
+ # buffer = "*" + self.name_from_dir(dir) + " merb shell"
107
+
108
+ # path = self.path_from_dir(dir)
109
+ # View.to_after_bar
110
+
111
+ # # Just go there if already open
112
+ # if View.buffer_open? buffer
113
+ # View.to_buffer buffer
114
+ # return
115
+ # end
116
+
117
+ # Console.run nil, :path => path, :buffer => buffer
118
+ end
119
+
120
+ # def self.url path='/', dir=nil, port
121
+ # $el.browse_url "http://localhost:#{port}#{path}"
122
+ # end
123
+
124
+ def self.url path, dir, port
125
+ $el.browse_url "http://localhost:#{port}#{path}"
126
+ nil
127
+ end
128
+
129
+ def self.console dir=nil, port=nil
130
+ b = "*merb console #{self.name_from_dir(dir)}"
131
+ if View.buffer_open?(b)
132
+ View.handle_bar
133
+ View.to_buffer b
134
+ else
135
+ Console.run "merb -i", :dir => dir, :buffer => b
136
+ end
137
+ nil
138
+ end
139
+
140
+ def self.migrate dir=nil, port=nil
141
+ b = "*merb console #{self.name_from_dir(dir)}"
142
+
143
+ if View.buffer_open?(b)
144
+ View.handle_bar
145
+ View.to_buffer b
146
+ else # If console not open, open it
147
+ self.console dir
148
+ end
149
+
150
+ View.to_buffer(b)
151
+ $el.insert("repository.auto_migrate!")
152
+ #$el.insert("DataMapper::Base.auto_migrate!")
153
+ Console.enter
154
+
155
+ # TODO: item for migrating test
156
+ # - always take env as param?
157
+ # - default to 'development'
158
+ # - auto_migrate MERB_ENV=test
159
+ end
160
+
161
+ def self.name_from_dir dir
162
+ dir = View.dir_of_after_bar if dir == "."
163
+ dir[/(\w+)\/?$/, 1]
164
+ end
165
+
166
+ def self.path_from_dir dir
167
+ # If ., grab path of window after bar
168
+ dir = View.dir_of_after_bar if dir == "."
169
+ Bookmarks.expand(dir, :absolute => true)
170
+ end
171
+
172
+ def self.models model=nil
173
+ # If no model specified, show all
174
+ unless model
175
+ Dir.foreach(Bookmarks['$mo']) { |m|
176
+ next unless m =~ /(.+)\.rb$/
177
+ puts "+ #{TextUtil.camel_case($1)}/"
178
+ }
179
+ return
180
+ end
181
+
182
+ # Show options
183
+ puts "
184
+ + .first/
185
+ + .recent 1/
186
+ + .all/
187
+ + .count/
188
+ + .first \":name => 'foo'\"/
189
+ + .recent 1, \":name => 'foo'\"/
190
+ + .all \":name => 'foo'\"/
191
+ + .count \":name => 'foo'\"/
192
+ "
193
+ end
194
+
195
+ def self.first *args
196
+ # If 2 args, it's where, model
197
+ where = (args.size == 2) ? "(#{args.shift})" : ''
198
+ model = args.shift
199
+ model.sub! /\/$/, ''
200
+ puts RubyConsole.at(:m, "y #{model}.first#{where}")
201
+ end
202
+
203
+ def self.all *args
204
+ # If 2 args, it's where, model
205
+ where = (args.size == 2) ? "(#{args.shift})" : ''
206
+ model = args.shift
207
+ model.sub! /\/$/, ''
208
+ puts RubyConsole.at(:m, "y #{model}.all#{where}")
209
+ end
210
+
211
+ def self.count *args
212
+ # If 2 args, it's where, model
213
+ where = (args.size == 2) ? "(#{args.shift})" : ''
214
+ model = args.shift
215
+ model.sub! /\/$/, ''
216
+ puts RubyConsole.at(:m, "puts #{model}.count#{where}")
217
+ end
218
+
219
+ def self.recent *args
220
+ number = args.shift
221
+ where = (args.size == 2) ? "#{args.shift}, " : ''
222
+ model = args.shift
223
+ model.sub! /\/$/, ''
224
+
225
+ number ||= 1
226
+
227
+ model.sub! /\/$/, ''
228
+ puts RubyConsole.at(:m, "y #{model}.all(#{where}:order => [:updated_at.desc], :limit => #{number})")
229
+ end
230
+
231
+ def self.version
232
+ Console.run('merb --version', :sync=>true)
233
+ end
234
+
235
+ def self.launch_merb_log_line line
236
+ # if Keys.prefix_u # If U, just go there
237
+ # Pull out action and controller
238
+ action = line[/"action"=>"(.+?)"/, 1]
239
+ controller = line[/"controller"=>"(.+?)"/, 1]
240
+ # Open controller
241
+ View.open "$co/#{controller}.rb"
242
+ # Jump to method
243
+ View.to_highest
244
+ Search.forward "^\\s-+def #{action}[^a-z_]"
245
+ Line.to_beginning
246
+
247
+ end
248
+
249
+ def self.init
250
+ # Jump to controller from line in merb log
251
+ Launcher.add(/^.* ~ Routed to: \{/) do |line|
252
+ Merb.launch_merb_log_line line
253
+ end
254
+ end
255
+ end
256
+
257
+
258
+
259
+ Merb.init
@@ -0,0 +1,5 @@
1
+ class Message
2
+ def self.<< txt
3
+ View.message txt
4
+ end
5
+ end
@@ -0,0 +1,56 @@
1
+ # Is this still being used?
2
+
3
+ gem 'method_source'
4
+ require 'method_source'
5
+
6
+ # Adds .drill method to Object and Class
7
+
8
+ # For:
9
+ # my_instace.drill
10
+
11
+ class ::Object
12
+ # def drill method=nil
13
+
14
+ # # If no method, show all
15
+ # if method.nil?
16
+ # result = ""
17
+ # methods = self.methods - Object.methods
18
+ # cmethods = self.class.methods - Class.methods
19
+ # return methods.sort.map{|o| "#{o}/"} + cmethods.sort.map{|o| "self.#{o}/"}
20
+ # end
21
+
22
+ # # Method passed
23
+
24
+ # method
25
+
26
+ # # CodeTree.tree_search_option + result
27
+ # end
28
+
29
+ def self.meths method=nil
30
+ Class.meths_internal self, method
31
+ end
32
+
33
+ def meths method=nil
34
+ Class.meths_internal self.class, method
35
+ end
36
+
37
+ def self.meths_internal clazz, method=nil
38
+ # If no method, show all
39
+ if method.nil?
40
+ result = ""
41
+ methods = clazz.instance_methods - Object.methods
42
+ cmethods = clazz.methods - Class.methods
43
+ return cmethods.sort.map{|o| ".#{o}"} + methods.sort.map{|o| "##{o}"}
44
+ end
45
+
46
+ # Method passed
47
+
48
+ method.sub! /\/$/, ''
49
+ if method =~ /\.(.+)/
50
+ return "- " + clazz.method($1).source_location.join(':')
51
+ end
52
+ "- " + clazz.instance_method(method).source_location.join(':')
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,34 @@
1
+ # Helps you define modes.
2
+ #
3
+ # Sample usage:
4
+ # Mode.define(:deck, ".deck") do
5
+ # Deck.apply_styles
6
+ # end
7
+ #
8
+ class Mode
9
+
10
+ def self.menu
11
+ "
12
+ - Put something here.
13
+ "
14
+ end
15
+
16
+ # Easy way to define a mode
17
+ def self.define name, extension, &block
18
+
19
+ return if ! $el
20
+
21
+ # Mode function
22
+ $el.defun("#{name}_mode".to_sym, :interactive => "", :docstring => "Apply #{name} styles, etc") do
23
+ $el.el4r_lisp_eval "(setq font-lock-defaults '(nil t))"
24
+ block.call
25
+
26
+ map_name = "#{name}_mode_map".to_sym
27
+ $el.use_local_map $el.elvar.send(map_name) if $el.boundp(map_name)
28
+ end
29
+
30
+ # Associate with file extension
31
+ $el.el4r_lisp_eval %Q<(add-to-list 'auto-mode-alist '("\\\\#{extension}\\\\'" . #{name}-mode))>
32
+
33
+ end
34
+ end
@@ -0,0 +1,248 @@
1
+ require 'keys'
2
+
3
+ # Provides different ways of moving cursor.
4
+ class Move
5
+
6
+ # Go to last line having indent
7
+ def self.to_indent
8
+ direction_down = true # Assume down
9
+ prefix = Keys.prefix
10
+ line = Line.value
11
+
12
+ if prefix.is_a? Fixnum # If U, reverse
13
+ indent = prefix # If numeric, make that be the indent
14
+ else
15
+ direction_down = ! direction_down if line =~ /^ *(end|\]|\}|\))$/ # If end of block, reverse direction
16
+
17
+ if prefix == :u # If U, reverse
18
+ direction_down = false
19
+ else
20
+ end
21
+ end
22
+
23
+ column = View.column
24
+ indent ||= Line.indent(line).size
25
+
26
+ # If negative, reverse direction and amke positive
27
+ if indent < 0
28
+ direction_down = false
29
+ indent = 0 - indent
30
+ end
31
+
32
+ orig = Location.new
33
+ # Search for matching in right direction
34
+ if direction_down == false
35
+ Line.to_left
36
+ success = Search.backward "^ \\{#{indent}\\}[^ \t\n]"
37
+ else
38
+ Line.next
39
+ success = Search.forward "^ \\{#{indent}\\}[^ \t\n]"
40
+ end
41
+
42
+ Move.to_column prefix.is_a?(Fixnum) ? indent : column
43
+
44
+ unless success
45
+ View.beep
46
+ orig.go
47
+ end
48
+ end
49
+
50
+ def self.to_next_paragraph options={}
51
+ prefix = Keys.prefix :clear=>1
52
+ if prefix == :u # If C-u, just go to end
53
+ if Line.blank?
54
+ Line.value(2) =~ /./ ? # If on blank line but next line has stuff, just move down
55
+ Line.next :
56
+ Move.to_next_paragraph
57
+ end
58
+
59
+ Search.forward "^[ \t]*$", :go_anyway=>1
60
+
61
+ Move.to_axis
62
+ return
63
+ end
64
+
65
+ return Line.next if options[:no_skip] && Line.blank? && Line.value(2) =~ /./ # Don't skip if right before paragraph
66
+
67
+ prefix = prefix.is_a?(Fixnum) ? prefix : 1
68
+ prefix.times do
69
+ Search.forward "\n[ \t]*\\(\n+[ \t]*\\)+", :go_anyway=>1
70
+ end
71
+ $el.beginning_of_line
72
+ end
73
+
74
+ def self.to_previous_paragraph
75
+ prefix = Keys.prefix :clear=>1
76
+ if prefix == :u # If C-u, just go to end
77
+
78
+ # If line before us isn't blank, move past this paragraph first
79
+ Move.to_previous_paragraph if Line.value(0) =~ /./
80
+
81
+ Search.backward ".", :go_anyway=>1 # Go to non-blank line
82
+ Line.next
83
+ return
84
+ end
85
+
86
+ prefix = prefix.is_a?(Fixnum) ? prefix : 1
87
+
88
+ prefix.times do
89
+ $el.skip_chars_backward "\n "
90
+ $el.re_search_backward "\n[ \t]*\\(\n+[ \t]*\\)+", nil, 1
91
+ end
92
+ $el.skip_chars_forward "\n "
93
+ $el.beginning_of_line
94
+ end
95
+
96
+ def self.to_window n, options={}
97
+
98
+ views = View.list # Get views in this window
99
+
100
+ if n >= views.size # If they wanted to go further than exists
101
+ $el.select_window(views[views.size - 1])
102
+ else
103
+ $el.select_window(views[n-1])
104
+ end
105
+
106
+ Effects.blink(:what=>:line) if options[:blink]
107
+ end
108
+
109
+ def self.to_last_window options={}
110
+
111
+ View.to_nth(View.list.size - 1)
112
+
113
+ Effects.blink(:what=>:line) if options[:blink]
114
+ end
115
+
116
+ def self.to_line n=nil
117
+ # Use arg or numeric prefix or get input
118
+ n = n || $el.elvar.current_prefix_arg || Keys.input(:prompt=>"Go to line number: ")
119
+ $el.goto_line n.to_i
120
+ end
121
+
122
+ # Move to the specified column.
123
+ def self.to_column n=nil
124
+
125
+ prefix = Keys.prefix :clear=>1
126
+
127
+ # If dash+, go to specific char
128
+ if prefix == :-
129
+ return View.cursor = Keys.input(:prompt=>"Point to go to: ", :timed=>1).to_i
130
+ end
131
+
132
+ n = n || prefix || Keys.input(:prompt=>"column to go to: ").to_i
133
+ if n < 0
134
+ Move.to_end
135
+ n = $el.abs(n)
136
+ n > length = Line.txt.length and n = length
137
+ Move.backward n
138
+ return
139
+ end
140
+ $el.move_to_column n# - 1
141
+ end
142
+
143
+ # Go to opposite bracket
144
+ def self.to_other_bracket
145
+ prefix = Keys.prefix
146
+ # If prefix or after closing bracket, go backward
147
+ last_char = $el.point == 1 ? "" : $el.buffer_substring($el.point-1, $el.point)
148
+
149
+ # If numeric prefix
150
+ if prefix.class == Fixnum
151
+ if prefix > 0
152
+ prefix.times { $el.forward_sexp }
153
+ else
154
+ (0-prefix).times { $el.backward_sexp }
155
+ end
156
+ elsif prefix == :u or last_char =~ /[)}\]'">]/
157
+ $el.backward_sexp
158
+ # Otherwise, go forward
159
+ else
160
+ $el.forward_sexp
161
+ end
162
+ end
163
+
164
+ def self.backward count=nil
165
+ count ||= Keys.prefix# :clear => true
166
+ count ||= 1
167
+ case count
168
+ when :u; $el.backward_word 1
169
+ when :uu; $el.backward_word 2
170
+ when :uuu; $el.backward_word 3
171
+ else
172
+ $el.backward_char count
173
+ end
174
+ end
175
+
176
+ def self.forward count=nil
177
+
178
+ count ||= Keys.prefix# :clear => true
179
+ count ||= 1
180
+ case count
181
+ when :u
182
+ $el.forward_word 1
183
+ when :uu
184
+ $el.forward_word 2
185
+ when :uuu
186
+ $el.forward_word 3
187
+ else
188
+ $el.forward_char(count) rescue nil # In case tried to move past end
189
+ end
190
+ end
191
+
192
+ def self.top
193
+ $el.beginning_of_buffer
194
+ end
195
+
196
+ def self.bottom
197
+ $el.end_of_buffer
198
+ end
199
+
200
+ def self.to_quote
201
+ prefix = Keys.prefix :clear=>true
202
+ if prefix.nil?
203
+ times = 1
204
+ Keys.clear_prefix
205
+ elsif prefix.is_a? Fixnum
206
+ times = prefix
207
+ View.to_relative
208
+ end
209
+
210
+ (times||1).times do
211
+ Line.next if Line.matches(/^ *\|/)
212
+ $el.re_search_forward "^ *|"
213
+ $el.backward_char
214
+ end
215
+
216
+ # If on a quote, move off
217
+ end
218
+
219
+ # Move to file in tree (not dir) ?
220
+ def self.to_junior
221
+ Keys.prefix_times.times do
222
+ # Move to line without / at end
223
+ Line.next if Line.matches(/^ +[+-]? ?[a-zA-Z_-].+[^\/\n]$/)
224
+ $el.re_search_forward "^ +[+-]? ?[a-zA-Z_-].+[^\/\n]$"
225
+ Line.to_words
226
+ end
227
+ end
228
+
229
+ # Moves cursor to left of line:
230
+ #
231
+ # Move.to_axis
232
+ # Move.to_axiss
233
+ def self.to_axis
234
+ n = Keys.prefix_n # Check for numeric prefix
235
+ Line.next(n) if n.is_a? Fixnum # If there, move down
236
+ Line.to_left
237
+ end
238
+
239
+ # Moves cursor to left of line:
240
+ #
241
+ # Move.to_end
242
+ def self.to_end n=nil
243
+ n ||= Keys.prefix_n # Check for numeric prefix
244
+ Line.next(n) if n.is_a? Fixnum # If there, move down
245
+ Line.to_right
246
+ end
247
+
248
+ end