ver 2009.10.14 → 2009.11.28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (318) hide show
  1. data/CHANGELOG +1094 -0
  2. data/MANIFEST +227 -25
  3. data/README.textile +185 -0
  4. data/bin/ver +96 -12
  5. data/config/detect.rb +73 -21
  6. data/config/keymap/emacs.rb +66 -0
  7. data/config/keymap/vim.rb +250 -140
  8. data/config/preferences/ANTLR.json +10 -0
  9. data/config/preferences/ASP vb.NET.json +3 -0
  10. data/config/preferences/ASP.json +15 -0
  11. data/config/preferences/ActionScript.json +755 -0
  12. data/config/preferences/Active4D.json +89 -0
  13. data/config/preferences/Ada.json +23 -0
  14. data/config/preferences/Ant.json +356 -0
  15. data/config/preferences/Apache.json +644 -0
  16. data/config/preferences/AppleScript.json +92 -0
  17. data/config/preferences/Bison.json +3 -0
  18. data/config/preferences/Blogging.json +3 -0
  19. data/config/preferences/C.json +127 -0
  20. data/config/preferences/CMake.json +41 -0
  21. data/config/preferences/CSS.json +461 -0
  22. data/config/preferences/CTags.json +3 -0
  23. data/config/preferences/CVS.json +3 -0
  24. data/config/preferences/ColdFusion.json +32 -0
  25. data/config/preferences/D.json +58 -0
  26. data/config/preferences/Darcs.json +3 -0
  27. data/config/preferences/Diff.json +67 -0
  28. data/config/preferences/DokuWiki.json +19 -0
  29. data/config/preferences/Doxygen.json +3 -0
  30. data/config/preferences/Dylan.json +3 -0
  31. data/config/preferences/Eiffel.json +59 -0
  32. data/config/preferences/Erlang.json +72 -0
  33. data/config/preferences/Experimental.json +1356 -0
  34. data/config/preferences/F-Script.json +87 -0
  35. data/config/preferences/FXScript.json +78 -0
  36. data/config/preferences/FileMerge.json +3 -0
  37. data/config/preferences/Fortran.json +158 -0
  38. data/config/preferences/GTD2.json +11 -0
  39. data/config/preferences/GTDAlt.json +20 -0
  40. data/config/preferences/GetBundle.json +3 -0
  41. data/config/preferences/Gettext.json +24 -0
  42. data/config/preferences/Graphviz.json +42 -0
  43. data/config/preferences/Greasemonkey.json +3 -0
  44. data/config/preferences/Gri.json +34 -0
  45. data/config/preferences/HTML.json +492 -0
  46. data/config/preferences/Haskell.json +72 -0
  47. data/config/preferences/Hotkey.json +3 -0
  48. data/config/preferences/ImageBrowser.json +3 -0
  49. data/config/preferences/Inform.json +3 -0
  50. data/config/preferences/Ini.json +60 -0
  51. data/config/preferences/Installer.json +3 -0
  52. data/config/preferences/Io.json +64 -0
  53. data/config/preferences/JSON.json +3 -0
  54. data/config/preferences/Java.json +86 -0
  55. data/config/preferences/JavaDoc.json +3 -0
  56. data/config/preferences/JavaScript.json +76 -0
  57. data/config/preferences/LaTeX.json +267 -0
  58. data/config/preferences/Lex/Flex.json +3 -0
  59. data/config/preferences/Lighttpd.json +3 -0
  60. data/config/preferences/LilyPond.json +77 -0
  61. data/config/preferences/Lisp.json +63 -0
  62. data/config/preferences/Logo.json +58 -0
  63. data/config/preferences/Logtalk.json +236 -0
  64. data/config/preferences/Lua.json +24 -0
  65. data/config/preferences/MEL.json +19 -0
  66. data/config/preferences/MIPS Assembler.json +26 -0
  67. data/config/preferences/MacPorts.json +3 -0
  68. data/config/preferences/Mail.json +3 -0
  69. data/config/preferences/Make.json +16 -0
  70. data/config/preferences/Markdown.json +102 -0
  71. data/config/preferences/Math.json +3 -0
  72. data/config/preferences/Matlab.json +128 -0
  73. data/config/preferences/Maven.json +308 -0
  74. data/config/preferences/Mediawiki.json +73 -0
  75. data/config/preferences/Mercurial.json +3 -0
  76. data/config/preferences/Modula.json +37 -0
  77. data/config/preferences/MoinMoin.json +52 -0
  78. data/config/preferences/Navigation.json +3 -0
  79. data/config/preferences/Nemerle.json +3 -0
  80. data/config/preferences/OCaml Code Completion.json +3 -0
  81. data/config/preferences/OCaml.json +163 -0
  82. data/config/preferences/ODCompletion.json +3 -0
  83. data/config/preferences/Objective-C.json +84 -0
  84. data/config/preferences/OpenGL.json +3331 -0
  85. data/config/preferences/Outlines.json +3 -0
  86. data/config/preferences/Pascal.json +60 -0
  87. data/config/preferences/Perforce.json +3 -0
  88. data/config/preferences/Perl.json +15 -0
  89. data/config/preferences/PmWiki.json +27 -0
  90. data/config/preferences/Postscript.json +15 -0
  91. data/config/preferences/Processing.json +32 -0
  92. data/config/preferences/Prolog.json +3 -0
  93. data/config/preferences/Propel.json +3 -0
  94. data/config/preferences/Python.json +38 -0
  95. data/config/preferences/Quake.json +15 -0
  96. data/config/preferences/R.json +33 -0
  97. data/config/preferences/Ragel.json +15 -0
  98. data/config/preferences/Regular Expressions.json +3 -0
  99. data/config/preferences/Remind.json +15 -0
  100. data/config/preferences/Rez.json +46 -0
  101. data/config/preferences/Ruby.json +98 -0
  102. data/config/preferences/S5 Slide Show.json +20 -0
  103. data/config/preferences/SCons.json +3 -0
  104. data/config/preferences/SQL.json +32 -0
  105. data/config/preferences/SSH Config.json +15 -0
  106. data/config/preferences/SVK.json +3 -0
  107. data/config/preferences/SWIG.json +3 -0
  108. data/config/preferences/SWeave.json +32 -0
  109. data/config/preferences/Scheme.json +35 -0
  110. data/config/preferences/Scilab.json +15 -0
  111. data/config/preferences/Setext.json +3 -0
  112. data/config/preferences/Shell Script.json +25 -0
  113. data/config/preferences/Slate.json +113 -0
  114. data/config/preferences/Source.json +132 -0
  115. data/config/preferences/Subversion.json +10 -0
  116. data/config/preferences/TODO.json +3 -0
  117. data/config/preferences/Tabular.json +3 -0
  118. data/config/preferences/Tcl.json +82 -0
  119. data/config/preferences/TerminalMate.json +112 -0
  120. data/config/preferences/Text.json +89 -0
  121. data/config/preferences/TextMate.json +38 -0
  122. data/config/preferences/Textile.json +76 -0
  123. data/config/preferences/Thrift.json +56 -0
  124. data/config/preferences/Transmit.json +3 -0
  125. data/config/preferences/Twiki.json +51 -0
  126. data/config/preferences/Txt2tags.json +81 -0
  127. data/config/preferences/Vectorscript.json +1280 -0
  128. data/config/preferences/XML.json +60 -0
  129. data/config/preferences/Xcode.json +3 -0
  130. data/config/preferences/YAML.json +24 -0
  131. data/config/preferences/iCalendar.json +10 -0
  132. data/config/preferences/iTerm.json +36 -0
  133. data/config/preferences/reStructuredText.json +48 -0
  134. data/config/rc.rb +49 -0
  135. data/config/syntax/ANTLR.json +5 -5
  136. data/config/syntax/{ASP VB.net.json → ASP vb.NET.json } +3 -3
  137. data/config/syntax/ASP.json +1 -1
  138. data/config/syntax/ActionScript.json +6 -6
  139. data/config/syntax/Active4D Config.json +86 -0
  140. data/config/syntax/Active4D Library.json +20 -0
  141. data/config/syntax/Active4D.json +418 -0
  142. data/config/syntax/Ada.json +3 -3
  143. data/config/syntax/Ant.json +196 -0
  144. data/config/syntax/Apache.json +7 -7
  145. data/config/syntax/AppleScript.json +3 -3
  146. data/config/syntax/{Bibtex.json → BibTeX.json} +1 -1
  147. data/config/syntax/Bison.json +59 -0
  148. data/config/syntax/{Blog (HTML).json → Blog - HTML.json } +2 -2
  149. data/config/syntax/{Blog (Markdown).json → Blog - Markdown.json } +2 -2
  150. data/config/syntax/Blog (Text).json b/data/config/syntax/Blog - → Text.json +0 -0
  151. data/config/syntax/Blog (Textile).json b/data/config/syntax/Blog - → Textile.json +0 -0
  152. data/config/syntax/C++.json +3 -3
  153. data/config/syntax/C.json +13 -13
  154. data/config/syntax/CMake Listfile.json +171 -0
  155. data/config/syntax/CSS.json +6 -6
  156. data/config/syntax/CSV.json +108 -0
  157. data/config/syntax/ColdFusion.json +204 -0
  158. data/config/syntax/D.json +560 -0
  159. data/config/syntax/Diff.json +1 -1
  160. data/config/syntax/DokuWiki.json +412 -0
  161. data/config/syntax/Doxygen.json +80 -0
  162. data/config/syntax/Dylan.json +4 -4
  163. data/config/syntax/Erlang.json +5 -5
  164. data/config/syntax/F-Script.json +1 -1
  165. data/config/syntax/FXScript.json +5 -5
  166. data/config/syntax/Fortran - Modern.json +221 -0
  167. data/config/syntax/Fortran - Punchcard.json +468 -0
  168. data/config/syntax/GTD.json +39 -0
  169. data/config/syntax/GTDalt.json +233 -0
  170. data/config/syntax/Gettext.json +118 -0
  171. data/config/syntax/Go.json +555 -0
  172. data/config/syntax/{DOT.json → Graphviz (DOT).json } +3 -3
  173. data/config/syntax/Greasemonkey.json +56 -0
  174. data/config/syntax/Gri.json +4 -4
  175. data/config/syntax/{HTML-ASP.json → HTML (ASP).json } +1 -1
  176. data/config/syntax/{HTML for ASP.net.json → HTML (ASP.net).json } +19 -19
  177. data/config/syntax/HTML (Active4D).json +540 -0
  178. data/config/syntax/HTML (Erlang).json +31 -0
  179. data/config/syntax/HTML (Tcl).json +1 -1
  180. data/config/syntax/HTML.json +20 -20
  181. data/config/syntax/Haskell.json +3 -3
  182. data/config/syntax/Installer Distribution Script.json +135 -0
  183. data/config/syntax/Io.json +6 -6
  184. data/config/syntax/JSON.json +151 -0
  185. data/config/syntax/{JavaProperties.json → Java Properties.json } +2 -2
  186. data/config/syntax/Java Server Page (JSP).json +163 -0
  187. data/config/syntax/Java.json +7 -7
  188. data/config/syntax/JavaDoc.json +435 -0
  189. data/config/syntax/JavaScript.json +8 -8
  190. data/config/syntax/LaTeX Log.json +3 -3
  191. data/config/syntax/LaTeX Memoir.json +101 -0
  192. data/config/syntax/LaTeX.json +2 -2
  193. data/config/syntax/Lex-Flex.json +396 -0
  194. data/config/syntax/LilyPond.json +608 -0
  195. data/config/syntax/Logo.json +48 -0
  196. data/config/syntax/Logtalk.json +6 -6
  197. data/config/syntax/Lua.json +1 -1
  198. data/config/syntax/{M.json → MATLAB.json} +3 -3
  199. data/config/syntax/MEL.json +7 -7
  200. data/config/syntax/MIPS.json b/data/config/syntax/MIPS → Assembler.json +0 -0
  201. data/config/syntax/MacPorts Portfile.json +298 -0
  202. data/config/syntax/Mail.json +1 -1
  203. data/config/syntax/Markdown.json +6 -6
  204. data/config/syntax/Maven POM.json +774 -0
  205. data/config/syntax/Mediawiki.json +736 -0
  206. data/config/syntax/MoinMoin.json +335 -0
  207. data/config/syntax/MultiMarkdown.json +41 -0
  208. data/config/syntax/Nemerle.json +128 -0
  209. data/config/syntax/OCaml.json +4 -4
  210. data/config/syntax/OCamllex.json +307 -0
  211. data/config/syntax/OCamlyacc.json +346 -0
  212. data/config/syntax/Objective-C++.json +2 -2
  213. data/config/syntax/Objective-C.json +979 -0
  214. data/config/syntax/Octave.json +417 -0
  215. data/config/syntax/PHP.json +32 -32
  216. data/config/syntax/Pascal.json +1 -1
  217. data/config/syntax/Perl.json +8 -8
  218. data/config/syntax/{Plain text.json → Plain Text.json } +1 -1
  219. data/config/syntax/PmWiki.json +241 -0
  220. data/config/syntax/Postscript.json +206 -0
  221. data/config/syntax/Processing.json +8 -8
  222. data/config/syntax/Prolog.json +70 -0
  223. data/config/syntax/Python.json +1934 -0
  224. data/config/syntax/{Quake3 Config.json → Quake Style .cfg.json } +1 -1
  225. data/config/syntax/R.json +2 -2
  226. data/config/syntax/Ragel.json +362 -0
  227. data/config/syntax/Rd (R Documentation).json +119 -0
  228. data/config/syntax/Regular Expressions (Oniguruma).json +186 -0
  229. data/config/syntax/Regular Expressions (Python).json +188 -0
  230. data/config/syntax/Release Notes.json +78 -0
  231. data/config/syntax/Remind.json +461 -0
  232. data/config/syntax/Rez.json +5 -5
  233. data/config/syntax/Ruby Sass.json +497 -0
  234. data/config/syntax/Ruby.json +13 -13
  235. data/config/syntax/S5 Slide Show.json +85 -0
  236. data/config/syntax/SQL.json +11 -11
  237. data/config/syntax/SSH Config.json +55 -0
  238. data/config/syntax/SWIG.json +2 -2
  239. data/config/syntax/SWeave.json +139 -0
  240. data/config/syntax/Scheme.json +8 -8
  241. data/config/syntax/Scilab.json +69 -0
  242. data/config/syntax/Setext.json +247 -0
  243. data/config/syntax/{Shell-Unix-Generic.json → Shell Script (Bash).json } +4 -4
  244. data/config/syntax/Slate.json +5 -5
  245. data/config/syntax/Strings File.json +53 -0
  246. data/config/syntax/TSV.json +83 -0
  247. data/config/syntax/Tcl.json +1 -1
  248. data/config/syntax/TeX Math.json +2 -2
  249. data/config/syntax/TeX.json +2 -2
  250. data/config/syntax/Textile.json +9 -9
  251. data/config/syntax/Thrift.json +641 -0
  252. data/config/syntax/Twiki.json +1 -1
  253. data/config/syntax/Txt2tags.json +154 -0
  254. data/config/syntax/XML strict.json +4 -4
  255. data/config/syntax/XML.json +6 -6
  256. data/config/syntax/XSL.json +2 -2
  257. data/config/syntax/camlp4.json +63 -0
  258. data/config/syntax/mod_perl.json +72 -0
  259. data/config/syntax/reStructuredText.json +1 -1
  260. data/config/syntax/{Subversion commit message.json → svn-commit.tmp.json} +0 -0
  261. data/config/tutorial +23 -19
  262. data/config/welcome +3 -3
  263. data/lib/ver.rb +273 -62
  264. data/lib/ver/entry.rb +142 -26
  265. data/lib/ver/font.rb +51 -0
  266. data/lib/ver/help.rb +16 -0
  267. data/lib/ver/help/describe_key.rb +82 -0
  268. data/lib/ver/help/help_for_help.rb +39 -0
  269. data/lib/ver/hover_completion.rb +129 -0
  270. data/lib/ver/keymap.rb +95 -24
  271. data/lib/ver/layout.rb +107 -43
  272. data/lib/ver/methods.rb +24 -8
  273. data/lib/ver/methods/clipboard.rb +91 -0
  274. data/lib/ver/methods/completion.rb +146 -71
  275. data/lib/ver/methods/control.rb +203 -222
  276. data/lib/ver/methods/ctags.rb +55 -0
  277. data/lib/ver/methods/delete.rb +30 -0
  278. data/lib/ver/methods/help.rb +7 -0
  279. data/lib/ver/methods/insert.rb +233 -1
  280. data/lib/ver/methods/move.rb +181 -32
  281. data/lib/ver/methods/open.rb +208 -0
  282. data/lib/ver/methods/preview.rb +14 -0
  283. data/lib/ver/methods/save.rb +111 -0
  284. data/lib/ver/methods/search.rb +57 -7
  285. data/lib/ver/methods/select.rb +97 -17
  286. data/lib/ver/methods/shortcuts.rb +21 -0
  287. data/lib/ver/methods/views.rb +56 -1
  288. data/lib/ver/mode.rb +60 -14
  289. data/lib/ver/status.rb +97 -19
  290. data/lib/ver/syntax.rb +14 -6
  291. data/lib/ver/syntax/detector.rb +16 -5
  292. data/lib/ver/syntax/processor.rb +9 -3
  293. data/lib/ver/text.rb +258 -199
  294. data/lib/ver/text/index.rb +103 -0
  295. data/lib/ver/theme.rb +27 -16
  296. data/lib/ver/tooltip.rb +59 -0
  297. data/lib/ver/vendor/binary_search.rb +61 -0
  298. data/lib/ver/vendor/levenshtein.rb +57 -0
  299. data/lib/ver/{textpow.rb → vendor/textpow.rb} +31 -29
  300. data/lib/ver/view.rb +65 -41
  301. data/lib/ver/view/console.rb +171 -0
  302. data/lib/ver/view/entry.rb +9 -5
  303. data/lib/ver/view/list.rb +44 -29
  304. data/lib/ver/view/list/ex.rb +71 -0
  305. data/lib/ver/view/list/grep.rb +42 -0
  306. data/lib/ver/view/list/methods.rb +159 -0
  307. data/lib/ver/view/term.rb +249 -0
  308. data/tasks/syntax_list.rake +3 -2
  309. data/ver.gemspec +4 -4
  310. metadata +230 -28
  311. data/config/syntax/Bulletin Board.json +0 -428
  312. data/config/syntax/HTML (Mason).json +0 -207
  313. data/config/syntax/HTML (Rails).json +0 -52
  314. data/config/syntax/Movable Type.json +0 -348
  315. data/config/syntax/Ruby on Rails.json +0 -170
  316. data/config/syntax/SQL (Rails).json +0 -31
  317. data/config/syntax/Smarty.json +0 -110
  318. data/config/syntax/Standard ML.json +0 -322
