ver 2009.10.14 → 2009.11.28

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 (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