From 4dce7f16363c1483c557b4580695a5699a46bfa0 Mon Sep 17 00:00:00 2001 From: Paul Knowles Date: Mon, 17 Mar 2014 14:26:38 -0700 Subject: [PATCH] Squashed '.vim/bundle/snipmate/' changes from f5a75d0..3a23fdf 3a23fdf improve README, vundle taught us this is very important 2f3b2ad Remove unused s:ReadFile function eb30d83 Fix handling of single snippet files 40f0efd Fix available snips completion popup 35cecbb Updates for snippet with normal for syntax 3883b17 Fix formatting of readme 4376a66 Remove expansion guards 55ee329 Use CursorMoved events entirely 667086e define left_from_cursor d3cda27 Fix bug with mirrors in placeholders 0631587 Implement simple caching 43e8b9a Change quoting when filtering snippets d7918d0 put VAM first because its most convenient because it supports dependencies 062d303 Fix README link to issue 149365c Count indents in bytes rather than columns e453b43 Fix bug with mirrors in the first column 49cf485 Fix header levels c7fe3e8 Release version 0.87 97a895d Add snipMate#CanBeTriggered() function ec98fb5 Add plug mapping snipMateTrigger 064f1ce Fix a typo in README efc849d Update contributors list a6457a5 Redundant line in syntax file 3cf2ebb Include instructions for installing vim-snippets f354636 Add g:snipMate_no_default_aliases option bc6a6f3 Use 'sw' if 'sts' is non-positive 75776f4 Fix typos in mapping documentation 6eb7adf Merge pull request #133 from bsutic/fix-typo 54736c3 Fix variable typo in source code dafb6f3 Add support for $0 tabstop cca4ec0 Edit documentation 3ab862a Updated references to README file. 4561694 Fix visual placeholder support cc708d7 Revert "Deprecate scope_aliases" 3b4c08d Deprecate scope_aliases db68369 Add extends keyword support in .snippets files fd6ad42 Remove unused ProcessFile function 54acd6a Stop indenting empty lines when expanding snippets dcac994 Release version 0.86 a6c5d6a Fix glob() for use with older Vim versions 6dabca0 Fix SnipMateOpenSnippetFiles 0f833de Restore performance benefits of old s:Glob 4e975c9 Fix snippet name collision bug d42783a Refactor ReadSnippetFiles() and s:Glob() 00aab28 Overhaul README f9bd680 Move contributors to separate file 6bed4c3 Add hpesoj to list of contributors 395ffaa Merge pull request #120 from hpesoj/master 7fe31d3 Avoid updating variables after calling self.remove(). 7378cff Reposition the cursor after updating vars 3dc52c5 Use mappings 9233940 Remove most select mode compatibility (?) mappings 0986a1f Add radicalbit to list of contributors 2f2a101 snipmate-snippets is vim-snippets because it will contain snipmate and UltiSnip snippets ab678e2 adding Adnan Zafar to lists of maintainers - he is doing most work now 83bf573 moving the repository list to snipmate-snippets - having one central place is eassier to maintain 2c6ae0b Remove redundant undo point creation d4d1060 Use filter() in ShowAvailableSnips fc22673 Release version 0.85 50fc7d2 Update ChangeLog ce80ad1 Merge pull request #118 from bonsaiben/bootstrap_snippets_readme 516c7af add link to Twitter Bootstrap snippets repo 35a7c9b Reset 'cpo' before creating maps bbae0a6 Merge pull request #117 from ajzafar/garbas 6af9294 Rewrite tab stop jumping and updating code d209d22 document that Marc Weber stop contributing to this project, because UltiSnips does a better job now 472affc status update 3260747 add reference to new issue b5b459c allow using \${1} in snippets or $1. $x is used in bash and ruby quite often fe3b739 document a new idea 341c7f6 add me as maintainer along with Garbas too, cause its me fixing bugs along with him and others bcd592ce5e fixed the ~bug introducing a new one, ctrl-r broke. The real fix is to escape ~ rather than disallowing regular expression matching cd408da correct statement, add neosnippets to list of related work. I haven't tried it yet ace4f02 fix pull/78 dce2394 guard must start at first column b455022 Merge pull request #112 from mihaifm/master c390c94 Merge pull request #113 from jean/master 4149635 Some editing. d0aee28 Bring in line with what the README says 3bc084d Fixed unexpected errors related to glob method e77388c Merge pull request #101 from linduxed/custom-backwards-fix 560f3e9 Merge pull request #91 from Tblue/master ca9f00d Merge pull request #99 from apuignav/master b2b6c27 Merge pull request #93 from sudar/arduino 4edab6b Merge pull request #106 from codeinthehole/patch-1 220347a Fix a few grammatical errors in README 62594d2 fix help doc style 43b5dc9 Fix a few grammatical errors in README a56f054 Merge branch 'master' of https://github.com/apuignav/vim-snipmate 62af7d9 Fixed custom backwards trigger key. b42f80f Merge pull request #100 from JamesMcMahon/patch-1 9f9dc4c Update README to use proper snippets bundle bcd592c Added protection against regular expressions in trigger. 41152a2 Merge pull request #97 from cmaureir/patch-2 23539b6 Adding C snippets to CUDA files. 34ab1a7 Merge pull request #95 from kucaahbe/master fc75101 allow overwriding individual keys in scope_aliases 106d4db turned spelling off for "snippet(s)" filetype 15b75e4 Added link to Arduino snippets project in README e587a62 Work around glob() returning non-existing files. 3f52de4 implement guards - this implementation may change f1e8510 disable file caching, rename s:snipMate to s:c, itroduce cache_parsed_snippets_on_disk, read_snippets_cached options 39ee6f8 also make snipmate distinct m and M when having 'ignorecase' set. Thanks to radicalbit (github) 4cef3fc 1) provide real fix to \t not being added by changing default setting db244df Merge pull request #77 from jasonsydes/doc_scope_aliases 3aae363 Misunderstood , reverted docs on that one point. 28e042d Added better docs on setting scope_aliases. 7dee28b fix issue 75 42e921a Merge remote-tracking branch 'garbas/master' 41e7931 fix: longest match poicy: prefer try div. before . b9e2804 Merge pull request #64 from juanpabloaj/addFold 1302bb1 Merge pull request #61 from buethling/patch-1 3a04669 Merge pull request #67 from davejamesmiller/master dc8ff04 Merge pull request #72 from mutewinter/patch-1 4549bf7 Merge pull request #73 from gmunkhbaatarmn/master b446bfb little typo fix a1190f5 tell user what's going wrong if tlib or vim-addon-mw-utils are missing 93fd4fc Updated Vundle instructions to typical syntax 95e66f0 fix typo, snippet_dirs was always overridden 7d11d00 stop the tab discussion: issue 42 - partially based on code sent by orutherfurd 7ff53bd Syntax highlight the snippet trigger names in the .snippets files to make them stand out from the replacement text 05084a3 Merge pull request #66 from davejamesmiller/master 68f668e Remove duplicated code from ftplugin/snippets.vim 7c6deea Add separate filetype for .snippet files, since they aren't indented like .snippets files are e361252 doc: modificated second example ec51a3d Merge pull request #63 from grota/master 7542b05 Call snipMate#ShowAvailableSnips() instead of ShowAvailableSnips() 09333a0 Merge pull request #62 from bogdan/patch-1 1401969 Describe bug #59 in readme afc866f Adding support for html/eruby-rails snippets in eruby (*.html.erb) files. I don't know if this is worthy of a pull but thought I'd suggest it as I'm sure a lot of textmate converts would enjoy it. Thanks to gmaccarone for his help on this. 8b9a02a Merge pull request #58 from DXist/master 1b43745 Add call fixed 2a240d6 unused variable e02c61a comment out echo f605f20 Merge pull request #56 from mlen/master 113d047 Fixing bug caused by using deprecated function d7ece78 cleanup and refactoring finishing the work lucapette has started 07175cc Merge remote-tracking branch 'garbas/lookups_refactor' 5803dbd lookup function refactored 66aa9c4 shorter escape function d75cb5f escaping glob search bf563cc use line variable 51ce83f escaping glob function b9efaa5 add second example illustrating how to implement suggestion by JuanPablo -> https://github.com/garbas/vim-snipmate/issues/49 132029e some typo fixed 0fb3214 Merge pull request #48 from lucapette/master 8529852 fixed issue #42 f456016 Merge pull request #46 from lucapette/master eef8409 some typo fixed 4535952 Merge pull request #45 from lucapette/master 23c52d4 sort matches fd78bd6 fix previous commit, implementation should be fine now e713269 implement &syntax support #40 ac3b77b support ft=A.B in command bfe6d4e fixes issue #38 fb77f9a making addon-info.json valid json file 1e5d510 Eustaquio Rangel is taq on github 67f4f8e Merge branch 'master' of github.com:garbas/vim-snipmate f38b624 Don't depend on snippets. install the snippets to get snipmate instead 5d28bf4 adding g:snips_trigger_key_backwards option 13e1136 recommending VAM over all the other solutions, rename snippets to snipmate-snippets 28248de Split off snippets into a new repo. 307880b added link to jgosmann github profile ad9594e Merge pull request #25 from jgosmann/master af5191a Forgot to add date and name to the note in the changelog from the last commit. c6fe706 Updated changelog with note about the bugfix of commit 65e27e7b7863509d331565e916c0b4db29b1b974 07f1a09 Merge branch 'master' of github.com:jgosmann/vim-snipmate 65e27e7 Fixes a bug that jumping to the next placeholder clears the current one if it is unchanged. 714d05c rename addon-info b89a21a fix of "longest match wins" 750a32c Merge remote-tracking branch 'pielgrzym/master' ab92aba Updated the changelog 5c1a64c fix htmlldjango,javascript,html scope handling. previously only htmldjango's for loop was found 4498269 Merge pull request #19 from pielgrzym/master 890f84b My favorite snippets for django/css are back :) 25a0e28 longest match wins now. eg d:b -> display:block wins over b -> bottom (css snippets) 02bb111 add reference to snippets for bibtex files 33d5107 Merge pull request #13 from bascht/master f0405ac Merge branch 'master', remote-tracking branch 'MarcWeber/master' 5179a40 make paths containing snippet files configurable dc893ba Merge commit 'd46588cad4f48f1fe6f0e80c06b87f9b78792422' 0233388 rewrite huge parts of the documentation cause it was outdated aa43f9a adding php snippet redirect d46588c made "context"'s variable a little more appropriate 314efd0 inline php snippet. Useful for php templates :) 137e20b removing lefovers of conflict resolution in jsp.snippets d505bb3 Merge pull request #9 from smt/official 497be12 Merge pull request #10 from ironcamel/fix-readme 4f2b15f Fixing pathogen section of README 08ac6e5 Add JSP snippets 8253cfa adding css.snippets 2d1eabc updating changelog to refloct which changes were merged 6c48e60 Merge remote-tracking branch 'MarcWeber/master' 2099976 wrong url in "Manual" section 34df7bd Merge branch 'master', remote-tracking branch 'origin/master' 2a35445 Merge pull request #6 from ironcamel/master 35ff1e4 Updating pathogen section of README to include directions for adding deps. 22548b8 Escape '~' for triggerR in GetSnippets. 824f902 Break undo only if a snippet gets expanded. 23f1cb7 js: Add snippet `cl` for console.log. 9260697 Merge branch 'MarcWeber-master' 48f6b66 add configuration for custom trigger-key 4d95aca handle single-line or multiline snippets 45bdc32 fix error with multiline snippet 4adc111 fixed a paragraph of the README e29ab22 added rst snippets 00aace7 fixed some paragraphs of the README cddc863 Improved README.rst -- added Vundle installation and me as an author 1a68a57 added dowh python snippet - do...while in python 89720d4 added gpl C snippet b6f8a22 added double quotes for rspec context 458c0d8 Fix typos/style in README.rst. 3d650a8 document dependencies better c6efa21 vladimir-vg told me that I should ignore this file because Pathogen lists those plugins as "modified". Maybe it should be Pathogen ignoring this common case 4e1d137 speed up searching for trigger by { many times 3412e34 Minor doc review/fixes. b7e68f3 Improve snippet trigger lookup. bf8e871 Do not look for snippets in `bufnr` scope. 5efc6aa php: add snippet "G" for simple GLOBALS expansion. f8a6e19 - add ! to fun - cleanup: Use same function to find all snippet files - for .php files add php scope - add both: last path component of runtimepath and scope to snippet name This way many snippet files can provide the same "trigger" and you'll get all snippets in the list. Previously the last one was kept only and shown only. Example for trigger "for" in a .php file: 1* 1. snipmate javascript default 2: 2. snipmate php default 3e6f4eb Merge remote branch 'gh/master' 53b9ce4 Merge remote branch 'johnbintz/master' c5e1858 fixed 'do' to not prompt anything since we have 'dov' when there's a variable 1c13fd6 handle single-line or multiline snippets ddf7e81 Add a var_dump snippet for PHP. 3b89c13 PHP docblocks snippets end with "*/", not "**/". 4bd999f fix error with multiline snippet bdc96ce Merge remote-tracking branch 'darkwise/master' 7dea62f add #{2} into eaid in ruby.snippets a802c63 comment about superSnipMate 6d51515 Add php snippets 'pd' and 'pdd' for 'pre-dump'. fd5e917 Fix typos/doc. 6763aab If there is only one snippet choose it directly. 13fa8b2 document that there should be a comparison 814b22a add scroolooses repo f94352a drop pathogen, tell about how to use vim-addon-manager to install the plugin 8a4e70d Merge branches 'latex' and 'master' into latex df30746 fixing my merge 9998465 pull from garbas fork 6628393 Adding math 051c92e Merge branch 'latex', remote branch 'darkwise/me' into latex 892956a Adding math formula 99b5fae Adding some mathematic formula. Adding figure. 5dafc81 Merge branch 'master' into MarcWeber 4073f71 update backwards snippet as well for latest supertab 583b740 Merge remote branch 'ervandew/master' fe2093f Merge branch 'master' of git://github.com/MarcWeber/snipmate.vim 03b001b Fix expansion of "foo.bar(" using the "." snippet. b1e7778 Add bang to function definitons, allowing for reload. dbc1826 Add snippets file for "diff" filetype. 12bc924 added the context snippet as well 65ceac4 fix mapping reported by t2wd (github) 3dfbff2 added ruby-debug snippet ff9729d comment 777356e update snipmate to handle latest supertab version 885d0ad striping out some text e1665f7 wrong markup for README da052e5 Updated README: added contributors, instructions how to install snipMate, some spellchecking of my wonderfull english, added this Changelog fcb11b4 adding pdbbb snippet 4a7e1f9 Merge remote branch 'garbas/master' 04b989c some README.rst formatting 111e299 updated README 9466f01 added python debugger snippets 29707ac Using expr foldmethod to get better folds 2a83172 New way to eval `...`, and escape \ 08945cc Add "lorem" snippet. 73a7255 Create undo point before expanding snippet in insert mode. dbd8dd5 Add common liceses to falcon be90fd5 Add falcon pl snippets 447ef99 added info about building the tag file e95244b Fixed tag for snipMate-syntax 8b1a270 Enhanced Ruby 'do' block support 30a95fb Oops, removing extraneous ${3} 8b418c5 A more idiomatic way to slurp files in perl. aef6379 Add GPLv3 file header to Python snippets. 2af46e3 Fixed small find bug 7398762 Small props fix b44655c Fixed the style a bit 10b8efd Added target properties d747fe8 Initial cmake snippets 7a203fb Improved cpp snippets 44ed36e Added snippets for Django 77bafff added with statement to python.snippets f94be27 A couple snippets for markdown URLs/images. d6e9809 Removed trailing whitespace from an else. 6804234 Removed trailing whitespace from ends. eadf218 add footnote to tex.snippets 05c68b2 adding other formating snippets to tex.snippets 3b38ac3 Adding some snippets to tex.snippets : it for italic (\textit{}) bf for bold (\textbf{}) others follow. d818718 Added Progress/OpenEdge ABL snippets 91b229e Adding sniippets for Play framework 82b1adc Formatted if else. bcecd26 Formatted anonymous function. 82dc2d1 Alterted increment and decrement operators to conform to JSLint's plusplus rule. d244908 Formatted if statement. f7749f8 Added immediate function snippet. 9d7be5d Add missing closing parenthesis for js timeout snippet 5b6c443 Added 'try' to js snippets. 458f62c removed an unnecessary empty line 10d2283 removed the beginning 'should' from spec snippet b954b05 document that Id like to have a upstream merge and how I think about the future of snipmate 55ddcfb added before & after to ruby snippets 100f870 added rename column snippet 63cfadc add footnote to tex.snippets 902d3fd adding other formating snippets to tex.snippets 5ff223a Adding some snippets to tex.snippets : it for italic (\textit{}) bf for bold (\textbf{}) others follow. e56f31d adding .gitignore file e3810af Merge branch 'master' of git://github.com/srushti/snipmate.vim 1c9effc Haml: html and rails snippets 181d4ae added eruby snippets d27b3bf added a do without a variable f5e094c added content_for & fixed desc b5868f8 add ! 948082a adding support for visual selection 4132328 js, html support for .ur files 41a9bc8 adding hooks allowing you to add more snippets d8bbe83 allow filetype/*.snippets files 0055d73 if Snippet* command is called on a file without filetype show appropriate message. Actually its hidden. But you can get it by :messages rather than an "empty key" error c74d647 added a couple of rspec & migrations snippets a466687 Merge upstream. Add comments in which way this fork differs from the original 974cd54 Merge remote branch 'origin/master' into master-get-snips-func 1c255a6 alias mxml -> actionscript 9bf3901 adding new command SnipMateOpenSnippetFiles It lists many possible files which can contain .snippets. Existing files are listed first. So you should be even faster managing your snippets now d24a08c Vim snippets: - add autoload prefix. Add new placeholder for s: - always use fun! for developing. It seldomly hurts 7cab68f remove duplicate line. Don't use local var 9c98f59 ruby snippets: add else ensure to begin snippet 020a417 make AddScopeAliases recursive so that aliases of aliases are added make xhtml an alias for html add javascript to both: html and php 47ccae0 PHP: add lambda snippet JS: Add try catch 540ccf0 ruby: add begin rescue snippet 01b769a fix ScopeAliases 66ffd85 fix flash snippets 7621baf fix: numbersmuststart at 1 4ae365b adding some action script snippets (unfinished but more useful than no snippets) 649eba5 ruby add missing block snippet 55ff5a0 fix PHP snippet (it's the value not the key var) add try snippet add foreachk snippet f7d2c13 add ! to command set tabstop and expandtab settings explicitely so that indentation commands work as expected ff95f28 add a RetabSnip command which fixes indentation automatically d9f239c big change: Add a function collecting snippets on demand. .snippets files are parsed only once and cached for performance reasons. However if the timestamp changes they are reread automatically. I tried to preserve behaviour. However I may have failed. The main reason for this is that it is possible now to define new script sources easily. Eg there could be a plugin which reads Eclipse plugins, translating them to snipMate snippets on the fly etc. 30fae8e 'put s:snippets into s:multi_snip using key "default" So if you have both: a snippet without description and one with desciption they both show up Also if a snippet is added twice the second overrides the first one. Thus you can just reload snippets without empying the dicts cfc8431 tab: start completion if there is no match, only do so if some characters have been typed git-subtree-dir: .vim/bundle/snipmate git-subtree-split: 3a23fdf65b6bf8ac2cf0de79f5894dc02f1d28dd --- .gitignore | 3 + Contributors.md | 43 ++ README.markdown | 5 - README.md | 103 ++++ addon-info.json | 12 + after/plugin/snipMate.vim | 85 +-- autoload/snipMate.vim | 904 +++++++++++++++++++++--------- autoload/snipMate_python_demo.vim | 47 ++ doc/SnipMate.txt | 498 ++++++++++++++++ doc/snipMate.txt | 322 ----------- ftplugin/snippet.vim | 8 + ftplugin/snippets.vim | 1 + plugin-info.txt | 8 - plugin/snipMate.vim | 305 +++------- plugin/snipMateInterface.vim | 2 + snippets/_.snippets | 9 - snippets/autoit.snippets | 66 --- snippets/c.snippets | 113 ---- snippets/cpp.snippets | 34 -- snippets/erlang.snippets | 39 -- snippets/html.snippets | 190 ------- snippets/java.snippets | 95 ---- snippets/javascript.snippets | 74 --- snippets/mako.snippets | 54 -- snippets/objc.snippets | 247 -------- snippets/perl.snippets | 97 ---- snippets/php.snippets | 216 ------- snippets/python.snippets | 86 --- snippets/ruby.snippets | 504 ----------------- snippets/sh.snippets | 28 - snippets/snippet.snippets | 7 - snippets/tcl.snippets | 92 --- snippets/tex.snippets | 115 ---- snippets/vim.snippets | 32 -- snippets/zsh.snippets | 58 -- syntax/snippet.vim | 16 +- syntax/snippets.vim | 23 + 37 files changed, 1506 insertions(+), 3035 deletions(-) create mode 100644 .gitignore create mode 100644 Contributors.md delete mode 100644 README.markdown create mode 100644 README.md create mode 100644 addon-info.json create mode 100644 autoload/snipMate_python_demo.vim create mode 100644 doc/SnipMate.txt delete mode 100644 doc/snipMate.txt create mode 100644 ftplugin/snippet.vim create mode 100644 ftplugin/snippets.vim delete mode 100644 plugin-info.txt create mode 100644 plugin/snipMateInterface.vim delete mode 100644 snippets/_.snippets delete mode 100644 snippets/autoit.snippets delete mode 100644 snippets/c.snippets delete mode 100644 snippets/cpp.snippets delete mode 100644 snippets/erlang.snippets delete mode 100644 snippets/html.snippets delete mode 100644 snippets/java.snippets delete mode 100644 snippets/javascript.snippets delete mode 100644 snippets/mako.snippets delete mode 100644 snippets/objc.snippets delete mode 100644 snippets/perl.snippets delete mode 100644 snippets/php.snippets delete mode 100644 snippets/python.snippets delete mode 100644 snippets/ruby.snippets delete mode 100644 snippets/sh.snippets delete mode 100644 snippets/snippet.snippets delete mode 100644 snippets/tcl.snippets delete mode 100644 snippets/tex.snippets delete mode 100644 snippets/vim.snippets delete mode 100644 snippets/zsh.snippets create mode 100644 syntax/snippets.vim diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9140e6a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +doc/tags +*.swp +.DS_Store diff --git a/Contributors.md b/Contributors.md new file mode 100644 index 0000000..6333cf5 --- /dev/null +++ b/Contributors.md @@ -0,0 +1,43 @@ +# Contributors # + +SnipMate was originally authored by Michael Sanders +([Vim](http://www.vim.org/account/profile.php?user_id=16544), +[GitHub](https://github.com/msanders)). + +It is currently maintained by [Rok Garbas](rok@garbas.si), [Marc +Weber](marco-oweber@gmx.de), and [Adnan Zafar](https://github.com/ajzafar) with +additional contributions from: + +* [907th](https://github.com/907th) +* [alderz](https://github.com/alderz) +* [asymmetric](https://github.com/asymmetric) +* [bpugh](https://github.com/bpugh) +* [bruno-](https://github.com/bruno-) +* [darkwise](https://github.com/darkwise) +* [fish-face](https://github.com/fish-face) +* [henrik](https://github.com/henrik) +* [holizz](https://github.com/holizz) +* [honza](https://github.com/honza) +* [hpesoj](https://github.com/hpesoj) +* [ironcamel](https://github.com/ironcamel) +* [jb55](https://github.com/jb55) +* [jbernard](https://github.com/jbernard) +* [jherdman](https://github.com/jherdman) +* [kozo2](https://github.com/kozo2) +* [lilydjwg](https://github.com/lilydjwg) +* [marutanm](https://github.com/marutanm) +* [MicahElliott](https://github.com/MicahElliott) +* [muffinresearch](https://github.com/muffinresearch) +* [pielgrzym](https://github.com/pielgrzym) +* [pose](https://github.com/pose) +* [r00k](https://github.com/r00k) +* [radicalbit](https://github.com/radicalbit) +* [redpill](https://github.com/redpill) +* [robhudson](https://github.com/robhudson) +* [Shraymonks](https://github.com/shraymonks) +* [sickill](https://github.com/sickill) +* [statik](https://github.com/statik) +* [steveno](https://github.com/steveno) +* [taq](https://github.com/taq) +* [thisgeek](https://github.com/thisgeek) +* [Xandaros](https://github.com/Xandaros) diff --git a/README.markdown b/README.markdown deleted file mode 100644 index 160f807..0000000 --- a/README.markdown +++ /dev/null @@ -1,5 +0,0 @@ -Quickly install with: - - git clone git://github.com/msanders/snipmate.vim.git - cd snipmate.vim - cp -R * ~/.vim diff --git a/README.md b/README.md new file mode 100644 index 0000000..3b31cfc --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# SnipMate # + +SnipMate aims to provide support for textual snippets, similar to TextMate or +other Vim plugins like [UltiSnips][ultisnips]. For +example, in C, typing `for` could be expanded to + + for (i = 0; i < count; i++) { + /* code */ + } + +with successive presses of tab jumping around the snippet. + +Originally authored by [Michael Sanders][msanders], SnipMate was forked in 2011 +after a stagnation in development. This fork is currently maintained by [Rok +Garbas][garbas], [Marc Weber][marcweber], and [Adnan Zafar][ajzafar]. + + +## Installing SnipMate ## + +We recommend one of the following methods for installing SnipMate and its +dependencies. SnipMate depends on [vim-addon-mw-utils][mw-utils] and +[tlib][tlib]. Since SnipMate does not ship with any snippets, we suggest +looking at the [vim-snippets][vim-snippets] repository. + +* Using [VAM][vam], add `vim-snippets` to the list of packages to be installed. + +* Using [Pathogen][pathogen], run the following commands: + + % cd ~/.vim/bundle + % git clone https://github.com/tomtom/tlib_vim.git + % git clone https://github.com/MarcWeber/vim-addon-mw-utils.git + % git clone https://github.com/garbas/vim-snipmate.git + + # Optional: + % git clone https://github.com/honza/vim-snippets.git + +* Using [Vundle][vundle], add the following to your `vimrc` then run + `:BundleInstall` + + Bundle "MarcWeber/vim-addon-mw-utils" + Bundle "tomtom/tlib_vim" + Bundle "garbas/vim-snipmate" + + " Optional: + Bundle "honza/vim-snippets" + +## selecting snippets / customization +Snipmate is powerful, you can hook into almost everything and replace the +default implementation. + +Eg the get_snippets, snippet_dirs, get_scopes option determine which +directories to look for snippet files, which snippet files to select and so on. + +Most likely you're happy by overridding patching scope_aliases which tells +snipmate which snippet files to read for a given file type. Example +configuration for your .vimrc: + + let g:snipMate = {} + let g:snipMate.scope_aliases = {} + let g:snipMate.scope_aliases['ruby'] + \ = 'ruby,ruby-rails' + +which will make vim load ruby.snippets and ruby-rails.snippets if you open ruby +files. Because this is that easy vim-snippets even recommends creating multiple +files so that users can opt-in for sets of snippets easily according to their +liking. + +The SnippetsWithFolding example shows how to patch / add snippets on the fly. + +## Release Notes ## + +### Master ### + +* Implement simple caching +* Remove expansion guards +* Fix bug with mirrors in the first column +* Fix bug with tabs in indents ([#143][143]) +* Fix bug with mirrors in placeholders + +### 0.87 - 2014-01-04 ### + +* Stop indenting empty lines when expanding snippets +* Support extends keyword in .snippets files +* Fix visual placeholder support +* Add zero tabstop support +* Support negative 'softtabstop' +* Add g:snipMate_no_default_aliases option +* Add snipMateTrigger for triggering an expansion inside a snippet +* Add snipMate#CanBeTriggered() function + +[ultisnips]: https://github.com/sirver/ultisnips +[msanders]: https://github.com/msanders +[garbas]: https://github.com/garbas +[marcweber]: https://github.com/marcweber +[ajzafar]: https://github.com/ajzafar +[mw-utils]: https://github.com/marcweber/vim-addon-mw-utils +[tlib]: https://github.com/tomtom/tlib_vim +[vim-snippets]: https://github.com/honza/vim-snippets +[vam]: https://github.com/marcweber/vim-addon-manager +[pathogen]: https://github.com/tpope/vim-pathogen +[vundle]: https://github.com/gmarik/vundle + +[143]: https://github.com/garbas/vim-snipmate/issues/143 diff --git a/addon-info.json b/addon-info.json new file mode 100644 index 0000000..8d9930f --- /dev/null +++ b/addon-info.json @@ -0,0 +1,12 @@ +{ + "name" : "snipMate", + "version" : "dev", + "author" : "Michael Sanders -> original project http://github.com/msanders/snipmate.vim", + "maintainer" : "Rok Garbas / Marc Weber", + "repository" : {"type": "git", "url": "git://github.com/garbas/vim-snipmate.git"}, + "dependencies" : { + "vim-addon-mw-utils": {}, + "tlib": {} + }, + "description" : "snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. See README.md to learn about the features this fork adds" +} diff --git a/after/plugin/snipMate.vim b/after/plugin/snipMate.vim index bdbe199..668b224 100644 --- a/after/plugin/snipMate.vim +++ b/after/plugin/snipMate.vim @@ -1,40 +1,51 @@ -" These are the mappings for snipMate.vim. Putting it here ensures that it -" will be mapped after other plugins such as supertab.vim. -if !exists('loaded_snips') || exists('s:did_snips_mappings') - finish -endif -let s:did_snips_mappings = 1 - -" This is put here in the 'after' directory in order for snipMate to override -" other plugin mappings (e.g., supertab). -" -" You can safely adjust these mappings to your preferences (as explained in -" :help snipMate-remap). -ino =TriggerSnippet() -snor i=TriggerSnippet() -ino =BackwardsSnippet() -snor i=BackwardsSnippet() -ino =ShowAvailableSnips() - -" The default mappings for these are annoying & sometimes break snipMate. -" You can change them back if you want, I've put them here for convenience. -snor b -snor a -snor bi -snor ' b' -snor ` b` -snor % b% -snor U bU -snor ^ b^ -snor \ b\ -snor b - -" By default load snippets in snippets_dir -if empty(snippets_dir) - finish +" snipMate maps +" These maps are created here in order to make sure we can reliably create maps +" after SuperTab. + +let s:save_cpo = &cpo +set cpo&vim + +function! s:map_if_not_mapped(lhs, rhs, mode) + let l:unique = s:overwrite ? '' : ' ' + if !hasmapto(a:rhs, a:mode) + silent! exe a:mode . 'map' . l:unique a:lhs a:rhs + endif +endfunction + +if !exists('g:snips_no_mappings') || !g:snips_no_mappings + if exists('g:snips_trigger_key') + echom 'g:snips_trigger_key is deprecated. See :h snipMate-mappings' + exec 'imap ' g:snips_trigger_key 'snipMateTrigger' + exec 'smap ' g:snips_trigger_key 'snipMateSNext' + exec 'xmap ' g:snips_trigger_key 'snipMateVisual' + else + " Remove SuperTab map if it exists + let s:overwrite = maparg('', 'i') ==? 'SuperTabForward' + call s:map_if_not_mapped('', 'snipMateNextOrTrigger', 'i') + call s:map_if_not_mapped('', 'snipMateNextOrTrigger', 's') + let s:overwrite = 0 + call s:map_if_not_mapped('', 'snipMateVisual', 'x') + endif + + if exists('g:snips_trigger_key_backwards') + echom 'g:snips_trigger_key_backwards is deprecated. See :h snipMate-mappings' + exec 'imap ' g:snips_trigger_key_backwards 'snipMateIBack' + exec 'smap ' g:snips_trigger_key_backwards 'snipMateSBack' + else + let s:overwrite = maparg('', 'i') ==? 'SuperTabBackward' + call s:map_if_not_mapped('', 'snipMateBack', 'i') + call s:map_if_not_mapped('', 'snipMateBack', 's') + let s:overwrite = 0 + endif + + call s:map_if_not_mapped('', 'snipMateShow', 'i') endif -call GetSnippets(snippets_dir, '_') " Get global snippets +" FIXME: Without this map, in select mode deletes the current selection and +" returns to normal mode. This doesn't update placeholders. Ideally there's some +" way to update the placeholders without this otherwise useless map. +silent! snoremap b + +let &cpo = s:save_cpo -au FileType * if &ft != 'help' | call GetSnippets(snippets_dir, &ft) | endif -" vim:noet:sw=4:ts=4:ft=vim +" vim:noet: diff --git a/autoload/snipMate.vim b/autoload/snipMate.vim index 0ad5a58..955ab52 100644 --- a/autoload/snipMate.vim +++ b/autoload/snipMate.vim @@ -1,20 +1,54 @@ +" config which can be overridden (shared lines) +if !exists('g:snipMate') + let g:snipMate = {} +endif +let s:c = g:snipMate + +try + call tlib#input#List('mi', '', []) +catch /.*/ + echoe "you're missing tlib. See install instructions at ".expand(':h:h').'/README.md' +endtry + +" match $ which doesn't follow a \ +let s:d = '\%([\\]\@" to make snipmate not swallow tab (make sure to not have +" expandtab set). Remember that you can always enter tabs by then +" you don't need this +let s:c['no_match_completion_feedkeys_chars'] = get(s:c, 'no_match_completion_feedkeys_chars', "\t") + fun! Filename(...) let filename = expand('%:t:r') if filename == '' | return a:0 == 2 ? a:2 : '' | endif return !a:0 || a:1 == '' ? filename : substitute(a:1, '$1', filename, 'g') endf -fun s:RemoveSnippet() - unl! g:snipPos s:curPos s:snipLen s:endCol s:endLine s:prevLen - \ s:lastBuf s:oldWord - if exists('s:update') - unl s:startCol s:origWordLen s:update - if exists('s:oldVars') | unl s:oldVars s:oldEndCol | endif - endif - aug! snipMateAutocmds +let s:state_proto = {} +let s:cache = {} + +fun! s:state_proto.remove() + unlet! b:snip_state + " Remove all buffer-local autocommands in the snipmate_changes group + au! snipmate_changes * endf -fun snipMate#expandSnip(snip, col) +fun! snipMate#expandSnip(snip, col) let lnum = line('.') | let col = a:col let snippet = s:ProcessSnippet(a:snip) @@ -22,7 +56,7 @@ fun snipMate#expandSnip(snip, col) if snippet == '' | return '' | endif " Expand snippet onto current position with the tab stops removed - let snipLines = split(substitute(snippet, '$\d\+\|${\d\+.\{-}}', '', 'g'), "\n", 1) + let snipLines = split(substitute(snippet, ''.s:d .'\d\+\|'.s:d .'{\d\+.\{-}}', '', 'g'), "\n", 1) let line = getline(lnum) let afterCursor = strpart(line, col - 1) @@ -38,32 +72,26 @@ fun snipMate#expandSnip(snip, col) endif endif - call setline(lnum, line.snipLines[0]) - - " Autoindent snippet according to previous indentation - let indent = matchend(line, '^.\{-}\ze\(\S\|$\)') + 1 - call append(lnum, map(snipLines[1:], "'".strpart(line, 0, indent - 1)."'.v:val")) + " Insert snippet with proper indentation + let indent = match(line, '\S\|$') + 1 + call setline(lnum, line . snipLines[0]) + call append(lnum, map(snipLines[1:], "empty(v:val) ? v:val : '" . strpart(line, 0, indent - 1) . "' . v:val")) " Open any folds snippet expands into if &fen | sil! exe lnum.','.(lnum + len(snipLines) - 1).'foldopen' | endif - let [g:snipPos, s:snipLen] = s:BuildTabStops(snippet, lnum, col - indent, indent) + let b:snip_state = copy(s:state_proto) + let [b:snip_state.stops, b:snip_state.stop_count] = s:BuildTabStops(snippet, lnum, col - indent, indent) - if s:snipLen - aug snipMateAutocmds - au CursorMovedI * call s:UpdateChangedSnip(0) - au InsertEnter * call s:UpdateChangedSnip(1) + if b:snip_state.stop_count + aug snipmate_changes + au CursorMoved,CursorMovedI call b:snip_state.update_changes() aug END - let s:lastBuf = bufnr(0) " Only expand snippet while in current buffer - let s:curPos = 0 - let s:endCol = g:snipPos[s:curPos][1] - let s:endLine = g:snipPos[s:curPos][0] - - call cursor(g:snipPos[s:curPos][0], g:snipPos[s:curPos][1]) - let s:prevLen = [line('$'), col('$')] - if g:snipPos[s:curPos][2] != -1 | return s:SelectWord() | endif + call b:snip_state.set_stop(0) + + return b:snip_state.select_word() else - unl g:snipPos s:snipLen + unlet b:snip_state " Place cursor at end of snippet if no tab stop is given let newlines = len(snipLines) - 1 call cursor(lnum + newlines, indent + len(snipLines[-1]) - len(afterCursor) @@ -72,47 +100,89 @@ fun snipMate#expandSnip(snip, col) return '' endf +" Update state information to correspond to the given tab stop +function! s:state_proto.set_stop(stop) + let self.stop_no = a:stop + let self.cur_stop = self.stops[self.stop_no] + let self.end_col = self.cur_stop[1] + self.cur_stop[2] + let self.start_col = self.cur_stop[1] + call cursor(self.cur_stop[0], self.cur_stop[1]) + let self.prev_len = col('$') + let self.has_vars = exists('self.cur_stop[3]') + let self.old_vars = self.has_vars ? deepcopy(self.cur_stop[3]) : [] +endfunction + " Prepare snippet to be processed by s:BuildTabStops -fun s:ProcessSnippet(snip) +fun! s:ProcessSnippet(snip) let snippet = a:snip + + if exists('b:snipmate_content_visual') + let visual = b:snipmate_content_visual + unlet b:snipmate_content_visual + else + let visual = '' + endif + let snippet = substitute(snippet,'{VISUAL}', escape(visual,'%\'), 'g') + " Evaluate eval (`...`) expressions. " Backquotes prefixed with a backslash "\" are ignored. + " And backslash can be escaped by doubling it. " Using a loop here instead of a regex fixes a bug with nested "\=". if stridx(snippet, '`') != -1 - while match(snippet, '\(^\|[^\\]\)`.\{-}[^\\]`') != -1 - let snippet = substitute(snippet, '\(^\|[^\\]\)\zs`.\{-}[^\\]`\ze', - \ substitute(eval(matchstr(snippet, '\(^\|[^\\]\)`\zs.\{-}[^\\]\ze`')), - \ "\n\\%$", '', ''), '') - endw + let new = [] + let snip = split(snippet, '\%(\\\@ 0) ? &sts : &sw), 'g') endif return snippet endf " Counts occurences of haystack in needle -fun s:Count(haystack, needle) +fun! s:Count(haystack, needle) let counter = 0 let index = stridx(a:haystack, a:needle) while index != -1 @@ -128,39 +198,39 @@ endf " (by getting the length of the string between the last "\n" and the " tab stop). " 3.) The length of the text after the colon for the current tab stop -" (e.g. "${1:foo}" would return 3). If there is no text, -1 is returned. +" (e.g. "${1:foo}" would return 3). " 4.) If the "${#:}" construct is given, another list containing all " the matches of "$#", to be replaced with the placeholder. This list is " composed the same way as the parent; the first item is the line number, " and the second is the column. -fun s:BuildTabStops(snip, lnum, col, indent) +fun! s:BuildTabStops(snip, lnum, col, indent) let snipPos = [] let i = 1 let withoutVars = substitute(a:snip, '$\d\+', '', 'g') - while stridx(a:snip, '${'.i) != -1 - let beforeTabStop = matchstr(withoutVars, '^.*\ze${'.i.'\D') - let withoutOthers = substitute(withoutVars, '${\('.i.'\D\)\@!\d\+.\{-}}', '', 'g') + while a:snip =~ s:d.'{'.i + let beforeTabStop = matchstr(withoutVars, '^.*\ze'.s:d .'{'.i.'\D') + let withoutOthers = substitute(withoutVars, ''.s:d .'{\('.i.'\D\)\@!\d\+.\{-}}', '', 'g') let j = i - 1 - call add(snipPos, [0, 0, -1]) + call add(snipPos, [0, 0, 0]) let snipPos[j][0] = a:lnum + s:Count(beforeTabStop, "\n") - let snipPos[j][1] = a:indent + len(matchstr(withoutOthers, '.*\(\n\|^\)\zs.*\ze${'.i.'\D')) + let snipPos[j][1] = a:indent + len(matchstr(withoutOthers, '.*\(\n\|^\)\zs.*\ze'.s:d .'{'.i.'\D')) if snipPos[j][0] == a:lnum | let snipPos[j][1] += a:col | endif " Get all $# matches in another list, if ${#:name} is given - if stridx(withoutVars, '${'.i.':') != -1 - let snipPos[j][2] = len(matchstr(withoutVars, '${'.i.':\zs.\{-}\ze}')) + if withoutVars =~ ''.s:d .'{'.i.':' + let snipPos[j][2] = len(matchstr(withoutVars, ''.s:d .'{'.i.':\zs.\{-}\ze}')) let dots = repeat('.', snipPos[j][2]) call add(snipPos[j], []) - let withoutOthers = substitute(a:snip, '${\d\+.\{-}}\|$'.i.'\@!\d\+', '', 'g') - while match(withoutOthers, '$'.i.'\(\D\|$\)') != -1 - let beforeMark = matchstr(withoutOthers, '^.\{-}\ze'.dots.'$'.i.'\(\D\|$\)') + let withoutOthers = substitute(a:snip, ''.s:d .'{\d\+.\{-}}\|'.s:d .''.i.'\@!\d\+', '', 'g') + while match(withoutOthers, ''.s:d .''.i.'\(\D\|$\)') != -1 + let beforeMark = matchstr(withoutOthers, '^.\{-}\ze'.dots.''.s:d .''.i.'\(\D\|$\)') call add(snipPos[j][3], [0, 0]) let snipPos[j][3][-1][0] = a:lnum + s:Count(beforeMark, "\n") let snipPos[j][3][-1][1] = a:indent + (snipPos[j][3][-1][0] > a:lnum \ ? len(matchstr(beforeMark, '.*\n\zs.*')) \ : a:col + len(beforeMark)) - let withoutOthers = substitute(withoutOthers, '$'.i.'\ze\(\D\|$\)', '', '') + let withoutOthers = substitute(withoutOthers, ''.s:d .''.i.'\ze\(\D\|$\)', '', '') endw endif let i += 1 @@ -168,65 +238,48 @@ fun s:BuildTabStops(snip, lnum, col, indent) return [snipPos, i - 1] endf -fun snipMate#jumpTabStop(backwards) - let leftPlaceholder = exists('s:origWordLen') - \ && s:origWordLen != g:snipPos[s:curPos][2] - if leftPlaceholder && exists('s:oldEndCol') - let startPlaceholder = s:oldEndCol + 1 - endif +function! s:state_proto.jump_stop(backwards) + " Update changes just in case + " This seems to be only needed because insert completion does not trigger + " the CursorMovedI event + call self.update_changes() - if exists('s:update') - call s:UpdatePlaceholderTabStops() - else - call s:UpdateTabStops() - endif + " Update stop and var locations + call self.update_stops() - " Don't reselect placeholder if it has been modified - if leftPlaceholder && g:snipPos[s:curPos][2] != -1 - if exists('startPlaceholder') - let g:snipPos[s:curPos][1] = startPlaceholder - else - let g:snipPos[s:curPos][1] = col('.') - let g:snipPos[s:curPos][2] = 0 - endif - endif + " Store the changed col/length of the current stop + let self.cur_stop[1] = self.start_col + let self.cur_stop[2] = self.end_col - self.start_col - let s:curPos += a:backwards ? -1 : 1 + let self.stop_no += a:backwards ? -1 : 1 " Loop over the snippet when going backwards from the beginning - if s:curPos < 0 | let s:curPos = s:snipLen - 1 | endif + if self.stop_no < 0 | let self.stop_no = self.stop_count - 1 | endif - if s:curPos == s:snipLen - let sMode = s:endCol == g:snipPos[s:curPos-1][1]+g:snipPos[s:curPos-1][2] - call s:RemoveSnippet() - return sMode ? "\" : TriggerSnippet() + if self.stop_no == self.stop_count + call self.remove() + return '' endif - call cursor(g:snipPos[s:curPos][0], g:snipPos[s:curPos][1]) - - let s:endLine = g:snipPos[s:curPos][0] - let s:endCol = g:snipPos[s:curPos][1] - let s:prevLen = [line('$'), col('$')] - - return g:snipPos[s:curPos][2] == -1 ? '' : s:SelectWord() -endf + call self.set_stop(self.stop_no) + return self.select_word() +endfunction -fun s:UpdatePlaceholderTabStops() - let changeLen = s:origWordLen - g:snipPos[s:curPos][2] - unl s:startCol s:origWordLen s:update - if !exists('s:oldVars') | return | endif +" Updates tab stops/vars +function! s:state_proto.update_stops() + let changeLen = self.end_col - self.cur_stop[2] - self.start_col " Update tab stops in snippet if text has been added via "$#" " (e.g., in "${1:foo}bar$1${2}"). if changeLen != 0 let curLine = line('.') - for pos in g:snipPos - if pos == g:snipPos[s:curPos] | continue | endif - let changed = pos[0] == curLine && pos[1] > s:oldEndCol + for pos in self.stops + if pos == self.cur_stop | continue | endif + let changed = pos[0] == curLine && pos[1] > self.start_col let changedVars = 0 let endPlaceholder = pos[2] - 1 + pos[1] " Subtract changeLen from each tab stop that was after any of " the current tab stop's placeholders. - for [lnum, col] in s:oldVars + for [lnum, col] in self.old_vars if lnum > pos[0] | break | endif if pos[0] == lnum if pos[1] > col || (pos[2] == -1 && pos[1] == col) @@ -236,200 +289,545 @@ fun s:UpdatePlaceholderTabStops() endif endif endfor - let pos[1] -= changeLen * changed - let pos[2] -= changeLen * changedVars " Parse variables within placeholders - " e.g., "${1:foo} ${2:$1bar}" + let pos[1] += changeLen * changed + " Parse variables within placeholders, e.g., "${1:foo} ${2:$1bar}" + let pos[2] += changeLen * changedVars - if pos[2] == -1 | continue | endif " Do the same to any placeholders in the other tab stops. - for nPos in pos[3] - let changed = nPos[0] == curLine && nPos[1] > s:oldEndCol - for [lnum, col] in s:oldVars - if lnum > nPos[0] | break | endif - if nPos[0] == lnum && nPos[1] > col - let changed += 1 + if exists('pos[3]') + for nPos in pos[3] + let changed = nPos[0] == curLine && nPos[1] > self.start_col + if changed && nPos[1] < self.start_col + self.cur_stop[2] + call remove(pos, index(pos, nPos)) + continue endif + for [lnum, col] in self.old_vars + if lnum > nPos[0] | break | endif + if nPos[0] == lnum && nPos[1] > col + let changed += 1 + endif + endfor + let nPos[1] += changeLen * changed endfor - let nPos[1] -= changeLen * changed - endfor + endif endfor endif - unl s:endCol s:oldVars s:oldEndCol -endf +endfunction -fun s:UpdateTabStops() - let changeLine = s:endLine - g:snipPos[s:curPos][0] - let changeCol = s:endCol - g:snipPos[s:curPos][1] - if exists('s:origWordLen') - let changeCol -= s:origWordLen - unl s:origWordLen +" Select the placeholder for the current tab stop +function! s:state_proto.select_word() + let len = self.cur_stop[2] + if !len | return '' | endif + let l = col('.') != 1 ? 'l' : '' + if &sel == 'exclusive' + return "\".l.'v'.len."l\" endif - let lnum = g:snipPos[s:curPos][0] - let col = g:snipPos[s:curPos][1] - " Update the line number of all proceeding tab stops if has - " been inserted. - if changeLine != 0 - let changeLine -= 1 - for pos in g:snipPos - if pos[0] >= lnum - if pos[0] == lnum | let pos[1] += changeCol | endif - let pos[0] += changeLine - endif - if pos[2] == -1 | continue | endif - for nPos in pos[3] - if nPos[0] >= lnum - if nPos[0] == lnum | let nPos[1] += changeCol | endif - let nPos[0] += changeLine - endif - endfor - endfor - elseif changeCol != 0 - " Update the column of all proceeding tab stops if text has - " been inserted/deleted in the current line. - for pos in g:snipPos - if pos[1] >= col && pos[0] == lnum - let pos[1] += changeCol + return len == 1 ? "\".l.'gh' : "\".l.'v'.(len - 1)."l\" +endfunction + +" Update the snippet as text is typed. The self.update_vars() function does +" the actual work. +" If the cursor moves outside of a placeholder, call self.remove() +function! s:state_proto.update_changes() + let change_len = col('$') - self.prev_len + let self.end_col += change_len + + let col = col('.') + if line('.') != self.cur_stop[0] || col < self.start_col || col > self.end_col + call self.remove() + elseif self.has_vars + call self.update_vars(change_len) + endif + + let self.prev_len = col('$') +endfunction + +" Actually update the vars for any changed text +function! s:state_proto.update_vars(change) + let newWordLen = self.end_col - self.start_col + let newWord = strpart(getline('.'), self.start_col - 1, newWordLen) + let changeLen = a:change + let curLine = line('.') + let oldStartSnip = self.start_col + let updateTabStops = changeLen != 0 + let i = 0 + + for [lnum, col] in self.cur_stop[3] + if updateTabStops + let start = self.start_col + if lnum == curLine && col <= start + let self.start_col += changeLen + let self.end_col += changeLen endif - if pos[2] == -1 | continue | endif - for nPos in pos[3] + for nPos in self.cur_stop[3][(i):] + " This list is in ascending order, so quit if we've gone too far. if nPos[0] > lnum | break | endif - if nPos[0] == lnum && nPos[1] >= col - let nPos[1] += changeCol + if nPos[0] == lnum && nPos[1] > col + let nPos[1] += changeLen endif endfor - endfor + if lnum == curLine && col > start + let col += changeLen + let self.cur_stop[3][i][1] = col + endif + let i += 1 + endif + + " Split the line into three parts: the mirror, what's before it, and + " what's after it. Then combine them using the new mirror string. + " Subtract one to go from column index to byte index + let theline = getline(lnum) + let update = strpart(theline, 0, col - 1) + let update .= newWord + let update .= strpart(theline, col + self.end_col - self.start_col - a:change - 1) + call setline(lnum, update) + endfor + + " Reposition the cursor in case a var updates on the same line but before + " the current tabstop + if oldStartSnip != self.start_col || mode() == 'i' + call cursor(0, col('.') + self.start_col - oldStartSnip) endif +endfunction + +" reads a .snippets file +" returns list of +" ['triggername', 'name', 'contents'] +" if triggername is not set 'default' is assumed +fun! snipMate#ReadSnippetsFile(file) + let result = [] + let new_scopes = [] + if !filereadable(a:file) | return [result, new_scopes] | endif + let inSnip = 0 + for line in readfile(a:file) + ["\n"] + if inSnip && (line[0] == "\t" || line == '') + let content .= strpart(line, 1)."\n" + continue + elseif inSnip + call add(result, [trigger, name == '' ? 'default' : name, content[:-2]]) + let inSnip = 0 + endif + + if line[:6] == 'snippet' + let inSnip = 1 + let trigger = strpart(line, 8) + let name = '' + let space = stridx(trigger, ' ') + 1 + if space " Process multi snip + let name = strpart(trigger, space) + let trigger = strpart(trigger, 0, space - 1) + endif + let content = '' + elseif line[:6] == 'extends' + call extend(new_scopes, map(split(strpart(line, 8)), + \ "substitute(v:val, ',*$', '', '')")) + endif + endfor + return [result, new_scopes] endf -fun s:SelectWord() - let s:origWordLen = g:snipPos[s:curPos][2] - let s:oldWord = strpart(getline('.'), g:snipPos[s:curPos][1] - 1, - \ s:origWordLen) - let s:prevLen[1] -= s:origWordLen - if !empty(g:snipPos[s:curPos][3]) - let s:update = 1 - let s:endCol = -1 - let s:startCol = g:snipPos[s:curPos][1] - 1 - endif - if !s:origWordLen | return '' | endif - let l = col('.') != 1 ? 'l' : '' - if &sel == 'exclusive' - return "\".l.'v'.s:origWordLen."l\" - endif - return s:origWordLen == 1 ? "\".l.'gh' - \ : "\".l.'v'.(s:origWordLen - 1)."l\" +" adds scope aliases to list. +" returns new list +" the aliases of aliases are added recursively +fun! s:AddScopeAliases(list) + let did = {} + let scope_aliases = get(s:c,'scope_aliases', {}) + let new = a:list + let new2 = [] + while !empty(new) + for i in new + if !has_key(did, i) + let did[i] = 1 + call extend(new2, split(get(scope_aliases,i,''),',')) + endif + endfor + let new = new2 + let new2 = [] + endwhile + return keys(did) endf -" This updates the snippet as you type when text needs to be inserted -" into multiple places (e.g. in "${1:default text}foo$1bar$1", -" "default text" would be highlighted, and if the user types something, -" UpdateChangedSnip() would be called so that the text after "foo" & "bar" -" are updated accordingly) +if v:version >= 704 + function! s:Glob(path, expr) + return split(globpath(a:path, a:expr), "\n") + endfunction +else + function! s:Glob(path, expr) + let res = [] + for p in split(a:path, ',') + let h = split(fnamemodify(a:expr, ':h'), '/')[0] + if isdirectory(p . '/' . h) + call extend(res, split(glob(p . '/' . a:expr), "\n")) + endif + endfor + return filter(res, 'filereadable(v:val)') + endfunction +endif + +" returns dict of +" { path: { 'type': one of 'snippet' 'snippets', +" 'exists': 1 or 0 +" " for single snippet files: +" 'name': name of snippet +" 'trigger': trigger of snippet +" } +" } +" use mustExist = 1 to return existing files only " -" It also automatically quits the snippet if the cursor is moved out of it -" while in insert mode. -fun s:UpdateChangedSnip(entering) - if exists('g:snipPos') && bufnr(0) != s:lastBuf - call s:RemoveSnippet() - elseif exists('s:update') " If modifying a placeholder - if !exists('s:oldVars') && s:curPos + 1 < s:snipLen - " Save the old snippet & word length before it's updated - " s:startCol must be saved too, in case text is added - " before the snippet (e.g. in "foo$1${2}bar${1:foo}"). - let s:oldEndCol = s:startCol - let s:oldVars = deepcopy(g:snipPos[s:curPos][3]) - endif - let col = col('.') - 1 - - if s:endCol != -1 - let changeLen = col('$') - s:prevLen[1] - let s:endCol += changeLen - else " When being updated the first time, after leaving select mode - if a:entering | return | endif - let s:endCol = col - 1 - endif +" mustExist = 0 is used by OpenSnippetFiles +function! snipMate#GetSnippetFiles(mustExist, scopes, trigger) + let paths = join(funcref#Call(s:c.snippet_dirs), ',') + let result = {} + let scopes = s:AddScopeAliases(a:scopes) + let trigger = escape(a:trigger, "*[]?{}`'$") + + " collect existing files + for scope in scopes + + for f in s:Glob(paths, 'snippets/' . scope . '.snippets') + + \ s:Glob(paths, 'snippets/' . scope . '/*.snippets') + let result[f] = { 'exists' : 1, 'type' : 'snippets', + \ 'name_prefix' : fnamemodify(f, ':t:r') } + endfor - " If the cursor moves outside the snippet, quit it - if line('.') != g:snipPos[s:curPos][0] || col < s:startCol || - \ col - 1 > s:endCol - unl! s:startCol s:origWordLen s:oldVars s:update - return s:RemoveSnippet() - endif + " We check for trigger* in the next two loops. In the case of an exact + " match, that'll be handled in snipMate#GetSnippetsForWordBelowCursor. + for f in s:Glob(paths, 'snippets/' . scope . '/' . trigger . '*.snippet') + let result[f] = {'exists': 1, 'type': 'snippet', 'name': 'default', + \ 'trigger': fnamemodify(f, ':t:r'), 'name_prefix' : scope } + endfor - call s:UpdateVars() - let s:prevLen[1] = col('$') - elseif exists('g:snipPos') - if !a:entering && g:snipPos[s:curPos][2] != -1 - let g:snipPos[s:curPos][2] = -2 + for f in s:Glob(paths, 'snippets/' . scope . '/' . trigger . '*/*.snippet') + let result[f] = {'exists': 1, 'type': 'snippet', 'name' : fnamemodify(f, ':t:r'), + \ 'trigger': fnamemodify(f, ':h:t'), 'name_prefix' : scope } + endfor + + if !a:mustExist + for p in split(paths, ',') + let p .= '/snippets/' . scope . '.snippets' + let result[p] = get(result, p, {'exists': 0, 'type': 'snippets'}) + endfor endif - let col = col('.') - let lnum = line('.') - let changeLine = line('$') - s:prevLen[0] + endfor + return result +endfunction + +" should be moved to utils or such? +function! snipMate#SetByPath(dict, trigger, path, snippet) + let d = a:dict + if !has_key(d, a:trigger) + let d[a:trigger] = {} + endif + let d[a:trigger][a:path] = a:snippet +endfunction - if lnum == s:endLine - let s:endCol += col('$') - s:prevLen[1] - let s:prevLen = [line('$'), col('$')] +function! s:CachedSnips(file) + let mtime = getftime(a:file) + if has_key(s:cache, a:file) && s:cache[a:file].mtime >= mtime + return s:cache[a:file].contents + endif + let s:cache[a:file] = {} + let s:cache[a:file].mtime = mtime + let s:cache[a:file].contents = snipMate#ReadSnippetsFile(a:file) + return s:cache[a:file].contents +endfunction + +" default triggers based on paths +function! snipMate#DefaultPool(scopes, trigger, result) + let extra_scopes = [] + for [f,opts] in items(snipMate#GetSnippetFiles(1, a:scopes, a:trigger)) + let opts.name_prefix = matchstr(f, '\v/\zs.{-}\ze/snippets') . ' ' . opts.name_prefix + if opts.type == 'snippets' + let [snippets, new_scopes] = s:CachedSnips(f) + call extend(extra_scopes, new_scopes) + for [trigger, name, contents] in snippets + if trigger =~ '\V\^' . escape(a:trigger, '\') + call snipMate#SetByPath(a:result, trigger, + \ opts.name_prefix . ' ' . name, contents) + endif + endfor + elseif opts.type == 'snippet' + call snipMate#SetByPath(a:result, opts.trigger, + \ opts.name_prefix . ' ' . opts.name, readfile(f)) + else + throw "unexpected" endif - if changeLine != 0 - let s:endLine += changeLine - let s:endCol = col + endfor + + if !empty(extra_scopes) + call snipMate#DefaultPool(extra_scopes, a:trigger, a:result) + endif +endfunction + +" return a dict of snippets found in runtimepath matching trigger +" scopes: list of scopes. usually this is the filetype. eg ['c','cpp'] +" trigger may contain glob patterns. Thus use '*' to get all triggers +" +fun! snipMate#GetSnippets(scopes, trigger) + let result = {} + + for F in values(g:snipMateSources) + call funcref#Call(F, [a:scopes, a:trigger, result]) + endfor + return result +endf + +" adds leading tab +" and replaces leading spaces by tabs +" see ftplugin/snippet.vim +fun! snipMate#RetabSnip() range + let leadingTab = expand('%:e') == 'snippets' + + let lines = getline(a:firstline, a:lastline) + + " remove leading "\t" + let allIndented = 1 + for l in lines + if l[0] != '\t' | let allIndented = 0 | endif + endfor + + " retab + if allIndented + call map(lines, 'v:val[1:]') + endif + + let leadingSp = filter(map(copy(lines),'matchstr(v:val,"^\\s*") '),'v:val !=""') + if !empty(leadingSp) + " lines containing leading spaces found + let smallestInd = len(sort(leadingSp)[-1]) + let ind = input('retab, spaces per tab: ', smallestInd) + for i in range(0, len(lines)-1) + let ml = matchlist(lines[i], '^\(\s*\)\(.*\)') + let lines[i] = repeat("\t", len(ml[1]) / ind) + \ . repeat( " ", len(ml[1]) % ind) + \ . ml[2] + endfor + endif + " readd tab + let tab = leadingTab ? "\t" : "" + for i in range(0,len(lines)-1) + call setline(a:firstline + i, tab.lines[i]) + endfor +endf + +fun! snipMate#OpenSnippetFiles() + let dict = snipMate#GetSnippetFiles(0, snipMate#ScopesByFile(), '*') + " sort by files wether they exist - put existing files first + let exists = [] + let notExists = [] + for [file, v] in items(dict) + let v['file'] = file + if v['exists'] + call add(exists, v) + else + call add(notExists, v) + endif + endfor + let all = exists + notExists + let show = map(copy(all),'(v:val["exists"] ? "exists:" : "does not exist yet:")." ".v:val["file"]') + let select = tlib#input#List('mi', 'select files to be opened in splits', show) + for idx in select + exec 'sp '.all[idx - 1]['file'] + endfor +endf + +fun! snipMate#ScopesByFile() + " duplicates are removed in AddScopeAliases + return filter(funcref#Call(s:c.get_scopes), "v:val != ''") +endf + +" used by both: completion and insert snippet +fun! snipMate#GetSnippetsForWordBelowCursor(word, exact) + " Setup lookups: '1.2.3' becomes [1.2.3] + [3, 2.3] + let parts = split(a:word, '\W\zs') + if len(parts) > 2 + let parts = parts[-2:] " max 2 additional items, this might become a setting + endif + let lookups = [a:word] + let lookup = '' + for w in reverse(parts) + let lookup = w . lookup + if index(lookups, lookup) == -1 + call add(lookups, lookup) endif + endfor + + " allow matching '.' + if a:word =~ '\.$' + call add(lookups, '.') + endif + + " Remove empty lookup entries, but only if there are other nonempty lookups + if len(lookups) > 1 + call filter(lookups, 'v:val != ""') + endif - " Delete snippet if cursor moves out of it in insert mode - if (lnum == s:endLine && (col > s:endCol || col < g:snipPos[s:curPos][1])) - \ || lnum > s:endLine || lnum < g:snipPos[s:curPos][0] - call s:RemoveSnippet() + let matching_snippets = [] + let snippet = '' + " prefer longest word + for word in lookups + let s:c.word = word + for [k,snippetD] in items(funcref#Call(s:c['get_snippets'], [snipMate#ScopesByFile(), word])) + " hack: require exact match + if a:exact && k !=# word + continue + endif + call add(matching_snippets, [k, snippetD]) + if a:exact + break + endif + endfor + endfor + return matching_snippets +endf + +" snippets: dict containing snippets by name +" usually this is just {'default' : snippet_contents } +fun! s:ChooseSnippet(snippets) + let snippet = [] + let keys = keys(a:snippets) + let i = 1 + for snip in keys + let snippet += [i.'. '.snip] + let i += 1 + endfor + if len(snippet) == 1 + " there's only a single snippet, choose it + let idx = 0 + else + let idx = tlib#input#List('si','select snippet by name',snippet) -1 + if idx == -1 + return '' endif endif + " if a:snippets[..] is a String Call returns it + " If it's a function or a function string the result is returned + return funcref#Call(a:snippets[keys(a:snippets)[idx]]) endf -" This updates the variables in a snippet when a placeholder has been edited. -" (e.g., each "$1" in "${1:foo} $1bar $1bar") -fun s:UpdateVars() - let newWordLen = s:endCol - s:startCol + 1 - let newWord = strpart(getline('.'), s:startCol, newWordLen) - if newWord == s:oldWord || empty(g:snipPos[s:curPos][3]) - return +fun! snipMate#WordBelowCursor() + return matchstr(getline('.'), '\S\+\%' . col('.') . 'c') +endf + +fun! snipMate#GetSnippetsForWordBelowCursorForComplete(word) + let snippets = map(snipMate#GetSnippetsForWordBelowCursor(a:word, 0), 'v:val[0]') + return filter(snippets, 'v:val =~# "\\V\\^' . escape(a:word, '"\') . '"') +endf + +fun! snipMate#CanBeTriggered() + let word = snipMate#WordBelowCursor() + let matches = snipMate#GetSnippetsForWordBelowCursorForComplete(word) + return len(matches) > 0 +endf + +fun! snipMate#ShowAvailableSnips() + let col = col('.') + let word = snipMate#WordBelowCursor() + let matches = snipMate#GetSnippetsForWordBelowCursorForComplete(word) + + " Pretty hacky, but really can't have the tab swallowed! + if len(matches) == 0 + call feedkeys(s:c['no_match_completion_feedkeys_chars'], 'n') + return "" endif - let changeLen = g:snipPos[s:curPos][2] - newWordLen - let curLine = line('.') - let startCol = col('.') - let oldStartSnip = s:startCol - let updateTabStops = changeLen != 0 - let i = 0 + call complete(col - len(word), sort(matches)) + return '' +endf - for [lnum, col] in g:snipPos[s:curPos][3] - if updateTabStops - let start = s:startCol - if lnum == curLine && col <= start - let s:startCol -= changeLen - let s:endCol -= changeLen +" Pass an argument to force snippet expansion instead of triggering or jumping +function! snipMate#TriggerSnippet(...) + if exists('g:SuperTabMappingForward') + if g:SuperTabMappingForward == "" + let SuperTabPlug = maparg('SuperTabForward', 'i') + if SuperTabPlug == "" + let SuperTabKey = "\" + else + exec "let SuperTabKey = \"" . escape(SuperTabPlug, '<') . "\"" endif - for nPos in g:snipPos[s:curPos][3][(i):] - " This list is in ascending order, so quit if we've gone too far. - if nPos[0] > lnum | break | endif - if nPos[0] == lnum && nPos[1] > col - let nPos[1] -= changeLen - endif - endfor - if lnum == curLine && col > start - let col -= changeLen - let g:snipPos[s:curPos][3][i][1] = col + elseif g:SuperTabMappingBackward == "" + let SuperTabPlug = maparg('SuperTabBackward', 'i') + if SuperTabPlug == "" + let SuperTabKey = "\" + else + exec "let SuperTabKey = \"" . escape(SuperTabPlug, '<') . "\"" endif - let i += 1 endif + endif - " "Very nomagic" is used here to allow special characters. - call setline(lnum, substitute(getline(lnum), '\%'.col.'c\V'. - \ escape(s:oldWord, '\'), escape(newWord, '\&'), '')) - endfor - if oldStartSnip != s:startCol - call cursor(0, startCol + s:startCol - oldStartSnip) + if pumvisible() " Update snippet if completion is used, or deal with supertab + if exists('SuperTabKey') + call feedkeys(SuperTabKey) | return '' + endif + call feedkeys("\a", 'n') " Close completion menu + call feedkeys("\") | return '' + endif + + if exists('b:snip_state') && a:0 == 0 " Jump only if no arguments + let jump = b:snip_state.jump_stop(0) + if type(jump) == 1 " returned a string + return jump + endif endif - let s:oldWord = newWord - let g:snipPos[s:curPos][2] = newWordLen + let word = matchstr(getline('.'), '\S\+\%'.col('.').'c') + let list = snipMate#GetSnippetsForWordBelowCursor(word, 1) + if empty(list) + let snippet = '' + else + let [trigger, snippetD] = list[0] + + let s = s:ChooseSnippet(snippetD) + if type(s) == type([]) + let snippet = join(s, "\n") + else + let snippet = s + end + + " Before expanding snippet, create new undo point |i_CTRL-G| + let &undolevels = &undolevels + let col = col('.') - len(trigger) + sil exe 's/\V'.escape(trigger, '/\.').'\%#//' + return snipMate#expandSnip(snippet, col) + endif + + " should allow other plugins to register hooks instead (duplicate code) + if exists('SuperTabKey') + call feedkeys(SuperTabKey) + return '' + endif + return word == '' + \ ? "\" + \ : "\=snipMate#ShowAvailableSnips()\" +endfunction + +fun! snipMate#BackwardsSnippet() + if exists('b:snip_state') | return b:snip_state.jump_stop(1) | endif + + if exists('g:SuperTabMappingForward') + if g:SuperTabMappingForward == "" + let SuperTabPlug = maparg('SuperTabForward', 'i') + if SuperTabPlug == "" + let SuperTabKey = "\" + else + exec "let SuperTabKey = \"" . escape(SuperTabPlug, '<') . "\"" + endif + elseif g:SuperTabMappingBackward == "" + let SuperTabPlug = maparg('SuperTabBackward', 'i') + if SuperTabPlug == "" + let SuperTabKey = "\" + else + exec "let SuperTabKey = \"" . escape(SuperTabPlug, '<') . "\"" + endif + endif + endif + " should allow other plugins to register hooks instead (duplicate code) + if exists('SuperTabKey') + call feedkeys(SuperTabKey) + return '' + endif + return "\" endf + " vim:noet:sw=4:ts=4:ft=vim diff --git a/autoload/snipMate_python_demo.vim b/autoload/snipMate_python_demo.vim new file mode 100644 index 0000000..33d0f28 --- /dev/null +++ b/autoload/snipMate_python_demo.vim @@ -0,0 +1,47 @@ +" This file demonstrates +" - how to register your own snippet sources (call snipMate_python_demo#Activate() in ftplugin/python.vim) +" - implents a source which creates snippets based on python function +" definitions found in the current file +" +" Example: +" +" def abc(a,b,c=None) +" will create a snippet on the fly which looks like this: +" abc(${1:a}, ${2:b}, ${3:c=None}) + +fun! snipMate_python_demo#Activate() + if !exists('g:snipMateSources') + let g:snipMateSources = {} + endif + + let g:snipMateSources['python'] = funcref#Function('snipMate_python_demo#FunctionsFromCurrentFileAndTags') +endf + +fun! s:Add(dict, line, source, trigger) + let matched = matchlist(a:line,'def\s\+\([^( \t]\+\)[ \t]*(\([^)]*\)') + if len(matched) > 2 + let name = matched[1] + " TODO: is this a glob? + if name !~ a:trigger | return | endif + let a:dict[name] = get(a:dict, name, {}) + let sd = a:dict[name] + let args = [] + let nr=1 + for arg in split(matched[2], '\s*,\s*') + call add(args, '${'.nr.':'.arg.'}') + let nr+=1 + endfor + let sd[a:source] = name.'('.join(args,', ').')' + endif +endf +fun! snipMate_python_demo#FunctionsFromCurrentFileAndTags(scopes, trigger, result) + " getting all might be too much + if a:trigger == '*' | return | endif + if index(a:scopes, 'python') < 0 | return | endif + for t in taglist('^'.a:trigger) + call s:Add(a:result, t.cmd, 'tags-' . t.filename, a:trigger) + endfor + for l in getline(0, line('$')) + call s:Add(a:result, l, 'current-file', a:trigger) + endfor +endf diff --git a/doc/SnipMate.txt b/doc/SnipMate.txt new file mode 100644 index 0000000..5ec5092 --- /dev/null +++ b/doc/SnipMate.txt @@ -0,0 +1,498 @@ +*SnipMate.txt* Plugin for using TextMate-style snippets in Vim. + +SnipMate *snippet* *snippets* *SnipMate* +Last Change: December 27, 2009 + +1. Description |SnipMate-description| +2. Usage |SnipMate-usage| +3. Interface and Settings |SnipMate-interface| |SnipMate-settings| +4. Snippet syntax |SnipMate-syntax| +5. Snippet sources |SnipMate-snippet-sources| +6. Disadvantages to TextMate |SnipMate-disadvantages| +7. Contact |SnipMate-contact| +8. License |SnipMate-license| + +For Vim version 7.0 or later. +This plugin only works if 'compatible' is not set. +{Vi does not have any of these features.} + +SnipMate depends on vim-addon-mw-utils and tlib. + +============================================================================== +DESCRIPTION *SnipMate-description* + +SnipMate implements snippet features in Vim. A snippet is like a template, +reducing repetitive insertion of pieces of text. Snippets can contain +placeholders for modifying the text if necessary or interpolated code for +evaluation. For example, in C, typing "for" then pushing could expand +to: > + + for (i = 0; i < count; i++) { + /* code */ + } + +SnipMate is inspired by TextMate's snippet features. + +============================================================================== +USAGE *SnipMate-usage* + +Every snippet consists of an expansion and a trigger. Typing a trigger into +your buffer and then hitting your trigger key ( by default, see +|SnipMate-mappings|) will replace the trigger with the expansion text. + +The expansion text can optionally include tab stops. When it does, upon +expansion of the snippet, the cursor is placed at the first one, and the user +can jump between each tab stop. Each of these tab stops can be represented by +default placeholder text. If such a placeholder is provided, then the text of +the placeholder can be repeated in the snippet at specified mirrors. Any edits +to the placeholder are instantly updated at every mirror. + +SnipMate allows multiple snippets to use the same trigger. When triggered, +a list of all snippets with that trigger is provided and prompts for which +snippet to use. + + *SnipMate-scopes* +SnipMate searches for snippets inside a directory named "snippets" inside each +entry in 'runtimepath'. Which files are loaded depends on 'filetype' and +'syntax'; see |SnipMate-syntax| for more information. Snippets are loaded and +refreshed automatically on demand. + +Note: SnipMate does not ship with any snippets. In order to use it, the user +must either write their own snippets or obtain some from a repository like +https://github.com/honza/vim-snippets + +============================================================================== +INTERFACE AND SETTINGS *SnipMate-interface* *SnipMate-settings* + + *SnipMate-commands* +Commands~ + + *:SnipMateOpenSnippetFiles* +:SnipMateOpenSnippetFiles Opens a list of all valid snippet locations + based on the current scope |SnipMate-scopes|. + Only existing files and non-existing .snippets + files will be shown, with the existing files + shown first. + + *SnipMate-options* +Options~ + +g:snips_author A variable used in some snippets in place of + the author's (your) name. Similar to + $TM_FULLNAME in TextMate. For example, > + snippet name + `g:snips_author` +< creates a snippet "name" that expands to your + name. + +g:snipMate This |Dictionary| contains other SnipMate + options. In short add > + let g:snipMate = {} +< to your .vimrc before setting other SnipMate + options. + +g:snipMate.scope_aliases A |Dictionary| associating certain filetypes + with other scopes |SnipMate-scopes|. The + entries consist of a filetype as the key and + a comma-separated list of aliases as the + value. For example, > + let g:snipMate.scope_aliases = {} + let g:snipMate.scope_aliases['ruby'] + \ = 'ruby,ruby-rails' +< tells SnipMate that "ruby-rails" snippets in + addition to "ruby" snippets should be loaded + when editing files with 'filetype' set to + "ruby" or contains "ruby" as an entry in the + case of dotted filetypes. + +g:snipMate_no_default_aliases + When set to 1, prevents SnipMate from loading + default scope aliases. The defaults are: + Filetype Alias ~ + cpp c + cu c + eruby eruby-rails,html + html javascript + mxml actionscript + objc c + php php,html,javascript + ur html,javascript + xhtml html + Note: Setting this option does not disable + scope aliases entirely, only those made by + SnipMate itself. Any scope aliases created by + the user or someone else will still be in + effect. + +g:snipMate['no_match_completion_feedkeys_chars'] + A string inserted when no match for a trigger + is found. By default a tab is inserted + according to 'expandtab', 'tabstop', and + 'softtabstop'. Set it to the empty string to + prevent anything from being inserted. + + *SnipMate-mappings* +Mappings~ + +The mappings SnipMate uses can be customized with the |:map| commands. For +example, to change the key that triggers snippets and moves to the next +tabstop, > + + :imap snipMateNextOrTrigger + :smap snipMateNextOrTrigger + +The list of possible mappings is as follows: + +snipMateNextOrTrigger Default: Mode: Insert, Select + Jumps to the next tab stop or, if none exists, + try to expand a snippet. Use in both insert + and select modes. + +snipMateTrigger Default: unmapped Mode: Insert + Try to expand a snippet regardless of any + existing snippet expansion. If done within an + expanded snippet, the outer snippet's tab + stops are lost, unless expansion failed. + +snipMateBack Default: Mode: Insert, Select + Jump to the previous tab stop, if it exists. + Use in both insert and select modes. + +snipMateShow Default: Mode: Insert + Show all available snippets (that start with + the previous text, if it exists). Use in + insert mode. + +snipMateVisual Default: Mode: Visual + See |SnipMate-visual|. + +Additionally, is mapped in visual mode in .snippets files for retabbing +snippets. + +============================================================================== +SYNTAX *snippet-syntax* *SnipMate-syntax* + +SnipMate looks inside of each entry of 'rtp' (or |SnipMate-snippet-sources|) +for a directory named /snippets/. Based on the 'filetype' and 'syntax' +settings (taking into account the dotted syntax), the following files are read +for snippets: > + + .../snippets/.snippets + .../snippets//.snippets + .../snippets//.snippet + .../snippets///.snippet + +where is an entry in 'filetype' or 'syntax', is an arbitrary +name, is the trigger for a snippet, and is +a description used for |SnipMate-multisnip|. + +A .snippet file defines a single snippet with the trigger (and description) +determined by the filename. The entire contents of the file are used as the +snippet expansion text. + +Multiple snippets can be defined in *.snippets files. Each snippet definition +looks something like: > + + snippet trigger optional description + expanded text + more expanded text + +< *SnipMate-multisnip* +The description is optional. If it is left out and a second snippet inside the +same .snippets file uses the same trigger, the second one will overwrite the +first. Otherwise multisnip is used. + +Note: Hard tabs in the expansion text are required. When the snippet is +expanded in the text and 'expandtab' is set, each tab will be replaced with +spaces based on 'softtabstop' if nonzero or 'shiftwidth' otherwise. + +Comments can be made in .snippets files by starting a line with a # character. +However these can't be used inside of snippet definitions: > + + # this is a correct comment + snippet trigger + expanded text + snippet another_trigger + # this isn't a comment! + expanded text + +This should hopefully be clear with the included syntax highlighting. + + *snipMate-extends* +Borrowing from UltiSnips, .snippets files can also contain an extends +directive, for example: > + + extends html, javascript, css + +will tell SnipMate to also read html, javascript, and css snippets. + + *SnipMate-tabstops* +Tab stops~ + +A tab stop, specified by ${#} where # is a number, tells SnipMate where to +position the cursor next. The special tab stop ${0} denotes the last cursor +position; in its absence, the cursor is placed at the end of the snippet. + +For example, to place the cursor first on the id of a
tag, allow +the user to press to go to the middle of it, and finally end after +
: > + + snippet div +
+ ${2} +
+ +< *SnipMate-placeholders* *SnipMate-mirrors* +Placeholders and Mirrors~ + +Placeholder text can be supplied using "${#:text}", where # is the number of +the tab stop. This text then can be copied throughout the snippet using "$#", +given # is the same number as used before. So, to make a C for loop: > + + snippet for + for (${2:i}=0; $2 < ${1:count}; $2++) { + ${4} + } + +This will cause "count" to first be selected and change if the user starts +typing. When is pressed, the "i" in ${2}'s position will be selected; +all $2 variables will default to "i" and automatically be updated if the user +starts typing. + +NOTE: "$#" syntax is used only for mirrors, not for tab stops as in TextMate. + +Mirrors can also be used inside of placeholders. For instance: > + + snippet opt + + +Will, as usual, cause "option" to first be selected and update all the $1 +variables if the user starts typing. Since one of these variables is inside of +${2}, this text will then be used as a placeholder for the next tab stop, +allowing the user to change it if he wishes. + +To copy a value throughout a snippet without supplying default text, simply +use the "${#:}" construct without the text, e.g.: > + + snippet foo + ${1:}bar$1 + +< *SnipMate-visual* +There is a special placeholder called {VISUAL}. If you visually select text, +then press Vim switches to insert mode. The next snippet you'll expand +will replace {VISUAL} by the text which was selected previously. + + *SnipMate-eval* +Interpolated Vim Script~ + +Snippets can also contain Vim script commands that are executed (via |eval()|) +when the snippet is inserted. Commands are given inside backticks (`...`); for +TextMates's functionality, use the |system()| function. E.g.: > + + snippet date + `system("date +%Y-%m-%d")` + +will insert the current date, assuming you are on a Unix system. Note that you +can also (and should) use |strftime()| for this example. + +Filename([{expr}] [, {defaultText}]) *SnipMate-Filename()* + +Since the current filename is used often in snippets, a default function +has been defined for it in SnipMate.vim, appropriately called Filename(). + +With no arguments, the default filename without an extension is returned; +the first argument specifies what to place before or after the filename, +and the second argument supplies the default text to be used if the file +has not been named. "$1" in the first argument is replaced with the filename; +if you only want the filename to be returned, the first argument can be left +blank. Examples: > + + snippet filename + `Filename()` + snippet filename_with_default + `Filename('', 'name')` + snippet filename_foo + `Filename('$1_foo')` + +The first example returns the filename if it the file has been named, and an +empty string if it hasn't. The second returns the filename if it's been named, +and "name" if it hasn't. The third returns the filename followed by "_foo" if +it has been named, and an empty string if it hasn't. + +============================================================================== +SNIPPET SOURCES *SnipMate-snippet-sources* + +SnipMate is configurable. + +plugin/SnipMate.vim assigns three important keys: > + + " default implementation collecting snippets by handlers + let g:SnipMate['get_snippets'] = SnipMate#GetSnippets + " default handler: + let g:SnipMateSources['default'] = SnipMate#DefaultPool + " default directories containing snippets: + let g:SnipMate['snippet_dirs'] + \ = funcref#Function('return split(&runtimepath,",")') + +You can override all of those settings. + +You can see that the default set of snippets is determined by Vim's 'rtp'. + +Example 1:~ +autoload/SnipMate_python_demo.vim shows how you can register additional +sources such as creating snippets on the fly representing python function +definitions found in the current file. + +Example 2:~ +Add to your ~/.vimrc: For each know snippet add a second version ending in _ +adding folding markers > + + let g:commentChar = { + \ 'vim': '"', + \ 'c': '//', + \ 'cpp': '//', + \ 'sh': '#', + \ 'python': '#' + \ } + " url https://github.com/garbas/vim-snipmate/issues/49 + fun! AddFolding(text) + return substitute(a:text,'\n'," ".g:commentChar[&ft]." {{{\n",1)."\n".g:commentChar[&ft]." }}}" + endf + + fun! SnippetsWithFolding(scopes, trigger, result) + " hacky: temporarely remove this function to prevent infinite recursion: + call remove(g:SnipMateSources, 'with_folding') + " get list of snippets: + let result = SnipMate#GetSnippets(a:scopes, substitute(a:trigger,'_\(\*\)\?$','\1','')) + let g:SnipMateSources['with_folding'] = funcref#Function('SnippetsWithFolding') + + " add folding: + for k in keys(result) + let a:result[k.'_'] = map(result[k],'AddFolding(v:val)') + endfor + endf + + " force setting default: + runtime plugin/SnipMate.vim + " add our own source + let g:SnipMateSources['with_folding'] = funcref#Function('SnippetsWithFolding') + +See |SnipMate-syntax| for more details about all possible relative locations +to 'rtp' can be found in. + +============================================================================== +DISADVANTAGES *SnipMate-disadvantages* + +SnipMate.vim currently has the following disadvantages to TextMate's snippets: + - Nested placeholders are not currently possible. E.g.: > + '${3}' +< In TextMate this would first highlight ' id="some_id"', and if + you hit delete it would automatically skip ${2} and go to ${3} + on the next , but if you didn't delete it it would highlight + "some_id" first. You cannot do this in SnipMate.vim. + - Regex cannot be performed on variables, such as "${1/.*/\U&}" + - Placeholders cannot span multiple lines. + - Activating snippets in different scopes of the same file is + not possible. + +Perhaps some of these features will be added in a later release. + +============================================================================== +CHANGELOG *SnipMate-changelog* + +0.87 - 2014-01-04 +----------------- + +* Stop indenting empty lines when expanding snippets +* Support extends keyword in .snippets files +* Fix visual placeholder support +* Add zero tabstop support +* Support negative 'softtabstop' +* Add g:snipMate_no_default_aliases option +* Add snipMateTrigger for triggering an expansion inside a snippet +* Add snipMate#CanBeTriggered() function + +0.86 - 2013-06-15 +----------------- +* Use more idiomatic maps +* Remove most select mode mappings + +* Fix disappearing variables bug (hpesoj) +* Fix cursor position bug when a variable is on the same line as the stop +* Fix undo point creation causing problems with Supertab +* Fix bug where SnipMate would use a typed trigger as a regular expression + +0.85 - 2013-04-03 +----------------- + +* Allow trigger key customization +* Enable undoing of snippet expansion +* Support backslash escaping in snippets +* Add support for {VISUAL} +* Expand filetype extension with scope_aliases +* Add expansion guards +* Enable per-buffer expansion of snippets +* Fix 'cpo' compatibility +* Update supertab compatibility +* Enable customization of various things through g:SnipMate + +* Disable spelling in snippet files +* Highlight trigger names in .snippets files + +* Update many snippets +* Separate sample snippets into separate repository + +0.84 +---- + +* Unreleased version by Michael Sanders, available on his GitHub, + + +0.83 - 2009-07-13 +----------------- + +* Last release done by Michael Sanders, available at + + +============================================================================== +CONTACT *SnipMate-contact* *SnipMate-author* + +SnipMate is currently maintained by: + - Rok Garbas + - Marc Weber (marco-oweber@gmx.de) + - Adnan Zafar + +For bug reports, issues, or questions, check out the Issues page on GitHub: +https://github.com/garbas/vim-snipmate/issues + +The original author, Michael Sanders, can be reached at: +msanders42+snipmate gmail com + + +============================================================================== +LICENSE *SnipMate-license* + +SnipMate is released under the MIT license: + +Copyright 2009-2010 Michael Sanders. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The software is provided "as is", without warranty of any kind, express or +implied, including but not limited to the warranties of merchantability, +fitness for a particular purpose and noninfringement. In no event shall the +authors or copyright holders be liable for any claim, damages or other +liability, whether in an action of contract, tort or otherwise, arising from, +out of or in connection with the software or the use or other dealings in the +software. + +============================================================================== + vim:tw=78:ts=8:ft=help:norl: diff --git a/doc/snipMate.txt b/doc/snipMate.txt deleted file mode 100644 index 521235d..0000000 --- a/doc/snipMate.txt +++ /dev/null @@ -1,322 +0,0 @@ -*snipMate.txt* Plugin for using TextMate-style snippets in Vim. - -snipMate *snippet* *snippets* *snipMate* -Last Change: December 27, 2009 - -|snipMate-description| Description -|snipMate-syntax| Snippet syntax -|snipMate-usage| Usage -|snipMate-settings| Settings -|snipMate-features| Features -|snipMate-disadvantages| Disadvantages to TextMate -|snipMate-contact| Contact -|snipMate-license| License - -For Vim version 7.0 or later. -This plugin only works if 'compatible' is not set. -{Vi does not have any of these features.} - -============================================================================== -DESCRIPTION *snipMate-description* - -snipMate.vim implements some of TextMate's snippets features in Vim. A -snippet is a piece of often-typed text that you can insert into your -document using a trigger word followed by a . - -For instance, in a C file using the default installation of snipMate.vim, if -you type "for" in insert mode, it will expand a typical for loop in C: > - - for (i = 0; i < count; i++) { - - } - - -To go to the next item in the loop, simply over to it; if there is -repeated code, such as the "i" variable in this example, you can simply -start typing once it's highlighted and all the matches specified in the -snippet will be updated. To go in reverse, use . - -============================================================================== -SYNTAX *snippet-syntax* - -Snippets can be defined in two ways. They can be in their own file, named -after their trigger in 'snippets//.snippet', or they can be -defined together in a 'snippets/.snippets' file. Note that dotted -'filetype' syntax is supported -- e.g., you can use > - - :set ft=html.eruby - -to activate snippets for both HTML and eRuby for the current file. - -The syntax for snippets in *.snippets files is the following: > - - snippet trigger - expanded text - more expanded text - -Note that the first hard tab after the snippet trigger is required, and not -expanded in the actual snippet. The syntax for *.snippet files is the same, -only without the trigger declaration and starting indentation. - -Also note that snippets must be defined using hard tabs. They can be expanded -to spaces later if desired (see |snipMate-indenting|). - -"#" is used as a line-comment character in *.snippets files; however, they can -only be used outside of a snippet declaration. E.g.: > - - # this is a correct comment - snippet trigger - expanded text - snippet another_trigger - # this isn't a comment! - expanded text -< -This should hopefully be obvious with the included syntax highlighting. - - *snipMate-${#}* -Tab stops ~ - -By default, the cursor is placed at the end of a snippet. To specify where the -cursor is to be placed next, use "${#}", where the # is the number of the tab -stop. E.g., to place the cursor first on the id of a
tag, and then allow -the user to press to go to the middle of it: - > - snippet div -
- ${2} -
-< - *snipMate-placeholders* *snipMate-${#:}* *snipMate-$#* -Placeholders ~ - -Placeholder text can be supplied using "${#:text}", where # is the number of -the tab stop. This text then can be copied throughout the snippet using "$#", -given # is the same number as used before. So, to make a C for loop: > - - snippet for - for (${2:i}; $2 < ${1:count}; $1++) { - ${4} - } - -This will cause "count" to first be selected and change if the user starts -typing. When is pressed, the "i" in ${2}'s position will be selected; -all $2 variables will default to "i" and automatically be updated if the user -starts typing. -NOTE: "$#" syntax is used only for variables, not for tab stops as in TextMate. - -Variables within variables are also possible. For instance: > - - snippet opt - - -Will, as usual, cause "option" to first be selected and update all the $1 -variables if the user starts typing. Since one of these variables is inside of -${2}, this text will then be used as a placeholder for the next tab stop, -allowing the user to change it if he wishes. - -To copy a value throughout a snippet without supplying default text, simply -use the "${#:}" construct without the text; e.g.: > - - snippet foo - ${1:}bar$1 -< *snipMate-commands* -Interpolated Vim Script ~ - -Snippets can also contain Vim script commands that are executed (via |eval()|) -when the snippet is inserted. Commands are given inside backticks (`...`); for -TextMates's functionality, use the |system()| function. E.g.: > - - snippet date - `system("date +%Y-%m-%d")` - -will insert the current date, assuming you are on a Unix system. Note that you -can also (and should) use |strftime()| for this example. - -Filename([{expr}] [, {defaultText}]) *snipMate-filename* *Filename()* - -Since the current filename is used often in snippets, a default function -has been defined for it in snipMate.vim, appropriately called Filename(). - -With no arguments, the default filename without an extension is returned; -the first argument specifies what to place before or after the filename, -and the second argument supplies the default text to be used if the file -has not been named. "$1" in the first argument is replaced with the filename; -if you only want the filename to be returned, the first argument can be left -blank. Examples: > - - snippet filename - `Filename()` - snippet filename_with_default - `Filename('', 'name')` - snippet filename_foo - `filename('$1_foo')` - -The first example returns the filename if it the file has been named, and an -empty string if it hasn't. The second returns the filename if it's been named, -and "name" if it hasn't. The third returns the filename followed by "_foo" if -it has been named, and an empty string if it hasn't. - - *multi_snip* -To specify that a snippet can have multiple matches in a *.snippets file, use -this syntax: > - - snippet trigger A description of snippet #1 - expand this text - snippet trigger A description of snippet #2 - expand THIS text! - -In this example, when "trigger" is typed, a numbered menu containing all -of the descriptions of the "trigger" will be shown; when the user presses the -corresponding number, that snippet will then be expanded. - -To create a snippet with multiple matches using *.snippet files, -simply place all the snippets in a subdirectory with the trigger name: -'snippets///.snippet'. - -============================================================================== -USAGE *snipMate-usage* - - *'snippets'* *g:snippets_dir* -Snippets are by default looked for any 'snippets' directory in your -'runtimepath'. Typically, it is located at '~/.vim/snippets/' on *nix or -'$HOME\vimfiles\snippets\' on Windows. To change that location or add another -one, change the g:snippets_dir variable in your |.vimrc| to your preferred -directory, or use the |ExtractSnips()|function. This will be used by the -|globpath()| function, and so accepts the same syntax as it (e.g., -comma-separated paths). - -ExtractSnipsFile({directory}, {filetype}) *ExtractSnipsFile()* *.snippets* - -ExtractSnipsFile() extracts the specified *.snippets file for the given -filetype. A .snippets file contains multiple snippet declarations for the -filetype. It is further explained above, in |snippet-syntax|. - -ExtractSnips({directory}, {filetype}) *ExtractSnips()* *.snippet* - -ExtractSnips() extracts *.snippet files from the specified directory and -defines them as snippets for the given filetype. The directory tree should -look like this: 'snippets//.snippet'. If the snippet has -multiple matches, it should look like this: -'snippets///.snippet' (see |multi_snip|). - -ResetAllSnippets() *ResetAllSnippets()* -ResetAllSnippets() removes all snippets from memory. This is useful to put at -the top of a snippet setup file for if you would like to |:source| it multiple -times. - -ResetSnippets({filetype}) *ResetSnippets()* -ResetSnippets() removes all snippets from memory for the given filetype. - -ReloadAllSnippets() *ReloadAllSnippets()* -ReloadAllSnippets() reloads all snippets for all filetypes. This is useful for -testing and debugging. - -ReloadSnippets({filetype}) *ReloadSnippets()* -ReloadSnippets() reloads all snippets for the given filetype. - - *list-snippets* *i_CTRL-R_* -If you would like to see what snippets are available, simply type -in the current buffer to show a list via |popupmenu-completion|. - -============================================================================== -SETTINGS *snipMate-settings* *g:snips_author* - -The g:snips_author string (similar to $TM_FULLNAME in TextMate) should be set -to your name; it can then be used in snippets to automatically add it. E.g.: > - - let g:snips_author = 'Hubert Farnsworth' - snippet name - `g:snips_author` -< - *snipMate-expandtab* *snipMate-indenting* -If you would like your snippets to be expanded using spaces instead of tabs, -just enable 'expandtab' and set 'softtabstop' to your preferred amount of -spaces. If 'softtabstop' is not set, 'shiftwidth' is used instead. - - *snipMate-remap* -snipMate does not come with a setting to customize the trigger key, but you -can remap it easily in the two lines it's defined in the 'after' directory -under 'plugin/snipMate.vim'. For instance, to change the trigger key -to CTRL-J, just change this: > - - ino =TriggerSnippet() - snor i=TriggerSnippet() - -to this: > - ino =TriggerSnippet() - snor i=TriggerSnippet() - -============================================================================== -FEATURES *snipMate-features* - -snipMate.vim has the following features among others: - - The syntax of snippets is very similar to TextMate's, allowing - easy conversion. - - The position of the snippet is kept transparently (i.e. it does not use - markers/placeholders written to the buffer), which allows you to escape - out of an incomplete snippet, something particularly useful in Vim. - - Variables in snippets are updated as-you-type. - - Snippets can have multiple matches. - - Snippets can be out of order. For instance, in a do...while loop, the - condition can be added before the code. - - [New] File-based snippets are supported. - - [New] Triggers after non-word delimiters are expanded, e.g. "foo" - in "bar.foo". - - [New] can now be used to jump tab stops in reverse order. - -============================================================================== -DISADVANTAGES *snipMate-disadvantages* - -snipMate.vim currently has the following disadvantages to TextMate's snippets: - - There is no $0; the order of tab stops must be explicitly stated. - - Placeholders within placeholders are not possible. E.g.: > - - '${3}
' -< - In TextMate this would first highlight ' id="some_id"', and if - you hit delete it would automatically skip ${2} and go to ${3} - on the next , but if you didn't delete it it would highlight - "some_id" first. You cannot do this in snipMate.vim. - - Regex cannot be performed on variables, such as "${1/.*/\U&}" - - Placeholders cannot span multiple lines. - - Activating snippets in different scopes of the same file is - not possible. - -Perhaps some of these features will be added in a later release. - -============================================================================== -CONTACT *snipMate-contact* *snipMate-author* - -To contact the author (Michael Sanders), please email: - msanders42+snipmate gmail com - -I greatly appreciate any suggestions or improvements offered for the script. - -============================================================================== -LICENSE *snipMate-license* - -snipMate is released under the MIT license: - -Copyright 2009-2010 Michael Sanders. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -The software is provided "as is", without warranty of any kind, express or -implied, including but not limited to the warranties of merchantability, -fitness for a particular purpose and noninfringement. In no event shall the -authors or copyright holders be liable for any claim, damages or other -liability, whether in an action of contract, tort or otherwise, arising from, -out of or in connection with the software or the use or other dealings in the -software. - -============================================================================== - -vim:tw=78:ts=8:ft=help:norl: diff --git a/ftplugin/snippet.vim b/ftplugin/snippet.vim new file mode 100644 index 0000000..242aa86 --- /dev/null +++ b/ftplugin/snippet.vim @@ -0,0 +1,8 @@ +command! -buffer -range=% RetabSnip ,call snipMate#RetabSnip() +vnoremap :RetabSnip + +if !exists('g:snippet_no_indentation_settings') + setlocal sw=4 + setlocal tabstop=4 + setlocal noexpandtab +endif diff --git a/ftplugin/snippets.vim b/ftplugin/snippets.vim new file mode 100644 index 0000000..e0c6826 --- /dev/null +++ b/ftplugin/snippets.vim @@ -0,0 +1 @@ +runtime! ftplugin/snippet.vim diff --git a/plugin-info.txt b/plugin-info.txt deleted file mode 100644 index 0936bc1..0000000 --- a/plugin-info.txt +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name" : "snipmate", - "version" : "dev", - "author" : "Michael Sanders ", - "repository" : {"type": "git", "url": "git://github.com/msanders/snipmate.vim.git"}, - "dependencies" : {}, - "description" : "snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim." -} diff --git a/plugin/snipMate.vim b/plugin/snipMate.vim index ef03b12..34d4ad2 100644 --- a/plugin/snipMate.vim +++ b/plugin/snipMate.vim @@ -1,271 +1,92 @@ " File: snipMate.vim -" Author: Michael Sanders -" Version: 0.84 " Description: snipMate.vim implements some of TextMate's snippets features in " Vim. A snippet is a piece of often-typed text that you can " insert into your document using a trigger word followed by a "". " " For more help see snipMate.txt; you can do this by using: " :helptags ~/.vim/doc -" :h snipMate.txt +" :h SnipMate if exists('loaded_snips') || &cp || version < 700 finish endif let loaded_snips = 1 if !exists('snips_author') | let snips_author = 'Me' | endif - -au BufRead,BufNewFile *.snippets\= set ft=snippet -au FileType snippet setl noet fdm=indent - -let s:snippets = {} | let s:multi_snips = {} - -if !exists('snippets_dir') - let snippets_dir = substitute(globpath(&rtp, 'snippets/'), "\n", ',', 'g') +" save and reset 'cpo' +let s:save_cpo = &cpo +set cpo&vim + +try + call funcref#Function('') +catch /.*/ + echoe "you're missing vim-addon-mw-utils. See install instructions at ".expand(':h:h').'/README.md' +endtry + +if (!exists('g:snipMateSources')) + let g:snipMateSources = {} + " default source: get snippets based on runtimepath: + let g:snipMateSources['default'] = funcref#Function('snipMate#DefaultPool') endif -fun! MakeSnip(scope, trigger, content, ...) - let multisnip = a:0 && a:1 != '' - let var = multisnip ? 's:multi_snips' : 's:snippets' - if !has_key({var}, a:scope) | let {var}[a:scope] = {} | endif - if !has_key({var}[a:scope], a:trigger) - let {var}[a:scope][a:trigger] = multisnip ? [[a:1, a:content]] : a:content - elseif multisnip | let {var}[a:scope][a:trigger] += [[a:1, a:content]] - else - echom 'Warning in snipMate.vim: Snippet '.a:trigger.' is already defined.' - \ .' See :h multi_snip for help on snippets with multiple matches.' - endif -endf +au BufRead,BufNewFile *.snippet set ft=snippet +au FileType snippet setl noet nospell -fun! ExtractSnips(dir, ft) - for path in split(globpath(a:dir, '*'), "\n") - if isdirectory(path) - let pathname = fnamemodify(path, ':t') - for snipFile in split(globpath(path, '*.snippet'), "\n") - call s:ProcessFile(snipFile, a:ft, pathname) - endfor - elseif fnamemodify(path, ':e') == 'snippet' - call s:ProcessFile(path, a:ft) - endif - endfor -endf - -" Processes a single-snippet file; optionally add the name of the parent -" directory for a snippet with multiple matches. -fun s:ProcessFile(file, ft, ...) - let keyword = fnamemodify(a:file, ':t:r') - if keyword == '' | return | endif - try - let text = join(readfile(a:file), "\n") - catch /E484/ - echom "Error in snipMate.vim: couldn't read file: ".a:file - endtry - return a:0 ? MakeSnip(a:ft, a:1, text, keyword) - \ : MakeSnip(a:ft, keyword, text) -endf +au BufRead,BufNewFile *.snippets set ft=snippets +au FileType snippets setl noet nospell fdm=expr fde=getline(v:lnum)!~'^\\t\\\\|^$'?'>1':1 -fun! ExtractSnipsFile(file, ft) - if !filereadable(a:file) | return | endif - let text = readfile(a:file) - let inSnip = 0 - for line in text + ["\n"] - if inSnip && (line[0] == "\t" || line == '') - let content .= strpart(line, 1)."\n" - continue - elseif inSnip - call MakeSnip(a:ft, trigger, content[:-2], name) - let inSnip = 0 - endif +inoremap snipMateNextOrTrigger =snipMate#TriggerSnippet() +snoremap snipMateNextOrTrigger a=snipMate#TriggerSnippet() +inoremap snipMateTrigger =snipMate#TriggerSnippet(1) +inoremap snipMateBack =snipMate#BackwardsSnippet() +snoremap snipMateBack a=snipMate#BackwardsSnippet() +inoremap snipMateShow =snipMate#ShowAvailableSnips() +xnoremap snipMateVisual :call grab_visual()i - if line[:6] == 'snippet' - let inSnip = 1 - let trigger = strpart(line, 8) - let name = '' - let space = stridx(trigger, ' ') + 1 - if space " Process multi snip - let name = strpart(trigger, space) - let trigger = strpart(trigger, 0, space - 1) - endif - let content = '' - endif - endfor -endf - -" Reset snippets for filetype. -fun! ResetSnippets(ft) - let ft = a:ft == '' ? '_' : a:ft - for dict in [s:snippets, s:multi_snips, g:did_ft] - if has_key(dict, ft) - unlet dict[ft] - endif - endfor -endf - -" Reset snippets for all filetypes. -fun! ResetAllSnippets() - let s:snippets = {} | let s:multi_snips = {} | let g:did_ft = {} -endf - -" Reload snippets for filetype. -fun! ReloadSnippets(ft) - let ft = a:ft == '' ? '_' : a:ft - call ResetSnippets(ft) - call GetSnippets(g:snippets_dir, ft) -endf +" config which can be overridden (shared lines) +if !exists('g:snipMate') + let g:snipMate = {} +endif +let s:snipMate = g:snipMate -" Reload snippets for all filetypes. -fun! ReloadAllSnippets() - for ft in keys(g:did_ft) - call ReloadSnippets(ft) - endfor -endf +let s:snipMate['get_snippets'] = get(s:snipMate, 'get_snippets', funcref#Function("snipMate#GetSnippets")) -let g:did_ft = {} -fun! GetSnippets(dir, filetypes) - for ft in split(a:filetypes, '\.') - if has_key(g:did_ft, ft) | continue | endif - call s:DefineSnips(a:dir, ft, ft) - if ft == 'objc' || ft == 'cpp' || ft == 'cs' - call s:DefineSnips(a:dir, 'c', ft) - elseif ft == 'xhtml' - call s:DefineSnips(a:dir, 'html', 'xhtml') - endif - let g:did_ft[ft] = 1 - endfor -endf +" old snippets_dir: function returning list of paths which is used to read +" snippets. You can replace it with your own implementation. Defaults to all +" directories in &rtp/snippets/* +let s:snipMate['snippet_dirs'] = get(s:snipMate, 'snippet_dirs', funcref#Function('return split(&runtimepath,",")')) +if type(s:snipMate['snippet_dirs']) == type([]) + call map(s:snipMate['snippet_dirs'], 'expand(v:val)') +endif -" Define "aliasft" snippets for the filetype "realft". -fun s:DefineSnips(dir, aliasft, realft) - for path in split(globpath(a:dir, a:aliasft.'/')."\n". - \ globpath(a:dir, a:aliasft.'-*/'), "\n") - call ExtractSnips(path, a:realft) - endfor - for path in split(globpath(a:dir, a:aliasft.'.snippets')."\n". - \ globpath(a:dir, a:aliasft.'-*.snippets'), "\n") - call ExtractSnipsFile(path, a:realft) - endfor -endf +" _ is default scope added always +" +" &ft honors multiple filetypes and syntax such as in set ft=html.javascript syntax=FOO +let s:snipMate['get_scopes'] = get(s:snipMate, 'get_scopes', funcref#Function('return split(&ft,"\\.")+[&syntax, "_"]')) +" dummy for compatibility - will be removed +" moving to autoload to improve loading speed and debugging fun! TriggerSnippet() - if exists('g:SuperTabMappingForward') - if g:SuperTabMappingForward == "" - let SuperTabKey = "\" - elseif g:SuperTabMappingBackward == "" - let SuperTabKey = "\" - endif - endif - - if pumvisible() " Update snippet if completion is used, or deal with supertab - if exists('SuperTabKey') - call feedkeys(SuperTabKey) | return '' - endif - call feedkeys("\a", 'n') " Close completion menu - call feedkeys("\") | return '' - endif - - if exists('g:snipPos') | return snipMate#jumpTabStop(0) | endif - - let word = matchstr(getline('.'), '\S\+\%'.col('.').'c') - for scope in [bufnr('%')] + split(&ft, '\.') + ['_'] - let [trigger, snippet] = s:GetSnippet(word, scope) - " If word is a trigger for a snippet, delete the trigger & expand - " the snippet. - if snippet != '' - let col = col('.') - len(trigger) - sil exe 's/\V'.escape(trigger, '/\.').'\%#//' - return snipMate#expandSnip(snippet, col) - endif - endfor - - if exists('SuperTabKey') - call feedkeys(SuperTabKey) - return '' - endif - return "\" + echoe "replace TriggerSnippet by snipMate#TriggerSnippet, please!" + return snipMate#TriggerSnippet() endf - -fun! BackwardsSnippet() - if exists('g:snipPos') | return snipMate#jumpTabStop(1) | endif - - if exists('g:SuperTabMappingForward') - if g:SuperTabMappingBackward == "" - let SuperTabKey = "\" - elseif g:SuperTabMappingForward == "" - let SuperTabKey = "\" - endif - endif - if exists('SuperTabKey') - call feedkeys(SuperTabKey) - return '' - endif - return "\" -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, scope) - let word = a:word | let snippet = '' - while snippet == '' - if exists('s:snippets["'.a:scope.'"]["'.escape(word, '\"').'"]') - let snippet = s:snippets[a:scope][word] - elseif exists('s:multi_snips["'.a:scope.'"]["'.escape(word, '\"').'"]') - let snippet = s:ChooseSnippet(a:scope, word) - if snippet == '' | break | endif - else - if match(word, '\W') == -1 | break | endif - let word = substitute(word, '.\{-}\W', '', '') - endif - endw - if word == '' && a:word != '.' && stridx(a:word, '.') != -1 - let [word, snippet] = s:GetSnippet('.', a:scope) - endif - return [word, snippet] +fun! BackwardSnippet() + echoe "replace BackwardSnippet by snipMate#BackwardsSnippet, please!" + return snipMate#BackwardsSnippet() endf -fun s:ChooseSnippet(scope, trigger) - let snippet = [] - let i = 1 - 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:scope][a:trigger][0][1] | endif - let num = inputlist(snippet) - 1 - return num == -1 ? '' : s:multi_snips[a:scope][a:trigger][num][1] -endf +" Modified from Luc Hermitte's function on StackOverflow +" +function! s:grab_visual() + let a_save = @a + try + normal! gv"ad + let b:snipmate_content_visual = @a + finally + let @a = a_save + endtry +endfunction -fun! ShowAvailableSnips() - let line = getline('.') - let col = col('.') - let word = matchstr(getline('.'), '\S\+\%'.col.'c') - let words = [word] - if stridx(word, '.') - let words += split(word, '\.', 1) - endif - let matchlen = 0 - let matches = [] - for scope in [bufnr('%')] + split(&ft, '\.') + ['_'] - let triggers = has_key(s:snippets, scope) ? keys(s:snippets[scope]) : [] - if has_key(s:multi_snips, scope) - let triggers += keys(s:multi_snips[scope]) - endif - for trigger in triggers - for word in words - if word == '' - let matches += [trigger] " Show all matches if word is empty - elseif trigger =~ '^'.word - let matches += [trigger] - let len = len(word) - if len > matchlen | let matchlen = len | endif - endif - endfor - endfor - endfor +" restore 'cpo' +let &cpo = s:save_cpo - " This is to avoid a bug with Vim when using complete(col - matchlen, matches) - " (Issue#46 on the Google Code snipMate issue tracker). - call setline(line('.'), substitute(line, repeat('.', matchlen).'\%'.col.'c', '', '')) - call complete(col, matches) - return '' -endf " vim:noet:sw=4:ts=4:ft=vim diff --git a/plugin/snipMateInterface.vim b/plugin/snipMateInterface.vim new file mode 100644 index 0000000..e3e391d --- /dev/null +++ b/plugin/snipMateInterface.vim @@ -0,0 +1,2 @@ +" some useful commands +command! SnipMateOpenSnippetFiles call snipMate#OpenSnippetFiles() diff --git a/snippets/_.snippets b/snippets/_.snippets deleted file mode 100644 index d3ee355..0000000 --- a/snippets/_.snippets +++ /dev/null @@ -1,9 +0,0 @@ -# Global snippets - -# (c) holds no legal value ;) -snippet c) - Copyright `&enc[:2] == "utf" ? "©" : "(c)"` `strftime("%Y")` ${1:`g:snips_author`}. All Rights Reserved.${2} -snippet date - `strftime("%Y-%m-%d")` -snippet ddate - `strftime("%B %d, %Y")` diff --git a/snippets/autoit.snippets b/snippets/autoit.snippets deleted file mode 100644 index 690018c..0000000 --- a/snippets/autoit.snippets +++ /dev/null @@ -1,66 +0,0 @@ -snippet if - If ${1:condition} Then - ${2:; True code} - EndIf -snippet el - Else - ${1} -snippet elif - ElseIf ${1:condition} Then - ${2:; True code} -# If/Else block -snippet ifel - If ${1:condition} Then - ${2:; True code} - Else - ${3:; Else code} - EndIf -# If/ElseIf/Else block -snippet ifelif - If ${1:condition 1} Then - ${2:; True code} - ElseIf ${3:condition 2} Then - ${4:; True code} - Else - ${5:; Else code} - EndIf -# Switch block -snippet switch - Switch (${1:condition}) - Case {$2:case1}: - {$3:; Case 1 code} - Case Else: - {$4:; Else code} - EndSwitch -# Select block -snippet select - Select (${1:condition}) - Case {$2:case1}: - {$3:; Case 1 code} - Case Else: - {$4:; Else code} - EndSelect -# While loop -snippet while - While (${1:condition}) - ${2:; code...} - WEnd -# For loop -snippet for - For ${1:n} = ${3:1} to ${2:count} - ${4:; code...} - Next -# New Function -snippet func - Func ${1:fname}(${2:`indent('.') ? 'self' : ''`}): - ${4:Return} - EndFunc -# Message box -snippet msg - MsgBox(${3:MsgType}, ${1:"Title"}, ${2:"Message Text"}) -# Debug Message -snippet debug - MsgBox(0, "Debug", ${1:"Debug Message"}) -# Show Variable Debug Message -snippet showvar - MsgBox(0, "${1:VarName}", $1) diff --git a/snippets/c.snippets b/snippets/c.snippets deleted file mode 100644 index e1c4f05..0000000 --- a/snippets/c.snippets +++ /dev/null @@ -1,113 +0,0 @@ -# main() -snippet main - int main(int argc, const char *argv[]) - { - ${1} - return 0; - } -snippet mainn - int main(void) - { - ${1} - return 0; - } -# #include <...> -snippet inc - #include <${1:stdio}.h>${2} -# #include "..." -snippet Inc - #include "${1:`Filename("$1.h")`}"${2} -# #ifndef ... #define ... #endif -snippet Def - #ifndef $1 - #define ${1:SYMBOL} ${2:value} - #endif${3} -snippet def - #define -snippet ifdef - #ifdef ${1:FOO} - ${2:#define } - #endif -snippet #if - #if ${1:FOO} - ${2} - #endif -# Header Include-Guard -snippet once - #ifndef ${1:`toupper(Filename('$1_H', 'UNTITLED_H'))`} - - #define $1 - - ${2} - - #endif /* end of include guard: $1 */ -# If Condition -snippet if - if (${1:/* condition */}) { - ${2:/* code */} - } -snippet el - else { - ${1} - } -# Ternary conditional -snippet t - ${1:/* condition */} ? ${2:a} : ${3:b} -# Do While Loop -snippet do - do { - ${2:/* code */} - } while (${1:/* condition */}); -# While Loop -snippet wh - while (${1:/* condition */}) { - ${2:/* code */} - } -# For Loop -snippet for - for (${2:i} = 0; $2 < ${1:count}; $2${3:++}) { - ${4:/* code */} - } -# Custom For Loop -snippet forr - for (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) { - ${5:/* code */} - } -# Function -snippet fun - ${1:void} ${2:function_name}(${3}) - { - ${4:/* code */} - } -# Function Declaration -snippet fund - ${1:void} ${2:function_name}(${3});${4} -# Typedef -snippet td - typedef ${1:int} ${2:MyCustomType};${3} -# Struct -snippet st - struct ${1:`Filename('$1_t', 'name')`} { - ${2:/* data */} - }${3: /* optional variable list */};${4} -# Typedef struct -snippet tds - typedef struct ${2:_$1 }{ - ${3:/* data */} - } ${1:`Filename('$1_t', 'name')`}; -# Typdef enum -snippet tde - typedef enum { - ${1:/* data */} - } ${2:foo}; -# printf -# unfortunately version this isn't as nice as TextMates's, given the lack of a -# dynamic `...` -snippet pr - printf("${1:%s}\n"${2});${3} -# fprintf (again, this isn't as nice as TextMate's version, but it works) -snippet fpr - fprintf(${1:stderr}, "${2:%s}\n"${3});${4} -# This is kind of convenient -snippet . - [${1}]${2} diff --git a/snippets/cpp.snippets b/snippets/cpp.snippets deleted file mode 100644 index fdabd63..0000000 --- a/snippets/cpp.snippets +++ /dev/null @@ -1,34 +0,0 @@ -# Read File Into Vector -snippet readfile - std::vector v; - if (FILE *${2:fp} = fopen(${1:"filename"}, "r")) { - char buf[1024]; - while (size_t len = fread(buf, 1, sizeof(buf), $2)) - v.insert(v.end(), buf, buf + len); - fclose($2); - }${3} -# std::map -snippet map - std::map<${1:key}, ${2:value}> map${3}; -# std::vector -snippet vector - std::vector<${1:char}> v${2}; -# Namespace -snippet ns - namespace ${1:`Filename('', 'my')`} { - ${2} - } /* $1 */ -# Class -snippet cl - class ${1:`Filename('$1_t', 'name')`} { - public: - $1 (${2:arguments}); - virtual ~$1 (); - - private: - ${3:/* data */} - }; -snippet fori - for (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) { - ${4:/* code */} - } diff --git a/snippets/erlang.snippets b/snippets/erlang.snippets deleted file mode 100644 index 7238149..0000000 --- a/snippets/erlang.snippets +++ /dev/null @@ -1,39 +0,0 @@ -# module and export all -snippet mod - -module(${1:`Filename('', 'my')`}). - - -compile([export_all]). - - start() -> - ${2} - - stop() -> - ok. -# define directive -snippet def - -define(${1:macro}, ${2:body}).${3} -# export directive -snippet exp - -export([${1:function}/${2:arity}]). -# include directive -snippet inc - -include("${1:file}").${2} -# behavior directive -snippet beh - -behaviour(${1:behaviour}).${2} -# if expression -snippet if - if - ${1:guard} -> - ${2:body} - end -# case expression -snippet case - case ${1:expression} of - ${2:pattern} -> - ${3:body}; - end -# record directive -snippet rec - -record(${1:record}, { - ${2:field}=${3:value}}).${4} diff --git a/snippets/html.snippets b/snippets/html.snippets deleted file mode 100644 index 302cea2..0000000 --- a/snippets/html.snippets +++ /dev/null @@ -1,190 +0,0 @@ -# Some useful Unicode entities -# Non-Breaking Space -snippet nbs -   -# ← -snippet left - ← -# → -snippet right - → -# ↑ -snippet up - ↑ -# ↓ -snippet down - ↓ -# ↩ -snippet return - ↩ -# ⇤ -snippet backtab - ⇤ -# ⇥ -snippet tab - ⇥ -# ⇧ -snippet shift - ⇧ -# ⌃ -snippet control - ⌃ -# ⌅ -snippet enter - ⌅ -# ⌘ -snippet command - ⌘ -# ⌥ -snippet option - ⌥ -# ⌦ -snippet delete - ⌦ -# ⌫ -snippet backspace - ⌫ -# ⎋ -snippet escape - ⎋ -# Generic Doctype -snippet doctype HTML 4.01 Strict - -snippet doctype HTML 4.01 Transitional - -snippet doctype HTML 5 - -snippet doctype XHTML 1.0 Frameset - -snippet doctype XHTML 1.0 Strict - -snippet doctype XHTML 1.0 Transitional - -snippet doctype XHTML 1.1 - -# HTML Doctype 4.01 Strict -snippet docts - -# HTML Doctype 4.01 Transitional -snippet doct - -# HTML Doctype 5 -snippet doct5 - -# XHTML Doctype 1.0 Frameset -snippet docxf - -# XHTML Doctype 1.0 Strict -snippet docxs - -# XHTML Doctype 1.0 Transitional -snippet docxt - -# XHTML Doctype 1.1 -snippet docx - -snippet html - - ${1} - -snippet xhtml - - ${1} - -snippet body - - ${1} - -snippet head - - - - ${1:`substitute(Filename('', 'Page Title'), '^.', '\u&', '')`} - ${2} - -snippet title - ${1:`substitute(Filename('', 'Page Title'), '^.', '\u&', '')`}${2} -snippet script - ${2} -snippet scriptsrc - ${2} -snippet style - ${3} -snippet base - -snippet r - -snippet div -
- ${2} -
-# Embed QT Movie -snippet movie - - - - - - ${6} -snippet fieldset -
- ${1:name} - - ${3} -
-snippet form -
- ${3} - - -

-
-snippet h1 -

${2:$1}

-snippet input - ${4} -snippet label - ${7} -snippet link - ${4} -snippet mailto - ${3:email me} -snippet meta - ${3} -snippet opt - ${3} -snippet optt - ${2} -snippet select - ${5} -snippet table - - - -
${2:Header}
${3:Data}
${4} -snippet textarea - ${5} diff --git a/snippets/java.snippets b/snippets/java.snippets deleted file mode 100644 index dd96b79..0000000 --- a/snippets/java.snippets +++ /dev/null @@ -1,95 +0,0 @@ -snippet main - public static void main (String [] args) - { - ${1:/* code */} - } -snippet pu - public -snippet po - protected -snippet pr - private -snippet st - static -snippet fi - final -snippet ab - abstract -snippet re - return -snippet br - break; -snippet de - default: - ${1} -snippet ca - catch(${1:Exception} ${2:e}) ${3} -snippet th - throw -snippet sy - synchronized -snippet im - import -snippet imp - implements -snippet ext - extends -snippet j.u - java.util -snippet j.i - java.io. -snippet j.b - java.beans. -snippet j.n - java.net. -snippet j.m - java.math. -snippet if - if (${1}) ${2} -snippet el - else -snippet elif - else if (${1}) ${2} -snippet wh - while (${1}) ${2} -snippet for - for (${1}; ${2}; ${3}) ${4} -snippet fore - for (${1} : ${2}) ${3} -snippet sw - switch (${1}) ${2} -snippet cs - case ${1}: - ${2} - ${3} -snippet tc - public class ${1:`Filename()`} extends ${2:TestCase} -snippet t - public void test${1:Name}() throws Exception ${2} -snippet cl - class ${1:`Filename("", "untitled")`} ${2} -snippet in - interface ${1:`Filename("", "untitled")`} ${2:extends Parent}${3} -snippet m - ${1:void} ${2:method}(${3}) ${4:throws }${5} -snippet v - ${1:String} ${2:var}${3: = null}${4};${5} -snippet co - static public final ${1:String} ${2:var} = ${3};${4} -snippet cos - static public final String ${1:var} = "${2}";${3} -snippet as - assert ${1:test} : "${2:Failure message}";${3} -snippet try - try { - ${3} - } catch(${1:Exception} ${2:e}) { - } -snippet tryf - try { - ${3} - } catch(${1:Exception} ${2:e}) { - } finally { - } -snippet rst - ResultSet ${1:rst}${2: = null}${3};${4} diff --git a/snippets/javascript.snippets b/snippets/javascript.snippets deleted file mode 100644 index f869e2f..0000000 --- a/snippets/javascript.snippets +++ /dev/null @@ -1,74 +0,0 @@ -# Prototype -snippet proto - ${1:class_name}.prototype.${2:method_name} = - function(${3:first_argument}) { - ${4:// body...} - }; -# Function -snippet fun - function ${1:function_name} (${2:argument}) { - ${3:// body...} - } -# Anonymous Function -snippet f - function(${1}) {${2}}; -# if -snippet if - if (${1:true}) {${2}} -# if ... else -snippet ife - if (${1:true}) {${2}} - else{${3}} -# tertiary conditional -snippet t - ${1:/* condition */} ? ${2:a} : ${3:b} -# switch -snippet switch - switch(${1:expression}) { - case '${3:case}': - ${4:// code} - break; - ${5} - default: - ${2:// code} - } -# case -snippet case - case '${1:case}': - ${2:// code} - break; - ${3} -# for (...) {...} -snippet for - for (var ${2:i} = 0; $2 < ${1:Things}.length; $2${3:++}) { - ${4:$1[$2]} - }; -# for (...) {...} (Improved Native For-Loop) -snippet forr - for (var ${2:i} = ${1:Things}.length - 1; $2 >= 0; $2${3:--}) { - ${4:$1[$2]} - }; -# while (...) {...} -snippet wh - while (${1:/* condition */}) { - ${2:/* code */} - } -# do...while -snippet do - do { - ${2:/* code */} - } while (${1:/* condition */}); -# Object Method -snippet :f - ${1:method_name}: function(${2:attribute}) { - ${4} - }${3:,} -# setTimeout function -snippet timeout - setTimeout(function() {${3}}${2}, ${1:10}; -# Get Elements -snippet get - getElementsBy${1:TagName}('${2}')${3} -# Get Element -snippet gett - getElementBy${1:Id}('${2}')${3} diff --git a/snippets/mako.snippets b/snippets/mako.snippets deleted file mode 100644 index 2a0aef9..0000000 --- a/snippets/mako.snippets +++ /dev/null @@ -1,54 +0,0 @@ -snippet def - <%def name="${1:name}"> - ${2:} - -snippet call - <%call expr="${1:name}"> - ${2:} - -snippet doc - <%doc> - ${1:} - -snippet text - <%text> - ${1:} - -snippet for - % for ${1:i} in ${2:iter}: - ${3:} - % endfor -snippet if if - % if ${1:condition}: - ${2:} - % endif -snippet if if/else - % if ${1:condition}: - ${2:} - % else: - ${3:} - % endif -snippet try - % try: - ${1:} - % except${2:}: - ${3:pass} - % endtry -snippet wh - % while ${1:}: - ${2:} - % endwhile -snippet $ - ${ ${1:} } -snippet <% - <% ${1:} %> -snippet -snippet inherit - <%inherit file="${1:filename}" /> -snippet include - <%include file="${1:filename}" /> -snippet namespace - <%namespace file="${1:name}" /> -snippet page - <%page args="${1:}" /> diff --git a/snippets/objc.snippets b/snippets/objc.snippets deleted file mode 100644 index 85b80d9..0000000 --- a/snippets/objc.snippets +++ /dev/null @@ -1,247 +0,0 @@ -# #import <...> -snippet Imp - #import <${1:Cocoa/Cocoa.h}>${2} -# #import "..." -snippet imp - #import "${1:`Filename()`.h}"${2} -# @selector(...) -snippet sel - @selector(${1:method}:)${3} -# @"..." string -snippet s - @"${1}"${2} -# Object -snippet o - ${1:NSObject} *${2:foo} = [${3:$1 alloc}]${4};${5} -# NSLog(...) -snippet log - NSLog(@"${1:%@}"${2});${3} -# Class -snippet objc - @interface ${1:`Filename('', 'someClass')`} : ${2:NSObject} - { - } - @end - - @implementation $1 - ${3} - @end -# Class Interface -snippet int - @interface ${1:`Filename('', 'someClass')`} : ${2:NSObject} - {${3} - } - ${4} - @end -snippet @interface - @interface ${1:`Filename('', 'someClass')`} : ${2:NSObject} - {${3} - } - ${4} - @end -# Class Implementation -snippet impl - @implementation ${1:`Filename('', 'someClass')`} - ${2} - @end -snippet @implementation - @implementation ${1:`Filename('', 'someClass')`} - ${2} - @end -# Protocol -snippet pro - @protocol ${1:`Filename('$1Delegate', 'MyProtocol')`} ${2:} - ${3} - @end -snippet @protocol - @protocol ${1:`Filename('$1Delegate', 'MyProtocol')`} ${2:} - ${3} - @end -# init Definition -snippet init - - (id)init - { - if (self = [super init]) { - ${1} - } - return self; - } -# dealloc Definition -snippet dealloc - - (void) dealloc - { - ${1:deallocations} - [super dealloc]; - } -snippet su - [super ${1:init}]${2} -snippet ibo - IBOutlet ${1:NSSomeClass} *${2:$1};${3} -# Category -snippet cat - @interface ${1:NSObject} (${2:MyCategory}) - @end - - @implementation $1 ($2) - ${3} - @end -# Category Interface -snippet cath - @interface ${1:`Filename('$1', 'NSObject')`} (${2:MyCategory}) - ${3} - @end -# Method -snippet m - - (${1:id})${2:method} - { - ${3} - } -# Method declaration -snippet md - - (${1:id})${2:method};${3} -# IBAction declaration -snippet ibad - - (IBAction)${1:method}:(${2:id})sender;${3} -# IBAction method -snippet iba - - (IBAction)${1:method}:(${2:id})sender - { - ${3} - } -# awakeFromNib method -snippet wake - - (void)awakeFromNib - { - ${1} - } -# Class Method -snippet M - + (${1:id})${2:method} - { - ${3:return nil;} - } -# Sub-method (Call super) -snippet sm - - (${1:id})${2:method} - { - [super $2];${3} - return self; - } -# Accessor Methods For: -# Object -snippet objacc - - (${1:id})${2:thing} - { - return $2; - } - - - (void)set$2:($1)${3:new$2} - { - [$3 retain]; - [$2 release]; - $2 = $3; - }${4} -# for (object in array) -snippet forin - for (${1:Class} *${2:some$1} in ${3:array}) { - ${4} - } -snippet fore - for (${1:object} in ${2:array}) { - ${3:statements} - } -snippet forarray - unsigned int ${1:object}Count = [${2:array} count]; - - for (unsigned int index = 0; index < $1Count; index++) { - ${3:id} $1 = [$2 $1AtIndex:index]; - ${4} - } -snippet fora - unsigned int ${1:object}Count = [${2:array} count]; - - for (unsigned int index = 0; index < $1Count; index++) { - ${3:id} $1 = [$2 $1AtIndex:index]; - ${4} - } -# Try / Catch Block -snippet @try - @try { - ${1:statements} - } - @catch (NSException * e) { - ${2:handler} - } - @finally { - ${3:statements} - } -snippet @catch - @catch (${1:exception}) { - ${2:handler} - } -snippet @finally - @finally { - ${1:statements} - } -# IBOutlet -# @property (Objective-C 2.0) -snippet prop - @property (${1:retain}) ${2:NSSomeClass} ${3:*$2};${4} -# @synthesize (Objective-C 2.0) -snippet syn - @synthesize ${1:property};${2} -# [[ alloc] init] -snippet alloc - [[${1:foo} alloc] init${2}];${3} -snippet a - [[${1:foo} alloc] init${2}];${3} -# retain -snippet ret - [${1:foo} retain];${2} -# release -snippet rel - [${1:foo} release]; -# autorelease -snippet arel - [${1:foo} autorelease]; -# autorelease pool -snippet pool - NSAutoreleasePool *${1:pool} = [[NSAutoreleasePool alloc] init]; - ${2:/* code */} - [$1 drain]; -# Throw an exception -snippet except - NSException *${1:badness}; - $1 = [NSException exceptionWithName:@"${2:$1Name}" - reason:@"${3}" - userInfo:nil]; - [$1 raise]; -snippet prag - #pragma mark ${1:-} -snippet cl - @class ${1:Foo};${2} -snippet color - [[NSColor ${1:blackColor}] set]; -# NSArray -snippet array - NSMutableArray *${1:array} = [NSMutable array];${2} -snippet nsa - NSArray ${1} -snippet nsma - NSMutableArray ${1} -snippet aa - NSArray * array;${1} -snippet ma - NSMutableArray * array;${1} -# NSDictionary -snippet dict - NSMutableDictionary *${1:dict} = [NSMutableDictionary dictionary];${2} -snippet nsd - NSDictionary ${1} -snippet nsmd - NSMutableDictionary ${1} -# NSString -snippet nss - NSString ${1} -snippet nsms - NSMutableString ${1} diff --git a/snippets/perl.snippets b/snippets/perl.snippets deleted file mode 100644 index c85ff11..0000000 --- a/snippets/perl.snippets +++ /dev/null @@ -1,97 +0,0 @@ -# #!/usr/bin/perl -snippet #! - #!/usr/bin/perl - -# Hash Pointer -snippet . - => -# Function -snippet sub - sub ${1:function_name} { - ${2:#body ...} - } -# Conditional -snippet if - if (${1}) { - ${2:# body...} - } -# Conditional if..else -snippet ife - if (${1}) { - ${2:# body...} - } - else { - ${3:# else...} - } -# Conditional if..elsif..else -snippet ifee - if (${1}) { - ${2:# body...} - } - elsif (${3}) { - ${4:# elsif...} - } - else { - ${5:# else...} - } -# Conditional One-line -snippet xif - ${1:expression} if ${2:condition};${3} -# Unless conditional -snippet unless - unless (${1}) { - ${2:# body...} - } -# Unless conditional One-line -snippet xunless - ${1:expression} unless ${2:condition};${3} -# Try/Except -snippet eval - eval { - ${1:# do something risky...} - }; - if ($@) { - ${2:# handle failure...} - } -# While Loop -snippet wh - while (${1}) { - ${2:# body...} - } -# While Loop One-line -snippet xwh - ${1:expression} while ${2:condition};${3} -# C-style For Loop -snippet cfor - for (my $${2:var} = 0; $$2 < ${1:count}; $$2${3:++}) { - ${4:# body...} - } -# For loop one-line -snippet xfor - ${1:expression} for @${2:array};${3} -# Foreach Loop -snippet for - foreach my $${1:x} (@${2:array}) { - ${3:# body...} - } -# Foreach Loop One-line -snippet fore - ${1:expression} foreach @${2:array};${3} -# Package -snippet cl - package ${1:ClassName}; - - use base qw(${2:ParentClass}); - - sub new { - my $class = shift; - $class = ref $class if ref $class; - my $self = bless {}, $class; - $self; - } - - 1;${3} -# Read File -snippet slurp - my $${1:var}; - { local $/ = undef; local *FILE; open FILE, "<${2:file}"; $$1 = ; close FILE }${3} diff --git a/snippets/php.snippets b/snippets/php.snippets deleted file mode 100644 index 3ce9e26..0000000 --- a/snippets/php.snippets +++ /dev/null @@ -1,216 +0,0 @@ -snippet php - -snippet ec - echo "${1:string}"${2}; -snippet inc - include '${1:file}';${2} -snippet inc1 - include_once '${1:file}';${2} -snippet req - require '${1:file}';${2} -snippet req1 - require_once '${1:file}';${2} -# $GLOBALS['...'] -snippet globals - $GLOBALS['${1:variable}']${2: = }${3:something}${4:;}${5} -snippet $_ COOKIE['...'] - $_COOKIE['${1:variable}']${2} -snippet $_ ENV['...'] - $_ENV['${1:variable}']${2} -snippet $_ FILES['...'] - $_FILES['${1:variable}']${2} -snippet $_ Get['...'] - $_GET['${1:variable}']${2} -snippet $_ POST['...'] - $_POST['${1:variable}']${2} -snippet $_ REQUEST['...'] - $_REQUEST['${1:variable}']${2} -snippet $_ SERVER['...'] - $_SERVER['${1:variable}']${2} -snippet $_ SESSION['...'] - $_SESSION['${1:variable}']${2} -# Start Docblock -snippet /* - /** - * ${1} - **/ -# Class - post doc -snippet doc_cp - /** - * ${1:undocumented class} - * - * @package ${2:default} - * @author ${3:`g:snips_author`} - **/${4} -# Class Variable - post doc -snippet doc_vp - /** - * ${1:undocumented class variable} - * - * @var ${2:string} - **/${3} -# Class Variable -snippet doc_v - /** - * ${3:undocumented class variable} - * - * @var ${4:string} - **/ - ${1:var} $${2};${5} -# Class -snippet doc_c - /** - * ${3:undocumented class} - * - * @packaged ${4:default} - * @author ${5:`g:snips_author`} - **/ - ${1:}class ${2:} - {${6} - } // END $1class $2 -# Constant Definition - post doc -snippet doc_dp - /** - * ${1:undocumented constant} - **/${2} -# Constant Definition -snippet doc_d - /** - * ${3:undocumented constant} - **/ - define(${1}, ${2});${4} -# Function - post doc -snippet doc_fp - /** - * ${1:undocumented function} - * - * @return ${2:void} - * @author ${3:`g:snips_author`} - **/${4} -# Function signature -snippet doc_s - /** - * ${4:undocumented function} - * - * @return ${5:void} - * @author ${6:`g:snips_author`} - **/ - ${1}function ${2}(${3});${7} -# Function -snippet doc_f - /** - * ${4:undocumented function} - * - * @return ${5:void} - * @author ${6:`g:snips_author`} - **/ - ${1}function ${2}(${3}) - {${7} - } -# Header -snippet doc_h - /** - * ${1} - * - * @author ${2:`g:snips_author`} - * @version ${3:$Id$} - * @copyright ${4:$2}, `strftime('%d %B, %Y')` - * @package ${5:default} - **/ - - /** - * Define DocBlock - *// -# Interface -snippet doc_i - /** - * ${2:undocumented class} - * - * @package ${3:default} - * @author ${4:`g:snips_author`} - **/ - interface ${1:} - {${5} - } // END interface $1 -# class ... -snippet class - /** - * ${1} - **/ - class ${2:ClassName} - { - ${3} - function ${4:__construct}(${5:argument}) - { - ${6:// code...} - } - } -# define(...) -snippet def - define('${1}'${2});${3} -# defined(...) -snippet def? - ${1}defined('${2}')${3} -snippet wh - while (${1:/* condition */}) { - ${2:// code...} - } -# do ... while -snippet do - do { - ${2:// code... } - } while (${1:/* condition */}); -snippet if - if (${1:/* condition */}) { - ${2:// code...} - } -snippet ife - if (${1:/* condition */}) { - ${2:// code...} - } else { - ${3:// code...} - } - ${4} -snippet else - else { - ${1:// code...} - } -snippet elseif - elseif (${1:/* condition */}) { - ${2:// code...} - } -# Tertiary conditional -snippet t - $${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b};${5} -snippet switch - switch ($${1:variable}) { - case '${2:value}': - ${3:// code...} - break; - ${5} - default: - ${4:// code...} - break; - } -snippet case - case '${1:value}': - ${2:// code...} - break;${3} -snippet for - for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) { - ${4: // code...} - } -snippet foreach - foreach ($${1:variable} as $${2:key}) { - ${3:// code...} - } -snippet fun - ${1:public }function ${2:FunctionName}(${3}) - { - ${4:// code...} - } -# $... = array (...) -snippet array - $${1:arrayName} = array('${2}' => ${3});${4} diff --git a/snippets/python.snippets b/snippets/python.snippets deleted file mode 100644 index 28a2948..0000000 --- a/snippets/python.snippets +++ /dev/null @@ -1,86 +0,0 @@ -snippet #! - #!/usr/bin/env python - -snippet imp - import ${1:module} -# Module Docstring -snippet docs - ''' - File: ${1:`Filename('$1.py', 'foo.py')`} - Author: ${2:`g:snips_author`} - Description: ${3} - ''' -snippet wh - while ${1:condition}: - ${2:# code...} -snippet for - for ${1:needle} in ${2:haystack}: - ${3:# code...} -# New Class -snippet cl - class ${1:ClassName}(${2:object}): - """${3:docstring for $1}""" - def __init__(self, ${4:arg}): - ${5:super($1, self).__init__()} - self.$4 = $4 - ${6} -# New Function -snippet def - def ${1:fname}(${2:`indent('.') ? 'self' : ''`}): - """${3:docstring for $1}""" - ${4:pass} -snippet deff - def ${1:fname}(${2:`indent('.') ? 'self' : ''`}): - ${3} -# New Method -snippet defs - def ${1:mname}(self, ${2:arg}): - ${3:pass} -# New Property -snippet property - def ${1:foo}(): - doc = "${2:The $1 property.}" - def fget(self): - ${3:return self._$1} - def fset(self, value): - ${4:self._$1 = value} -# Lambda -snippet ld - ${1:var} = lambda ${2:vars} : ${3:action} -snippet . - self. -snippet try Try/Except - try: - ${1:pass} - except ${2:Exception}, ${3:e}: - ${4:raise $3} -snippet try Try/Except/Else - try: - ${1:pass} - except ${2:Exception}, ${3:e}: - ${4:raise $3} - else: - ${5:pass} -snippet try Try/Except/Finally - try: - ${1:pass} - except ${2:Exception}, ${3:e}: - ${4:raise $3} - finally: - ${5:pass} -snippet try Try/Except/Else/Finally - try: - ${1:pass} - except ${2:Exception}, ${3:e}: - ${4:raise $3} - else: - ${5:pass} - finally: - ${6:pass} -# if __name__ == '__main__': -snippet ifmain - if __name__ == '__main__': - ${1:main()} -# __magic__ -snippet _ - __${1:init}__${2} diff --git a/snippets/ruby.snippets b/snippets/ruby.snippets deleted file mode 100644 index 50080d9..0000000 --- a/snippets/ruby.snippets +++ /dev/null @@ -1,504 +0,0 @@ -# #!/usr/bin/env ruby -snippet #! - #!/usr/bin/env ruby - -# New Block -snippet =b - =begin rdoc - ${1} - =end -snippet y - :yields: ${1:arguments} -snippet rb - #!/usr/bin/env ruby -wKU -snippet beg - begin - ${3} - rescue ${1:Exception} => ${2:e} - end - -snippet req - require "${1}"${2} -snippet # - # => -snippet end - __END__ -snippet case - case ${1:object} - when ${2:condition} - ${3} - end -snippet when - when ${1:condition} - ${2} -snippet def - def ${1:method_name} - ${2} - end -snippet deft - def test_${1:case_name} - ${2} - end -snippet if - if ${1:condition} - ${2} - end -snippet ife - if ${1:condition} - ${2} - else - ${3} - end -snippet elsif - elsif ${1:condition} - ${2} -snippet unless - unless ${1:condition} - ${2} - end -snippet while - while ${1:condition} - ${2} - end -snippet for - for ${1:e} in ${2:c} - ${3} - end -snippet until - until ${1:condition} - ${2} - end -snippet cla class .. end - class ${1:`substitute(Filename(), '^.', '\u&', '')`} - ${2} - end -snippet cla class .. initialize .. end - class ${1:`substitute(Filename(), '^.', '\u&', '')`} - def initialize(${2:args}) - ${3} - end - - - end -snippet cla class .. < ParentClass .. initialize .. end - class ${1:`substitute(Filename(), '^.', '\u&', '')`} < ${2:ParentClass} - def initialize(${3:args}) - ${4} - end - - - end -snippet cla ClassName = Struct .. do .. end - ${1:`substitute(Filename(), '^.', '\u&', '')`} = Struct.new(:${2:attr_names}) do - def ${3:method_name} - ${4} - end - - - end -snippet cla class BlankSlate .. initialize .. end - class ${1:BlankSlate} - instance_methods.each { |meth| undef_method(meth) unless meth =~ /\A__/ } -snippet cla class << self .. end - class << ${1:self} - ${2} - end -# class .. < DelegateClass .. initialize .. end -snippet cla- - class ${1:`substitute(Filename(), '^.', '\u&', '')`} < DelegateClass(${2:ParentClass}) - def initialize(${3:args}) - super(${4:del_obj}) - - ${5} - end - - - end -snippet mod module .. end - module ${1:`substitute(Filename(), '^.', '\u&', '')`} - ${2} - end -snippet mod module .. module_function .. end - module ${1:`substitute(Filename(), '^.', '\u&', '')`} - module_function - - ${2} - end -snippet mod module .. ClassMethods .. end - module ${1:`substitute(Filename(), '^.', '\u&', '')`} - module ClassMethods - ${2} - end - - module InstanceMethods - - end - - def self.included(receiver) - receiver.extend ClassMethods - receiver.send :include, InstanceMethods - end - end -# attr_reader -snippet r - attr_reader :${1:attr_names} -# attr_writer -snippet w - attr_writer :${1:attr_names} -# attr_accessor -snippet rw - attr_accessor :${1:attr_names} -# include Enumerable -snippet Enum - include Enumerable - - def each(&block) - ${1} - end -# include Comparable -snippet Comp - include Comparable - - def <=>(other) - ${1} - end -# extend Forwardable -snippet Forw- - extend Forwardable -# def self -snippet defs - def self.${1:class_method_name} - ${2} - end -# def method_missing -snippet defmm - def method_missing(meth, *args, &blk) - ${1} - end -snippet defd - def_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name} -snippet defds - def_delegators :${1:@del_obj}, :${2:del_methods} -snippet am - alias_method :${1:new_name}, :${2:old_name} -snippet app - if __FILE__ == $PROGRAM_NAME - ${1} - end -# usage_if() -snippet usai - if ARGV.${1} - abort "Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}"${3} - end -# usage_unless() -snippet usau - unless ARGV.${1} - abort "Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}"${3} - end -snippet array - Array.new(${1:10}) { |${2:i}| ${3} } -snippet hash - Hash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} } -snippet file File.foreach() { |line| .. } - File.foreach(${1:"path/to/file"}) { |${2:line}| ${3} } -snippet file File.read() - File.read(${1:"path/to/file"})${2} -snippet Dir Dir.global() { |file| .. } - Dir.glob(${1:"dir/glob/*"}) { |${2:file}| ${3} } -snippet Dir Dir[".."] - Dir[${1:"glob/**/*.rb"}]${2} -snippet dir - Filename.dirname(__FILE__) -snippet deli - delete_if { |${1:e}| ${2} } -snippet fil - fill(${1:range}) { |${2:i}| ${3} } -# flatten_once() -snippet flao - inject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3} -snippet zip - zip(${1:enums}) { |${2:row}| ${3} } -# downto(0) { |n| .. } -snippet dow - downto(${1:0}) { |${2:n}| ${3} } -snippet ste - step(${1:2}) { |${2:n}| ${3} } -snippet tim - times { |${1:n}| ${2} } -snippet upt - upto(${1:1.0/0.0}) { |${2:n}| ${3} } -snippet loo - loop { ${1} } -snippet ea - each { |${1:e}| ${2} } -snippet ead - each do |${1:e}| - ${2} - end -snippet eab - each_byte { |${1:byte}| ${2} } -snippet eac- each_char { |chr| .. } - each_char { |${1:chr}| ${2} } -snippet eac- each_cons(..) { |group| .. } - each_cons(${1:2}) { |${2:group}| ${3} } -snippet eai - each_index { |${1:i}| ${2} } -snippet eaid - each_index do |${1:i}| - end -snippet eak - each_key { |${1:key}| ${2} } -snippet eakd - each_key do |${1:key}| - ${2} - end -snippet eal - each_line { |${1:line}| ${2} } -snippet eald - each_line do |${1:line}| - ${2} - end -snippet eap - each_pair { |${1:name}, ${2:val}| ${3} } -snippet eapd - each_pair do |${1:name}, ${2:val}| - ${3} - end -snippet eas- - each_slice(${1:2}) { |${2:group}| ${3} } -snippet easd- - each_slice(${1:2}) do |${2:group}| - ${3} - end -snippet eav - each_value { |${1:val}| ${2} } -snippet eavd - each_value do |${1:val}| - ${2} - end -snippet eawi - each_with_index { |${1:e}, ${2:i}| ${3} } -snippet eawid - each_with_index do |${1:e},${2:i}| - ${3} - end -snippet reve - reverse_each { |${1:e}| ${2} } -snippet reved - reverse_each do |${1:e}| - ${2} - end -snippet inj - inject(${1:init}) { |${2:mem}, ${3:var}| ${4} } -snippet injd - inject(${1:init}) do |${2:mem}, ${3:var}| - ${4} - end -snippet map - map { |${1:e}| ${2} } -snippet mapd - map do |${1:e}| - ${2} - end -snippet mapwi- - enum_with_index.map { |${1:e}, ${2:i}| ${3} } -snippet sor - sort { |a, b| ${1} } -snippet sorb - sort_by { |${1:e}| ${2} } -snippet ran - sort_by { rand } -snippet all - all? { |${1:e}| ${2} } -snippet any - any? { |${1:e}| ${2} } -snippet cl - classify { |${1:e}| ${2} } -snippet col - collect { |${1:e}| ${2} } -snippet cold - collect do |${1:e}| - ${2} - end -snippet det - detect { |${1:e}| ${2} } -snippet detd - detect do |${1:e}| - ${2} - end -snippet fet - fetch(${1:name}) { |${2:key}| ${3} } -snippet fin - find { |${1:e}| ${2} } -snippet find - find do |${1:e}| - ${2} - end -snippet fina - find_all { |${1:e}| ${2} } -snippet finad - find_all do |${1:e}| - ${2} - end -snippet gre - grep(${1:/pattern/}) { |${2:match}| ${3} } -snippet sub - ${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} } -snippet sca - scan(${1:/pattern/}) { |${2:match}| ${3} } -snippet scad - scan(${1:/pattern/}) do |${2:match}| - ${3} - end -snippet max - max { |a, b| ${1} } -snippet min - min { |a, b| ${1} } -snippet par - partition { |${1:e}| ${2} } -snippet pard - partition do |${1:e}| - ${2} - end -snippet rej - reject { |${1:e}| ${2} } -snippet rejd - reject do |${1:e}| - ${2} - end -snippet sel - select { |${1:e}| ${2} } -snippet seld - select do |${1:e}| - ${2} - end -snippet lam - lambda { |${1:args}| ${2} } -snippet do - do |${1:variable}| - ${2} - end -snippet : - :${1:key} => ${2:"value"}${3} -snippet ope - open(${1:"path/or/url/or/pipe"}, "${2:w}") { |${3:io}| ${4} } -# path_from_here() -snippet patfh - File.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2} -# unix_filter {} -snippet unif - ARGF.each_line${1} do |${2:line}| - ${3} - end -# option_parse {} -snippet optp - require "optparse" - - options = {${1:default => "args"}} - - ARGV.options do |opts| - opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} -snippet opt - opts.on( "-${1:o}", "--${2:long-option-name}", ${3:String}, - "${4:Option description.}") do |${5:opt}| - ${6} - end -snippet tc - require "test/unit" - - require "${1:library_file_name}" - - class Test${2:$1} < Test::Unit::TestCase - def test_${3:case_name} - ${4} - end - end -snippet ts - require "test/unit" - - require "tc_${1:test_case_file}" - require "tc_${2:test_case_file}"${3} -snippet as - assert(${1:test}, "${2:Failure message.}")${3} -snippet ase - assert_equal(${1:expected}, ${2:actual})${3} -snippet asne - assert_not_equal(${1:unexpected}, ${2:actual})${3} -snippet asid - assert_in_delta(${1:expected_float}, ${2:actual_float}, ${3:2 ** -20})${4} -snippet asio - assert_instance_of(${1:ExpectedClass}, ${2:actual_instance})${3} -snippet asko - assert_kind_of(${1:ExpectedKind}, ${2:actual_instance})${3} -snippet asn - assert_nil(${1:instance})${2} -snippet asnn - assert_not_nil(${1:instance})${2} -snippet asm - assert_match(/${1:expected_pattern}/, ${2:actual_string})${3} -snippet asnm - assert_no_match(/${1:unexpected_pattern}/, ${2:actual_string})${3} -snippet aso - assert_operator(${1:left}, :${2:operator}, ${3:right})${4} -snippet asr - assert_raise(${1:Exception}) { ${2} } -snippet asnr - assert_nothing_raised(${1:Exception}) { ${2} } -snippet asrt - assert_respond_to(${1:object}, :${2:method})${3} -snippet ass assert_same(..) - assert_same(${1:expected}, ${2:actual})${3} -snippet ass assert_send(..) - assert_send([${1:object}, :${2:message}, ${3:args}])${4} -snippet asns - assert_not_same(${1:unexpected}, ${2:actual})${3} -snippet ast - assert_throws(:${1:expected}) { ${2} } -snippet asnt - assert_nothing_thrown { ${1} } -snippet fl - flunk("${1:Failure message.}")${2} -# Benchmark.bmbm do .. end -snippet bm- - TESTS = ${1:10_000} - Benchmark.bmbm do |results| - ${2} - end -snippet rep - results.report("${1:name}:") { TESTS.times { ${2} }} -# Marshal.dump(.., file) -snippet Md - File.open(${1:"path/to/file.dump"}, "wb") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4} -# Mashal.load(obj) -snippet Ml - File.open(${1:"path/to/file.dump"}, "rb") { |${2:file}| Marshal.load($2) }${3} -# deep_copy(..) -snippet deec - Marshal.load(Marshal.dump(${1:obj_to_copy}))${2} -snippet Pn- - PStore.new(${1:"file_name.pstore"})${2} -snippet tra - transaction(${1:true}) { ${2} } -# xmlread(..) -snippet xml- - REXML::Document.new(File.read(${1:"path/to/file"}))${2} -# xpath(..) { .. } -snippet xpa - elements.each(${1:"//Xpath"}) do |${2:node}| - ${3} - end -# class_from_name() -snippet clafn - split("::").inject(Object) { |par, const| par.const_get(const) } -# singleton_class() -snippet sinc - class << self; self end -snippet nam - namespace :${1:`Filename()`} do - ${2} - end -snippet tas - desc "${1:Task description\}" - task :${2:task_name => [:dependent, :tasks]} do - ${3} - end diff --git a/snippets/sh.snippets b/snippets/sh.snippets deleted file mode 100644 index f035126..0000000 --- a/snippets/sh.snippets +++ /dev/null @@ -1,28 +0,0 @@ -# #!/bin/bash -snippet #! - #!/bin/bash - -snippet if - if [[ ${1:condition} ]]; then - ${2:#statements} - fi -snippet elif - elif [[ ${1:condition} ]]; then - ${2:#statements} -snippet for - for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do - ${3:#statements} - done -snippet wh - while [[ ${1:condition} ]]; do - ${2:#statements} - done -snippet until - until [[ ${1:condition} ]]; do - ${2:#statements} - done -snippet case - case ${1:word} in - ${2:pattern}) - ${3};; - esac diff --git a/snippets/snippet.snippets b/snippets/snippet.snippets deleted file mode 100644 index 854c058..0000000 --- a/snippets/snippet.snippets +++ /dev/null @@ -1,7 +0,0 @@ -# snippets for making snippets :) -snippet snip - snippet ${1:trigger} - ${2} -snippet msnip - snippet ${1:trigger} ${2:description} - ${3} diff --git a/snippets/tcl.snippets b/snippets/tcl.snippets deleted file mode 100644 index 1fe1cb9..0000000 --- a/snippets/tcl.snippets +++ /dev/null @@ -1,92 +0,0 @@ -# #!/usr/bin/env tclsh -snippet #! - #!/usr/bin/env tclsh - -# Process -snippet pro - proc ${1:function_name} {${2:args}} { - ${3:#body ...} - } -#xif -snippet xif - ${1:expr}? ${2:true} : ${3:false} -# Conditional -snippet if - if {${1}} { - ${2:# body...} - } -# Conditional if..else -snippet ife - if {${1}} { - ${2:# body...} - } else { - ${3:# else...} - } -# Conditional if..elsif..else -snippet ifee - if {${1}} { - ${2:# body...} - } elseif {${3}} { - ${4:# elsif...} - } else { - ${5:# else...} - } -# If catch then -snippet ifc - if { [catch {${1:#do something...}} ${2:err}] } { - ${3:# handle failure...} - } -# Catch -snippet catch - catch {${1}} ${2:err} ${3:options} -# While Loop -snippet wh - while {${1}} { - ${2:# body...} - } -# For Loop -snippet for - for {set ${2:var} 0} {$$2 < ${1:count}} {${3:incr} $2} { - ${4:# body...} - } -# Foreach Loop -snippet fore - foreach ${1:x} {${2:#list}} { - ${3:# body...} - } -# after ms script... -snippet af - after ${1:ms} ${2:#do something} -# after cancel id -snippet afc - after cancel ${1:id or script} -# after idle -snippet afi - after idle ${1:script} -# after info id -snippet afin - after info ${1:id} -# Expr -snippet exp - expr {${1:#expression here}} -# Switch -snippet sw - switch ${1:var} { - ${3:pattern 1} { - ${4:#do something} - } - default { - ${2:#do something} - } - } -# Case -snippet ca - ${1:pattern} { - ${2:#do something} - }${3} -# Namespace eval -snippet ns - namespace eval ${1:path} {${2:#script...}} -# Namespace current -snippet nsc - namespace current diff --git a/snippets/tex.snippets b/snippets/tex.snippets deleted file mode 100644 index 22f7316..0000000 --- a/snippets/tex.snippets +++ /dev/null @@ -1,115 +0,0 @@ -# \begin{}...\end{} -snippet begin - \begin{${1:env}} - ${2} - \end{$1} -# Tabular -snippet tab - \begin{${1:tabular}}{${2:c}} - ${3} - \end{$1} -# Align(ed) -snippet ali - \begin{align${1:ed}} - ${2} - \end{align$1} -# Gather(ed) -snippet gat - \begin{gather${1:ed}} - ${2} - \end{gather$1} -# Equation -snippet eq - \begin{equation} - ${1} - \end{equation} -# Unnumbered Equation -snippet \ - \\[ - ${1} - \\] -# Enumerate -snippet enum - \begin{enumerate} - \item ${1} - \end{enumerate} -# Itemize -snippet item - \begin{itemize} - \item ${1} - \end{itemize} -# Description -snippet desc - \begin{description} - \item[${1}] ${2} - \end{description} -# Matrix -snippet mat - \begin{${1:p/b/v/V/B/small}matrix} - ${2} - \end{$1matrix} -# Cases -snippet cas - \begin{cases} - ${1:equation}, &\text{ if }${2:case}\\ - ${3} - \end{cases} -# Split -snippet spl - \begin{split} - ${1} - \end{split} -# Part -snippet part - \part{${1:part name}} % (fold) - \label{prt:${2:$1}} - ${3} - % part $2 (end) -# Chapter -snippet cha - \chapter{${1:chapter name}} % (fold) - \label{cha:${2:$1}} - ${3} - % chapter $2 (end) -# Section -snippet sec - \section{${1:section name}} % (fold) - \label{sec:${2:$1}} - ${3} - % section $2 (end) -# Sub Section -snippet sub - \subsection{${1:subsection name}} % (fold) - \label{sub:${2:$1}} - ${3} - % subsection $2 (end) -# Sub Sub Section -snippet subs - \subsubsection{${1:subsubsection name}} % (fold) - \label{ssub:${2:$1}} - ${3} - % subsubsection $2 (end) -# Paragraph -snippet par - \paragraph{${1:paragraph name}} % (fold) - \label{par:${2:$1}} - ${3} - % paragraph $2 (end) -# Sub Paragraph -snippet subp - \subparagraph{${1:subparagraph name}} % (fold) - \label{subp:${2:$1}} - ${3} - % subparagraph $2 (end) -snippet itd - \item[${1:description}] ${2:item} -snippet figure - ${1:Figure}~\ref{${2:fig:}}${3} -snippet table - ${1:Table}~\ref{${2:tab:}}${3} -snippet listing - ${1:Listing}~\ref{${2:list}}${3} -snippet section - ${1:Section}~\ref{${2:sec:}}${3} -snippet page - ${1:page}~\pageref{${2}}${3} diff --git a/snippets/vim.snippets b/snippets/vim.snippets deleted file mode 100644 index 64e7807..0000000 --- a/snippets/vim.snippets +++ /dev/null @@ -1,32 +0,0 @@ -snippet header - " File: ${1:`expand('%:t')`} - " Author: ${2:`g:snips_author`} - " Description: ${3} - ${4:" Last Modified: `strftime("%B %d, %Y")`} -snippet guard - if exists('${1:did_`Filename()`}') || &cp${2: || version < 700} - finish - endif - let $1 = 1${3} -snippet f - fun ${1:function_name}(${2}) - ${3:" code} - endf -snippet for - for ${1:needle} in ${2:haystack} - ${3:" code} - endfor -snippet wh - while ${1:condition} - ${2:" code} - endw -snippet if - if ${1:condition} - ${2:" code} - endif -snippet ife - if ${1:condition} - ${2} - else - ${3} - endif diff --git a/snippets/zsh.snippets b/snippets/zsh.snippets deleted file mode 100644 index 7aee05b..0000000 --- a/snippets/zsh.snippets +++ /dev/null @@ -1,58 +0,0 @@ -# #!/bin/zsh -snippet #! - #!/bin/zsh - -snippet if - if ${1:condition}; then - ${2:# statements} - fi -snippet ife - if ${1:condition}; then - ${2:# statements} - else - ${3:# statements} - fi -snippet elif - elif ${1:condition} ; then - ${2:# statements} -snippet for - for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do - ${3:# statements} - done -snippet fore - for ${1:item} in ${2:list}; do - ${3:# statements} - done -snippet wh - while ${1:condition}; do - ${2:# statements} - done -snippet until - until ${1:condition}; do - ${2:# statements} - done -snippet repeat - repeat ${1:integer}; do - ${2:# statements} - done -snippet case - case ${1:word} in - ${2:pattern}) - ${3};; - esac -snippet select - select ${1:answer} in ${2:choices}; do - ${3:# statements} - done -snippet ( - ( ${1:#statements} ) -snippet { - { ${1:#statements} } -snippet [ - [[ ${1:test} ]] -snippet always - { ${1:try} } always { ${2:always} } -snippet fun - function ${1:name} (${2:args}) { - ${3:# body} - } diff --git a/syntax/snippet.vim b/syntax/snippet.vim index 3aa8571..a947356 100644 --- a/syntax/snippet.vim +++ b/syntax/snippet.vim @@ -1,19 +1,11 @@ -" Syntax highlighting for snippet files (used for snipMate.vim) +" Syntax highlighting for .snippet files (used for snipMate.vim) " Hopefully this should make snippets a bit nicer to write! -syn match snipComment '^#.*' syn match placeHolder '\${\d\+\(:.\{-}\)\=}' contains=snipCommand syn match tabStop '\$\d\+' -syn match snipCommand '[^\\]`.\{-}`' -syn match snippet '^snippet.*' transparent contains=multiSnipText,snipKeyword -syn match multiSnipText '\S\+ \zs.*' contained -syn match snipKeyword '^snippet'me=s+8 contained -syn match snipError "^[^#s\t].*$" +syn match snipEscape '\\\\\|\\`' +syn match snipCommand '\%(\\\@