@@ -0,0 +1,21 @@
1
+ module VER
2
+ module Methods
3
+ module Shortcuts
4
+ include Move, Save, Open, Views, Insert
5
+
6
+ alias q view_close
7
+ alias q! quit
8
+ alias w file_save
9
+ alias r insert_file_contents
10
+ alias e open_path
11
+ alias o view_find_or_create
12
+ alias bn view_focus_next
13
+ alias bp view_focus_prev
14
+ alias bd view_close
15
+
16
+ def wq
17
+ w and q
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,6 +1,10 @@
1
1
  module VER
2
2
  module Methods
3
3
  module Views
4
+ def view_find_or_create(file)
5
+ view.find_or_create(file)
6
+ end
7
+
4
8
  def view_create
5
9
  view.create
6
10
  end
@@ -16,6 +20,57 @@ module VER
16
20
  def view_focus_prev
17
21
  view.focus_prev
18
22
  end
23
+
24
+ def view_push_up
25
+ view.push_up
26
+ end
27
+
28
+ def view_push_down
29
+ view.push_down
30
+ end
31
+
32
+ def view_push_top
33
+ view.push_top
34
+ end
35
+
36
+ def view_push_bottom
37
+ view.push_bottom
38
+ end
39
+
40
+ def view_one
41
+ layout.options.merge! master: 1, stacking: 0
42
+ layout.apply
43
+ end
44
+
45
+ def view_two
46
+ layout.options.merge! master: 1, stacking: 1
47
+ layout.apply
48
+ end
49
+
50
+ def view_slave_inc
51
+ stacking = layout.options[:stacking]
52
+ unless stacking >= layout.views.size
53
+ layout.options[:stacking] += 1
54
+ layout.apply
55
+ end
56
+ end
57
+
58
+ def view_slave_dec
59
+ stacking = layout.options[:stacking]
60
+ layout.options[:stacking] -= 1 if stacking > 0
61
+ layout.apply
62
+ end
63
+
64
+ def view_master_inc
65
+ layout.options[:master] += 1
66
+ layout.apply
67
+ end
68
+
69
+ def view_master_dec
70
+ master = layout.options[:master]
71
+ layout.options[:master] -= 1 if master > 0
72
+ layout.apply
73
+ end
19
74
  end
