tomkersten-vixploder 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +105 -0
  3. data/PostInstall.txt +21 -0
  4. data/README.rdoc +131 -0
  5. data/Rakefile +21 -0
  6. data/bin/256colors2.pl +63 -0
  7. data/bin/colortest +365 -0
  8. data/bin/vixplode +10 -0
  9. data/lib/dotfiles/aliases +30 -0
  10. data/lib/dotfiles/gvimrc +20 -0
  11. data/lib/dotfiles/vim/.VimballRecord +2 -0
  12. data/lib/dotfiles/vim/after/ftplugin/actionscript_snippets.vim +9 -0
  13. data/lib/dotfiles/vim/after/ftplugin/aspvbs_snippets.vim +17 -0
  14. data/lib/dotfiles/vim/after/ftplugin/c_snippets.vim +58 -0
  15. data/lib/dotfiles/vim/after/ftplugin/css_snippets.vim +30 -0
  16. data/lib/dotfiles/vim/after/ftplugin/django_model_snippets.vim +61 -0
  17. data/lib/dotfiles/vim/after/ftplugin/django_template_snippets.vim +32 -0
  18. data/lib/dotfiles/vim/after/ftplugin/f-script_snippets.vim +14 -0
  19. data/lib/dotfiles/vim/after/ftplugin/haskell_snippets.vim +9 -0
  20. data/lib/dotfiles/vim/after/ftplugin/html_snippets.vim +57 -0
  21. data/lib/dotfiles/vim/after/ftplugin/java_snippets.vim +52 -0
  22. data/lib/dotfiles/vim/after/ftplugin/javascript_snippets.vim +10 -0
  23. data/lib/dotfiles/vim/after/ftplugin/latex_snippets.vim +13 -0
  24. data/lib/dotfiles/vim/after/ftplugin/logo_snippets.vim +9 -0
  25. data/lib/dotfiles/vim/after/ftplugin/markdown_snippets.vim +10 -0
  26. data/lib/dotfiles/vim/after/ftplugin/movable_type_snippets.vim +14 -0
  27. data/lib/dotfiles/vim/after/ftplugin/objc_snippets.vim +53 -0
  28. data/lib/dotfiles/vim/after/ftplugin/ocaml_snippets.vim +26 -0
  29. data/lib/dotfiles/vim/after/ftplugin/perl_snippets.vim +23 -0
  30. data/lib/dotfiles/vim/after/ftplugin/php_snippets.vim +30 -0
  31. data/lib/dotfiles/vim/after/ftplugin/phpdoc_snippets.vim +19 -0
  32. data/lib/dotfiles/vim/after/ftplugin/propel_snippets.vim +14 -0
  33. data/lib/dotfiles/vim/after/ftplugin/python_snippets.vim +202 -0
  34. data/lib/dotfiles/vim/after/ftplugin/rails_snippets.vim +54 -0
  35. data/lib/dotfiles/vim/after/ftplugin/ruby_snippets.vim +32 -0
  36. data/lib/dotfiles/vim/after/ftplugin/sh_snippets.vim +12 -0
  37. data/lib/dotfiles/vim/after/ftplugin/slate_snippets.vim +19 -0
  38. data/lib/dotfiles/vim/after/ftplugin/smarty_snippets.vim +35 -0
  39. data/lib/dotfiles/vim/after/ftplugin/symfony_snippets.vim +21 -0
  40. data/lib/dotfiles/vim/after/ftplugin/tcl_snippets.vim +14 -0
  41. data/lib/dotfiles/vim/after/ftplugin/template_toolkit_snippets.vim +13 -0
  42. data/lib/dotfiles/vim/after/ftplugin/tex_snippets.vim +13 -0
  43. data/lib/dotfiles/vim/after/ftplugin/xhtml_snippets.vim +48 -0
  44. data/lib/dotfiles/vim/autoload/fakeclip.vim +253 -0
  45. data/lib/dotfiles/vim/autoload/rails.vim +4377 -0
  46. data/lib/dotfiles/vim/autoload/rubycomplete.vim +802 -0
  47. data/lib/dotfiles/vim/colors/inkpot.vim +212 -0
  48. data/lib/dotfiles/vim/colors/ir_black.vim +212 -0
  49. data/lib/dotfiles/vim/colors/ir_black_mod.vim +213 -0
  50. data/lib/dotfiles/vim/colors/railscasts.vim +100 -0
  51. data/lib/dotfiles/vim/colors/rubyblue.vim +74 -0
  52. data/lib/dotfiles/vim/colors/twilight.vim +75 -0
  53. data/lib/dotfiles/vim/colors/twilight2.vim +74 -0
  54. data/lib/dotfiles/vim/colors/wombat256.vim +302 -0
  55. data/lib/dotfiles/vim/compiler/eruby.vim +41 -0
  56. data/lib/dotfiles/vim/compiler/ruby.vim +68 -0
  57. data/lib/dotfiles/vim/compiler/rubyunit.vim +35 -0
  58. data/lib/dotfiles/vim/doc/NERD_tree.txt +1235 -0
  59. data/lib/dotfiles/vim/doc/fakeclip.txt +190 -0
  60. data/lib/dotfiles/vim/doc/matchit.txt +406 -0
  61. data/lib/dotfiles/vim/doc/project.txt +710 -0
  62. data/lib/dotfiles/vim/doc/rails.txt +1123 -0
  63. data/lib/dotfiles/vim/doc/snippets_emu.txt +354 -0
  64. data/lib/dotfiles/vim/doc/surround.txt +218 -0
  65. data/lib/dotfiles/vim/doc/tags +433 -0
  66. data/lib/dotfiles/vim/filetype.vim +13 -0
  67. data/lib/dotfiles/vim/ftdetect/gist.vim +3 -0
  68. data/lib/dotfiles/vim/ftdetect/ruby.vim +14 -0
  69. data/lib/dotfiles/vim/ftplugin/eruby.vim +101 -0
  70. data/lib/dotfiles/vim/ftplugin/ruby.vim +230 -0
  71. data/lib/dotfiles/vim/indent/eruby.vim +73 -0
  72. data/lib/dotfiles/vim/indent/ruby.vim +373 -0
  73. data/lib/dotfiles/vim/plugin/NERD_tree.vim +3536 -0
  74. data/lib/dotfiles/vim/plugin/comments.vim +321 -0
  75. data/lib/dotfiles/vim/plugin/fakeclip.vim +174 -0
  76. data/lib/dotfiles/vim/plugin/fuzzyfinder.vim +1676 -0
  77. data/lib/dotfiles/vim/plugin/fuzzyfinder_textmate.vim +150 -0
  78. data/lib/dotfiles/vim/plugin/gist.vim +241 -0
  79. data/lib/dotfiles/vim/plugin/gitdiff.vim +141 -0
  80. data/lib/dotfiles/vim/plugin/matchit.vim +812 -0
  81. data/lib/dotfiles/vim/plugin/mru.vim +787 -0
  82. data/lib/dotfiles/vim/plugin/rails.vim +310 -0
  83. data/lib/dotfiles/vim/plugin/rspec.vim +12 -0
  84. data/lib/dotfiles/vim/plugin/snippets.vim +17 -0
  85. data/lib/dotfiles/vim/plugin/snippetsEmu.vim +973 -0
  86. data/lib/dotfiles/vim/plugin/supertab.vim +531 -0
  87. data/lib/dotfiles/vim/plugin/surround.vim +632 -0
  88. data/lib/dotfiles/vim/ref_vimrc +80 -0
  89. data/lib/dotfiles/vim/ruby/fuzzy_file_finder.rb +353 -0
  90. data/lib/dotfiles/vim/syntax/eruby.vim +85 -0
  91. data/lib/dotfiles/vim/syntax/haml.vim +113 -0
  92. data/lib/dotfiles/vim/syntax/mkd.vim +86 -0
  93. data/lib/dotfiles/vim/syntax/ruby.vim +324 -0
  94. data/lib/dotfiles/vim/syntax/sass.vim +93 -0
  95. data/lib/dotfiles/vimrc +269 -0
  96. data/lib/vixplode/cli.rb +73 -0
  97. data/lib/vixploder.rb +6 -0
  98. data/script/console +10 -0
  99. data/script/destroy +14 -0
  100. data/script/generate +14 -0
  101. data/spec/spec.opts +1 -0
  102. data/spec/spec_helper.rb +10 -0
  103. data/spec/vixplode_cli_spec.rb +15 -0
  104. data/spec/vixploder_spec.rb +7 -0
  105. data/tasks/rspec.rake +21 -0
  106. metadata +202 -8
