xiki 0.5.0a

Sign up to get free protection for your applications and to get access to all the features.
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