20
75
  end
21
- end
76
+ end
@@ -10,6 +10,10 @@ module VER
10
10
 
11
11
  attr_accessor :callback, :name, :arguments
12
12
 
13
+ def inspect
14
+ "#<Mode #@name>"
15
+ end
16
+
13
17
  def initialize(name, callback)
14
18
  @name, @callback = name, callback
15
19
  @stack = []
@@ -28,7 +32,11 @@ module VER
28
32
  end
29
33
 
30
34
  def find_ancestor(name)
31
- callback.modes[name.to_sym]
35
+ if found = callback.modes[name.to_sym]
36
+ return found
37
+ else
38
+ raise "Mode #{name} is not specified yet"
39
+ end
32
40
  end
33
41
 
34
42
  def ancestors(*done, &block)
@@ -57,12 +65,16 @@ module VER
57
65
  total = hash = {}
58
66
 
59
67
  while key = keychain.shift
60
- register key
68
+ if key.is_a?(Symbol)
69
+ canonical = callback.modes[key]
70
+ else
71
+ canonical = register(key)
72
+ end
61
73
 
62
74
  if keychain.empty?
63
- hash[key] = block || action_name
75
+ hash[canonical] = block || action_name
64
76
  else
65
- hash = hash[key] = {}
77
+ hash = hash[canonical] = {}
66
78
  end