@@ -0,0 +1,310 @@
1
+ " rails.vim - Detect a rails application
2
+ " Author: Tim Pope <vimNOSPAM@tpope.info>
3
+ " GetLatestVimScripts: 1567 1 :AutoInstall: rails.vim
4
+ " URL: http://rails.vim.tpope.net/
5
+
6
+ " Install this file as plugin/rails.vim. See doc/rails.txt for details. (Grab
7
+ " it from the URL above if you don't have it.) To access it from Vim, see
8
+ " :help add-local-help (hint: :helptags ~/.vim/doc) Afterwards, you should be
9
+ " able to do :help rails
10
+
11
+ " ============================================================================
12
+
13
+ " Exit quickly when:
14
+ " - this plugin was already loaded (or disabled)
15
+ " - when 'compatible' is set
16
+ if &cp || (exists("g:loaded_rails") && g:loaded_rails) && !(exists("g:rails_debug") && g:rails_debug)
17
+ finish
18
+ endif
19
+ let g:loaded_rails = 1
20
+
21
+ " Apparently, the nesting level within Vim when the Ruby interface is
22
+ " initialized determines how much stack space Ruby gets. In previous
23
+ " versions of rails.vim, sporadic stack overflows occured when omnicomplete
24
+ " was used. This was apparently due to rails.vim having first initialized
25
+ " ruby deep in a nested function call.
26
+ if has("ruby")
27
+ silent! ruby nil
28
+ endif
29
+
30
+ " Utility Functions {{{1
31
+
32
+ function! s:error(str)
33
+ echohl ErrorMsg
34
+ echomsg a:str
35
+ echohl None
36
+ let v:errmsg = a:str
37
+ endfunction
38
+
39
+ function! s:autoload(...)
40
+ if !exists("g:autoloaded_rails")
41
+ runtime! autoload/rails.vim
42
+ endif
43
+ if exists("g:autoloaded_rails")
44
+ if a:0
45
+ exe a:1
46
+ endif
47
+ return 1
48
+ endif
49
+ if !exists("g:rails_no_autoload_warning")
50
+ let g:rails_no_autoload_warning = 1
51
+ call s:error("Disabling rails.vim: autoload/rails.vim is missing")
52
+ endif
53
+ return ""
54
+ endfunction
55
+
56
+ " }}}1
57
+ " Configuration {{{
58
+
59
+ function! s:SetOptDefault(opt,val)
60
+ if !exists("g:".a:opt)
61
+ let g:{a:opt} = a:val
62
+ endif
63
+ endfunction
64
+
65
+ call s:SetOptDefault("rails_level",3)
66
+ call s:SetOptDefault("rails_statusline",1)
67
+ call s:SetOptDefault("rails_syntax",1)
68
+ call s:SetOptDefault("rails_mappings",1)
69
+ call s:SetOptDefault("rails_abbreviations",1)
70
+ call s:SetOptDefault("rails_expensive",1+0*(has("win32")||has("win32unix")))
71
+ call s:SetOptDefault("rails_dbext",g:rails_expensive)
72
+ call s:SetOptDefault("rails_subversion",0)
73
+ call s:SetOptDefault("rails_default_file","README")
74
+ call s:SetOptDefault("rails_default_database","")
75
+ call s:SetOptDefault("rails_root_url",'http://localhost:3000/')
76
+ call s:SetOptDefault("rails_modelines",0)
77
+ call s:SetOptDefault("rails_menu",1)
78
+ call s:SetOptDefault("rails_gnu_screen",1)
79
+ call s:SetOptDefault("rails_history_size",5)
80
+ call s:SetOptDefault("rails_debug",0)
81
+ call s:SetOptDefault("rails_generators","controller\nintegration_test\nmailer\nmigration\nmodel\nobserver\nplugin\nresource\nscaffold\nsession_migration")
82
+ call s:SetOptDefault("rails_rake_tasks","db:charset\ndb:collation\ndb:create\ndb:create:all\ndb:drop\ndb:drop:all\ndb:fixtures:identify\ndb:fixtures:load\ndb:migrate\ndb:reset\ndb:rollback\ndb:schema:dump\ndb:schema:load\ndb:sessions:clear\ndb:sessions:create\ndb:structure:dump\ndb:test:clone\ndb:test:clone_structure\ndb:test:prepare\ndb:test:purge\ndb:version\ndoc:app\ndoc:clobber_app\ndoc:clobber_plugins\ndoc:clobber_rails\ndoc:plugins\ndoc:rails\ndoc:reapp\ndoc:rerails\nlog:clear\nnotes\nnotes:fixme\nnotes:optimize\nnotes:todo\nrails:freeze:edge\nrails:freeze:gems\nrails:unfreeze\nrails:update\nrails:update:configs\nrails:update:javascripts\nrails:update:scripts\nroutes\nstats\ntest\ntest:functionals\ntest:integration\ntest:plugins\ntest:recent\ntest:uncommitted\ntest:units\ntmp:cache:clear\ntmp:clear\ntmp:create\ntmp:pids:clear\ntmp:sessions:clear\ntmp:sockets:clear")
83
+ if g:rails_dbext
84
+ if exists("g:loaded_dbext") && executable("sqlite3") && ! executable("sqlite")
85
+ " Since dbext can't find it by itself
86
+ call s:SetOptDefault("dbext_default_SQLITE_bin","sqlite3")
87
+ endif
88
+ endif
89
+
90
+ " }}}1
91
+ " Detection {{{1
92
+
93
+ function! s:escvar(r)
94
+ let r = fnamemodify(a:r,':~')
95
+ let r = substitute(r,'\W','\="_".char2nr(submatch(0))."_"','g')
96
+ let r = substitute(r,'^\d','_&','')
97
+ return r
98
+ endfunction
99
+
100
+ function! s:Detect(filename)
101
+ let fn = substitute(fnamemodify(a:filename,":p"),'\c^file://','','')
102
+ if fn =~ '[\/]config[\/]environment\.rb$'
103
+ return s:BufInit(strpart(fn,0,strlen(fn)-22))
104
+ endif
105
+ if isdirectory(fn)
106
+ let fn = fnamemodify(fn,":s?[\/]$??")
107
+ else
108
+ let fn = fnamemodify(fn,':s?\(.*\)[\/][^\/]*$?\1?')
109
+ endif
110
+ let ofn = ""
111
+ let nfn = fn
112
+ while nfn != ofn && nfn != ""
113
+ if exists("s:_".s:escvar(nfn))
114
+ return s:BufInit(nfn)
115
+ endif
116
+ let ofn = nfn
117
+ let nfn = fnamemodify(nfn,':h')
118
+ endwhile
119
+ let ofn = ""
120
+ while fn != ofn
121
+ if filereadable(fn . "/config/environment.rb")
122
+ return s:BufInit(fn)
123
+ endif
124
+ let ofn = fn
125
+ let fn = fnamemodify(ofn,':s?\(.*\)[\/]\(app\|config\|db\|doc\|lib\|log\|public\|script\|spec\|test\|tmp\|vendor\)\($\|[\/].*$\)?\1?')
126
+ endwhile
127
+ return 0
128
+ endfunction
129
+
130
+ function! s:BufInit(path)
131
+ let s:_{s:escvar(a:path)} = 1
132
+ if s:autoload()
133
+ return RailsBufInit(a:path)
134
+ endif
135
+ endfunction
136
+
137
+ " }}}1
138
+ " Initialization {{{1
139
+
140
+ augroup railsPluginDetect
141
+ autocmd!
142
+ autocmd BufNewFile,BufRead * call s:Detect(expand("<afile>:p"))
143
+ autocmd VimEnter * if expand("<amatch>") == "" && !exists("b:rails_root") | call s:Detect(getcwd()) | endif | if exists("b:rails_root") | silent doau User BufEnterRails | endif
144
+ autocmd FileType netrw if !exists("b:rails_root") | call s:Detect(expand("<afile>:p")) | endif | if exists("b:rails_root") | silent doau User BufEnterRails | endif
145
+ autocmd BufEnter * if exists("b:rails_root")|silent doau User BufEnterRails|endif
146
+ autocmd BufLeave * if exists("b:rails_root")|silent doau User BufLeaveRails|endif
147
+ autocmd FileType railslog if s:autoload()|call RailslogSyntax()|endif
148
+ augroup END
149
+
150
+ command! -bar -bang -nargs=* -complete=dir Rails :if s:autoload()|call RailsNewApp(<bang>0,<f-args>)|endif
151
+
152
+ " }}}1
153
+ " Menus {{{1
154
+
155
+ if !(g:rails_menu && has("menu"))
156
+ finish
157
+ endif
158
+
159
+ function! s:sub(str,pat,rep)
160
+ return substitute(a:str,'\v\C'.a:pat,a:rep,'')
161
+ endfunction
162
+
163
+ function! s:gsub(str,pat,rep)
164
+ return substitute(a:str,'\v\C'.a:pat,a:rep,'g')
165
+ endfunction
166
+
167
+ function! s:CreateMenus() abort
168
+ if exists("g:rails_installed_menu") && g:rails_installed_menu != ""
169
+ exe "aunmenu ".s:gsub(g:rails_installed_menu,'\&','')
170
+ unlet g:rails_installed_menu
171
+ endif
172
+ if has("menu") && (exists("g:did_install_default_menus") || exists("$CREAM")) && g:rails_menu
173
+ if g:rails_menu > 1
174
+ let g:rails_installed_menu = '&Rails'
175
+ else
176
+ let g:rails_installed_menu = '&Plugin.&Rails'
177
+ endif
178
+ if exists("$CREAM")
179
+ let menucmd = '87anoremenu <script> '
180
+ exe menucmd.g:rails_installed_menu.'.-PSep- :'
181
+ exe menucmd.g:rails_installed_menu.'.&Related\ file\ :R\ /\ Alt+] :R<CR>'
182
+ exe menucmd.g:rails_installed_menu.'.&Alternate\ file\ :A\ /\ Alt+[ :A<CR>'
183
+ exe menucmd.g:rails_installed_menu.'.&File\ under\ cursor\ Ctrl+Enter :Rfind<CR>'
184
+ else
185
+ let menucmd = 'anoremenu <script> '
186
+ exe menucmd.g:rails_installed_menu.'.-PSep- :'
187
+ exe menucmd.g:rails_installed_menu.'.&Related\ file\ :R\ /\ ]f :R<CR>'
188
+ exe menucmd.g:rails_installed_menu.'.&Alternate\ file\ :A\ /\ [f :A<CR>'
189
+ exe menucmd.g:rails_installed_menu.'.&File\ under\ cursor\ gf :Rfind<CR>'
190
+ endif
191
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.Application\ &Controller :find app/controllers/application.rb<CR>'
192
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.Application\ &Helper :find app/helpers/application_helper.rb<CR>'
193
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.Application\ &Javascript :find public/javascripts/application.js<CR>'
194
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.Application\ &Layout :Rlayout application<CR>'
195
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.Application\ &README :find doc/README_FOR_APP<CR>'
196
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.&Environment :find config/environment.rb<CR>'
197
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.&Database\ Configuration :find config/database.yml<CR>'
198
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.Database\ &Schema :call <SID>findschema()<CR>'
199
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.R&outes :find config/routes.rb<CR>'
200
+ exe menucmd.g:rails_installed_menu.'.&Other\ files.&Test\ Helper :find test/test_helper.rb<CR>'
201
+ exe menucmd.g:rails_installed_menu.'.-FSep- :'
202
+ exe menucmd.g:rails_installed_menu.'.Ra&ke\ :Rake :Rake<CR>'
203
+ let tasks = g:rails_rake_tasks
204
+ while tasks != ''
205
+ let task = matchstr(tasks,'.\{-\}\ze\%(\n\|$\)')
206
+ let tasks = s:sub(tasks,'.{-}%(\n|$)','')
207
+ exe menucmd.g:rails_installed_menu.'.Rake\ &tasks\ :Rake.'.s:sub(s:sub(task,'^[^:]*$','&:all'),':','.').' :Rake '.task.'<CR>'
208
+ endwhile
209
+ let tasks = g:rails_generators
210
+ while tasks != ''
211
+ let task = matchstr(tasks,'.\{-\}\ze\%(\n\|$\)')
212
+ let tasks = s:sub(tasks,'.{-}%(\n|$)','')
213
+ exe menucmd.'<silent> '.g:rails_installed_menu.'.&Generate\ :Rgen.'.s:gsub(task,'_','\\ ').' :call <SID>menuprompt("Rgenerate '.task.'","Arguments for script/generate '.task.': ")<CR>'
214
+ exe menucmd.'<silent> '.g:rails_installed_menu.'.&Destroy\ :Rdestroy.'.s:gsub(task,'_','\\ ').' :call <SID>menuprompt("Rdestroy '.task.'","Arguments for script/destroy '.task.': ")<CR>'
215
+ endwhile
216
+ exe menucmd.g:rails_installed_menu.'.&Server\ :Rserver.&Start\ :Rserver :Rserver<CR>'
217
+ exe menucmd.g:rails_installed_menu.'.&Server\ :Rserver.&Force\ start\ :Rserver! :Rserver!<CR>'
218
+ exe menucmd.g:rails_installed_menu.'.&Server\ :Rserver.&Kill\ :Rserver!\ - :Rserver! -<CR>'
219
+ exe menucmd.'<silent> '.g:rails_installed_menu.'.&Evaluate\ Ruby\.\.\.\ :Rp :call <SID>menuprompt("Rp","Code to execute and output: ")<CR>'
220
+ exe menucmd.g:rails_installed_menu.'.&Console\ :Rconsole :Rconsole<CR>'
221
+ exe menucmd.g:rails_installed_menu.'.&Preview\ :Rpreview :Rpreview<CR>'
222
+ exe menucmd.g:rails_installed_menu.'.&Log\ file\ :Rlog :Rlog<CR>'
223
+ exe s:sub(menucmd,'anoremenu','vnoremenu').' <silent> '.g:rails_installed_menu.'.E&xtract\ as\ partial\ :Rextract :call <SID>menuprompt("'."'".'<,'."'".'>Rextract","Partial name (e.g., template or /controller/template): ")<CR>'
224
+ exe menucmd.g:rails_installed_menu.'.&Migration\ writer\ :Rinvert :Rinvert<CR>'
225
+ exe menucmd.' '.g:rails_installed_menu.'.-HSep- :'
226
+ exe menucmd.'<silent> '.g:rails_installed_menu.'.&Help\ :help\ rails :if <SID>autoload()<Bar>exe RailsHelpCommand("")<Bar>endif<CR>'
227
+ exe menucmd.'<silent> '.g:rails_installed_menu.'.Abo&ut\ :if <SID>autoload()<Bar>exe RailsHelpCommand("about")<Bar>endif<CR>'
228
+ let g:rails_did_menus = 1
229
+ call s:ProjectMenu()
230
+ call s:menuBufLeave()
231
+ if exists("b:rails_root")
232
+ call s:menuBufEnter()
233
+ endif
234
+ endif
235
+ endfunction
236
+
237
+ function! s:ProjectMenu()
238
+ if exists("g:rails_did_menus") && g:rails_history_size > 0
239
+ if !exists("g:RAILS_HISTORY")
240
+ let g:RAILS_HISTORY = ""
241
+ endif
242
+ let history = g:RAILS_HISTORY
243
+ let menu = s:gsub(g:rails_installed_menu,'\&','')
244
+ silent! exe "aunmenu <script> ".menu.".Projects"
245
+ let dots = s:gsub(menu,'[^.]','')
246
+ exe 'anoremenu <script> <silent> '.(exists("$CREAM") ? '87' : '').dots.'.100 '.menu.'.Pro&jects.&New\.\.\.\ :Rails :call <SID>menuprompt("Rails","New application path and additional arguments: ")<CR>'
247
+ exe 'anoremenu <script> '.menu.'.Pro&jects.-FSep- :'
248
+ while history =~ '\n'
249
+ let proj = matchstr(history,'^.\{-\}\ze\n')
250
+ let history = s:sub(history,'^.{-}\n','')
251
+ exe 'anoremenu <script> '.menu.'.Pro&jects.'.s:gsub(proj,'[.\\ ]','\\&').' :e '.s:gsub(proj."/".g:rails_default_file,'[ !%#]','\\&')."<CR>"
252
+ endwhile
253
+ endif
254
+ endfunction
255
+
256
+ function! s:menuBufEnter()
257
+ if exists("g:rails_installed_menu") && g:rails_installed_menu != ""
258
+ let menu = s:gsub(g:rails_installed_menu,'\&','')
259
+ exe 'amenu enable '.menu.'.*'
260
+ if RailsFileType() !~ '^view\>'
261
+ exe 'vmenu disable '.menu.'.Extract\ as\ partial'
262
+ endif
263
+ if RailsFileType() !~ '^\%(db-\)\=migration$' || RailsFilePath() =~ '\<db/schema\.rb$'
264
+ exe 'amenu disable '.menu.'.Migration\ writer'
265
+ endif
266
+ call s:ProjectMenu()
267
+ endif
268
+ endfunction
269
+
270
+ function! s:menuBufLeave()
271
+ if exists("g:rails_installed_menu") && g:rails_installed_menu != ""
272
+ let menu = s:gsub(g:rails_installed_menu,'\&','')
273
+ exe 'amenu disable '.menu.'.*'
274
+ exe 'amenu enable '.menu.'.Help\ '
275
+ exe 'amenu enable '.menu.'.About\ '
276
+ exe 'amenu enable '.menu.'.Projects'
277
+ endif
278
+ endfunction
279
+
280
+ function! s:menuprompt(vimcmd,prompt)
281
+ let res = inputdialog(a:prompt,'','!!!')
282
+ if res == '!!!'
283
+ return ""
284
+ endif
285
+ exe a:vimcmd." ".res
286
+ endfunction
287
+
288
+ function! s:findschema()
289
+ let env = exists('$RAILS_ENV') ? $RAILS_ENV : "development"
290
+ if filereadable(b:rails_root."/db/schema.rb")
291
+ edit `=b:rails_root.'/db/schema.rb'`
292
+ elseif filereadable(b:rails_root.'/db/'.env.'_structure.sql')
293
+ edit `=b:rails_root.'/db/'.env.'_structure.sql'`
294
+ else
295
+ return s:error("Schema not found: try :Rake db:schema:dump")
296
+ endif
297
+ endfunction
298
+
299
+ call s:CreateMenus()
300
+
301
+ augroup railsPluginMenu
302
+ autocmd!
303
+ autocmd User BufEnterRails call s:menuBufEnter()
304
+ autocmd User BufLeaveRails call s:menuBufLeave()
305
+ " g:RAILS_HISTORY hasn't been set when s:InitPlugin() is called.
306
+ autocmd VimEnter * call s:ProjectMenu()
307
+ augroup END
308
+
309
+ " }}}1
310
+ " vim:set sw=2 sts=2:
@@ -0,0 +1,12 @@
1
+ noremap <buffer><silent> <F10> :w<CR>:echo "Running test file..."<CR>:!spec %<CR>
2
+
3
+ " Sigh... everybody has their own keystroke for running specs...
4
+
5
+ " for VS aficionados...
6
+ " noremap <buffer><silent> <F5> :w<CR>:echo "Running tests..."<CR>:let spec_response = system("spec -l ".line(".")." ".expand("%"))<CR>:echo spec_response<CR>
7
+
8
+ " for Mac/Textmate geeks...
9
+ noremap <buffer><silent> <M-r> :w<CR>:echo "Running tests..."<CR>:let spec_response = system("spec -l ".line(".")." ".expand("%"))<CR>:echo spec_response<CR>
10
+
11
+ " randomly chosen to be near F10...
12
+ noremap <buffer><silent> <F11> :w<CR>:echo "Running tests..."<CR>:let spec_response = system("spec -l ".line(".")." ".expand("%"))<CR>:echo spec_response<CR>
@@ -0,0 +1,17 @@
1
+ func Eatchar(pat)
2
+ let c = nr2char(getchar(0))
3
+ return (c =~ a:pat) ? '' : c
4
+ endfunc
5
+
6
+ nmap <silent> <Tab> /!@[^@]*@!/<CR>"_cf!
7
+ nmap <silent> ; /!@[^@]*@!/<CR>"_cf!
8
+
9
+ iab <silent> ea each do \|!@block_variable@!\|<CR>!@block@!<CR>end<CR><Esc>3k0;<C-R>=Eatchar('\s')<CR>
10
+ iab <silent> eal each { \|!@block_variable@!\| !@block@! }<CR><Esc>3k0;<C-R>=Eatchar('\s')<CR>
11
+
12
+ iab <silent> dm def !@method@!<CR>!@method_body@!<CR>end<CR><Esc>3k0;<C-R>=Eatchar('\s')<CR>
13
+
14
+ iab <silent> des describe '!@method@!' do<CR>!@its@!<CR>end<Esc>2k0;<C-R>=Eatchar('\s')<CR>
15
+ iab <silent> iit it "should !@should@!" do<CR>!@something@!<CR>end<CR><Esc>3k0;<C-R>=Eatchar('\s')<CR>
16
+ iab <silent> desit describe '!@method@!' do<CR>it "should !@should@!" do<CR>!@stuff@!<CR>end<CR>end<CR><Esc>5k<Esc>;<C-R>=Eatchar('\s')<CR>
17
+ iab <silent> bef before(:each) do<CR>end<CR><Esc>kO<C-R>=Eatchar('\s')<CR>
@@ -0,0 +1,973 @@
1
+ " File: snippetsEmu.vim
2
+ " Author: Felix Ingram
3
+ " ( f.ingram.lists <AT> gmail.com )
4
+ " Description: An attempt to implement TextMate style Snippets. Features include
5
+ " automatic cursor placement and command execution.
6
+ " $LastChangedDate$
7
+ " Version: 1.1
8
+ " $Revision$
9
+ "
10
+ " This file contains some simple functions that attempt to emulate some of the
11
+ " behaviour of 'Snippets' from the OS X editor TextMate, in particular the
12
+ " variable bouncing and replacement behaviour.
13
+ "
14
+ " {{{ USAGE:
15
+ "
16
+ " Place the file in your plugin directory.
17
+ " Define snippets using the Snippet command.
18
+ " Snippets are best defined in the 'after' subdirectory of your Vim home
19
+ " directory ('~/.vim/after' on Unix). Filetype specific snippets can be defined
20
+ " in '~/.vim/after/ftplugin/<filetype>_snippets.vim. Using the <buffer> argument will
21
+ " By default snippets are buffer specific. To define general snippets available
22
+ " globally use the 'Iabbr' command.
23
+ "
24
+ " Example One:
25
+ " Snippet fori for <{datum}> in <{data}>:<CR><{datum}>.<{}>
26
+ "
27
+ " The above will expand to the following (indenting may differ):
28
+ "
29
+ " for <{datum}> in <{data}>:
30
+ " <{datum}>.<{}>
31
+ "
32
+ " The cursor will be placed after the first '<{' in insert mode.
33
+ " Pressing <Tab> will 'tab' to the next place marker (<{data}>) in
34
+ " insert mode. Adding text between <{ and }> and then hitting <{Tab}> will
35
+ " remove the angle brackets and replace all markers with a similar identifier.
36
+ "
37
+ " Example Two:
38
+ " With the cursor at the pipe, hitting <Tab> will replace:
39
+ " for <{MyVariableName|datum}> in <{data}>:
40
+ " <{datum}>.<{}>
41
+ "
42
+ " with (the pipe shows the cursor placement):
43
+ "
44
+ " for MyVariableName in <{data}>:
45
+ " MyVariableName.<{}>
46
+ "
47
+ " Enjoy.
48
+ "
49
+ " For more information please see the documentation accompanying this plugin.
50
+ "
51
+ " Additional Features:
52
+ "
53
+ " Commands in tags. Anything after a ':' in a tag will be run with Vim's
54
+ " 'execute' command. The value entered by the user (or the tag name if no change
55
+ " has been made) is passed in the @z register (the original contents of the
56
+ " register are restored once the command has been run).
57
+ "
58
+ " Named Tags. Naming a tag (the <{datum}> tag in the example above) and changing
59
+ " the value will cause all other tags with the same name to be changed to the
60
+ " same value (as illustrated in the above example). Not changing the value and
61
+ " hitting <Tab> will cause the tag's name to be used as the default value.
62
+ "
63
+ " Test tags for pattern matching:
64
+ " The following are examples of valid and invalid tags. Whitespace can only be
65
+ " used in a tag name if the name is enclosed in quotes.
66
+ "
67
+ " Valid tags
68
+ " <{}>
69
+ " <{tagName}>
70
+ " <{tagName:command}>
71
+ " <{"Tag Name"}>
72
+ " <{"Tag Name":command}>
73
+ "
74
+ " Invalid tags, random text
75
+ " <{:}>
76
+ " <{:command}>
77
+ " <{Tag Name}>
78
+ " <{Tag Name:command}>
79
+ " <{"Tag Name":}>
80
+ " <{Tag }>
81
+ " <{OpenTag
82
+ "
83
+ " Here's our magic search term (assumes '<{',':' and '}>' as our tag delimiters:
84
+ " <{\([^[:punct:] \t]\{-}\|".\{-}"\)\(:[^}>]\{-1,}\)\?}>
85
+ " }}}
86
+
87
+ if v:version < 700
88
+ echomsg "snippetsEmu plugin requires Vim version 7 or later"
89
+ finish
90
+ endif
91
+
92
+ if globpath(&rtp, 'plugin/snippetEmu.vim') != ""
93
+ call confirm("It looks like you've got an old version of snippetsEmu installed. Please delete the file 'snippetEmu.vim' from the plugin directory. Note lack of 's'")
94
+ endif
95
+
96
+ let s:debug = 0
97
+ let s:Disable = 0
98
+
99
+ function! s:Debug(func, text)
100
+ if exists('s:debug') && s:debug == 1
101
+ echom "Snippy: ".a:func.": ".a:text
102
+ endif
103
+ endfunction
104
+
105
+ if (exists('loaded_snippet') || &cp) && !s:debug
106
+ finish
107
+ endif
108
+
109
+ "call s:Debug("","Started the plugin")
110
+
111
+ let loaded_snippet=1
112
+ " {{{ Set up variables
113
+ if !exists("g:snip_start_tag")
114
+ let g:snip_start_tag = "<{"
115
+ endif
116
+
117
+ if !exists("g:snip_end_tag")
118
+ let g:snip_end_tag = "}>"
119
+ endif
120
+
121
+ if !exists("g:snip_elem_delim")
122
+ let g:snip_elem_delim = ":"
123
+ endif
124
+
125
+ if !exists("g:snippetsEmu_key")
126
+ let g:snippetsEmu_key = "<Tab>"
127
+ endif
128
+
129
+ "call s:Debug("", "Set variables")
130
+
131
+ " }}}
132
+ " {{{ Set up menu
133
+ for def_file in split(globpath(&rtp, "after/ftplugin/*_snippets.vim"), '\n')
134
+ "call s:Debug("","Adding ".def_file." definitions to menu")
135
+ let snip = substitute(def_file, '.*[\\/]\(.*\)_snippets.vim', '\1', '')
136
+ exec "nmenu <silent> S&nippets.".snip." :source ".def_file."<CR>"
137
+ endfor
138
+ " }}}
139
+ " {{{ Sort out supertab
140
+ function! s:GetSuperTabSNR()
141
+ let a_sav = @a
142
+ redir @a
143
+ exec "silent function"
144
+ redir END
145
+ let funclist = @a
146
+ let @a = a_sav
147
+ try
148
+ let func = split(split(matchstr(funclist,'.SNR.\{-}SuperTab(command)'),'\n')[-1])[1]
149
+ return matchlist(func, '\(.*\)S')[1]
150
+ catch /E684/
151
+ endtry
152
+ return ""
153
+ endfunction
154
+
155
+ function! s:SetupSupertab()
156
+ if !exists('s:supInstalled')
157
+ let s:supInstalled = 0
158
+ endif
159
+ if s:supInstalled == 1 || globpath(&rtp, 'plugin/supertab.vim') != ""
160
+ "call s:Debug("SetupSupertab", "Supertab installed")
161
+ let s:SupSNR = s:GetSuperTabSNR()
162
+ let s:supInstalled = 1
163
+ if s:SupSNR != ""
164
+ let s:done_remap = 1
165
+ else
166
+ let s:done_remap = 0
167
+ endif
168
+ endif
169
+ endfunction
170
+
171
+ call s:SetupSupertab()
172
+ " }}}
173
+ " {{{ Map Jumper to the default key if not set already
174
+ function! s:SnipMapKeys()
175
+ if (!hasmapto('<Plug>Jumper','i'))
176
+ if s:supInstalled == 1
177
+ exec 'imap '.g:snippetsEmu_key.' <Plug>Jumper'
178
+ else
179
+ exec 'imap <unique> '.g:snippetsEmu_key.' <Plug>Jumper'
180
+ endif
181
+ endif
182
+
183
+ if (!hasmapto( 'i<BS>'.g:snippetsEmu_key, 's'))
184
+ exec 'smap <unique> '.g:snippetsEmu_key.' i<BS>'.g:snippetsEmu_key
185
+ endif
186
+ imap <silent> <script> <Plug>Jumper <C-R>=<SID>Jumper()<CR>
187
+ endfunction
188
+
189
+ call s:SnipMapKeys()
190
+
191
+ "call s:Debug("", "Mapped keys")
192
+
193
+ " }}}
194
+ " {{{ SetLocalTagVars()
195
+ function! s:SetLocalTagVars()
196
+ if exists("b:snip_end_tag") && exists("b:snip_start_tag") && exists("b:snip_elem_delim")
197
+ return [b:snip_start_tag, b:snip_elem_delim, b:snip_end_tag]
198
+ else
199
+ return [g:snip_start_tag, g:snip_elem_delim, g:snip_end_tag]
200
+ endif
201
+ endfunction
202
+ " }}}
203
+ " {{{ SetSearchStrings() - Set the search string. Checks for buffer dependence
204
+ function! s:SetSearchStrings()
205
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
206
+ let b:search_str = snip_start_tag.'\([^'.
207
+ \snip_start_tag.snip_end_tag.
208
+ \'[:punct:] \t]\{-}\|".\{-}"\)\('.
209
+ \snip_elem_delim.
210
+ \'[^'.snip_end_tag.snip_start_tag.']\{-1,}\)\?'.snip_end_tag
211
+ let b:search_commandVal = "[^".snip_elem_delim."]*"
212
+ let b:search_endVal = "[^".snip_end_tag."]*"
213
+ endfunction
214
+ " }}}
215
+ " {{{ SetCom(text, scope) - Set command function
216
+ function! <SID>SetCom(text, scope)
217
+ let text = substitute(a:text, '\c<CR>\|<Esc>\|<Tab>\|<BS>\|<Space>\|<C-r>\|<Bar>\|\"\|\\','\\&',"g")
218
+
219
+ if s:supInstalled == 1
220
+ call s:SetupSupertab()
221
+ call s:SnipMapKeys()
222
+ endif
223
+
224
+ let text = substitute(text, "\r$", "","")
225
+
226
+ let tokens = split(text, ' ')
227
+ call filter(tokens, 'v:val != ""')
228
+ if len(tokens) == 0
229
+ let output = join(s:ListSnippets("","","",eval(a:scope)) ,"\n")
230
+ if output == ""
231
+ echohl Title | echo "No snippets defined" | echohl None
232
+ else
233
+ echohl Title | echo "Defined snippets:" | echohl None
234
+ echo output
235
+ endif
236
+ " NOTE - cases such as ":Snippet if " will intentionally(?) be parsed as a
237
+ " snippet named "if" with contents of " "
238
+ elseif len(tokens) == 1
239
+ let snip = s:Hash(tokens[0])
240
+ if exists(a:scope."trigger_".snip)
241
+ " FIXME - is there a better approach?
242
+ " echo doesn't handle ^M correctly
243
+ let pretty = substitute(eval(a:scope."trigger_".snip), "\r", "\n","g")
244
+ echo pretty
245
+ else
246
+ echohl Error | echo "Undefined snippet: ".snip | echohl None
247
+ endif
248
+ else
249
+ let [lhs, rhs] = [s:Hash(tokens[0]), join(tokens[1:])]
250
+ call s:SetSearchStrings()
251
+ let g:search_str = b:search_str
252
+ exe "let ".a:scope."trigger_".lhs.' = "'.rhs.'"'
253
+ endif
254
+ endfunction
255
+ " }}}
256
+ " {{{ RestoreSearch()
257
+ " Checks whether more tags exist and restores hlsearch and @/ if not
258
+ function! s:RestoreSearch()
259
+ if !search(b:search_str, "n")
260
+ if exists("b:hl_on") && b:hl_on == 1
261
+ setlocal hlsearch
262
+ endif
263
+ if exists("b:search_sav")
264
+ let @/ = b:search_sav
265
+ endif
266
+ endif
267
+ endfunction
268
+ "}}}
269
+ " {{{ DeleteEmptyTag
270
+ function! s:DeleteEmptyTag()
271
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
272
+ exec "normal zv".(s:StrLen(snip_start_tag) + s:StrLen(snip_end_tag))."x"
273
+ endfunction
274
+ " }}}
275
+ " {{{ SetUpTags()
276
+ function! s:SetUpTags()
277
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
278
+ if (strpart(getline("."), col(".")+strlen(snip_start_tag)-1, strlen(snip_end_tag)) == snip_end_tag)
279
+ "call s:Debug("SetUpTags","Found an empty tag")
280
+ let b:tag_name = ""
281
+ if col(".") + s:StrLen(snip_start_tag.snip_end_tag) == s:StrLen(getline("."))
282
+ " We delete the empty tag here as otherwise we can't determine whether we
283
+ " need to send 'a' or 'A' as deleting the empty tag will sit us on the
284
+ " final character either way
285
+ call s:DeleteEmptyTag()
286
+ call s:RestoreSearch()
287
+ if col(".") == s:StrLen(getline("."))
288
+ return "\<Esc>a"
289
+ endif
290
+ else
291
+ call s:DeleteEmptyTag()
292
+ call s:RestoreSearch()
293
+ if col(".") == s:StrLen(getline("."))
294
+ return "\<Esc>A"
295
+ endif
296
+ endif
297
+ return ''
298
+ else
299
+ " Not on an empty tag so it must be a normal tag
300
+ let b:tag_name = s:ChopTags(matchstr(getline("."),b:search_str,col(".")-1))
301
+ "call s:Debug("SetUpTags","On a tag called: ".b:tag_name)
302
+
303
+ " Check for exclusive selection mode. If exclusive is not set then we need to
304
+ " move back a character.
305
+ if &selection == "exclusive"
306
+ let end_skip = ""
307
+ else
308
+ let end_skip = "\<Left>"
309
+ endif
310
+
311
+ let start_skip = repeat("\<Right>",s:StrLen(snip_start_tag)+1)
312
+ "call s:Debug("SetUpTags","Start skip is: ".start_skip)
313
+ "call s:Debug("SetUpTags","Col() is: ".col("."))
314
+ if col(".") == 1
315
+ "call s:Debug("SetUpTags","We're at the start of the line so don't need to skip the first char of start tag")
316
+ let start_skip = strpart(start_skip, 0, strlen(start_skip)-strlen("\<Right>"))
317
+ "call s:Debug("SetUpTags","Start skip is now: ".start_skip)
318
+ endif
319
+ "call s:Debug("SetUpTags","Returning: \<Esc>".start_skip."v/".snip_end_tag."\<CR>".end_skip."\<C-g>")
320
+ return "\<Esc>".start_skip."v/".snip_end_tag."\<CR>".end_skip."\<C-g>"
321
+ endif
322
+ endfunction
323
+ " }}}
324
+ " {{{ NextHop() - Jump to the next tag if one is available
325
+ function! <SID>NextHop()
326
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
327
+ "call s:Debug("NextHop", "Col() is: ".col("."))
328
+ "call s:Debug("NextHop", "Position of next match = ".match(getline("."), b:search_str))
329
+ " First check to see if we have any tags on lines above the current one
330
+ " If the first match is after the current cursor position or not on this
331
+ " line...
332
+ if match(getline("."), b:search_str) >= col(".") || match(getline("."), b:search_str) == -1
333
+ " Perform a search to jump to the next tag
334
+ "call s:Debug("NextHop", "Seaching for a tag")
335
+ if search(b:search_str) != 0
336
+ return s:SetUpTags()
337
+ else
338
+ " there are no more matches
339
+ "call s:Debug("NextHop", "No more tags in the buffer")
340
+ " Restore hlsarch and @/
341
+ call s:RestoreSearch()
342
+ return ''
343
+ endif
344
+ else
345
+ " The match on the current line is on or before the cursor, so we need to
346
+ " move the cursor back
347
+ "call s:Debug("NextHop", "Moving the cursor back")
348
+ "call s:Debug("NextHop", "Col is: ".col("."))
349
+ "call s:Debug("NextHop", "Moving back to column: ".match(getline("."), b:search_str))
350
+ while col(".") > match(getline("."), b:search_str) + 1
351
+ call cursor(0,col('.')-1)
352
+ endwhile
353
+ "call s:Debug("NextHop", "Col is now: ".col("."))
354
+ " Now we just set up the tag as usual
355
+ return s:SetUpTags()
356
+ endif
357
+ endfunction
358
+ " }}}
359
+ " {{{ RunCommand() - Execute commands stored in tags
360
+ function! s:RunCommand(command, z)
361
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
362
+ "call s:Debug("RunCommand", "RunCommand was passed this command: ".a:command." and this value: ".a:z)
363
+ if a:command == ''
364
+ return a:z
365
+ endif
366
+ " Save current value of 'z'
367
+ let snip_save = @z
368
+ let @z=a:z
369
+ " Call the command
370
+ execute 'let ret = '. a:command
371
+ " Replace the value
372
+ let @z = snip_save
373
+ return ret
374
+ endfunction
375
+ " }}}
376
+ " {{{ MakeChanges() - Search the document making all the changes required
377
+ " This function has been factored out to allow the addition of commands in tags
378
+ function! s:MakeChanges()
379
+ " Make all the changes
380
+ " Change all the tags with the same name and no commands defined
381
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
382
+
383
+ if b:tag_name == ""
384
+ "call s:Debug("MakeChanges", "Nothing to do: tag_name is empty")
385
+ return
386
+ endif
387
+
388
+ let tagmatch = '\V'.snip_start_tag.b:tag_name.snip_end_tag
389
+
390
+ "call s:Debug("MakeChanges", "Matching on this value: ".tagmatch)
391
+ "call s:Debug("MakeChanges", "Replacing with this value: ".s:replaceVal)
392
+
393
+ try
394
+ "call s:Debug("MakeChanges", "Running these commands: ".join(b:command_dict[b:tag_name], "', '"))
395
+ catch /E175/
396
+ "call s:Debug("MakeChanges", "Could not find this key in the dict: ".b:tag_name)
397
+ endtry
398
+
399
+ let ind = 0
400
+ while search(tagmatch,"w") > 0
401
+ try
402
+ let commandResult = s:RunCommand(b:command_dict[b:tag_name][0], s:replaceVal)
403
+ catch /E175/
404
+ "call s:Debug("MakeChanges", "Could not find this key in the dict: ".b:tag_name)
405
+ endtry
406
+ "call s:Debug("MakeChanges", "Got this result: ".commandResult)
407
+ let lines = split(substitute(getline("."), tagmatch, commandResult, ''),'\n')
408
+ if len(lines) > 1
409
+ call setline(".", lines[0])
410
+ call append(".", lines[1:])
411
+ else
412
+ call setline(".", lines)
413
+ endif
414
+ try
415
+ unlet b:command_dict[b:tag_name][0]
416
+ catch /E175/
417
+ "call s:Debug("MakeChanges", "Could not find this key in the dict: ".b:tag_name)
418
+ endtry
419
+ endwhile
420
+ endfunction
421
+ " }}}
422
+ " {{{ ChangeVals() - Set up values for MakeChanges()
423
+ function! s:ChangeVals(changed)
424
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
425
+
426
+ if a:changed == 1
427
+ let s:CHANGED_VAL = 1
428
+ else
429
+ let s:CHANGED_VAL = 0
430
+ endif
431
+
432
+ "call s:Debug("ChangeVals", "CHANGED_VAL: ".s:CHANGED_VAL)
433
+ "call s:Debug("ChangeVals", "b:tag_name: ".b:tag_name)
434
+ let elem_match = match(s:line, snip_elem_delim, s:curCurs)
435
+ let tagstart = strridx(getline("."), snip_start_tag,s:curCurs)+strlen(snip_start_tag)
436
+
437
+ "call s:Debug("ChangeVals", "About to access b:command_dict")
438
+ try
439
+ let commandToRun = b:command_dict[b:tag_name][0]
440
+ "call s:Debug("ChangeVals", "Accessed command_dict")
441
+ "call s:Debug("ChangeVals", "Running this command: ".commandToRun)
442
+ unlet b:command_dict[b:tag_name][0]
443
+ "call s:Debug("ChangeVals", "Command list is now: ".join(b:command_dict[b:tag_name], "', '"))
444
+ catch /E175/
445
+ "call s:Debug("ChangeVals", "Could not find this key in the dict: ".b:tag_name)
446
+ endtry
447
+
448
+ let commandMatch = substitute(commandToRun, '\', '\\\\', 'g')
449
+ if s:CHANGED_VAL
450
+ " The value has changed so we need to grab our current position back
451
+ " to the start of the tag
452
+ let replaceVal = strpart(getline("."), tagstart,s:curCurs-tagstart)
453
+ "call s:Debug("ChangeVals", "User entered this value: ".replaceVal)
454
+ let tagmatch = replaceVal
455
+ "call s:Debug("ChangeVals", "Col is: ".col("."))
456
+ call cursor(0,col('.')-s:StrLen(tagmatch))
457
+ "call s:Debug("ChangeVals", "Col is: ".col("."))
458
+ else
459
+ " The value hasn't changed so it's just the tag name
460
+ " without any quotes that are around it
461
+ "call s:Debug("ChangeVals", "Tag name is: ".b:tag_name)
462
+ let replaceVal = substitute(b:tag_name, '^"\(.*\)"$', '\1', '')
463
+ "call s:Debug("ChangeVals", "User did not enter a value. Replacing with this value: ".replaceVal)
464
+ let tagmatch = ''
465
+ "call s:Debug("ChangeVals", "Col is: ".col("."))
466
+ endif
467
+
468
+ let tagmatch = '\V'.snip_start_tag.tagmatch.snip_end_tag
469
+ "call s:Debug("ChangeVals", "Matching on this string: ".tagmatch)
470
+ let tagsubstitution = s:RunCommand(commandToRun, replaceVal)
471
+ let lines = split(substitute(getline("."), tagmatch, tagsubstitution, ""),'\n')
472
+ if len(lines) > 1
473
+ call setline(".", lines[0])
474
+ call append(".", lines[1:])
475
+ else
476
+ call setline(".", lines)
477
+ endif
478
+ " We use replaceVal instead of tagsubsitution as otherwise the command
479
+ " result will be passed to subsequent tags
480
+ let s:replaceVal = replaceVal
481
+ let line = line('.')
482
+ let col = col('.')
483
+ call s:MakeChanges()
484
+ call cursor(line, col)
485
+ unlet s:CHANGED_VAL
486
+ endfunction
487
+ " }}}
488
+ "{{{ SID() - Get the SID for the current script
489
+ function! s:SID()
490
+ return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')
491
+ endfun
492
+ "}}}
493
+ "{{{ CheckForInTag() - Check whether we're in a tag
494
+ function! s:CheckForInTag()
495
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
496
+ if snip_start_tag != snip_end_tag
497
+ " The tags are different so we can check to see whether the
498
+ " end tag comes before a start tag
499
+ let s:startMatch = match(s:line, '\V'.snip_start_tag, s:curCurs)
500
+ let s:endMatch = match(s:line, '\V'.snip_end_tag, s:curCurs)
501
+
502
+ if s:endMatch != -1 && ((s:endMatch < s:startMatch) || s:startMatch == -1)
503
+ " End has come before start so we're in a tag.
504
+ return 1
505
+ else
506
+ return 0
507
+ endif
508
+ else
509
+ " Start and end tags are the same so we need do tag counting to see
510
+ " whether we're in a tag.
511
+ let s:count = 0
512
+ let s:curSkip = s:curCurs
513
+ while match(strpart(s:line,s:curSkip),snip_start_tag) != -1
514
+ if match(strpart(s:line,s:curSkip),snip_start_tag) == 0
515
+ let s:curSkip = s:curSkip + 1
516
+ else
517
+ let s:curSkip = s:curSkip + 1 + match(strpart(s:line,s:curSkip),snip_start_tag)
518
+ endif
519
+ let s:count = s:count + 1
520
+ endwhile
521
+ if (s:count % 2) == 1
522
+ " Odd number of tags implies we're inside a tag.
523
+ return 1
524
+ else
525
+ " We're not inside a tag.
526
+ return 0
527
+ endif
528
+ endif
529
+ endfunction
530
+ "}}}
531
+ " {{{ SubSpecialVars(text)
532
+ function! s:SubSpecialVars(text)
533
+ let text = a:text
534
+ let text = substitute(text, 'SNIP_FILE_NAME', expand('%'), 'g')
535
+ let text = substitute(text, 'SNIP_ISO_DATE', strftime("%Y-%m-%d"), 'g')
536
+ return text
537
+ endfunction
538
+ " }}}
539
+ " {{{ SubCommandOutput(text)
540
+ function! s:SubCommandOutput(text)
541
+ let search = '``.\{-}``'
542
+ let text = a:text
543
+ while match(text, search) != -1
544
+ let command_match = matchstr(text, search)
545
+ "call s:Debug("SubCommandOutput", "Command found: ".command_match)
546
+ let command = substitute(command_match, '^..\(.*\)..$', '\1', '')
547
+ "call s:Debug("SubCommandOutput", "Command being run: ".command)
548
+ exec 'let output = '.command
549
+ let output = escape(output, '\')
550
+ let text = substitute(text, '\V'.escape(command_match, '\'), output, '')
551
+ endwhile
552
+ let text = substitute(text, '\\`\\`\(.\{-}\)\\`\\`','``\1``','g')
553
+ return text
554
+ endfunction
555
+ " }}}
556
+ " {{{ RemoveAndStoreCommands(text)
557
+ function! s:RemoveAndStoreCommands(text)
558
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
559
+
560
+ let text = a:text
561
+ if !exists("b:command_dict")
562
+ let b:command_dict = {}
563
+ endif
564
+
565
+ let tmp_command_dict = {}
566
+ try
567
+ let ind = match(text, b:search_str)
568
+ catch /E55: Unmatched \\)/
569
+ call confirm("SnippetsEmu has caught an error while performing a search. This is most likely caused by setting the start and end tags to special characters. Try setting the 'fileencoding' of the file in which you defined them to 'utf-8'.\n\nThe plugin will be disabled for the remainder of this Vim session.")
570
+ let s:Disable = 1
571
+ return ''
572
+ endtry
573
+ while ind > -1
574
+ "call s:Debug("RemoveAndStoreCommands", "Text is: ".text)
575
+ "call s:Debug("RemoveAndStoreCommands", "index is: ".ind)
576
+ let tag = matchstr(text, b:search_str, ind)
577
+ "call s:Debug("RemoveAndStoreCommands", "Tag is: ".tag)
578
+ let commandToRun = matchstr(tag, snip_elem_delim.".*".snip_end_tag)
579
+
580
+ if commandToRun != ''
581
+ let tag_name = strpart(tag,strlen(snip_start_tag),match(tag,snip_elem_delim)-strlen(snip_start_tag))
582
+ "call s:Debug("RemoveAndStoreCommands", "Got this tag: ".tag_name)
583
+ "call s:Debug("RemoveAndStoreCommands", "Adding this command: ".commandToRun)
584
+ if tag_name != ''
585
+ if has_key(tmp_command_dict, tag_name)
586
+ call add(tmp_command_dict[tag_name], strpart(commandToRun, 1, strlen(commandToRun)-strlen(snip_end_tag)-1))
587
+ else
588
+ let tmp_command_dict[tag_name] = [strpart(commandToRun, 1, strlen(commandToRun)-strlen(snip_end_tag)-1)]
589
+ endif
590
+ endif
591
+ let text = substitute(text, '\V'.escape(commandToRun,'\'), snip_end_tag,'')
592
+ else
593
+ let tag_name = s:ChopTags(tag)
594
+ if tag_name != ''
595
+ if has_key(tmp_command_dict, tag_name)
596
+ call add(tmp_command_dict[tag_name], '')
597
+ else
598
+ let tmp_command_dict[tag_name] = ['']
599
+ endif
600
+ endif
601
+ endif
602
+ "call s:Debug("RemoveAndStoreCommands", "".tag." found at ".ind)
603
+ let ind = match(text, b:search_str, ind+strlen(snip_end_tag))
604
+ endwhile
605
+
606
+ for key in keys(tmp_command_dict)
607
+ if has_key(b:command_dict, key)
608
+ for item in reverse(tmp_command_dict[key])
609
+ call insert(b:command_dict[key], item)
610
+ endfor
611
+ else
612
+ let b:command_dict[key] = tmp_command_dict[key]
613
+ endif
614
+ endfor
615
+ return text
616
+ endfunction
617
+ " }}}
618
+ " {{{ ReturnKey() - Return our mapped key or Supertab key
619
+ function! s:ReturnKey()
620
+ if s:supInstalled
621
+ "call s:Debug('ReturnKey', 'Snippy: SuperTab installed. Returning <C-n> instead of <Tab>')
622
+ return "\<C-R>=".s:SupSNR."SuperTab('n')\<CR>"
623
+ else
624
+ " We need this hacky line as the one below doesn't seem to work.
625
+ " Patches welcome
626
+ exe "return \"".substitute(g:snippetsEmu_key, '^<', "\\\\<","")."\""
627
+ "return substitute(g:snippetsEmu_key, '^<', "\\<","")
628
+ endif
629
+ endfunction
630
+ " }}}
631
+ " {{{ Jumper()
632
+ " We need to rewrite this function to reflect the new behaviour. Every jump
633
+ " will now delete the markers so we need to allow for the following conditions
634
+ " 1. Empty tags e.g. "<{}>". When we land inside then we delete the tags.
635
+ " "<{:}>" is now an invalid tag (use "<{}>" instead) so we don't need to check for
636
+ " this
637
+ " 2. Tag with variable name. Save the variable name for the next jump.
638
+ " 3. Tag with command. Tags no longer have default values. Everything after the
639
+ " centre delimiter until the end tag is assumed to be a command.
640
+ "
641
+ " Jumper is performed when we want to perform a jump. If we've landed in a
642
+ " 1. style tag then we'll be in free form text and just want to jump to the
643
+ " next tag. If we're in a 2. or 3. style tag then we need to look for whether
644
+ " the value has changed and make all the replacements. If we're in a 3.
645
+ " style tag then we need to replace all the occurrences with their command
646
+ " modified values.
647
+ "
648
+ function! <SID>Jumper()
649
+ if s:Disable == 1
650
+ return substitute(g:snippetsEmu_key, '^<', "\\<",'')
651
+ endif
652
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
653
+
654
+ " Set up some mapping in case we got called before Supertab
655
+ if s:supInstalled == 1 && s:done_remap != 1
656
+ call s:SetupSupertab()
657
+ call s:SnipMapKeys()
658
+ endif
659
+
660
+ if !exists('b:search_str') && exists('g:search_str')
661
+ let b:search_str = g:search_str
662
+ endif
663
+
664
+ if !exists('b:search_str')
665
+ return s:ReturnKey()
666
+ endif
667
+
668
+ let s:curCurs = col(".") - 1
669
+ let s:curLine = line(".")
670
+ let s:line = getline(".")
671
+ let s:replaceVal = ""
672
+
673
+ " First we'll check that the user hasn't just typed a snippet to expand
674
+ let origword = matchstr(strpart(getline("."), 0, s:curCurs), '\(^\|\s\)\S\{-}$')
675
+ let origword = substitute(origword, '\s', "", "")
676
+ "call s:Debug("Jumper", "Original word was: ".origword)
677
+ let word = s:Hash(origword)
678
+ " The following code is lifted from the imaps.vim script - Many
679
+ " thanks for the inspiration to add the TextMate compatibility
680
+ let rhs = ''
681
+ let found = 0
682
+ " Check for buffer specific expansions
683
+ if exists('b:trigger_'.word)
684
+ exe 'let rhs = b:trigger_'.word
685
+ let found = 1
686
+ elseif exists('g:trigger_'.word)
687
+ " also check for global definitions
688
+ exe 'let rhs = g:trigger_'.word
689
+ let found = 1
690
+ endif
691
+
692
+ if found == 0
693
+ " Check using keyword boundary
694
+ let origword = matchstr(strpart(getline("."), 0, s:curCurs), '\k\{-}$')
695
+ "call s:Debug("Jumper", "Original word was: ".origword)
696
+ let word = s:Hash(origword)
697
+ if exists('b:trigger_'.word)
698
+ exe 'let rhs = b:trigger_'.word
699
+ elseif exists('g:trigger_'.word)
700
+ " also check for global definitions
701
+ exe 'let rhs = g:trigger_'.word
702
+ endif
703
+ endif
704
+
705
+ if rhs != ''
706
+ " Save the value of hlsearch
707
+ if &hls
708
+ "call s:Debug("Jumper", "Hlsearch set")
709
+ setlocal nohlsearch
710
+ let b:hl_on = 1
711
+ else
712
+ "call s:Debug("Jumper", "Hlsearch not set")
713
+ let b:hl_on = 0
714
+ endif
715
+ " Save the last search value
716
+ let b:search_sav = @/
717
+ " Count the number of lines in the rhs
718
+ let move_up = ""
719
+ if len(split(rhs, "\<CR>")) - 1 != 0
720
+ let move_up = len(split(rhs, "\<CR>")) - 1
721
+ let move_up = move_up."\<Up>"
722
+ endif
723
+
724
+ " If this is a mapping, then erase the previous part of the map
725
+ " by returning a number of backspaces.
726
+ let bkspc = substitute(origword, '.', "\<BS>", "g")
727
+ "call s:Debug("Jumper", "Backspacing ".s:StrLen(origword)." characters")
728
+ let delEndTag = ""
729
+ if s:CheckForInTag()
730
+ "call s:Debug("Jumper", "We're doing a nested tag")
731
+ "call s:Debug("Jumper", "B:tag_name: ".b:tag_name)
732
+ if b:tag_name != ''
733
+ try
734
+ "call s:Debug("Jumper", "Commands for this tag are currently: ".join(b:command_dict[b:tag_name],"', '"))
735
+ "call s:Debug("Jumper", "Removing command for '".b:tag_name."'")
736
+ unlet b:command_dict[b:tag_name][0]
737
+ "call s:Debug("Jumper", "Commands for this tag are now: ".join(b:command_dict[b:tag_name],"', '"))
738
+ catch /E175/
739
+ "call s:Debug("Jumper", "Could not find this key in the dict: ".b:tag_name)
740
+ endtry
741
+ endif
742
+ "call s:Debug("Jumper", "Deleting start tag")
743
+ let bkspc = bkspc.substitute(snip_start_tag, '.', "\<BS>", "g")
744
+ "call s:Debug("Jumper", "Deleting end tag")
745
+ let delEndTag = substitute(snip_end_tag, '.', "\<Del>", "g")
746
+ "call s:Debug("Jumper", "Deleting ".s:StrLen(delEndTag)." characters")
747
+ endif
748
+
749
+ " We've found a mapping so we'll substitute special variables
750
+ let rhs = s:SubSpecialVars(rhs)
751
+ let rhs = s:SubCommandOutput(rhs)
752
+ " Now we'll chop out the commands from tags
753
+ let rhs = s:RemoveAndStoreCommands(rhs)
754
+ if s:Disable == 1
755
+ return substitute(g:snippetsEmu_key, '^<', "\\<",'')
756
+ endif
757
+
758
+ " Save the value of 'backspace'
759
+ let bs_save = &backspace
760
+ set backspace=indent,eol,start
761
+ return bkspc.delEndTag.rhs."\<Esc>".move_up."^:set backspace=".bs_save."\<CR>a\<C-r>=<SNR>".s:SID()."_NextHop()\<CR>"
762
+ else
763
+ " No definition so let's check to see whether we're in a tag
764
+ if s:CheckForInTag()
765
+ "call s:Debug("Jumper", "No mapping and we're in a tag")
766
+ " We're in a tag so we need to do processing
767
+ if strpart(s:line, s:curCurs - strlen(snip_start_tag), strlen(snip_start_tag)) == snip_start_tag
768
+ "call s:Debug("Jumper", "Value not changed")
769
+ call s:ChangeVals(0)
770
+ else
771
+ "call s:Debug("Jumper", "Value changed")
772
+ call s:ChangeVals(1)
773
+ endif
774
+ return "\<C-r>=<SNR>".s:SID()."_NextHop()\<CR>"
775
+ else
776
+ " We're not in a tag so we'll see whether there are more tags
777
+ if search(b:search_str, "n")
778
+ " More tags so let's perform nexthop
779
+ let s:replaceVal = ""
780
+ return "\<C-r>=<SNR>".s:SID()."_NextHop()\<CR>"
781
+ else
782
+ " No more tags so let's return a Tab after restoring hlsearch and @/
783
+ call s:RestoreSearch()
784
+ if exists("b:command_dict")
785
+ unlet b:command_dict
786
+ endif
787
+ return s:ReturnKey()
788
+ endif
789
+ endif
790
+ endif
791
+ endfunction
792
+ " }}}
793
+ "{{{ ListSnippets() - Return a list of snippets - used for command completion
794
+ function! s:ListSnippets(ArgLead, CmdLine, CursorPos, scope)
795
+ " Only allow completion for the second argument
796
+ " TODO
797
+ return sort(map(map(filter(keys(a:scope), 'v:val =~ "^trigger_'.a:ArgLead.'"'), 'v:val[8:]'), 's:UnHash(v:val)'))
798
+ endfunction
799
+
800
+ function! s:ListBufferSnippets(ArgLead, CmdLine, CursorPos)
801
+ return s:ListSnippets(a:ArgLead, a:CmdLine, a:CursorPos, b:)
802
+ endfunction
803
+
804
+ function! s:ListGlobalSnippets(ArgLead, CmdLine, CursorPos)
805
+ return s:ListSnippets(a:ArgLead, a:CmdLine, a:CursorPos, g:)
806
+ endfunction
807
+ " }}}
808
+ " {{{ DelSnippet() - Delete a snippet
809
+ function! s:DelSnippet(snippet, scope)
810
+ if a:snippet != ""
811
+ try
812
+ exec "unlet ".a:scope."trigger_".s:Hash(a:snippet)
813
+ catch /E108: No such variable:/
814
+ echom "Snippet '".a:snippet."' does not exist."
815
+ endtry
816
+ endif
817
+ endfunction
818
+ " }}}
819
+ " {{{ Set up the 'Iabbr' and 'Snippet' commands
820
+ "command! -nargs=+ Iabbr execute s:SetCom(<q-args>)
821
+ "command! -nargs=+ Snippet execute s:SetCom("<buffer> ".<q-args>)
822
+ command! -complete=customlist,s:ListGlobalSnippets -nargs=*
823
+ \ Iabbr call <SID>SetCom(<q-args>, "g:")
824
+ command! -complete=customlist,s:ListBufferSnippets -nargs=*
825
+ \ Snippet call <SID>SetCom(<q-args>, "b:")
826
+ command! -range CreateSnippet <line1>,<line2>call s:CreateSnippet()
827
+ command! -range CreateBundleSnippet <line1>,<line2>call s:CreateBundleSnippet()
828
+ command! -complete=customlist,s:ListBufferSnippets -nargs=*
829
+ \ DelSnippet call <SID>DelSnippet(<q-args>, "b:")
830
+ command! -complete=customlist,s:ListGlobalSnippets -nargs=*
831
+ \ DelIabbr call <SID>DelSnippet(<q-args>, "g:")
832
+ "}}}
833
+ " {{{ Utility functions
834
+
835
+ " This function will convert the selected range into a snippet
836
+ function! s:CreateSnippet() range
837
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
838
+ let snip = ""
839
+ if &expandtab
840
+ let tabs = indent(a:firstline)/&shiftwidth
841
+ let tabstr = repeat(' ',&shiftwidth)
842
+ else
843
+ let tabs = indent(a:firstline)/&tabstop
844
+ let tabstr = '\t'
845
+ endif
846
+ let tab_text = repeat(tabstr,tabs)
847
+
848
+ for i in range(a:firstline, a:lastline)
849
+ "First chop off the indent
850
+ let text = substitute(getline(i),tab_text,'','')
851
+ "Now replace 'tabs' with <Tab>s
852
+ let text = substitute(text, tabstr, '<Tab>','g')
853
+ "And trim the newlines
854
+ let text = substitute(text, "\r", '','g')
855
+ let snip = snip.text.'<CR>'
856
+ endfor
857
+ let tag = snip_start_tag.snip_end_tag
858
+ let split_sav = &swb
859
+ set swb=useopen
860
+ if bufexists("Snippets")
861
+ belowright sb Snippets
862
+ else
863
+ belowright sp Snippets
864
+ endif
865
+ resize 8
866
+ setlocal buftype=nofile
867
+ setlocal bufhidden=hide
868
+ setlocal noswapfile
869
+ let @"=tag
870
+ exe 'set swb='.split_sav
871
+ let trig = inputdialog("Please enter the trigger word for your snippet: ", "My_snippet")
872
+ if trig == ""
873
+ let trig = "YOUR_SNIPPET_NAME_HERE"
874
+ endif
875
+ call append("$", "Snippet ".trig." ".snip)
876
+ if getline(1) == ""
877
+ 1 delete _
878
+ endif
879
+ call cursor(line('$'),1)
880
+ endfunction
881
+
882
+ " This function will convert the selected range into a snippet suitable for
883
+ " including in a bundle.
884
+ function! s:CreateBundleSnippet() range
885
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
886
+ let snip = ""
887
+ if &expandtab
888
+ let tabs = indent(a:firstline)/&shiftwidth
889
+ let tabstr = repeat(' ',&shiftwidth)
890
+ else
891
+ let tabs = indent(a:firstline)/&tabstop
892
+ let tabstr = '\t'
893
+ endif
894
+ let tab_text = repeat(tabstr,tabs)
895
+
896
+ for i in range(a:firstline, a:lastline)
897
+ let text = substitute(getline(i),tab_text,'','')
898
+ let text = substitute(text, tabstr, '<Tab>','g')
899
+ let text = substitute(text, "\r$", '','g')
900
+ let text = substitute(text, '"', '\\"','g')
901
+ let text = substitute(text, '|', '<Bar>','g')
902
+ let snip = snip.text.'<CR>'
903
+ endfor
904
+ let tag = '".st.et."'
905
+ let split_sav = &swb
906
+ set swb=useopen
907
+ if bufexists("Snippets")
908
+ belowright sb Snippets
909
+ else
910
+ belowright sp Snippets
911
+ endif
912
+ resize 8
913
+ setlocal buftype=nofile
914
+ setlocal bufhidden=hide
915
+ setlocal noswapfile
916
+ let @"=tag
917
+ exe 'set swb='.split_sav
918
+ let trig = inputdialog("Please enter the trigger word for your snippet: ", "My_snippet")
919
+ if trig == ""
920
+ let trig = "YOUR_SNIPPET_NAME_HERE"
921
+ endif
922
+ call append("$", 'exe "Snippet '.trig." ".snip.'"')
923
+ if getline(1) == ""
924
+ 1 delete _
925
+ endif
926
+ call cursor(line('$'),1)
927
+ endfunction
928
+
929
+ " This function will just return what's passed to it unless a change has been
930
+ " made
931
+ fun! D(text)
932
+ if exists('s:CHANGED_VAL') && s:CHANGED_VAL == 1
933
+ return @z
934
+ else
935
+ return a:text
936
+ endif
937
+ endfun
938
+
939
+ " s:Hash allows the use of special characters in snippets
940
+ " This function is lifted straight from the imaps.vim plugin. Please let me know
941
+ " if this is against licensing.
942
+ function! s:Hash(text)
943
+ return substitute(a:text, '\([^[:alnum:]]\)',
944
+ \ '\="_".char2nr(submatch(1))."_"', 'g')
945
+ endfunction
946
+
947
+ " s:UnHash allows the use of special characters in snippets
948
+ " This function is lifted straight from the imaps.vim plugin. Please let me know
949
+ " if this is against licensing.
950
+ function! s:UnHash(text)
951
+ return substitute(a:text, '_\(\d\+\)_',
952
+ \ '\=nr2char(submatch(1))', 'g')
953
+ endfunction
954
+
955
+ " This function chops tags from any text passed to it
956
+ function! s:ChopTags(text)
957
+ let text = a:text
958
+ "call s:Debug("ChopTags", "ChopTags was passed this text: ".text)
959
+ let [snip_start_tag, snip_elem_delim, snip_end_tag] = s:SetLocalTagVars()
960
+ let text = strpart(text, strlen(snip_start_tag))
961
+ let text = strpart(text, 0, strlen(text)-strlen(snip_end_tag))
962
+ "call s:Debug("ChopTags", "ChopTags is returning this text: ".text)
963
+ return text
964
+ endfunction
965
+
966
+ " This function ensures we measure string lengths correctly
967
+ function! s:StrLen(str)
968
+ "call s:Debug("StrLen", "StrLen returned: ".strlen(substitute(a:str, '.', 'x', 'g'))." based on this text: ".a:str)
969
+ return strlen(substitute(a:str, '.', 'x', 'g'))
970
+ endfunction
971
+
972
+ " }}}
973
+ " vim: set tw=80 sw=2 sts=2 et foldmethod=marker :