Permalink
Browse files

added support for buffer-only snippets

  • Loading branch information...
1 parent 150a655 commit 5527548d63c0e8992086ba1e06b20447dc4757bd @msanders msanders committed Mar 15, 2009
Showing with 46 additions and 41 deletions.
  1. +2 −0 after/ftplugin/vim_snips.vim
  2. +28 −26 doc/snipMate.txt
  3. +16 −15 plugin/snipMate.vim
View
2 after/ftplugin/vim_snips.vim
@@ -7,6 +7,8 @@ let snippet_filetype = 'vim'
" snippets for making snippets :)
exe 'Snipp snip exe "Snipp ${1:trigger}"${2}'
exe "Snipp snipp exe 'Snipp ${1:trigger}'${2}"
+exe 'Snipp bsnip exe "BufferSnip ${1:trigger}"${2}'
+exe "Snipp bsnipp exe 'BufferSnip ${1:trigger}'${2}"
exe 'Snipp gsnip exe "GlobalSnip ${1:trigger}"${2}'
exe "Snipp gsnipp exe 'GlobalSnip ${1:trigger}'${2}"
exe "Snipp guard if !exists('g:loaded_snips') || exists('s:did_".
View
54 doc/snipMate.txt
@@ -1,7 +1,7 @@
*snipMate.txt* Plugin for using TextMate-style snippets in Vim.
snipMate *snippet* *snippets* *snipMate*
-Last Change: March 8, 2009
+Last Change: March 15, 2009
|snipMate-description| Description
|snipMate-usage| Usage
@@ -43,10 +43,10 @@ There are currently two ways to make snippets: file-based and command-based.
File-based snippets are simply *.snippet files named after the trigger of
the snippet placed in the directory of the filetype
(<filetype>/<trigger>.snippet); command-based snippets are snippets defined
-using the |Snipp| and |GlobalSnip| commands. File-based snippets have the
-advantage of being easier to read, but do not support special characters in
-snippet triggers, while command-based snippets are obviously convenient for
-short snippets but can quickly get unreadable.
+using the |Snipp| , |BufferSnip|, and |GlobalSnip| commands. File-based
+snippets have the advantage of being easier to read, but do not support
+special characters in snippet triggers, while command-based snippets are
+obviously convenient for short snippets but can quickly get unreadable.
*command-snippets*
------------------------------------------------------------------------------
@@ -69,33 +69,35 @@ snipMate: >
This ensures dotted filetypes (see 'filetype') are dealt with correctly.
- *Snipp* *GlobalSnip*
-Snipp and GlobalSnip Commands~
+ *Snipp* *BufferSnip* *GlobalSnip*
+Snipp, BufferSnip, and GlobalSnip Commands~
Snippets are added via the "Snipp" and "GlobalSnip" commands. The syntax for
these are "Snipp <trigger> <text>"; e.g.: >
exe "Snipp trigger The cursor will be placed at the end of this sentence."
exe "GlobalSnip another_trigger foo"
-
-"Snipp" creates snippets local to the buffer, while "GlobalSnip" creates
-global snippets. "Snipp" is used instead of "Snip" to avoid conflicts with the
-imaps.vim vim script that uses that command name.
-
-These commands are conveniently bound to snippets themselves; "snip" and
-"gsnip", respectively. So to expand a Snipp command with double quotes,
-just type snip<tab>. Single quote Snipp and GlobalSnip commands are bound
-to the snippets "snipp" and "gsnipp". See |literal-string| for the
-difference between single and double quotes.
-
- *multi_snip* *Snipp!* *GlobalSnip!*
-To specify that a snippet can have multiple matches, use the Snipp or
-GlobalSnip command followed by a bang (!). The syntax for these are
-'Snipp! <trigger> "<name>" <text>'. (Note that the name must be
-enclosed in double quotes). E.g.: >
-
- exe 'Snip! trigger "Snippet name #1" expand_this_text'
- exe 'Snip! trigger "Snippet name #2" expand_THIS_text!'
+ exe "BufferSnip bar This snippet only works for the current buffer."
+
+"Snipp" creates snippets for the current filetype, "GlobalSnip" creates global
+snippets, and "BufferSnip" creates snippets for the current buffer. "Snipp"
+is used instead of "Snip" to avoid conflicts with the imaps.vim vim script
+that uses that command name.
+
+These commands are conveniently bound to snippets themselves; "snip", "bsnip",
+and "gsnip", respectively (in vim files). So to expand a Snipp command with
+double quotes, just type snip<tab>. Single quote Snipp and GlobalSnip
+commands are bound to the snippets "snipp", "bsnipp" and "gsnipp". See
+|literal-string| for the difference between single and double quotes.
+
+ *multi_snip* *Snipp!* *BufferSnip!* *GlobalSnip!*
+To specify that a snippet can have multiple matches, use the Snipp,
+BufferSnip, or GlobalSnip command followed by a bang (!). The syntax for these
+are 'Snipp! <trigger> "<name>" <text>'. (Note that the name must be enclosed
+in double quotes). E.g.: >
+
+ exe 'Snipp! trigger "Snippet name #1" expand_this_text'
+ exe 'Snipp! trigger "Snippet name #2" expand_THIS_text!'
In this example, when "trigger<tab>" is typed, a numbered menu containing all
of the names for the "trigger" will be shown; when the user presses the
View
31 plugin/snipMate.vim
@@ -16,6 +16,7 @@ let loaded_snips = 1
if !exists('snips_author') | let snips_author = 'Me' | endif
com! -nargs=+ -bang Snipp call s:MakeSnippet(<q-args>, snippet_filetype, <bang>0)
+com! -nargs=+ -bang BufferSnip call s:MakeSnippet(<q-args>, bufnr('%'), <bang>0)
com! -nargs=+ -bang GlobalSnip call s:MakeSnippet(<q-args>, '_', <bang>0)
let s:snippets = {} | let s:multi_snips = {}
@@ -26,7 +27,7 @@ fun! Filename(...)
return !a:0 || a:1 == '' ? filename : substitute(a:1, '$1', filename, 'g')
endf
-fun s:MakeSnippet(text, ft, multisnip)
+fun s:MakeSnippet(text, scope, multisnip)
let space = stridx(a:text, ' ')
let trigger = strpart(a:text, 0, space)
if a:multisnip
@@ -38,14 +39,14 @@ fun s:MakeSnippet(text, ft, multisnip)
else
let var = 's:snippets'
endif
- if !has_key({var}, a:ft) | let {var}[a:ft] = {} | endif
+ if !has_key({var}, a:scope) | let {var}[a:scope] = {} | endif
let end = strpart(a:text, space + 1)
if end == '' || space == '' || (a:multisnip && name == '')
echom 'Error in snipMate.vim: Snippet '.a:text.' is undefined.'
- elseif !has_key({var}[a:ft], trigger)
- let {var}[a:ft][trigger] = a:multisnip ? [[name, end]] : end
- elseif a:multisnip | let {var}[a:ft][trigger] += [[name, end]]
+ elseif !has_key({var}[a:scope], trigger)
+ let {var}[a:scope][trigger] = a:multisnip ? [[name, end]] : end
+ elseif a:multisnip | let {var}[a:scope][trigger] += [[name, end]]
else
echom 'Warning in snipMate.vim: Snippet '.strpart(a:text, 0, stridx(a:text, ' '))
\ .' is already defined. See :h multi_snip for help on snippets'
@@ -90,16 +91,16 @@ fun s:RemoveSnippet()
unl s:snipPos s:curPos s:snipLen s:endSnip s:endSnipLine s:prevLen
endf
-fun s:ChooseSnippet(ft, trigger)
+fun s:ChooseSnippet(scope, trigger)
let snippet = []
let i = 1
- for snip in s:multi_snips[a:ft][a:trigger]
+ for snip in s:multi_snips[a:scope][a:trigger]
let snippet += [i.'. '.snip[0]]
let i += 1
endfor
- if i == 2 | return s:multi_snips[a:ft][a:trigger][0][1] | endif
+ if i == 2 | return s:multi_snips[a:scope][a:trigger][0][1] | endif
let num = inputlist(snippet) - 1
- return num < i-1 ? s:multi_snips[a:ft][a:trigger][num][1] : ''
+ return num < i-1 ? s:multi_snips[a:scope][a:trigger][num][1] : ''
endf
fun! TriggerSnippet()
@@ -117,7 +118,7 @@ fun! TriggerSnippet()
endif
let word = matchstr(getline('.'), '\S\+\%'.col('.').'c')
- for filetype in split(&ft, '\.') + ['_'] " Deal with dotted file-types
+ for filetype in [bufnr('%')] + split(&ft, '\.') + ['_']
let trigger = s:GetSnippet(word, filetype)
if exists('s:snippet') | break | endif
endfor
@@ -144,13 +145,13 @@ endf
" Check if word under cursor is snippet trigger; if it isn't, try checking if
" the text after non-word characters is (e.g. check for "foo" in "bar.foo")
-fun s:GetSnippet(word, ft)
+fun s:GetSnippet(scope, ft)
let word = a:word
wh !exists('s:snippet')
- if exists('s:snippets["'.a:ft.'"]["'.word.'"]')
- let s:snippet = s:snippets[a:ft][word]
- elseif exists('s:multi_snips["'.a:ft.'"]["'.word.'"]')
- let s:snippet = s:ChooseSnippet(a:ft, word)
+ if exists('s:snippets["'.a:scope.'"]["'.word.'"]')
+ let s:snippet = s:snippets[a:scope][word]
+ elseif exists('s:multi_snips["'.a:scope.'"]["'.word.'"]')
+ let s:snippet = s:ChooseSnippet(a:scope, word)
else
if match(word, '\W') == -1 | break | endif
let word = substitute(word, '.\{-}\W', '', '')

0 comments on commit 5527548

Please sign in to comment.