67
79
  end
68
80
 
@@ -81,7 +93,7 @@ module VER
81
93
  @stack << key
82
94
 
83
95
  ancestors do |ancestor|
84
- result = ancestor.attempt_execute(@stack)
96
+ result = ancestor.attempt_execute(@stack.dup)
85
97
 
86
98
  case result
87
99
  when nil # nothing matched yet, but possible in future
@@ -100,7 +112,7 @@ module VER
100
112
  @stack.clear
101
113
  enter_missing(key)
102
114
  rescue => ex
103
- puts ex, *ex.backtrace
115
+ VER.error(ex)
104
116
  @stack.clear
105
117
  end
106
118
 
@@ -108,7 +120,7 @@ module VER
108
120
  execute(@missing, key) if @missing
109
121
  end
110
122
 
111
- def attempt_execute(original_stack)
123
+ def attempt_execute(original_stack, lookup = false)
112
124
  if arguments
113
125
  stack, arg = Mode.split_stack(original_stack)
114
126
  else
@@ -118,15 +130,44 @@ module VER
118
130
  if stack.empty?
119
131
  arg ? nil : false
120
132
  else
121
- executable = stack.inject(@map){|keys, key| keys.fetch(key) }
133
+ executable = @map
134
+ while key = stack.shift
135
+ previous = executable
136
+ executable = executable[key]
137
+
138
+ case executable
139
+ when nil
140
+ # FIXME: this allows only one mode
141
+ if found = previous.find{|prev_key, prev_value| prev_key.is_a?(Mode) }
142
+ mode, action = found
143
+ looked = mode.attempt_execute([key, *stack], true)
144
+
145
+ case looked
146
+ when false
147
+ return false
148
+ when nil
149
+ return nil
150
+ else
151
+ cmd, cmd_arg = looked
152
+ return nil if cmd.is_a?(Hash)
153
+ return execute(action, cmd, arg)
154
+ end
155
+ else
156
+ return false
157
+ end
158
+ end
159
+ end
122
160
 
