tomkersten-vixploder 0.1.1 → 0.1.2

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