123
- execute(executable, *arg)
161
+ if lookup
162
+ return executable, arg
163
+ else
164
+ execute(executable, *arg)
165
+ end
124
166
  end
125
- rescue KeyError
126
- false
127
167
  end
128
168
 
129
169
  def execute(executable, *arg)
170
+ arg = [*arg].compact # doesn't allow nil
130
171
  case executable
131
172
  when Hash
132
173
  return nil
@@ -140,18 +181,23 @@ module VER
140
181
  return false
141
182
  end
142
183
 
184
+ true
185
+ rescue ArgumentError => ex
186
+ callback.message("#{executable} : #{ex}")
143
187
  true
144
188
  end
145
189
 
146
190
  def self.split_stack(stack)
147
- return stack, nil if stack[0] == '0'
191
+ first = stack[0]
192
+ return stack, nil if first == '0' || first == '<KeyPress-0>'
148
193
 
149
- pivot = stack.index{|c| c !~ /\d/ }
194
+ pivot = stack.index{|c| c !~ /^(<KeyPress-\d+>|\d+)$/ }
150
195
 
151
196
  if pivot == 0
152
197
  return stack, nil
153
198
  elsif pivot
154
- return stack[pivot..-1], stack[0..pivot].join.to_i
199
+ keys, args = stack[pivot..-1], stack[0..pivot]
200
+ return keys, args.join.scan(/\d+/).join.to_i
155
201
  else
156
202
  return [], stack.join.to_i
157
203
  end
@@ -4,12 +4,15 @@ module VER
4
4
  attr_accessor :keymap, :view
5
5
  attr_reader :mode
6
6
 
7
+ HISTORY = Hash.new{|k,v| k[v] = [] }
8
+
7
9
  def initialize(view, options = {})
8
10
  options[:style] ||= self.class.obtain_style_name
9
11
  super
10
12
  self.view = view
13
+ @question = ''
11
14
 
12
- keymap_name = VER.options.fetch(:keymap)
15
+ keymap_name = VER.options.keymap
13
16
  self.keymap = Keymap.get(name: keymap_name, receiver: self)
14
17
  end
15
18
 
@@ -28,40 +31,115 @@ module VER
28
31
  view.text
29
32
  end
30
33
 
31
- def ask(question, &callback)
32
- @question, @backup_value, @callback = question, value, callback
34
+ def ask(question, options = {}, &callback)
35
+ @backup_value, @callback = value, callback
36
+ @history_idx = -1
33
37
 
34
- message @question
38
+ self.question = question
39
+ submit_when_taken(options[:take])
35
40
  focus
36
41
  end
37
42
 
43
+ def submit_when_taken(length)
44
+ return unless length
45
+ target = value.size + length
46
+
47
+ bind '<<Modified>>' do |event|
48
+ if value.size >= target
49
+ bind('<<Modified>>'){}
50
+ ask_submit
51
+ end
52
+ end
53
+ end
54
+
38
55
  def ask_submit
39
- answer = value.sub(@question, '')
40
- result = @callback.call(answer)
41
- message result.inspect
56
+ answer = value
57
+ history = HISTORY[@question]
58
+ history.uniq!
59
+ history << answer
60
+ self.question = ''
61
+
62
+ case result = @callback.call(answer)
63
+ when String
64
+ message result
65
+ when Symbol
66
+ result
67
+ else
68
+ message result.inspect
69
+ end
42
70
  end
43
71
 
44
72
  def ask_abort
45
- message @backup_value
73
+ self.question = ''
74
+ self.value = @backup_value
46
75
  text.focus
47
76
  end
48
77
 
49
- def delete_char_left
50
- return if @question.size == cursor
51
- super
78
+ def delete(from, to = Tk::None)
79
+ if from < @question.size
80
+ from = @question.size
81
+ end
82
+
83
+ super(from, to)
84
+ end
85
+
86
+ def value=(string)
87
+ super([@question, string].join)
88
+ end
89
+
90
+ def value
91
+ regex = Regexp.escape(@question)
92
+ get.sub(/^#{regex}/, '')
93
+ end
94
+
95
+ def question=(string)
96
+ execute_only(:delete, 0, :end)
97
+ execute_only(:insert, 0, string)
98
+ @question = string.to_s
99
+ Tk::Event.generate(self, '<<Modified>>')
52
100
  end
53
101
 
54
- def go_char_left
55
- return if @question.size == cursor
102
+ def cursor=(pos)
103
+ return if pos < @question.size
56
104
  super
57
105
  end
58
106
 
59
- def go_word_left
60
- if index = value.rindex(/.\b\s/, cursor - 1)
61
- self.cursor = index
62
- else
63
- self.cursor = @question.size
107
+ def history_prev
108
+ @history_idx -= 1
109
+ history = HISTORY[@question]
110
+
111
+ if @history_idx < 0
112
+ @history_idx = history.size - 1
113
+ end
114
+
115
+ p prev: [history, @history_idx]
116
+ answer = history[@history_idx]
117
+ return unless answer
118
+ self.value = answer
119
+ end
120
+
121
+ def history_next
122
+ @history_idx += 1
123
+ history = HISTORY[@question]
124
+
125
+ if @history_idx > history.size
126
+ @history_idx = 0
64
127
  end
128
+
129
+ p next: [history, @history_idx]
130
+ answer = history[@history_idx]
131
+ return unless answer
132
+ self.value = answer
133
+ end
134
+
135
+ def history_complete
136
+ history = HISTORY[@question]
137
+ so_far = value.sub(@question, '')
138
+ needle = Regexp.escape(so_far)
139
+ list = history.grep(/#{needle}/i)
140
+ return if list.empty?
141
+
142
+ self.value = answer
65
143
  end
66
144
  end
67
- end
145
+ end
@@ -11,7 +11,7 @@ module VER
11
11
  if syntax_name = Detector.detect(filename)
12
12
  return new(syntax_name)
13
13
  else
14
- new 'Plain text'
14
+ new(VER.options.filetype)
15
15
  end
16
16
  end
17
17
 
@@ -40,7 +40,7 @@ module VER
40
40
  @theme = theme || Theme.find_and_load(VER.options[:theme])
41
41
  end
42
42
 
43
- def highlight(textarea, code, lineno = 0)
43
+ def highlight(textarea, code, lineno = nil, from = '1.0', to = 'end')
44
44
  if @old_theme
45
45
  @old_theme.delete_tags_on(textarea)
46
46
  @old_theme = nil
@@ -51,12 +51,20 @@ module VER
51
51
  @theme.apply_default_on(textarea)
52
52
  @first_highlight = false
53
53
  else
54
- @theme.remove_tags_on(textarea)
54
+ @theme.remove_tags_on(textarea, from, to)
55
55
  end
56
56
 
57
- pr = Processor.new(textarea, @theme, lineno)
57
+ pr = Processor.new(textarea, @theme, lineno || 0)
58
58
 
59
- parser.parse(code, pr)
59
+ if lineno
60
+ pr.start_parsing(parser.scopeName)
61
+ stack = [[parser, nil]]
62
+ parser.parse_line(stack, code, pr)
63
+ pr.end_parsing(parser.scopeName)
64
+ else
65
+ @theme.remove_tags_on(textarea, from, to)
66
+ parser.parse(code, pr)
67
+ end
60
68
  end
61
69
 
62
70
  def theme=(theme)
@@ -65,4 +73,4 @@ module VER
65
73
  @first_highlight = true
66
74
  end
67
75
  end
68
- end
76
+ end
@@ -22,8 +22,6 @@ module VER
22
22
  path = Pathname(filename.to_s)
23
23
  path = path.readlink if path.symlink?
24
24
 
25
- return unless path.file?
26
-
27
25
  VER.load('detect')
28
26
 
29
27
  override_name || detect_ext(path) || detect_head(path)
@@ -33,11 +31,23 @@ module VER
33
31
  basename = path.basename.to_s
34
32
  return unless basename =~ /\./
35
33
 
36
- EXTS_LIST.find do |name, exts|
34
+ scores = {}
35
+
36
+ EXTS_LIST.each do |name, exts|
37
+ lowest = nil
37
38
  exts.find do |ext|
38
- return name if basename.end_with?(ext)
39
+ if basename.end_with?(ext)
40
+ distance = Levenshtein.distance(basename, ext)
41
+ lowest ||= distance
42
+ lowest = distance if lowest > distance
43
+ end
44
+ # return name if basename.end_with?(ext)
39
45
  end
46
+ scores[name] = lowest if lowest
40
47
  end
48
+
49
+ found = scores.sort_by{|k,v| v }.first
50
+ return found.first if found
41
51
  end
42
52
 
43
53
  def detect_head(path)
@@ -47,7 +57,8 @@ module VER
47
57
  HEAD_LIST.find do |name, head|
48
58
  return name if line =~ head
49
59
  end
60
+ rescue Errno::ENOENT
50
61
  end
51
62
  end
52
63
  end
53
- end
64
+ end