Squashed 'vim/bundle/ultisnips/' changes from cecc7aad8..786145030
786145030 quick and dirty fix tests for vanilla vim ea8094c50 syntax: treat python in context/actions as string 61df32722 syntax highlighting: fix context highlighting 3a3e56a98 grant access to visual to context and actions 059c9a9da Merge pull request #679 from SirVer/overwrite-tabstops-from-py-interpolation 23a6ec87c Merge pull request #663 from kmarius/fix-transformation 8fdfde190 Fix escapes in conditional tabstob transformation 7536ac900 tabstops can be overwritten from interpolation a514585cd ignore .ropeproject ed40bebab Add test cases for conditional transformations 25882e95c add testcase for #658 0657e61e6 Merge pull request #643 from dNItro/master 4b27b7152 Testcase added! bdd9012eb Merge pull request #647 from alexlafroscia/master 6d38cad14 Allow Deoplete entries to show up with existing matches 203218297 More detailed documentation on multiline option 8a8e183b8 Documentation on multiline option b057f633e Add support to do transformation on multiple lines 3f2c591c3 Merge pull request #625 from chemzqm/location 0058e8664 doc: add link to options for #Anon() ec9b292ba fix typos in doc/UltiSnips.txt 52ade8fed doc for all param of SnippetsInCurrentScope 4e2e897de change g:current_ulti_dict_all to g:current_ulti_dict_info 319ccddcd Merge pull request #628 from kmarius/fix_syntax 9a73473e7 Fix highlighting for nested visual tabstob 6a69a4415 add all param to UltiSnips#SnippetsInCurrentScope dbd43ad27 Merge pull request #624 from chemzqm/patch-1 3a70765f4 syntax highlight for unite ultisnips 5a2dcc5cb disable tests in vanilla vim for #616 45e3775c1 fix #616: update state on edit w/o cursor move 1b481f312 Merge pull request #615 from SirVer/updated_changelog 60c47e8e9 Reworked README for change of maintenance. 2e9f12bfd Fixed doc/UltiSnips.txt for change of maintainer. 95d6e535e Updated ChangeLog for 3.1. c5a21c509 Merge pull request #611 from HerringtonDarkholme/deoplete 024374614 Add support for deoplete 9c73ce948 Fix a unicode bug in python3. 53bf0dbd7 Merge pull request #608 from JarrodCTaylor/master 53571bf4f Refactor: More descriptive method name 1d4d8b049 Enhancement: Align snippet names in unite source options ef72df8e7 Merge pull request #603 from seletskiy/do-not-break-last-jump-on-post-expand cba31b191 Use new path for neovims config directory. 6ea78e525 fix last jump $0 placeholder using post_expand c9699feed Fix docs: "'" has no special meaning in snippets. 0480b2243 Adapt to changed Neovim configuration directory. 1ce44ac9c Merge pull request #592 from seletskiy/show-backtrace-on-error 08b96cbdb print erroneous snippet location 698f2d491 print snippet information in backtrace (fix #551) d03b13a68 review: add comment about snippet_code 47a3d1862 review fixes: 3accb5cb4 mark line number in traceback 00e3a877d print executed code cc6ac3c06 Exit any snippets when entering a unite buffer. baa9c9709 Merge pull request #589 from seletskiy/autotrigger 6ad7472aa autotrigger: solve performance issues fde4a066c Disable Neovim tests, since they do not pass. 30ba8155a NEOVIM testing is just too flaky. Let's make it optional again. 69b7c501a Merge pull request #582 from seletskiy/autotrigger 76ebfec3c autotrigger: make snippets expand without <tab> e1e005a81 Merge pull request #575 from manishrjain/master c39ffb851 Fix link to Vimcasts ef2c0d6d8 Merge pull request #573 from ericdouglas/patch-1 e603117f6 Fix Tabstops and Placeholders index 036d0d9c2 Merge pull request #570 from dueyfinster/patch-1 74bbca2f9 Fixed URL e48d8a28e Rollback "Merge support for auto expand." 490430f91 Merge support for auto expand. 8c7ce8827 Allow neovim to fail for the moment. It is flaky on travis. c45867be5 add missing doc for autotrigger_only 9eb2de6c3 add test for vim<7.4.214 5a5de0734 neovim tests a994e3286 fix py3 tests 61e06bbc1 add note about version and fix tests 878f79ffd review fixes 8ff84758a fix tests cf2c473a8 Define UltiSnips#FileTypeChanged always b968bc3e9 Merge pull request #548 from blueyed/remove-bootstrap-again 5e2f58c35 Define UltiSnips#FileTypeChanged always 4a302149e Remove autoload/UltiSnips/bootstrap.vim again 29ad00ec0 Merge pull request #544 from wincent/fix-autocmd 3eabbe71a Use <nomodeline> when firing user autocmds b3cd0cae1 Merge pull request #541 from hanschen/master 44644f1fd Add field numbers to avoid errors in Python 2.6 ffb9b7948 Do not run autocommands when using --noplugin. 6c4fb6f3f fix b->b2<BS> case, fix merge 14ea90385 tests and docs 1356560f9 fix blumba test 5af229abc add error handling f80414fac prototype of autotrigger 7c74aa768 Merge pull request #537 from krisdages/master cc43d1251 Pipe-quoting helptag reference to UltiSnips-context-snippets c12867d1b Merge support for snippet-actions. 5638cdf4a review fix for == c3add0bef fix neovim tests 58a2094d4 review fixes 175e3ba52 fix doc 80 chars limit a39f3c241 revert access to UltiSnips_Manager bdecd9a8b fix not cleared context 3c4ac11af fix python3, finally b50c5c86c pass all args to snip.expand_anon 9649f15a9 fix buffer edits from jump action 5a663116f edge case: anon snip in pre-action 1e771de60 fix tests ba774c39c review fixes 8958b7134 add docs to the buffer proxy object bc29e2322 VimBufferHelper -> VimBufferProxy 972305725 fix expan_anon in pre-action, snip object, fixes 191ebd8e8 migrate to snip.* namespace 7ead6fa17 detect buffer changes via changedtick 760fd25e4 fix python3 compatibility 1ca82f76f pre/post-expand and post-jump actions 67fbdb2ad Handle $0 in a default text like any other tabstop. 5c211b0e7 Clear up pathogen installation instructions. 34679be7a Updated ChangeLog. 300156642 Support $n tabstops for snipMate snippets. e058d1d40 Added waffle.io badge. c68c9dd74 Add a webhook for gitter.im. 7f64510a7 Link to the Vimcasts about UltiSnips. cd0e60bc0 Remove no longer needed langmap translation. 290600c02 Pass the expected python version to the tests. 44db53b7b Even more leanient timings. 0be9d0f86 Even slower typing. eee82219b More lenient typing speed for Neovim. 306f0ace5 Add a testing interface that works for Neovim. 992e09463 Add a warning about changing the buffer in autocommands. c4ee3ecf1 Fire autocommands when setting up and tearing down inner state 29d7080d6 Do not set up inner state if it is already setup. 33db8b4ab Update pathogen installation instructions. 324a4f8ff Support regexp trigger ending in whitespace. 6b12b1141 Only set autocommands when there are snippets. 2ed217a05 Remove deprecated functions like a boss. becab789a Remove bootstrap.vim. Simplify startup. b13015d47 Remove sys.path manipulations. 5f75dde20 Remove snipMate compatibility script. 9822193e4 Make scripts actually executable. 4f65a7654 Fix testing and test against more scenarios. 5590f9b7b Merge pull request #522 from blueyed/use-vim-current-buffer 8c257e24e VimBuffer: use vim.current.buffer.number instead of vim.eval c3a0924b7 Require Vim 7.4 in preparation of removal of compatibility features. de70b1ed5 Exit snippets when entering/exiting command window. 3806a6987 Fix improper use of augroup in ftdetect. 2fb8820ff A backward compatible solution 00d50c3ae Remove augroup block 188e00f7b Merge pull request #493 from cwahbong/fold-fix ca1977231 Fix folding for snippet files. ab1cc1afa Remove documentation for using the same trigger for jump and expand. d6098193e Merge pull request #446 from seletskiy/context-snippets 50bb61cdc another test for error reporting 463e68a61 fix for correct error reporting 9587d9daa Merge pull request #486 from seletskiy/enhance-undo 2f355c233 another little fix in documentation 099d3bcfb Add more precise undo levels (expanding, jumping) 1b3ecf4a8 priority test, docs & fmt fixes 904fbdecf review fixes 4ab4c1df4 Do not use --interface anymore. 1bf07737b Make sure tmux is available before starting any test. 82ceb6288 Remove testing with GNU screen 2c15427b1 Merge pull request #482 from blueyed/check-python-support-for-UltiSnipsUsePythonVersion 87c3a7ba4 fix UltiSnipFunc test 709f8dc93 minor doc fix and new cursor variable 9861a6e6c typo fix in docs 66bc2e8f6 documentation, pull-requests fixes 0beefd4a1 fix context match on False value ed8cf4911 fix tests b3aec0705 proof of concept for context snips 800a54da1 bootstrap: use WarningMsg with python warning message ac42c83a7 bootstrap: verify that g:UltiSnipsUsePythonVersion is available 00848d7d6 Merge pull request #483 from cwahbong/master 3ccc14dca Try to work around transiently failing commands. aeb2e2420 Disabled unite test - it seems flaky. 4b39bf655 Priority must always be an integer. ee7e15558 Make install_vim.sh actually executable. 99eede1bf Started to test py2 and py3 on travis now. 01a17a1a4 Merge pull request #480 from KazuakiM/master bf20bc6f6 Update document for zero tabstop. 62a96bb05 Merge pull request #462 from kawing-chiu/fix-#457 71a8fdec5 Add contributor to doc. 42fc6c031 Merge branch 'improve_neocomplete' 3ae9b48cf Delete default setting in neocomplete/sources/ultisnips.vim f9a22111f Fix adjacent tabstop input issue. 1971030b5 Merge pull request #456 from spacewander/master 4d88df461 remove duplicate things in vim_test_case.py 56ac14840 Disable neocomplete test which fails right now. cf23624c0 A usable travis configuration. e11252655 More travis. ad2c6d35c Add travis badge and try running on python3 too. db00408a1 More travis. eb9adc50e More travis. f47ec08ef More travis. 348dd4346 More travis. c1aec63bd Typo in travis script. 35cdaba3a A travis script. 09876e008 Support for m (trim) snippet option. e04118766 Do not try to remap the keymaps if langnoremap is available and set. c1bde18cd Add support vim's langnoremap new option 8367587e4 Test fixes. 1a3d0ce4b tests: allow passing in PYTHON, and default to python2 6e787df80 tests: use return code from testrunner 936aac8da tests: add -x / --exitfirst option to fail fast 6602da89d tests: fix duplicate method name (test_SnippetPriorities) 125e6be78 tests: minor doc fixes 98fa887e5 tests: remove star imports, sort ed34607d3 Merge pull request #436 from waffle-iron/master 483dc4ab2 add waffle.io badge 81a628c6e Add option 'm' for trimming whitespaces in snippet d693259ab Add option to not traverse all of the rtp. 0ce8b2366 Less verbose pylint errors. b47e68652 do not walk &rtp if abs path to snips specified 6a787cdc7 Applied pyformat on entire codebase. e1436a8ae Accept numbers and text for disabling snipMate. d240aa24d Added Pyrohh to the list of contributors. 7df82bbe5 Merge pull request #415 from seletskiy/toggle-snipmate fc080b4fd add g:UltiSnipsEnableSnipMate 67630f4ae Merge pull request #414 from Pyrohh/master c050d68e5 Check if editor is Neovim when setting snippet_dir b26f2c97b Merge pull request #413 from lencioni/documentation bbb07646a Fix typo "endglobals" in documentation 6907b2444 Merge pull request #410 from tho/master 185f96c4d Fix list of trigger functions in documentation 6dd476750 Merge pull request #406 from jszakmeister/dont-rely-on-cwd e3159ce0d Merge pull request #407 from jszakmeister/update-documentation d85f0b0c2 Merge pull request #408 from tinypenguin/master d9691a912 Added a terminal emulator warning line for using c-tab combo with usnips eb82c6691 Add some documentation on running the test suite. 1f3f1ce64 Don't rely on having the tmux/screen cwd being in the project directory. e502c9ba8 Fix a couple of typos. 9028abd95 Fixes for Unicode issues by jszakmeister. 8b2115ec2 Fix #171: UltiSnips crashes in new file with text containing 0x80 char f4df1bd9e Teach _vim_enc to handle UnicodeDecodeErrors. 56aa817be Reset the unnamed register at the start of a test. cb8536d72 Merge pull request #394 from michamos/master f179fcf99 Map <c-r> in select mode 1ad970379 Support for sw=0 in newer Vim versions. 4e72a5d08 Merge pull request #388 from blueyed/doc-ref-triggers e3abd6678 Added test case for shiftwidth=0 and added myself to contributors list. 14e5b4638 doc: add tags for trigger vars 482650a00 Use shiftwidth() where available. This allows UltiSnips to work properly when shiftwidth is zero. Per ":help shiftwidth": 8aeb1a2e3 Merge pull request #377 from petobens/master 0775156de Don't escape backslashes in :UltiSnipsEdit 386b3a097 Merge pull request #360 from tafryn/master cae25e533 Change indent level to 3(?!) spaces. 9c632378a Add missing newline to ftdetect. f6e33387a Clean-up vimpager check. c681560b4 Add 'context' value to g:UltiSnipsEditSplit. c79cfd50f Merge pull request #370 from sakana/master 1129ca67d Fix UltiSnipsEdit for g:UltiSnipsSnippetsDir paths that include spaces 2c3c4a777 Add 'context' value to g:UltiSnipsEditSplit 59defbdd5 Merge pull request #357 from kballard/tweak_ftplugin a69764dff Tweak the ftplugin 1292b0fae Merge pull request #355 from kballard/fix_syntax_nested_tabstop a8c9caae8 Add check to prevent errors when using vimpager. 81f917313 Fix highlighting of nested tab stops 279d6e63c Updates the doc for the new clearsnippets behavior. Slight rewording by me. c3660128a Implements clearsnippets by priority. 57ed954cc Merge pull request #348 from cwahbong/select-cr-fix 0abfc3bec Some refinements. 63f65ea87 Add/modify test cases for priority-based clearsnippets. 4784a9e12 Refactor: snippet dictionary does not keep the extend info now. 20f3832ff Code cleanup. 5c87806d7 Implement priority-based clearsnippets. a9aa8c76a Update document for priority based clearsnippets. a053433e4 Variable rename and illustration. 97bad9906 Add test case for #341 (github). f6ce0f92d Merge pull request #349 from m42e/master 79705c3fc Ignore Errors E403 from included syntax files e05788cec Fix issue #341 (github). 4dcfca755 Test refactorings. 1cf3b928f Refactor: split test.py into several smaller files. 9521b942b Merge pull request #340 from cwahbong/test-fix 0872600b9 Ahbong is contributer now. 0dc6a8e4a Now test.py check the version or tmux. b11d5496a Add docstrings for TempFileManager. 15a0a17af Fix tmux interface. e97d52c68 Merge pull request #342 from chivalry/master 2d8ae2fcd Correct misspelling 3002b6852 Solves waiting problem in an elegant way. cc4dc3703 Code cleanup for test.py. 9a98039d2 Fix test.py. ccf79ba82 Merge pull request #331 from kballard/tagbar_snippets dee826520 Support TagBar for snippets files d1f6f7ed8 Better syntax file. b10b62ae6 Twiddle indentation settings 67c7422ae Set up basic highlighting for snipmate files 40145103b Stop embedding python/viml/sh if the `` includes { 010e2c4fa Remove the coloring for python commands ebd62751e Tweak snippet/global highlighting to always highlight the end 30ecd1d1b Rewrite parsing for tab stops 5fa39faa9 fixup! Clean up miscellaneous syntax items 4b73864b7 Fix the docstring for ShellCodeToken 0dba6503e Clean up miscellaneous syntax items acc79747c Syntax highlight the snippet trigger properly 5760eb403 Fix empty snippets/globals d239402b7 Rewrite syntax matching for `global` cb2905c17 Rewrite syntax matching for `snippet` 5937cea08 Mark up syntax items with 'display' as appropriate b82759b25 Rewrite extends/priority/clearsnippets 672117c47 Add hierarchy to syntax file 739e3d94a Fix coloring of shell/VimL/Python command substitutions 5b80ef187 Properly handle \` escapes in commands 636546beb Fix syntax name cab150995 Fix embedded VimL highlighting 1ad7d54d7 Fix highlighting of Python/VimL commands 7b8641e1f Back out fix for #323. Fixes #324. 7d65e2141 Merge pull request #323 from opennota/master 93be385d3 Don't complain about undefined function e59a60cbe Fixed docu for clearsnippets. ee1a2bb2b Escape '\\' in UltiSnipsEdit. f2d9e8b60 Support for selection=old. da5b124af add support for selection=old e4f2e34fc Remove tool that converts snipMate snippets. As support is now build into ultisnips, this is no longer needed. bca51cb40 Brought back snipMate compatibility file. We cannot rely on people tracking vim-snippets to have the renmamed version of this available there. 5c8e3ca48 Merge pull request #275 from skeept/patch-2 fb58034b1 Re-add > before code. 1e6928d0a Merge pull request #276 from meonkeys/patch-1 2042ad476 README: adapt to Vundle interface change 98289510c Update UltiSnips.txt 04ef0f8f5 Merged unite source by Skeept. 2f8489944 Remove snipMate compatibility file. If at all, this should now live in vim-snippets. c21016573 All mappings should be 'silent'. 77a9d8941 simple test for unite interface eff62c336 Be more correct about encoding/decoding strings under py3. Patch by aeruder. cae27fba5 Ensure that _vim_{dec,enc} always succeeds on py3 15f39c080 Do not barf more than once when python is not found. Patch by blueyed. 210304884 Define all/other dummy functions used in autocommands 7da9dbe2a Add UltiSnipsFileType augroup and unset it if UltiSnips is disabled 3208654c4 Do not map keys if 'g:_uspy' could not be set c57c717e3 Delete autocommands when Bootstrap failed 2ad6ad449 Fix E168: :finish used outside of a sourced file a3e654fc5 _vimfiles -> vimfiles. Patch b Oberon. 7bee824db use function to invoqe unite cc1514542 add unite source b6d545ecd Properly escape locations on windows. ae70ec895 Escape correctly file names in windows. 4b4ee4885 Overwrite all snippets with lower priority on expansion. 511600124 Documentation fixes. fee999a71 Docs: remove a reference to defunct ! snippet option 360f58dbf Show where snippets are defined in selection. 7c34a3400 Escape \ when asking for snippets. cd99bdd3b selection=old cannot work with UltiSnips. 69e0acd58 Change the way placeholders are selected. 5aaeae5e8 Do not delete child that is already gone. 1b21741a2 Update ChangeLog. f40c3ac5e Made UltiSnipsEdit! more consistent with multiple filetypes. 5ac043669 Retry unmapping when we switched buffers. b0a3266a6 More tweaking. 940f4d9f2 tweaked readme 5fe88fdc9 Use the demo in the README. 764fd65a7 Added a nice interactive demo. 001c2a967 Added realname of petobens. c6906d85b Fixed a bug in UltiSnipsEdit! 6398a598b Made UltiSnipsEdit more useful and consistent. f44640923 Mention neocomplete in the docs. ba2f30fdf Adapted neosnippets source. Examples by petobens. e6d335aa4 Make the cloning direcotory explicit on stdout. 96557f397 Added integration test for SuperTab. a800b51e0 Removed no longer planned TODOs 147df653a Snippet sources can now be registered. 1ce706e3a Adapted neocomplete integration. a23911f7f Add option to only clone and immediately exit the test runner. c017806b1 Added preliminary support for neocomplete. 1ec523801 Added version checking for other plugins. f4cda8802 Add integration tests with YouCompleteMe. b65efa5aa Added quickstart to readme. 7b51ec6f6 Removed snippet contributors from README. 35e57fad0 Removes snippets. Please track honza/vim-snippets. c4fa2c03b Barf when using "snipmate" for UltiSnips. c9681051c Small fixes to the documentation. 1ec2f187b Updated ChangeLog. c690a3610 Empty lines do not end a snippet for snipMate. 14fca8523 Ups. Forgot to add this. fe7cb4cf8 Makes UltiSnips a drop in replacement for snipMate. 6b8bb1b64 Launch and exit vim for each test. 2c28b51db Allow tests to write arbitrary files into the runtimepath, not just snippet files. 48dcaa02b Attempted fix at several startup problems. 2d18d5365 Change initialization to make session work. git-subtree-dir: vim/bundle/ultisnips git-subtree-split: 78614503098571ecdb09f79bc9543aacdb0e41c0
This commit is contained in:
parent
88649519d4
commit
588aac5317
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
*.swp
|
*.swp
|
||||||
doc/tags
|
doc/tags
|
||||||
|
.ropeproject/
|
||||||
|
|||||||
29
.travis.yml
Normal file
29
.travis.yml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
language: python
|
||||||
|
|
||||||
|
python:
|
||||||
|
- 2.7
|
||||||
|
- 3.3
|
||||||
|
- 3.4
|
||||||
|
env:
|
||||||
|
- VIM_VERSION="74"
|
||||||
|
- VIM_VERSION="mercurial"
|
||||||
|
# - VIM_VERSION="NEOVIM"
|
||||||
|
|
||||||
|
install:
|
||||||
|
# Some of these commands fail transiently. We keep retrying them until they succeed.
|
||||||
|
- until sudo add-apt-repository ppa:kalakris/tmux -y; do sleep 10; done
|
||||||
|
- until sudo add-apt-repository ppa:neovim-ppa/unstable -y; do sleep 10; done
|
||||||
|
- until sudo apt-get update -qq; do sleep 10; done
|
||||||
|
- until sudo apt-get install -qq -y --force-yes tmux xclip gdb neovim mercurial; do sleep 10; done
|
||||||
|
- ./travis_install.sh
|
||||||
|
|
||||||
|
script:
|
||||||
|
- ./travis_test.sh
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
webhooks:
|
||||||
|
urls:
|
||||||
|
- https://webhooks.gitter.im/e/558acac434012ba838cd
|
||||||
|
on_success: change # options: [always|never|change] default: always
|
||||||
|
on_failure: always # options: [always|never|change] default: always
|
||||||
|
on_start: false # default: false
|
||||||
86
ChangeLog
86
ChangeLog
@ -1,4 +1,71 @@
|
|||||||
version 2.2:
|
version 3.1 (TODO: date):
|
||||||
|
- This is the last release done by @SirVer. The new maintainer of UltiSnips
|
||||||
|
is @seletskiy. The repository remains https://github.com/SirVer/ultisnips,
|
||||||
|
so this should not affect any users. This is also the last release to be
|
||||||
|
published on vim.org. Please follow the master branch on GitHub for the
|
||||||
|
latest stable version.
|
||||||
|
- New option `e`: Context aware snippets. This gives very precise and
|
||||||
|
powerful control over which snippet should be expanded depending on
|
||||||
|
surrounding code. *UltiSnips-context-snippets*
|
||||||
|
- New option `m`: Trim whitespace in all snippet lines.
|
||||||
|
- Very powerful, freely configurable pre/post-expand and post-jump actions
|
||||||
|
allow for transforming the buffer outside the snippet. *UltiSnips-snippet-actions*
|
||||||
|
- Automatic triggering of snippets without the need to press the expand
|
||||||
|
trigger. *UltiSnips-autotrigger*
|
||||||
|
- Better error reporting for snippet errors including python stacktraces
|
||||||
|
and listing of executed code.
|
||||||
|
- Undo is more granular. Each jump and expand is now a separate undo step.
|
||||||
|
- UltiSnips now emits autocommands on certain events. *UltiSnips-custom-autocommands*
|
||||||
|
- clearsnippets now clears all snippets below the current priority. This
|
||||||
|
fits better with the priority system introduced in 3.0.
|
||||||
|
- snipMate snippets support can be disabled. *UltiSnipsEnableSnipMate*
|
||||||
|
- UltiSnipsEditSplit got a new value 'context'. *UltiSnipsEditSplit*
|
||||||
|
- Improved syntax highlighting for snippets filetype.
|
||||||
|
- Mappings and autocommands are now only established when needed, i.e. when
|
||||||
|
a snippet is active. This boosts performance outside of snippets.
|
||||||
|
- New integration with Unite, TagBar, and deoplete.
|
||||||
|
- New Ctags configuration file for snippet definitions.
|
||||||
|
- Bug fixes, performance improvements, code cleanups and refactorings.
|
||||||
|
- No longer supports Vim < 7.4.
|
||||||
|
|
||||||
|
version 3.0 (02-Mar-2014):
|
||||||
|
- Organisational changes: The project is now hosted on github. Snippets are
|
||||||
|
now shipped separately - please track honza/vim-snippets.
|
||||||
|
- UltiSnips is now a drop in replacement for snipMate - it parses snipMate
|
||||||
|
snippets and expands them emulating snipMates smaller feature set.
|
||||||
|
- Filetype tab completion for UltiSnipsEdit.
|
||||||
|
- UltiSnipsEdit now only edits private snippet files. Use UltiSnipsEdit! if
|
||||||
|
you want to edit shipped files.
|
||||||
|
- New option 's' which strips trailing whitespace before jumping to next
|
||||||
|
tabstop
|
||||||
|
- New option 'a' which converts non-ascii characters into ascii characters
|
||||||
|
in transformations.
|
||||||
|
- New keyword in snippet files: priority defines which snippets should
|
||||||
|
overwrite others. This deprecates the '!' option.
|
||||||
|
*UltiSnips-adding-snippets*
|
||||||
|
- Remove common whitespace of visual line selections before inserting in an
|
||||||
|
indented tabstop.
|
||||||
|
- Support for overwriting the snippet directory name on a per buffer basis
|
||||||
|
to support per project snippets. *UltiSnips-snippet-search-path*
|
||||||
|
- The keymaps for jumping in snippets are now only mapped when a snippet is
|
||||||
|
active, allowing them to be used for something else otherwise.
|
||||||
|
- Expanding and jumping no longer overwrites the unnamed register.
|
||||||
|
- Integration with Valloric/YouCompleteMe and Shougo/neocomplete.vim.
|
||||||
|
- Other plugins can add sources for snippets to create snippets on the fly.
|
||||||
|
*UltiSnips-extending*
|
||||||
|
- Vim functions now indicates if it did any work.
|
||||||
|
*UltiSnips-trigger-functions*
|
||||||
|
- For python extensions: UltiSnips adds itself to the sys.path and can be
|
||||||
|
easily imported if it is available. *UltiSnips-python-module-path*
|
||||||
|
- A new function giving programmatic access to the snippets currently
|
||||||
|
available for expansion for other plugins integrating with UltiSnips.
|
||||||
|
*UltiSnips_SnippetsInCurrentScope*
|
||||||
|
- New or improved snippets (now in a different repo): all, bib, c, cpp, cs,
|
||||||
|
d, django, eruby, go, haskell, html, html, htmljinja, java, javascript,
|
||||||
|
js, ledger, ocaml, perl, php, puppet, python, ruby, scss, sh, tex, vim,
|
||||||
|
xml, zsh.
|
||||||
|
|
||||||
|
version 2.2 (01-Sep-2012):
|
||||||
- Support to silence Python-not-found warnings. *UltiSnips-python-warning*
|
- Support to silence Python-not-found warnings. *UltiSnips-python-warning*
|
||||||
- Matchit support for snippet files.
|
- Matchit support for snippet files.
|
||||||
- Improvements to syntax file.
|
- Improvements to syntax file.
|
||||||
@ -9,12 +76,12 @@ version 2.2:
|
|||||||
json, html, coffee, coffee_jasmine, javascript_jasmine, ruby, php,
|
json, html, coffee, coffee_jasmine, javascript_jasmine, ruby, php,
|
||||||
markdown.
|
markdown.
|
||||||
|
|
||||||
version 2.1:
|
version 2.1 (14-Feb-2012):
|
||||||
- Python interpolation access to text from visual selection via snip.v.
|
- Python interpolation access to text from visual selection via snip.v.
|
||||||
- Support for transformations of ${VISUAL} texts.
|
- Support for transformations of ${VISUAL} texts.
|
||||||
- New or improved snippets: python, tex, texmath, ruby, rails, html, django
|
- New or improved snippets: python, tex, texmath, ruby, rails, html, django
|
||||||
|
|
||||||
version 2.0:
|
version 2.0 (05-Feb-2012):
|
||||||
- Backwards incompatible change: Support for normal mode editing. Snippets
|
- Backwards incompatible change: Support for normal mode editing. Snippets
|
||||||
are no longer exited when leaving insert mode but only by leaving the
|
are no longer exited when leaving insert mode but only by leaving the
|
||||||
text span of the snippets. This allows usage of normal mode commands and
|
text span of the snippets. This allows usage of normal mode commands and
|
||||||
@ -28,20 +95,20 @@ version 2.0:
|
|||||||
- Full support for :py3. UltiSnips now works with python >= 2.6 or >= 3.2.
|
- Full support for :py3. UltiSnips now works with python >= 2.6 or >= 3.2.
|
||||||
- New or improved snippets: python, all
|
- New or improved snippets: python, all
|
||||||
|
|
||||||
version 1.6:
|
version 1.6 (30-Dec-2011):
|
||||||
- Significant speed improvements and a few bugs fixed.
|
- Significant speed improvements and a few bugs fixed.
|
||||||
- Better handling of non ASCII chars in snippets by assuming UTF-8 encoding
|
- Better handling of non ASCII chars in snippets by assuming UTF-8 encoding
|
||||||
when no other information is available.
|
when no other information is available.
|
||||||
- Contributions for UltiSnips are now also accepted on GitHub: https://github.com/SirVer/ultisnips/
|
- Contributions for UltiSnips are now also accepted on GitHub: https://github.com/SirVer/ultisnips/
|
||||||
- New or improved snippets: ruby, rails, xhtml
|
- New or improved snippets: ruby, rails, xhtml
|
||||||
|
|
||||||
version 1.5:
|
version 1.5 (24-Sep-2011):
|
||||||
- Some critical bug fixes for new vim versions.
|
- Some critical bug fixes for new vim versions.
|
||||||
- New or improved snippets: tex, texmath, python, jinja2, go, puppet, xhtml
|
- New or improved snippets: tex, texmath, python, jinja2, go, puppet, xhtml
|
||||||
- Configuration of search path for snippets *UltiSnips-snippet-search-path*
|
- Configuration of search path for snippets *UltiSnips-snippet-search-path*
|
||||||
- New parser implementation: A little faster, more flexible and less bugged.
|
- New parser implementation: A little faster, more flexible and less bugged.
|
||||||
|
|
||||||
version 1.4:
|
version 1.4 (17-Jul-2011):
|
||||||
- New or improved snippets: php, html, djangohtml, mako, lua
|
- New or improved snippets: php, html, djangohtml, mako, lua
|
||||||
- Snippets are now listed alphabetically by their trigger, no longer in
|
- Snippets are now listed alphabetically by their trigger, no longer in
|
||||||
order of appearance
|
order of appearance
|
||||||
@ -55,7 +122,7 @@ version 1.4:
|
|||||||
- snippets definition files now have the filetype 'snippets'. It used to be
|
- snippets definition files now have the filetype 'snippets'. It used to be
|
||||||
'snippet'.
|
'snippet'.
|
||||||
|
|
||||||
version 1.3:
|
version 1.3 (14-Feb-2011):
|
||||||
- Erlang snippets (g0rdin)
|
- Erlang snippets (g0rdin)
|
||||||
- Other VimScripts can now define and immediately expand anonymous snippets
|
- Other VimScripts can now define and immediately expand anonymous snippets
|
||||||
( *UltiSnips_Anon* ) (Ryan Wooden)
|
( *UltiSnips_Anon* ) (Ryan Wooden)
|
||||||
@ -68,7 +135,7 @@ version 1.3:
|
|||||||
missing. (Rupa Deadwyler)
|
missing. (Rupa Deadwyler)
|
||||||
- Added UltiSnipsReset and UltiSnipsEdit (Idea by JCEB)
|
- Added UltiSnipsReset and UltiSnipsEdit (Idea by JCEB)
|
||||||
|
|
||||||
version 1.2:
|
version 1.2 (24-Aug-2010):
|
||||||
- many bugs were fixed
|
- many bugs were fixed
|
||||||
- smode mappings for printable characters are now removed before expanding a
|
- smode mappings for printable characters are now removed before expanding a
|
||||||
snippet. This is configurable. *UltiSnips-warning-smappings*
|
snippet. This is configurable. *UltiSnips-warning-smappings*
|
||||||
@ -87,7 +154,7 @@ version 1.2:
|
|||||||
in c, but a c trigger is valuable for cpp.
|
in c, but a c trigger is valuable for cpp.
|
||||||
- UltiSnips now adheres to expandtab and tabstop options of vim
|
- UltiSnips now adheres to expandtab and tabstop options of vim
|
||||||
|
|
||||||
version 1.1:
|
version 1.1 (21-Jul-2009):
|
||||||
- Made triggers configurable. You can also use the same trigger for
|
- Made triggers configurable. You can also use the same trigger for
|
||||||
expanding and tabbing. The TextMate configuration <tab> and <s-tab> is now
|
expanding and tabbing. The TextMate configuration <tab> and <s-tab> is now
|
||||||
possible.
|
possible.
|
||||||
@ -98,4 +165,3 @@ version 1.1:
|
|||||||
with the same tab trigger ( *UltiSnips-adding-snippets* )
|
with the same tab trigger ( *UltiSnips-adding-snippets* )
|
||||||
- Support for dotted filetype syntax. Now snippets for more than one filetype
|
- Support for dotted filetype syntax. Now snippets for more than one filetype
|
||||||
can be active ( *UltiSnips-adding-snippets* )
|
can be active ( *UltiSnips-adding-snippets* )
|
||||||
|
|
||||||
|
|||||||
73
README.md
Normal file
73
README.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
[](https://travis-ci.org/SirVer/ultisnips)
|
||||||
|
[](https://waffle.io/SirVer/ultisnips)
|
||||||
|
[](https://gitter.im/SirVer/ultisnips?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||||
|
|
||||||
|
UltiSnips
|
||||||
|
=========
|
||||||
|
|
||||||
|
UltiSnips is the ultimate solution for snippets in Vim. It has tons of features
|
||||||
|
and is very fast.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
In this demo I am editing a python file. I first expand the `#!` snippet, then
|
||||||
|
the `class` snippet. The completion menu comes from
|
||||||
|
[YouCompleteMe](https://github.com/Valloric/YouCompleteMe), UltiSnips also
|
||||||
|
integrates with [neocomplete](https://github.com/Shougo/neocomplete.vim). I can
|
||||||
|
jump through placeholders and add text while the snippet inserts text in other
|
||||||
|
places automatically: when I add `Animal` as a base class, `__init__` gets
|
||||||
|
updated to call the base class constructor. When I add arguments to the
|
||||||
|
constructor, they automatically get assigned to instance variables. I then
|
||||||
|
insert my personal snippet for `print` debugging. Note that I left insert mode,
|
||||||
|
inserted another snippet and went back to add an additional argument to
|
||||||
|
`__init__` and the class snippet was still active and added another instance
|
||||||
|
variable.
|
||||||
|
|
||||||
|
The official home of UltiSnips is at <https://github.com/sirver/ultisnips>.
|
||||||
|
Please add pull requests and issues there.
|
||||||
|
|
||||||
|
UltiSnips was started in Jun 2009 by @SirVer. In Dec 2015, maintenance was
|
||||||
|
handed over to @seletskiy.
|
||||||
|
|
||||||
|
Quick Start
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This assumes you are using [Vundle](https://github.com/gmarik/Vundle.vim). Adapt
|
||||||
|
for your plugin manager of choice. Put this into your `.vimrc`.
|
||||||
|
|
||||||
|
" Track the engine.
|
||||||
|
Plugin 'SirVer/ultisnips'
|
||||||
|
|
||||||
|
" Snippets are separated from the engine. Add this if you want them:
|
||||||
|
Plugin 'honza/vim-snippets'
|
||||||
|
|
||||||
|
" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
|
||||||
|
let g:UltiSnipsExpandTrigger="<tab>"
|
||||||
|
let g:UltiSnipsJumpForwardTrigger="<c-b>"
|
||||||
|
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
|
||||||
|
|
||||||
|
" If you want :UltiSnipsEdit to split your window.
|
||||||
|
let g:UltiSnipsEditSplit="vertical"
|
||||||
|
|
||||||
|
UltiSnips comes with comprehensive
|
||||||
|
[documentation](https://github.com/SirVer/ultisnips/blob/master/doc/UltiSnips.txt).
|
||||||
|
As there are more options and tons of features I suggest you at least skim it.
|
||||||
|
|
||||||
|
Screencasts
|
||||||
|
-----------
|
||||||
|
|
||||||
|
From a gentle introduction to really advanced in a few minutes: The blog posts
|
||||||
|
of the screencasts contain more advanced examples of the things discussed in the
|
||||||
|
videos.
|
||||||
|
|
||||||
|
- [Episode 1: What are snippets and do I need them?](http://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/)
|
||||||
|
- [Episode 2: Creating Basic Snippets](http://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/)
|
||||||
|
- [Episode 3: What's new in version 2.0](http://www.sirver.net/blog/2012/02/05/third-episode-of-ultisnips-screencast/)
|
||||||
|
- [Episode 4: Python Interpolation](http://www.sirver.net/blog/2012/03/31/fourth-episode-of-ultisnips-screencast/)
|
||||||
|
|
||||||
|
Also the excellent [Vimcasts](http://vimcasts.org) dedicated three episodes to
|
||||||
|
UltiSnips:
|
||||||
|
|
||||||
|
- [Meet UltiSnips](http://vimcasts.org/episodes/meet-ultisnips/)
|
||||||
|
- [Using Python interpolation in UltiSnips snippets](http://vimcasts.org/episodes/ultisnips-python-interpolation/)
|
||||||
|
- [Using selected text in UltiSnips snippets](http://vimcasts.org/episodes/ultisnips-visual-placeholder/)
|
||||||
22
README.rst
22
README.rst
@ -1,22 +0,0 @@
|
|||||||
UltiSnips
|
|
||||||
=========
|
|
||||||
|
|
||||||
This is the official repository for UltiSnips. Send Pull request to
|
|
||||||
SirVer/ultisnips, not the automatic clone from vim-scripts or any
|
|
||||||
other fork of this project.
|
|
||||||
|
|
||||||
Screencasts
|
|
||||||
-----------
|
|
||||||
|
|
||||||
The blog posts of the screencasts contain more advanced examples of the things
|
|
||||||
discussed in the videos.
|
|
||||||
|
|
||||||
* `Episode 1: What are snippets and do I need them?`__
|
|
||||||
* `Episode 2: Creating Basic Snippets`__
|
|
||||||
* `Episode 3: What's new in version 2.0`__
|
|
||||||
* `Episode 4: Python Interpolation`__
|
|
||||||
|
|
||||||
__ http://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/
|
|
||||||
__ http://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/
|
|
||||||
__ http://www.sirver.net/blog/2012/02/05/third-episode-of-ultisnips-screencast/
|
|
||||||
__ http://www.sirver.net/blog/2012/03/31/fourth-episode-of-ultisnips-screencast/
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
This directory contains the main scripts that come bundled with UltiSnips.
|
|
||||||
|
|
||||||
Standing On The Shoulders of Giants
|
|
||||||
===================================
|
|
||||||
|
|
||||||
The snippets have been collected from various other project which I want to
|
|
||||||
express my gratitude for. My main source for inspiration where the following
|
|
||||||
two projects:
|
|
||||||
|
|
||||||
TextMate: http://svn.textmate.org/trunk/Bundles/
|
|
||||||
SnipMate: http://code.google.com/p/snipmate/
|
|
||||||
|
|
||||||
All snippets from those sources were copied and cleaned up, so that they are
|
|
||||||
- not using shell script, only python (so they are cross platform compatible)
|
|
||||||
- not using any feature that UltiSnips doesn't offer
|
|
||||||
|
|
||||||
UltiSnips has seen contributions by various individuals. Those contributions
|
|
||||||
have been merged into this collection seamlessly and without further comments.
|
|
||||||
|
|
||||||
-- vim:ft=rst:nospell:
|
|
||||||
|
|
||||||
@ -1,120 +0,0 @@
|
|||||||
# This file contains snippets that are always defined. I personally
|
|
||||||
# have snippets for signatures and often needed texts
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
##############
|
|
||||||
# NICE BOXES #
|
|
||||||
##############
|
|
||||||
global !p
|
|
||||||
import string, vim
|
|
||||||
|
|
||||||
""" Maps a filetype to comment format used for boxes.
|
|
||||||
Automatically filled during usage"""
|
|
||||||
_commentDict = { }
|
|
||||||
|
|
||||||
def _parse_comments(s):
|
|
||||||
""" Parses vim's comments option to extract comment format """
|
|
||||||
i = iter(s.split(","))
|
|
||||||
|
|
||||||
rv = []
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
# get the flags and text of a comment part
|
|
||||||
flags, text = next(i).split(':', 1)
|
|
||||||
|
|
||||||
if len(flags) == 0:
|
|
||||||
rv.append((text, text, text, ""))
|
|
||||||
# parse 3-part comment, but ignore those with O flag
|
|
||||||
elif flags[0] == 's' and 'O' not in flags:
|
|
||||||
ctriple = []
|
|
||||||
indent = ""
|
|
||||||
|
|
||||||
if flags[-1] in string.digits:
|
|
||||||
indent = " " * int(flags[-1])
|
|
||||||
ctriple.append(text)
|
|
||||||
|
|
||||||
flags,text = next(i).split(':', 1)
|
|
||||||
assert(flags[0] == 'm')
|
|
||||||
ctriple.append(text)
|
|
||||||
|
|
||||||
flags,text = next(i).split(':', 1)
|
|
||||||
assert(flags[0] == 'e')
|
|
||||||
ctriple.append(text)
|
|
||||||
ctriple.append(indent)
|
|
||||||
|
|
||||||
rv.append(ctriple)
|
|
||||||
elif flags[0] == 'b':
|
|
||||||
if len(text) == 1:
|
|
||||||
rv.insert(0, (text,text,text, ""))
|
|
||||||
except StopIteration:
|
|
||||||
return rv
|
|
||||||
|
|
||||||
def _get_comment_format():
|
|
||||||
""" Returns a 4-element tuple representing the comment format for
|
|
||||||
the current file. """
|
|
||||||
return _parse_comments(vim.eval("&comments"))[0]
|
|
||||||
|
|
||||||
|
|
||||||
def make_box(twidth, bwidth=None):
|
|
||||||
b, m, e, i = _get_comment_format()
|
|
||||||
bwidth_inner = bwidth - 3 - max(len(b), len(i + e)) if bwidth else twidth + 2
|
|
||||||
sline = b + m + bwidth_inner * m[0] + 2 * m[0]
|
|
||||||
nspaces = (bwidth_inner - twidth) // 2
|
|
||||||
mlines = i + m + " " + " " * nspaces
|
|
||||||
mlinee = " " + " "*(bwidth_inner - twidth - nspaces) + m
|
|
||||||
eline = i + m + bwidth_inner * m[0] + 2 * m[0] + e
|
|
||||||
return sline, mlines, mlinee, eline
|
|
||||||
|
|
||||||
def foldmarker():
|
|
||||||
"Return a tuple of (open fold marker, close fold marker)"
|
|
||||||
return vim.eval("&foldmarker").split(",")
|
|
||||||
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
snippet box "A nice box with the current comment symbol" b
|
|
||||||
`!p
|
|
||||||
box = make_box(len(t[1]))
|
|
||||||
snip.rv = box[0] + '\n' + box[1]
|
|
||||||
`${1:content}`!p
|
|
||||||
box = make_box(len(t[1]))
|
|
||||||
snip.rv = box[2] + '\n' + box[3]`
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet bbox "A nice box over the full width" b
|
|
||||||
`!p
|
|
||||||
width = int(vim.eval("&textwidth")) or 71
|
|
||||||
box = make_box(len(t[1]), width)
|
|
||||||
snip.rv = box[0] + '\n' + box[1]
|
|
||||||
`${1:content}`!p
|
|
||||||
box = make_box(len(t[1]), width)
|
|
||||||
snip.rv = box[2] + '\n' + box[3]`
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fold "Insert a vim fold marker" b
|
|
||||||
`!p snip.rv = _get_comment_format()[0]` ${1:Fold description} `!p snip.rv = foldmarker()[0]`${2:1} `!p snip.rv = _get_comment_format()[2]`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet foldc "Insert a vim fold close marker" b
|
|
||||||
`!p snip.rv = _get_comment_format()[0]` ${2:1}`!p snip.rv = foldmarker()[1]` `!p snip.rv = _get_comment_format()[2]`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet foldp "Insert a vim fold marker pair" b
|
|
||||||
`!p snip.rv = _get_comment_format()[0]` ${1:Fold description} `!p snip.rv = foldmarker()[0]` `!p snip.rv = _get_comment_format()[2]`
|
|
||||||
${2:${VISUAL:Content}}
|
|
||||||
`!p snip.rv = _get_comment_format()[0]` `!p snip.rv = foldmarker()[1]` $1 `!p snip.rv = _get_comment_format()[2]`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
##########################
|
|
||||||
# LOREM IPSUM GENERATORS #
|
|
||||||
##########################
|
|
||||||
snippet lorem "Lorem Ipsum - 50 Words" b
|
|
||||||
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
|
|
||||||
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
|
|
||||||
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
|
|
||||||
no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,52 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet online "Online resource" b
|
|
||||||
@online{${1:name},
|
|
||||||
author={${2:author}},
|
|
||||||
title={${3:title}},
|
|
||||||
date={${4:date}},
|
|
||||||
url={${5:url}}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet article "Article reference" b
|
|
||||||
@article{${1:name},
|
|
||||||
author={${2:author}},
|
|
||||||
title={${3:title}},
|
|
||||||
journaltitle={${4:journal}},
|
|
||||||
volume={${5:NN}},
|
|
||||||
number={${6:NN}},
|
|
||||||
year={${7:YYYY}},
|
|
||||||
pages={${8:NN}--${9:NN}}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet book "Book reference" b
|
|
||||||
@book{${1:name},
|
|
||||||
author={${2:author}},
|
|
||||||
title={${3:title}},
|
|
||||||
subtitle={${4:subtitle}},
|
|
||||||
year={${5:YYYY}},
|
|
||||||
location={${6:somewhere}},
|
|
||||||
publisher={${7:publisher}},
|
|
||||||
pages={${8:NN}--${9:NN}}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inb "In Book reference" b
|
|
||||||
@inbook{${1:name},
|
|
||||||
author={${2:author}},
|
|
||||||
title={${3:title}},
|
|
||||||
subtitle={${4:subtitle}},
|
|
||||||
booktitle={${5:book}},
|
|
||||||
editor={${6:editor}},
|
|
||||||
year={${7:YYYY}},
|
|
||||||
location={${8:somewhere}},
|
|
||||||
publisher={${9:publisher}},
|
|
||||||
pages={${10:NN}--${11:NN}}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
global !p
|
|
||||||
def newsoa():
|
|
||||||
import datetime
|
|
||||||
now = datetime.datetime.now()
|
|
||||||
# return standard SOA formatted serial for today
|
|
||||||
return now.strftime("%Y%m%d00")
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
snippet zone "Bootstrap a new Bind zonefile" b
|
|
||||||
$TTL 86400
|
|
||||||
@ IN SOA ${1:example.net}. ${2:hostmaster.$1}.(
|
|
||||||
`!p snip.rv = newsoa()`; serial
|
|
||||||
21600; refresh every 6 hours
|
|
||||||
3600; retry after one hour
|
|
||||||
604800; expire after a week
|
|
||||||
86400 ); minimum TTL of 1 day
|
|
||||||
|
|
||||||
IN NS ns01.$1.
|
|
||||||
IN MX 10 mail.$1.
|
|
||||||
|
|
||||||
ns01.$1 IN A
|
|
||||||
mail.$1 IN A
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet A "Insert A Record" b
|
|
||||||
${1:hostname} IN A ${2:ip}
|
|
||||||
endsnippet
|
|
||||||
@ -1,155 +0,0 @@
|
|||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
snippet def "#define ..."
|
|
||||||
#define ${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifndef "#ifndef ... #define ... #endif"
|
|
||||||
#ifndef ${1/([A-Za-z0-9_]+).*/$1/}
|
|
||||||
#define ${1:SYMBOL} ${2:value}
|
|
||||||
#endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet #if "#if #endif" b
|
|
||||||
#if ${1:0}
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::code)/}}
|
|
||||||
#endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inc "#include local header (inc)"
|
|
||||||
#include "${1:`!p snip.rv = snip.basename + '.h'`}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Inc "#include <> (Inc)"
|
|
||||||
#include <${1:.h}>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mark "#pragma mark (mark)"
|
|
||||||
#if 0
|
|
||||||
${1:#pragma mark -
|
|
||||||
}#pragma mark $2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet main "main() (main)"
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for loop (for)"
|
|
||||||
for (${2:i} = 0; $2 < ${1:count}; ${3:++$2})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fori "for int loop (fori)"
|
|
||||||
for (${4:int} ${2:i} = 0; $2 < ${1:count}; ${3:++$2})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet enum "Enumeration"
|
|
||||||
enum ${1:name} { $0 };
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet once "Include header once only guard"
|
|
||||||
#ifndef ${1:`!p
|
|
||||||
if not snip.c:
|
|
||||||
import random, string
|
|
||||||
name = re.sub(r'[^A-Za-z0-9]+','_', snip.fn).upper()
|
|
||||||
rand = ''.join(random.sample(string.ascii_letters+string.digits, 8))
|
|
||||||
snip.rv = ('%s_%s' % (name,rand)).upper()
|
|
||||||
else:
|
|
||||||
snip.rv = snip.c`}
|
|
||||||
#define $1
|
|
||||||
|
|
||||||
${0}
|
|
||||||
|
|
||||||
#endif /* end of include guard: $1 */
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet td "Typedef"
|
|
||||||
typedef ${1:int} ${2:MyCustomType};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wh "while loop"
|
|
||||||
while(${1:/* condition */}) {
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet do "do...while loop (do)"
|
|
||||||
do {
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
} while(${1:/* condition */});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fprintf "fprintf ..."
|
|
||||||
fprintf(${1:stderr}, "${2:%s}\n"${2/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$3${2/([^%]|%%)*(%.)?.*/(?2:\);)/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if .. (if)"
|
|
||||||
if (${1:/* condition */})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet el "else .. (else)"
|
|
||||||
else {
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eli "else if .. (eli)"
|
|
||||||
else if (${1:/* condition */}) {
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "if .. else (ife)"
|
|
||||||
if (${1:/* condition */})
|
|
||||||
{
|
|
||||||
${2:/* code */}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
${3:/* else */}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet printf "printf .. (printf)"
|
|
||||||
printf("${1:%s}\n"${1/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$2${1/([^%]|%%)*(%.)?.*/(?2:\);)/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet st "struct"
|
|
||||||
struct ${1:`!p snip.rv = (snip.basename or "name") + "_t"`}
|
|
||||||
{
|
|
||||||
${0:/* data */}
|
|
||||||
};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fun "function" b
|
|
||||||
${1:void} ${2:function_name}(${3})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fund "function declaration" b
|
|
||||||
${1:void} ${2:function_name}(${3});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,91 +0,0 @@
|
|||||||
# From the TextMate bundle
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
snippet fun "Function" b
|
|
||||||
${1:name} = (${2:args}) ->
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet bfun "Function (bound)" b
|
|
||||||
${1:(${2:args}) }=>
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "If" b
|
|
||||||
if ${1:condition}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "If .. Else" b
|
|
||||||
if ${1:condition}
|
|
||||||
${2:# body...}
|
|
||||||
else
|
|
||||||
${3:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet elif "Else if" b
|
|
||||||
else if ${1:condition}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifte "Ternary if" b
|
|
||||||
if ${1:condition} then ${2:value} else ${3:other}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet unl "Unless" b
|
|
||||||
${1:action} unless ${2:condition}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fora "Array Comprehension" b
|
|
||||||
for ${1:name} in ${2:array}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet foro "Object Comprehension" b
|
|
||||||
for ${1:key}, ${2:value} of ${3:Object}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forr "Range Comprehension (inclusive)" b
|
|
||||||
for ${1:name} in [${2:start}..${3:finish}]${4: by ${5:step}}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forrex "Range Comprehension (exclusive)" b
|
|
||||||
for ${1:name} in [${2:start}...${3:finish}]${4: by ${5:step}}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet swi "Switch" b
|
|
||||||
switch ${1:object}
|
|
||||||
when ${2:value}
|
|
||||||
${0:# body...}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cla "Class" b
|
|
||||||
class ${1:ClassName}${2: extends ${3:Ancestor}}
|
|
||||||
|
|
||||||
${4:constructor: (${5:args}) ->
|
|
||||||
${6:# body...}}
|
|
||||||
$7
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "Try .. Catch" b
|
|
||||||
try
|
|
||||||
$1
|
|
||||||
catch ${2:error}
|
|
||||||
$3
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet req "Require" b
|
|
||||||
${1/^'?(\w+)'?$/\L$1\E/} = require(${1:'${2:sys}'})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet # "Interpolated Code"
|
|
||||||
#{$1}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet log "Log" b
|
|
||||||
console.log ${1:"${2:msg}"}
|
|
||||||
endsnippet
|
|
||||||
@ -1,166 +0,0 @@
|
|||||||
#
|
|
||||||
# CoffeeScript versions -- adapted from the JS TextMate bundle + additions
|
|
||||||
# for some jasmine-jquery matchers
|
|
||||||
#
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
extends coffee
|
|
||||||
|
|
||||||
priority -49
|
|
||||||
|
|
||||||
snippet des "Describe (coffee)" b
|
|
||||||
describe '${1:description}', ->
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet it "it (coffee)" b
|
|
||||||
it '${1:description}', ->
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet bef "before each (coffee)" b
|
|
||||||
beforeEach ->
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aft "after each (coffee)" b
|
|
||||||
afterEach ->
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet any "any (coffee)" b
|
|
||||||
jasmine.any($1)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ru "runs (coffee)" b
|
|
||||||
runs ->
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wa "waits (coffee)" b
|
|
||||||
waits($1)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ex "expect (coffee)" b
|
|
||||||
expect(${1:target})$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ee "expect to equal (coffee)" b
|
|
||||||
expect(${1:target}).toEqual(${2:value})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet em "expect to match (coffee)" b
|
|
||||||
expect(${1:target}).toMatch(${2:pattern})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eha "expect to have attribute (coffee)" b
|
|
||||||
expect(${1:target}).toHaveAttr('${2:attr}'${3:, '${4:value}'})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet et "expect to be truthy (coffee)" b
|
|
||||||
expect(${1:target}).toBeTruthy()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ef "expect to be falsy (coffee)" b
|
|
||||||
expect(${1:target}).toBeFalsy()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ed "expect to be defined (coffee)" b
|
|
||||||
expect(${1:target}).toBeDefined()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet en "expect to be null (coffee)" b
|
|
||||||
expect(${1:target}).toBeNull()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ec "expect to contain (coffee)" b
|
|
||||||
expect(${1:target}).toContain(${2:value})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ev "expect to be visible (coffee)" b
|
|
||||||
expect(${1:target}).toBeVisible()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eh "expect to be hidden (coffee)" b
|
|
||||||
expect(${1:target}).toBeHidden()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notx "expect not (coffee)" b
|
|
||||||
expect(${1:target}).not$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet note "expect not to equal (coffee)" b
|
|
||||||
expect(${1:target}).not.toEqual(${2:value})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notm "expect not to match (coffee)" b
|
|
||||||
expect(${1:target}).not.toMatch(${2:pattern})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notha "expect to not have attribute (coffee)" b
|
|
||||||
expect(${1:target}).not.toHaveAttr('${2:attr}'${3:, '${4:value}'})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet nott "expect not to be truthy (coffee)" b
|
|
||||||
expect(${1:target}).not.toBeTruthy()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notf "expect not to be falsy (coffee)" b
|
|
||||||
expect(${1:target}).not.toBeFalsy()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notd "expect not to be defined (coffee)" b
|
|
||||||
expect(${1:target}).not.toBeDefined()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notn "expect not to be null (coffee)" b
|
|
||||||
expect(${1:target}).not.toBeNull()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notc "expect not to contain (coffee)" b
|
|
||||||
expect(${1:target}).not.toContain(${2:value})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notv "expect not to be visible (coffee)" b
|
|
||||||
expect(${1:target}).not.toBeVisible()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet noth "expect not to be hidden (coffee)" b
|
|
||||||
expect(${1:target}).not.toBeHidden()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet s "spy on (coffee)" b
|
|
||||||
spyOn(${1:object}, "${2:method}")$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sr "spy on and return (coffee)" b
|
|
||||||
spyOn(${1:object}, "${2:method}").andReturn(${3:arguments})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet st "spy on and throw (coffee)" b
|
|
||||||
spyOn(${1:object}, "${2:method}").andThrow(${3:exception})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sct "spy on and call through (coffee)" b
|
|
||||||
spyOn(${1:object}, "${2:method}").andCallThrough()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scf "spy on and call fake (coffee)" b
|
|
||||||
spyOn(${1:object}, "${2:method}").andCallFake(${3:function})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet esc "expect was called (coffee)" b
|
|
||||||
expect(${1:target}).wasCalled()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet escw "expect was called with (coffee)" b
|
|
||||||
expect(${1:target}).wasCalledWith(${2:arguments})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notsc "expect was not called (coffee)" b
|
|
||||||
expect(${1:target}).wasNotCalled()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet noscw "expect was not called with (coffee)" b
|
|
||||||
expect(${1:target}).wasNotCalledWith(${2:arguments})
|
|
||||||
endsnippet
|
|
||||||
@ -1,57 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends c
|
|
||||||
|
|
||||||
# We want to overwrite everything in parent ft.
|
|
||||||
priority -49
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
snippet beginend "$1.begin(), $1.end() (beginend)"
|
|
||||||
${1:v}${1/^.*?(-)?(>)?$/(?2::(?1:>:.))/}begin(), $1${1/^.*?(-)?(>)?$/(?2::(?1:>:.))/}end()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cl "class .. (class)"
|
|
||||||
class ${1:`!p snip.rv = snip.basename or "name"`}
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
${1/(\w+).*/$1/} (${2:arguments});
|
|
||||||
virtual ~${1/(\w+).*/$1/} ();
|
|
||||||
|
|
||||||
private:
|
|
||||||
${0:/* data */}
|
|
||||||
};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ns "namespace .. (namespace)"
|
|
||||||
namespace${1/.+/ /m}${1:`!p snip.rv = snip.basename or "name"`}
|
|
||||||
{
|
|
||||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
|
||||||
}${1/.+/ \/* /m}$1${1/.+/ *\/ /m}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet readfile "read file (readF)"
|
|
||||||
std::vector<char> v;
|
|
||||||
if (FILE *fp = fopen(${1:"filename"}, "r"))
|
|
||||||
{
|
|
||||||
char buf[1024];
|
|
||||||
while(size_t len = fread(buf, 1, sizeof(buf), fp))
|
|
||||||
v.insert(v.end(), buf, buf + len);
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet map "std::map (map)"
|
|
||||||
std::map<${1:key}, ${2:value}> map$0;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vector "std::vector (v)"
|
|
||||||
std::vector<${1:char}> v$0;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tp "template <typename ..> (template)"
|
|
||||||
template <typename ${1:_InputIter}>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,328 +0,0 @@
|
|||||||
#######################################################################
|
|
||||||
# C# Snippets for UltiSnips #
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
#########################
|
|
||||||
# classes and structs #
|
|
||||||
#########################
|
|
||||||
|
|
||||||
snippet namespace "namespace" b
|
|
||||||
namespace ${1:MyNamespace}
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet class "class" w
|
|
||||||
class ${1:MyClass}
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet struct "struct" w
|
|
||||||
struct ${1:MyStruct}
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet interface "interface" w
|
|
||||||
interface I${1:Interface}
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet enum "enumeration" b
|
|
||||||
enum ${1:MyEnum} { ${2:Item} };
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
############
|
|
||||||
# Main() #
|
|
||||||
############
|
|
||||||
|
|
||||||
snippet sim "static int main" b
|
|
||||||
static int Main(string[] args)
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet svm "static void main" b
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
################
|
|
||||||
# properties #
|
|
||||||
################
|
|
||||||
|
|
||||||
snippet prop "Simple property declaration" b
|
|
||||||
public ${1:int} ${2:MyProperty} { get; set; }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet propfull "Full property declaration" b
|
|
||||||
private ${1:int} ${2:_myProperty};
|
|
||||||
|
|
||||||
public $1 ${3:MyProperty}
|
|
||||||
{
|
|
||||||
get { return $2; }
|
|
||||||
set { $2 = value; }
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet propg "Property with a private setter" b
|
|
||||||
public ${1:int} ${2:MyProperty} { get; private set; }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
############
|
|
||||||
# blocks #
|
|
||||||
############
|
|
||||||
|
|
||||||
snippet #if "#if #endif" b
|
|
||||||
#if ${1:DEBUG}
|
|
||||||
${VISUAL}$0
|
|
||||||
#endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet #region "#region #endregion" b
|
|
||||||
#region ${1:Region}
|
|
||||||
${VISUAL}$0
|
|
||||||
#endregion
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
###########
|
|
||||||
# loops #
|
|
||||||
###########
|
|
||||||
|
|
||||||
snippet for "for loop" b
|
|
||||||
for (int ${1:i} = 0; $1 < ${2:10}; $1++)
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forr "for loop (reverse)" b
|
|
||||||
for (int ${1:i} = ${2:10}; $1 >= 0; $1--)
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet foreach "foreach loop" b
|
|
||||||
foreach (${3:var} ${2:item} in ${1:items})
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet while "while loop" b
|
|
||||||
while (${1:true})
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet do "do loop" b
|
|
||||||
do
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
} while (${1:true});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
###############
|
|
||||||
# branching #
|
|
||||||
###############
|
|
||||||
|
|
||||||
snippet if "if statement" b
|
|
||||||
if ($1)
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "if else statement" b
|
|
||||||
if ($1)
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet elif "else if" b
|
|
||||||
else if ($1)
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet elseif "else if" b
|
|
||||||
else if ($1)
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifnn "if not null" b
|
|
||||||
if ($1 != null)
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet switch "switch statement" b
|
|
||||||
switch (${1:statement})
|
|
||||||
{
|
|
||||||
case ${2:value}:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
$0break;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet case "case" b
|
|
||||||
case ${1:value}:
|
|
||||||
$2
|
|
||||||
break;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
##############
|
|
||||||
# wrappers #
|
|
||||||
##############
|
|
||||||
|
|
||||||
snippet using "using statement" b
|
|
||||||
using (${1:resource})
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet unchecked "unchecked block" b
|
|
||||||
unchecked
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet checked "checked block" b
|
|
||||||
checked
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet unsafe "unsafe" b
|
|
||||||
unsafe
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
########################
|
|
||||||
# exception handling #
|
|
||||||
########################
|
|
||||||
|
|
||||||
snippet try "try catch block" b
|
|
||||||
try
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
catch (${1:Exception} ${2:e})
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tryf "try finally block" b
|
|
||||||
try
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet throw "throw"
|
|
||||||
throw new ${1}Exception("${2}");
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
##########
|
|
||||||
# LINQ #
|
|
||||||
##########
|
|
||||||
|
|
||||||
snippet from "LINQ syntax" b
|
|
||||||
var ${1:seq} =
|
|
||||||
from ${2:item1} in ${3:items1}
|
|
||||||
join ${4:item2} in ${5:items2} on $2.${6:prop1} equals $4.${7:prop2}
|
|
||||||
select ${8:$2.prop3}
|
|
||||||
where ${9:clause}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
############################
|
|
||||||
# feedback and debugging #
|
|
||||||
############################
|
|
||||||
|
|
||||||
snippet da "Debug.Assert" b
|
|
||||||
Debug.Assert(${1:true});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cw "Console.WriteLine" b
|
|
||||||
Console.WriteLine("$1");
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# as you first type comma-separated parameters on the right, {n} values appear in the format string
|
|
||||||
snippet cwp "Console.WriteLine with parameters" b
|
|
||||||
Console.WriteLine("${2:`!p
|
|
||||||
snip.rv = ' '.join(['{' + str(i) + '}' for i in range(t[1].count(','))])
|
|
||||||
`}"${1:, something});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mbox "Message box" b
|
|
||||||
MessageBox.Show("${1:message}");
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
##################
|
|
||||||
# full methods #
|
|
||||||
##################
|
|
||||||
|
|
||||||
snippet equals "Equals method" b
|
|
||||||
public override bool Equals(object obj)
|
|
||||||
{
|
|
||||||
if (obj == null || GetType() != obj.GetType())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
return base.Equals(obj);
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
##############
|
|
||||||
# comments #
|
|
||||||
##############
|
|
||||||
|
|
||||||
snippet /// "XML comment" b
|
|
||||||
/// <summary>
|
|
||||||
/// $1
|
|
||||||
/// </summary>
|
|
||||||
endsnippet
|
|
||||||
@ -1,407 +0,0 @@
|
|||||||
###########################################################################
|
|
||||||
# Most of these came from TextMate #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
snippet ! "!important CSS (!)"
|
|
||||||
${1:!important}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fixed "Fixed Position Bottom 100% wide IE6"
|
|
||||||
${2:bottom: auto;}top: expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-${1:THE HEIGHT OF THIS THING IN PIXELS}));
|
|
||||||
${3:left: expression(eval(document.documentElement.scrollLeft));
|
|
||||||
}${4:width: expression(eval(document.documentElement.clientWidth));}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-attachment: scroll:fixed (background)"
|
|
||||||
background-attachment: ${1:scroll/fixed};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-color: color-hex (background)"
|
|
||||||
background-color: #${1:DDD};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-color: color-name (background)"
|
|
||||||
background-color: ${1:red};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-color: color-rgb (background)"
|
|
||||||
background-color: rgb(${1:255},${2:255},${3:255});$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-color: transparent (background)"
|
|
||||||
background-color: transparent;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-image: none (background)"
|
|
||||||
background-image: none;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-image: url (background)"
|
|
||||||
background-image: url($1);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-position: position (background)"
|
|
||||||
background-position: ${1:top left/top center/top right/center left/center center/center right/bottom left/bottom center/bottom right/x-% y-%/x-pos y-pos};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background-repeat: r:r-x:r-y:n-r (background)"
|
|
||||||
background-repeat: ${1:repeat/repeat-x/repeat-y/no-repeat};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet background "background: color image repeat attachment position (background)"
|
|
||||||
background:${6: #${1:DDD}} url($2) ${3:repeat/repeat-x/repeat-y/no-repeat} ${4:scroll/fixed} ${5:top left/top center/top right/center left/center center/center right/bottom left/bottom center/bottom right/x-% y-%/x-pos y-pos};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-bottom-color: size style color (border)"
|
|
||||||
border-bottom-color: #${1:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-bottom-style: size style color (border)"
|
|
||||||
border-bottom-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-bottom-width: size style color (border)"
|
|
||||||
border-bottom-width: ${1:1}px ${2:solid} #${3:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-bottom: size style color (border)"
|
|
||||||
border-bottom: ${1:1}px ${2:solid} #${3:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-color: color (border)"
|
|
||||||
border-color: ${1:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-left-color: color (border)"
|
|
||||||
border-right-color: #${1:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-left-style: style (border)"
|
|
||||||
border-left-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-left-width: size (border)"
|
|
||||||
border-left-width: ${1:1}px
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-left: size style color (border)"
|
|
||||||
border-left: ${1:1}px ${2:solid} #${3:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-right-color: color (border)"
|
|
||||||
border-right-color: #${1:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-right-style: style (border)"
|
|
||||||
border-right-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-right-width: size (border)"
|
|
||||||
border-right-width: ${1:1}px
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-right: size style color (border)"
|
|
||||||
border-right: ${1:1}px ${2:solid} #${3:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-style: style (border)"
|
|
||||||
border-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-top-color: color (border)"
|
|
||||||
border-top-color: #${1:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-top-style: style (border)"
|
|
||||||
border-top-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-top-width: size (border)"
|
|
||||||
border-top-width: ${1:1}px
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-top: size style color (border)"
|
|
||||||
border-top: ${1:1}px ${2:solid} #${3:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border-width: width (border)"
|
|
||||||
border-width: ${1:1px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet border "border: size style color (border)"
|
|
||||||
border: ${1:1px} ${2:solid} #${3:999};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet clear "clear: value (clear)"
|
|
||||||
clear: ${1:left/right/both/none};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet color "color: color-hex (color)"
|
|
||||||
color: #${1:DDD};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet color "color: color-name (color)"
|
|
||||||
color: ${1:red};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet color "color: color-rgb (color)"
|
|
||||||
color: rgb(${1:255},${2:255},${3:255});$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cursor "cursor: type (cursor)"
|
|
||||||
cursor: ${1:default/auto/crosshair/pointer/move/*-resize/text/wait/help};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cursor "cursor: url (cursor)"
|
|
||||||
cursor: url($1);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet direction "direction: ltr|rtl (direction)"
|
|
||||||
direction: ${1:ltr|rtl};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet display "display: block (display)"
|
|
||||||
display: block;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet display "display: common-types (display)"
|
|
||||||
display: ${1:none/inline/block/list-item/run-in/compact/marker};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet display "display: inline (display)"
|
|
||||||
display: inline;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet display "display: table-types (display)"
|
|
||||||
display: ${1:table/inline-table/table-row-group/table-header-group/table-footer-group/table-row/table-column-group/table-column/table-cell/table-caption};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet float "float: left:right:none (float)"
|
|
||||||
float: ${1:left/right/none};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font-family: family (font)"
|
|
||||||
font-family: ${1:Arial, "MS Trebuchet"}, ${2:sans-}serif;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font-size: size (font)"
|
|
||||||
font-size: ${1:100%};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font-style: normal:italic:oblique (font)"
|
|
||||||
font-style: ${1:normal/italic/oblique};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font-variant: normal:small-caps (font)"
|
|
||||||
font-variant: ${1:normal/small-caps};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font-weight: weight (font)"
|
|
||||||
font-weight: ${1:normal/bold};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font: style variant weight size:line-height font -family (font)"
|
|
||||||
font: ${1:normal/italic/oblique} ${2:normal/small-caps} ${3:normal/bold} ${4:1em/1.5em} ${5:Arial}, ${6:sans-}serif;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet font "font: size font (font)"
|
|
||||||
font: ${1:75%} ${2:"Lucida Grande", "Trebuchet MS", Verdana,} ${3:sans-}serif;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet letter "letter-spacing: length-em (letter)"
|
|
||||||
letter-spacing: $1em;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet letter "letter-spacing: length-px (letter)"
|
|
||||||
letter-spacing: $1px;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-image: url (list)"
|
|
||||||
list-style-image: url($1);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-position: pos (list)"
|
|
||||||
list-style-position: ${1:inside/outside};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-type: asian (list)"
|
|
||||||
list-style-type: ${1:cjk-ideographic/hiragana/katakana/hiragana-iroha/katakana-iroha};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-type: marker(list)"
|
|
||||||
list-style-type: ${1:none/disc/circle/square};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-type: numeric (list)"
|
|
||||||
list-style-type: ${1:decimal/decimal-leading-zero/zero};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-type: other (list)"
|
|
||||||
list-style-type: ${1:hebrew/armenian/georgian};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style-type: roman-alpha-greek (list)"
|
|
||||||
list-style-type: ${1:lower-roman/upper-roman/lower-alpha/upper-alpha/lower-greek/lower-latin/upper-latin};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "list-style: type position image (list)"
|
|
||||||
list-style: ${1:none/disc/circle/square/decimal/zero} ${2:inside/outside} url($3);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin-bottom: length (margin)"
|
|
||||||
margin-bottom: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin-left: length (margin)"
|
|
||||||
margin-left: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin-right: length (margin)"
|
|
||||||
margin-right: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin-top: length (margin)"
|
|
||||||
margin-top: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin: all (margin)"
|
|
||||||
margin: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin: T R B L (margin)"
|
|
||||||
margin: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet margin "margin: V H (margin)"
|
|
||||||
margin: ${1:20px} ${2:0px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet marker "marker-offset: auto (marker)"
|
|
||||||
marker-offset: auto;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet marker "marker-offset: length (marker)"
|
|
||||||
marker-offset: ${1:10px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet overflow "overflow: type (overflow)"
|
|
||||||
overflow: ${1:visible/hidden/scroll/auto};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding-bottom: length (margin)"
|
|
||||||
padding-bottom: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding-left: length (margin)"
|
|
||||||
padding-left: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding-right: length (margin)"
|
|
||||||
padding-right: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding-top: length (margin)"
|
|
||||||
padding-top: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding: T R B L (padding)"
|
|
||||||
padding: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding: V H (padding)"
|
|
||||||
padding: ${1:20px} ${2:0px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet padding "padding: all (padding)"
|
|
||||||
padding: ${1:20px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet position "position: type (position)"
|
|
||||||
position: ${1:static/relative/absolute/fixed};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet { "properties { } ( } )"
|
|
||||||
{
|
|
||||||
/* $1 */
|
|
||||||
$0
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scrollbar "scrollbar"
|
|
||||||
scrollbar-base-color: ${1:#CCCCCC};${2:
|
|
||||||
scrollbar-arrow-color: ${3:#000000};
|
|
||||||
scrollbar-track-color: ${4:#999999};
|
|
||||||
scrollbar-3dlight-color: ${5:#EEEEEE};
|
|
||||||
scrollbar-highlight-color: ${6:#FFFFFF};
|
|
||||||
scrollbar-face-color: ${7:#CCCCCC};
|
|
||||||
scrollbar-shadow-color: ${9:#999999};
|
|
||||||
scrollbar-darkshadow-color: ${8:#666666};}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet selection "selection"
|
|
||||||
$1::-moz-selection,
|
|
||||||
$1::selection {
|
|
||||||
color: ${2:inherit};
|
|
||||||
background: ${3:inherit};
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-align: left:center:right (txt)"
|
|
||||||
text-align: ${1:left/right/center/justify};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-decoration: none:underline:overline:line-through:blink (text)"
|
|
||||||
text-decoration: ${1:none/underline/overline/line-through/blink};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-indent: length (text)"
|
|
||||||
text-indent: ${1:10}px;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-shadow: color-hex x y blur (text)"
|
|
||||||
text-shadow: #${1:DDD} ${2:10px} ${3:10px} ${4:2px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-shadow: color-rgb x y blur (text)"
|
|
||||||
text-shadow: rgb(${1:255},${2:255},${3:255}) ${4:10px} ${5:10px} ${6:2px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-shadow: none (text)"
|
|
||||||
text-shadow: none;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-transform: capitalize:upper:lower (text)"
|
|
||||||
text-transform: ${1:capitalize/uppercase/lowercase};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text-transform: none (text)"
|
|
||||||
text-transform: none;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vertical "vertical-align: type (vertical)"
|
|
||||||
vertical-align: ${1:baseline/sub/super/top/text-top/middle/bottom/text-bottom/length/%};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet visibility "visibility: type (visibility)"
|
|
||||||
visibility: ${1:visible/hidden/collapse};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet white "white-space: normal:pre:nowrap (white)"
|
|
||||||
white-space: ${1:normal/pre/nowrap};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet word "word-spacing: length (word)"
|
|
||||||
word-spacing: ${1:10px};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet word "word-spacing: normal (word)"
|
|
||||||
word-spacing: normal;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet z "z-index: index (z)"
|
|
||||||
z-index: $1;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,584 +0,0 @@
|
|||||||
# Simple shortcuts
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
snippet imp "import (imp)" b
|
|
||||||
import ${1:std.stdio};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pimp "public import (pimp)" b
|
|
||||||
public import ${1:/*module*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet over "override (over)" b
|
|
||||||
override ${1:/*function*/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet al "alias (al)"
|
|
||||||
alias ${1:/*orig*/} ${2:/*alias*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mixin "mixin (mixin)" b
|
|
||||||
mixin ${1:/*mixed_in*/} ${2:/*name*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet new "new (new)"
|
|
||||||
new ${1}(${2});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scpn "@safe const pure nothrow (scpn)"
|
|
||||||
@safe const pure nothrow
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet spn "@safe pure nothrow (spn)"
|
|
||||||
@safe pure nothrow
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cont "continue (cont)"
|
|
||||||
continue;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet dis "@disable (dis)" b
|
|
||||||
@disable ${1:/*method*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pub "public (pub)" b
|
|
||||||
public:
|
|
||||||
${1:/*members*/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet priv "private (priv)" b
|
|
||||||
private:
|
|
||||||
${1:/*members*/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet prot "protected (prot)" b
|
|
||||||
protected:
|
|
||||||
${1:/*members*/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pack "package (pack)" b
|
|
||||||
package:
|
|
||||||
${1:/*members*/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ret "return (ret)"
|
|
||||||
return ${1:/*value to return*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet auto "auto (auto)" b
|
|
||||||
auto ${1:/*variable*/} = ${2:/*value*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet con "const (con)" b
|
|
||||||
const ${1:/*variable*/} = ${2:/*value*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet siz "size_t (siz)" b
|
|
||||||
size_t ${1:/*variable*/} = ${2:/*value*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sup "super (sup)" b
|
|
||||||
super(${1:/*args*/});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Phobos
|
|
||||||
|
|
||||||
snippet tup "tuple (tup)"
|
|
||||||
tuple(${1:/*args*/})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wr "writeln (wr)"
|
|
||||||
writeln(${1:/*args*/});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet to "to (to)"
|
|
||||||
to!(${1:/*type*/})(${2:/*arg*/})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet enf "enforce (enf)" b
|
|
||||||
enforce(${1:/*condition*/},
|
|
||||||
new ${2}Exception(${3:/*args*/}));
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Branches
|
|
||||||
|
|
||||||
snippet if "if .. (if)"
|
|
||||||
if(${1:/*condition*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "if .. else (ife)" b
|
|
||||||
if(${1:/*condition*/})
|
|
||||||
{
|
|
||||||
${2:/*code*/}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
${3:/*else*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet el "else (el)" b
|
|
||||||
else
|
|
||||||
{
|
|
||||||
${VISUAL}${1:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet elif "else if (elif)" b
|
|
||||||
else if(${1:/*condition*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sw "switch (sw)"
|
|
||||||
switch(${1:/*var*/})
|
|
||||||
{
|
|
||||||
case ${2:/*value*/}:
|
|
||||||
${3:/*code*/}
|
|
||||||
break;
|
|
||||||
case ${4:/*value*/}:
|
|
||||||
${5:/*code*/}
|
|
||||||
break;
|
|
||||||
${7:/*more cases*/}
|
|
||||||
default:
|
|
||||||
${6:assert(false);}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fsw "final switch (fsw)"
|
|
||||||
switch(${1:/*var*/})
|
|
||||||
{
|
|
||||||
case ${2:/*value*/}:
|
|
||||||
${3:/*code*/}
|
|
||||||
break;
|
|
||||||
case ${4:/*value*/}:
|
|
||||||
${5:/*code*/}
|
|
||||||
break;
|
|
||||||
${7:/*more cases*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet case "case (case)" b
|
|
||||||
case ${1:/*value*/}:
|
|
||||||
${2:/*code*/}
|
|
||||||
break;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ?: "ternary operator (?:)"
|
|
||||||
${1:/*condition*/} ? ${2:/*then*/} : ${3:/*else*/}$4
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Loops
|
|
||||||
|
|
||||||
snippet do "do while (do)" b
|
|
||||||
do
|
|
||||||
{
|
|
||||||
${VISUAL}${2:/*code*/}
|
|
||||||
} while(${1:/*condition*/});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wh "while (wh)" b
|
|
||||||
while(${1:/*condition*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for (for)" b
|
|
||||||
for (${4:size_t} ${2:i} = 0; $2 < ${1:count}; ${3:++$2})
|
|
||||||
{
|
|
||||||
${VISUAL}${0:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forever "forever (forever)" b
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
${VISUAL}${0:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fore "foreach (fore)"
|
|
||||||
foreach(${1:/*elem*/}; ${2:/*range*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forif "foreach if (forif)" b
|
|
||||||
foreach(${1:/*elem*/}; ${2:/*range*/}) if(${3:/*condition*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${4:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Contracts
|
|
||||||
snippet in "in contract (in)" b
|
|
||||||
in
|
|
||||||
{
|
|
||||||
assert(${1:/*condition*/}, "${2:error message}");
|
|
||||||
${3}
|
|
||||||
}
|
|
||||||
body
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet out "out contract (out)" b
|
|
||||||
out${1:(result)}
|
|
||||||
{
|
|
||||||
assert(${2:/*condition*/}, "${3:error message}");
|
|
||||||
${4}
|
|
||||||
}
|
|
||||||
body
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inv "invariant (inv)" b
|
|
||||||
invariant()
|
|
||||||
{
|
|
||||||
assert(${1:/*condition*/}, "${2:error message}");
|
|
||||||
${3}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Functions (generic)
|
|
||||||
|
|
||||||
snippet fun "function definition (fun)"
|
|
||||||
${1:void} ${2:/*function name*/}(${3:/*args*/}) ${4:@safe pure nothrow}
|
|
||||||
{
|
|
||||||
${VISUAL}${5:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet void "void function definition (void)"
|
|
||||||
void ${1:/*function name*/}(${2:/*args*/}) ${3:@safe pure nothrow}
|
|
||||||
{
|
|
||||||
${VISUAL}${4:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet this "ctor (this)" w
|
|
||||||
this(${1:/*args*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet get "getter property (get)"
|
|
||||||
@property ${1:/*type*/} ${2:/*member_name*/}() const pure nothrow {return ${3:$2_};}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet set "setter property (set)"
|
|
||||||
@property void ${1:/*member_name*/}(${2:/*type*/} rhs) pure nothrow {${3:$1_} = rhs;}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Functions (concrete)
|
|
||||||
|
|
||||||
snippet main "Main" b
|
|
||||||
void main(string[] args)
|
|
||||||
{
|
|
||||||
${VISUAL}${0: /*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Mixins
|
|
||||||
|
|
||||||
snippet signal "signal (signal)" b
|
|
||||||
mixin Signal!(${1:/*args*/}) ${2:/*name*/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Scope
|
|
||||||
|
|
||||||
snippet scope "scope (scope)" b
|
|
||||||
scope(${1:exit})
|
|
||||||
{
|
|
||||||
${VISUAL}${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# With
|
|
||||||
|
|
||||||
snippet with "with (with)"
|
|
||||||
with(${1})
|
|
||||||
{
|
|
||||||
${VISUAL}${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Exception handling
|
|
||||||
|
|
||||||
snippet try "try/catch (try)" b
|
|
||||||
try
|
|
||||||
{
|
|
||||||
${VISUAL}${1:/*code to try*/}
|
|
||||||
}
|
|
||||||
catch(${2}Exception e)
|
|
||||||
{
|
|
||||||
${3:/*handle exception*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tryf "try/catch/finally (tryf)" b
|
|
||||||
try
|
|
||||||
{
|
|
||||||
${VISUAL}${1:/*code to try*/}
|
|
||||||
}
|
|
||||||
catch(${2}Exception e)
|
|
||||||
{
|
|
||||||
${3:/*handle exception*/}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
${4:/*cleanup*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet catch "catch (catch)" b
|
|
||||||
catch(${1}Exception e)
|
|
||||||
{
|
|
||||||
${2:/*handle exception*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet thr "throw (thr)"
|
|
||||||
throw new ${1}Exception("${2}");
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Type declarations
|
|
||||||
|
|
||||||
snippet struct "struct (struct)"
|
|
||||||
struct ${1:`!p snip.rv = (snip.basename or "name")`}
|
|
||||||
{
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet union "union (union)"
|
|
||||||
union ${1:`!p snip.rv = (snip.basename or "name")`}
|
|
||||||
{
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet class "class (class)"
|
|
||||||
class ${1:`!p snip.rv = (snip.basename or "name")`}
|
|
||||||
{
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inter "interface (inter)"
|
|
||||||
interface ${1:`!p snip.rv = (snip.basename or "name")`}
|
|
||||||
{
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet enum "enum (enum)"
|
|
||||||
enum ${1:`!p snip.rv = (snip.basename or "name")`}
|
|
||||||
{
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Exception declarations
|
|
||||||
|
|
||||||
snippet exc "exception declaration (exc)" b
|
|
||||||
/// ${3:/*documentation*/}
|
|
||||||
class ${1}Exception : ${2}Exception
|
|
||||||
{
|
|
||||||
public this(string msg, string file = __FILE__, int line = __LINE__)
|
|
||||||
{
|
|
||||||
super(msg, file, line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Conditional compilation
|
|
||||||
|
|
||||||
snippet version "version (version)" b
|
|
||||||
version(${1:/*version name*/})
|
|
||||||
{
|
|
||||||
${VISUAL}${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet debug "debug" b
|
|
||||||
debug
|
|
||||||
{
|
|
||||||
${VISUAL}${1:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Templates
|
|
||||||
|
|
||||||
snippet temp "template (temp)" b
|
|
||||||
template ${2:/*name*/}(${1:/*args*/})
|
|
||||||
{
|
|
||||||
${3:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Asserts
|
|
||||||
|
|
||||||
snippet ass "assert (ass)" b
|
|
||||||
assert(${1:false}, "${2:TODO}");
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Unittests
|
|
||||||
|
|
||||||
snippet unittest "unittest (unittest)" b
|
|
||||||
unittest
|
|
||||||
{
|
|
||||||
${1:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Common member functions
|
|
||||||
|
|
||||||
snippet opDis "opDispatch (opDis)" b
|
|
||||||
${1:/*return type*/} opDispatch(string s)()
|
|
||||||
{
|
|
||||||
${2:/*code*/};
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet op= "opAssign (op=)" b
|
|
||||||
void opAssign(${1} rhs) ${2:@safe pure nothrow}
|
|
||||||
{
|
|
||||||
${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet opCmp "opCmp (opCmp)" b
|
|
||||||
int opCmp(${1} rhs) @safe const pure nothrow
|
|
||||||
{
|
|
||||||
${2:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet opApply "opApply (opApply)" b
|
|
||||||
int opApply(int delegate(ref ${1:/*iterated type/s*/}) dg)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
${2:/*loop*/}
|
|
||||||
{
|
|
||||||
result = dg(${3:/*arg/s*/});
|
|
||||||
if(result){break;}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet toString "toString (toString)" b
|
|
||||||
string toString() @safe const pure nothrow
|
|
||||||
{
|
|
||||||
${1:/*code*/}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Comments
|
|
||||||
|
|
||||||
|
|
||||||
snippet todo "TODO (todo)"
|
|
||||||
// TODO: ${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# DDoc
|
|
||||||
|
|
||||||
snippet doc "generic ddoc block (doc)" b
|
|
||||||
/// ${1:description}
|
|
||||||
///
|
|
||||||
/// ${2:details}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fdoc "function ddoc block (fdoc)" b
|
|
||||||
/// ${1:description}
|
|
||||||
///
|
|
||||||
/// ${2:Params: ${3:param} = ${4:param description}
|
|
||||||
/// ${5}}
|
|
||||||
///
|
|
||||||
/// ${6:Returns: ${7:return value}}
|
|
||||||
///
|
|
||||||
/// ${8:Throws: ${9}Exception ${10}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Par "Params (Par)"
|
|
||||||
Params: ${1:param} = ${2:param description}
|
|
||||||
/// ${3}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Ret "Returns (Ret)"
|
|
||||||
Returns: ${1:return value/s}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Thr "Throws (Thr)"
|
|
||||||
Throws: ${1}Exception ${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Example "Examples (Example)"
|
|
||||||
Examples:
|
|
||||||
/// --------------------
|
|
||||||
/// ${1:example code}
|
|
||||||
/// --------------------
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# License blocks
|
|
||||||
|
|
||||||
snippet gpl "GPL (gpl)" b
|
|
||||||
// This program is free software; you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
//
|
|
||||||
// Copyright (C) ${1:Author}, `!v strftime("%Y")`
|
|
||||||
|
|
||||||
${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet boost "Boost (boost)" b
|
|
||||||
// Copyright ${1:Author} `!v strftime("%Y")`.
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# New module
|
|
||||||
|
|
||||||
snippet module "New module (module)" b
|
|
||||||
// Copyright ${1:Author} `!v strftime("%Y")`.
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
module ${2}.`!v Filename('$1', 'name')`;
|
|
||||||
|
|
||||||
|
|
||||||
${3}
|
|
||||||
endsnippet
|
|
||||||
@ -1,238 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
# Generic Tags
|
|
||||||
snippet %
|
|
||||||
{% ${1} %}${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet %%
|
|
||||||
{% ${1:tag_name} %}
|
|
||||||
${2}
|
|
||||||
{% end$1 %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet {
|
|
||||||
{{ ${1} }}${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Template Tags
|
|
||||||
|
|
||||||
snippet autoescape
|
|
||||||
{% autoescape ${1:off} %}
|
|
||||||
${2}
|
|
||||||
{% endautoescape %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet block
|
|
||||||
{% block ${1} %}
|
|
||||||
${2}
|
|
||||||
{% endblock $1 %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet #
|
|
||||||
{# ${1:comment} #}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet comment
|
|
||||||
{% comment %}
|
|
||||||
${1}
|
|
||||||
{% endcomment %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cycle
|
|
||||||
{% cycle ${1:val1} ${2:val2} ${3:as ${4}} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet debug
|
|
||||||
{% debug %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet extends
|
|
||||||
{% extends "${1:base.html}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet filter
|
|
||||||
{% filter ${1} %}
|
|
||||||
${2}
|
|
||||||
{% endfilter %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet firstof
|
|
||||||
{% firstof ${1} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for
|
|
||||||
{% for ${1} in ${2} %}
|
|
||||||
${3}
|
|
||||||
{% endfor %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet empty
|
|
||||||
{% empty %}
|
|
||||||
${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if
|
|
||||||
{% if ${1} %}
|
|
||||||
${2}
|
|
||||||
{% endif %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet else
|
|
||||||
{% else %}
|
|
||||||
${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifchanged
|
|
||||||
{% ifchanged %}${1}{% endifchanged %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifequal
|
|
||||||
{% ifequal ${1} ${2} %}
|
|
||||||
${3}
|
|
||||||
{% endifequal %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifnotequal
|
|
||||||
{% ifnotequal ${1} ${2} %}
|
|
||||||
${3}
|
|
||||||
{% endifnotequal %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet include
|
|
||||||
{% include "${1}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet load
|
|
||||||
{% load ${1} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet now
|
|
||||||
{% now "${1:jS F Y H:i}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet regroup
|
|
||||||
{% regroup ${1} by ${2} as ${3} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet spaceless
|
|
||||||
{% spaceless %}${1}{% endspaceless %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ssi
|
|
||||||
{% ssi ${1} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet trans
|
|
||||||
{% trans "${1:string}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet url
|
|
||||||
{% url ${1} as ${2} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet widthratio
|
|
||||||
{% widthratio ${1:this_value} ${2:max_value} ${3:100} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet with
|
|
||||||
{% with ${1} as ${2} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Template Filters
|
|
||||||
|
|
||||||
# Note: Since SnipMate can't determine which template filter you are
|
|
||||||
# expanding without the "|" character, these do not add the "|"
|
|
||||||
# character. These save a few keystrokes still.
|
|
||||||
|
|
||||||
# Note: Template tags that take no arguments are not implemented.
|
|
||||||
|
|
||||||
snippet add
|
|
||||||
add:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet center
|
|
||||||
center:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cut
|
|
||||||
cut:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet date
|
|
||||||
date:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet default
|
|
||||||
default:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet defaultifnone
|
|
||||||
default_if_none:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet dictsort
|
|
||||||
dictsort:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet dictsortrev
|
|
||||||
dictsortreversed:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet divisibleby
|
|
||||||
divisibleby:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet floatformat
|
|
||||||
floatformat:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet getdigit
|
|
||||||
get_digit:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet join
|
|
||||||
join:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lengthis
|
|
||||||
length_is:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pluralize
|
|
||||||
pluralize:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet removetags
|
|
||||||
removetags:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet slice
|
|
||||||
slice:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet stringformat
|
|
||||||
stringformat:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet time
|
|
||||||
time:"${1}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet truncatewords
|
|
||||||
truncatewords:${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet truncatewordshtml
|
|
||||||
truncatewords_html:${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet urlizetrunc
|
|
||||||
urlizetrunc:${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wordwrap
|
|
||||||
wordwrap:${1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,100 +0,0 @@
|
|||||||
###########################################################################
|
|
||||||
# TEXTMATE SNIPPETS #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
snippet pat "Case:Receive:Try Clause"
|
|
||||||
${1:pattern}${2: when ${3:guard}} ->;
|
|
||||||
${4:body}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet beh "Behaviour Directive"
|
|
||||||
-behaviour (${1:behaviour}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet case "Case Expression"
|
|
||||||
case ${1:expression} of
|
|
||||||
${2:pattern}${3: when ${4:guard}} ->
|
|
||||||
${5:body}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet def "Define Directive"
|
|
||||||
-define (${1:macro}${2: (${3:param})}, ${4:body}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet exp "Export Directive"
|
|
||||||
-export ([${1:function}/${2:arity}]).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fun "Fun Expression"
|
|
||||||
fun
|
|
||||||
(${1:pattern})${2: when ${3:guard}} ->
|
|
||||||
${4:body}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fu "Function"
|
|
||||||
${1:function} (${2:param})${3: when ${4:guard}} ->
|
|
||||||
${5:body}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "If Expression"
|
|
||||||
if
|
|
||||||
${1:guard} ->
|
|
||||||
${2:body}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifdef "Ifdef Directive"
|
|
||||||
-ifdef (${1:macro}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifndef "Ifndef Directive"
|
|
||||||
-ifndef (${1:macro}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet imp "Import Directive"
|
|
||||||
-import (${1:module}, [${2:function}/${3:arity}]).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inc "Include Directive"
|
|
||||||
-include ("${1:file}").
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mod "Module Directive"
|
|
||||||
-module (${1:`!p snip.rv = snip.basename or "module"`}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rcv "Receive Expression"
|
|
||||||
receive
|
|
||||||
${1: ${2:pattern}${3: when ${4:guard}} ->
|
|
||||||
${5:body}}
|
|
||||||
${6:after
|
|
||||||
${7:expression} ->
|
|
||||||
${8:body}}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rec "Record Directive"
|
|
||||||
-record (${1:record}, {${2:field}${3: = ${4:value}}}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "Try Expression"
|
|
||||||
try${1: ${2:expression}${3: of
|
|
||||||
${4:pattern}${5: when ${6:guard}} ->
|
|
||||||
${7:body}}}
|
|
||||||
${8:catch
|
|
||||||
${9:pattern}${10: when ${11:guard}} ->
|
|
||||||
${12:body}}
|
|
||||||
${13:after
|
|
||||||
${14:body}}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet undef "Undef Directive"
|
|
||||||
-undef (${1:macro}).
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,280 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
# TextMate added these variables to cope with changes in ERB handling
|
|
||||||
# in different versions of Rails -- for instance, Rails 3 automatically
|
|
||||||
# strips whitespace so that it's no longer necessary to use a form like
|
|
||||||
# <% end -%>, but if you're still maintaining Rails 2 projects, you
|
|
||||||
# can't omit the minus sign and get the same behavior.
|
|
||||||
#
|
|
||||||
# The following regex replace substitutes the function below for the
|
|
||||||
# TextMate variable references after the snippets are converted:
|
|
||||||
#
|
|
||||||
# /\v\$\{(TM_RAILS_TEMPLATE_([^_]+)_RUBY_([^_\s]+))\}/`!p textmate_var('\1', snip)`/g
|
|
||||||
#
|
|
||||||
global !p
|
|
||||||
def textmate_var(var, snip):
|
|
||||||
lookup = dict(
|
|
||||||
TM_RAILS_TEMPLATE_START_RUBY_EXPR = snip.opt('g:tm_rails_template_start_ruby_expr', '<%= '),
|
|
||||||
TM_RAILS_TEMPLATE_END_RUBY_EXPR = snip.opt('g:tm_rails_template_end_ruby_expr', ' %>'),
|
|
||||||
TM_RAILS_TEMPLATE_START_RUBY_INLINE = snip.opt('g:tm_rails_template_start_ruby_inline', '<% '),
|
|
||||||
TM_RAILS_TEMPLATE_END_RUBY_INLINE = snip.opt('g:tm_rails_template_end_ruby_inline', ' %>'),
|
|
||||||
TM_RAILS_TEMPLATE_END_RUBY_BLOCK = '<% end %>'
|
|
||||||
)
|
|
||||||
snip.rv = lookup[var]
|
|
||||||
return
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# GENERATED FROM get_tm_snippets.py + REGEX REPLACE #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
snippet fi "<%= Fixtures.identify(:symbol) %>"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`Fixtures.identify(:${1:name})`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ft "form_tag"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`form_tag(${1::action => "${5:update}"}${6:, {:${8:class} => "${9:form}"\}}) do`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
$0
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet end "end (ERB)"
|
|
||||||
<% end -%>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for loop (ERB)"
|
|
||||||
<% if !${1:list}.blank? %>
|
|
||||||
<% for ${2:item} in ${1} %>
|
|
||||||
$3
|
|
||||||
<% end %>
|
|
||||||
<% else %>
|
|
||||||
$4
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffcb "form_for check_box"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.check_box :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffff "form_for file_field 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.file_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffhf "form_for hidden_field 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.hidden_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffl "form_for label 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.label :${1:attribute}${2:, "${3:${1/[[:alpha:]]+|(_)/(?1: :\u$0)/g}}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffpf "form_for password_field 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.password_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffrb "form_for radio_box 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.radio_box :${1:attribute}, :${2:tag_value}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffs "form_for submit 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.submit "${1:Submit}"${2:, :disable_with => '${3:$1ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffta "form_for text_area 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_area :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fftf "form_for text_field 2"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fields "fields_for"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`fields_for :${1:model}, @${2:$1} do |$1|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_INLINE', snip)`
|
|
||||||
$0
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f_fields_for (nff)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`f.fields_for :${1:attribute} do |${2:f}|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_INLINE', snip)`
|
|
||||||
$0
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.checkbox"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.check_box :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.file_field"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.file_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.hidden_field"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.hidden_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.label"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.label :${1:attribute}${2:, "${3:${1/[[:alpha:]]+|(_)/(?1: :\u$0)/g}}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.password_field"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.password_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.radio_box"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.radio_box :${1:attribute}, :${2:tag_value}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.submit"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.submit "${1:Submit}"${2:, :disable_with => '${3:$1ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.text_area"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_area :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f. "f.text_field"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ffe "form_for with errors"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`error_messages_for :${1:model}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`form_for @${2:$1} do |f|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
$0
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ff "form_for"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`form_for @${1:model} do |f|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
$0
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ist "image_submit_tag"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_submit_tag("${1:agree.png}"${2:${3:, :id => "${4:${1/^(\w+)(\.\w*)?$/$1/}}"}${5:, :name => "${6:${1/^(\w+)(\.\w*)?$/$1/}}"}${7:, :class => "${8:${1/^(\w+)(\.\w*)?$/$1/}-button}"}${9:, :disabled => ${10:false}}})`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet it "image_tag"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_tag "$1${2:.png}"${3:${4:, :title => "${5:title}"}${6:, :class => "${7:class}"}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet layout "layout"
|
|
||||||
layout "${1:template_name}"${2:${3:, :only => ${4:[:${5:action}, :${6:action}]}}${7:, :except => ${8:[:${9:action}, :${10:action}]}}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet jit "javascript_include_tag"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`javascript_include_tag ${1::all}${2:, :cache => ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lia "link_to (action)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :action => "${2:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet liai "link_to (action, id)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :action => "${2:edit}", :id => ${3:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lic "link_to (controller)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lica "link_to (controller, action)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}", :action => "${3:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet licai "link_to (controller, action, id)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}", :action => "${3:edit}", :id => ${4:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet linpp "link_to (nested path plural)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${10:parent}_${11:child}_path(${12:@}${13:${10}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet linp "link_to (nested path)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lipp "link_to (path plural)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${4:model}s_path}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lip "link_to (path)"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:model}_path(${13:@}${14:${12}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lim "link_to model"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:model}.${2:name}, ${3:${4:$1}_path(${14:$1})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hide "page.hide (*ids)"
|
|
||||||
page.hide ${1:"${2:id(s)}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ins "page.insert_html (position, id, partial)"
|
|
||||||
page.insert_html :${1:top}, ${2:"${3:id}"}, :${4:partial => "${5:template}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rep "page.replace (id, partial)"
|
|
||||||
page.replace ${1:"${2:id}"}, :${3:partial => "${4:template}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet reph "page.replace_html (id, partial)"
|
|
||||||
page.replace_html ${1:"${2:id}"}, :${3:partial => "${4:template}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet show "page.show (*ids)"
|
|
||||||
page.show ${1:"${2:id(s)}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tog "page.toggle (*ids)"
|
|
||||||
page.toggle ${1:"${2:id(s)}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vis "page.visual_effect (effect, id)"
|
|
||||||
page.visual_effect :${1:toggle_slide}, ${2:"${3:DOM ID}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rp "render (partial) (rp)"
|
|
||||||
render :partial => "${1:item}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rpc "render (partial,collection) (rpc)"
|
|
||||||
render :partial => "${1:item}", :collection => ${2:@$1s}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rpl "render (partial,locals) (rpl)"
|
|
||||||
render :partial => "${1:item}", :locals => { :${2:$1} => ${3:@$1}$0 }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rpo "render (partial,object) (rpo)"
|
|
||||||
render :partial => "${1:item}", :object => ${2:@$1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rps "render (partial,status) (rps)"
|
|
||||||
render :partial => "${1:item}", :status => ${2:500}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet slt "stylesheet_link_tag"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`stylesheet_link_tag ${1::all}${2:, :cache => ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet st "submit_tag"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`submit_tag "${1:Save changes}"${2:, :id => "${3:submit}"}${4:, :name => "${5:$3}"}${6:, :class => "${7:form_$3}"}${8:, :disabled => ${9:false}}${10:, :disable_with => "${11:Please wait...}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet else "else (ERB)"
|
|
||||||
<% else %>
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if (ERB)"
|
|
||||||
<% if ${1:condition} %>$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lf "link_to_function"
|
|
||||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to_function ${1:"${2:Greeting}"}, "${3:alert('Hello world!')}"$4`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,131 +0,0 @@
|
|||||||
# Snippets for Go
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
# when to abbriviate and when not?
|
|
||||||
# b doesn't work here, because it ignores whitespace
|
|
||||||
# optional local name?
|
|
||||||
snippet /^import/ "Import declaration" r
|
|
||||||
import (
|
|
||||||
"${1:package}"
|
|
||||||
)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /^package/ "Package declaration" r
|
|
||||||
// Package $1 provides ...
|
|
||||||
package ${1:main}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Mostly converted from: https://github.com/AlanQuatermain/go-tmbundle
|
|
||||||
snippet /^cons/ "Constants declaration" r
|
|
||||||
const (
|
|
||||||
${1:constant}${2/(.+)/ /}${2:type} = ${0:value}
|
|
||||||
)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /^con/ "Constant declaration" r
|
|
||||||
const ${1:name}${2/(.+)/ /}${2:type} = ${0:value}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet iota "Iota constant generator" b
|
|
||||||
const (
|
|
||||||
${1:constant}${2/(.+)/ /}${2:type} = iota
|
|
||||||
)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet struct "Struct declaration" b
|
|
||||||
type ${1:Struct} struct {
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet interface "Interface declaration" b
|
|
||||||
type ${1:Interface} interface {
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# statements
|
|
||||||
snippet for "For loop" b
|
|
||||||
for ${1:condition}${1/(.+)/ /}{
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forr "For range loop" b
|
|
||||||
for ${2:name} := range ${1:collection} {
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "If statement" b
|
|
||||||
if ${1:condition}${1/(.+)/ /}{
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet switch "Switch statement" b
|
|
||||||
switch ${1:expression}${1/(.+)/ /}{
|
|
||||||
case${0}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet select "Select statement" b
|
|
||||||
select {
|
|
||||||
case${0}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet case "Case clause" b
|
|
||||||
case ${1:condition}:
|
|
||||||
${0:${VISUAL}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet default "Default clause" b
|
|
||||||
default:
|
|
||||||
${0:${VISUAL}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# functions
|
|
||||||
snippet /^main/ "Main function" r
|
|
||||||
func main() {
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /^meth/ "Method" r
|
|
||||||
func (${1:receiver} ${2:type}) ${3:name}(${4:params})${5/(.+)/ /}${5:type} {
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet func "Function" b
|
|
||||||
func ${1:name}(${2:params})${3/(.+)/ /}${3:type} {
|
|
||||||
${0:${VISUAL}}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# types and variables
|
|
||||||
snippet map "Map type" b
|
|
||||||
map[${1:keytype}]${2:valtype}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet : "Variable declaration :=" b
|
|
||||||
${1:name} := ${0:value}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet var "Variable declaration" b
|
|
||||||
var ${1:name}${2/(.+)/ /}${2:type}${3: = ${0:value}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vars "Variables declaration" b
|
|
||||||
var (
|
|
||||||
${1:name}${2/(.+)/ /}${2:type}${3: = ${0:value} }
|
|
||||||
)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet json "JSON field"
|
|
||||||
\`json:"${1:displayName}"\`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,63 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet if "if ... then ... else ..."
|
|
||||||
if ${1:condition}
|
|
||||||
then ${2:expression}
|
|
||||||
else ${3:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet case "case ... of ..."
|
|
||||||
case ${1:expression} of
|
|
||||||
${2:pattern} -> ${3:expression}
|
|
||||||
${4:pattern} -> ${5:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet :: "Type signature"
|
|
||||||
${1:name} :: ${2:Type} -> ${3:Type}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet => "Type constraint"
|
|
||||||
(${1:Class} ${2:Type var}) => ${3:$2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet def "Function definition"
|
|
||||||
${1:name} :: ${2:Type} -> ${3:Type}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet def[] "Function definition for list patterns"
|
|
||||||
${1:name} :: [${2:Type}] -> ${3:Type}
|
|
||||||
$1 [] = ${4:undefined}
|
|
||||||
$1 ${5:(x:xs)} = ${6:undefined}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet = "Function clause"
|
|
||||||
${1:name} ${2:pattern} = ${3:undefined}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet 2= "Function clause"
|
|
||||||
${1:name} ${2:pattern} = ${3:undefined}
|
|
||||||
$1 ${4:pattern} = ${5:undefined}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet 3= "Function clause"
|
|
||||||
${1:name} ${2:pattern} = ${3:undefined}
|
|
||||||
$1 ${4:pattern} = ${5:undefined}
|
|
||||||
$1 ${6:pattern} = ${7:undefined}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet | "Guard"
|
|
||||||
| ${1:predicate} = ${2:undefined}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet \ "Lambda expression"
|
|
||||||
\ ${1:pattern} -> ${2:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet [|] "List comprehension"
|
|
||||||
[${3:foo }$1 | ${1:x} <- ${2:xs} ]
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet let "let ... in ..."
|
|
||||||
let ${1:name} = ${2:expression}
|
|
||||||
in ${3:expression}
|
|
||||||
endsnippet
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
# Snippets for VIM Help Files
|
|
||||||
|
|
||||||
priority -50
|
|
||||||
|
|
||||||
global !p
|
|
||||||
def sec_title(snip, t):
|
|
||||||
file_start = snip.fn.split('.')[0]
|
|
||||||
sec_name = t[1].strip("1234567890. ").lower().replace(' ', '-')
|
|
||||||
return ("*%s-%s*" % (file_start, sec_name)).rjust(78-len(t[1]))
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
snippet sec "Section marker" b
|
|
||||||
==============================================================================
|
|
||||||
${1:SECTION}`!p snip.rv = sec_title(snip, t)`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ssec "Sub section marker" b
|
|
||||||
${1:Subsection}`!p snip.rv = sec_title(snip, t)
|
|
||||||
snip += "-"*len(t[1])`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sssec "Subsub Section marker" b
|
|
||||||
${1:SubSubsection}:`!p snip.rv = sec_title(snip, t)`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,302 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
global !p
|
|
||||||
def x(snip):
|
|
||||||
if snip.ft.startswith("x"):
|
|
||||||
snip.rv = '/'
|
|
||||||
else:
|
|
||||||
snip.rv = ""
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
############
|
|
||||||
# Doctypes #
|
|
||||||
############
|
|
||||||
snippet doctype "DocType XHTML 1.0 Strict" b
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doctype "DocType XHTML 1.0 Transitional" b
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
||||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doctype "DocType XHTML 1.1" b
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
|
||||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doctype "HTML - 4.0 Transitional (doctype)" b
|
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
||||||
"http://www.w3.org/TR/html4/loose.dtd">
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doctype "HTML - 5.0 (doctype)" b
|
|
||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
#############
|
|
||||||
# Shortcuts #
|
|
||||||
#############
|
|
||||||
snippet down "Down (down)"
|
|
||||||
↓
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet enter "Enter (enter)"
|
|
||||||
⌅
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet escape "Escape (escape)"
|
|
||||||
⎋
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet shift "Shift (shift)"
|
|
||||||
⇧
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tab "Tab (tab)"
|
|
||||||
⇥
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet up "Up (up)"
|
|
||||||
↑
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet return "Return (return)"
|
|
||||||
↩
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet right "Right (right)"
|
|
||||||
→
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet left "Left (left)"
|
|
||||||
←
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet option "Option (option)"
|
|
||||||
⌥
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
#######################
|
|
||||||
# Conditional inserts #
|
|
||||||
#######################
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer 5_0 only"
|
|
||||||
<!--[if IE 5.0]>${1:IE Conditional Comment: Internet Explorer 5.0 only }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer 5_5 only"
|
|
||||||
<!--[if IE 5.5000]>${1:IE Conditional Comment: Internet Explorer 5.5 only }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer 5_x"
|
|
||||||
<!--[if lt IE 6]>${1:IE Conditional Comment: Internet Explorer 5.x }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer 6 and below"
|
|
||||||
<!--[if lte IE 6]>${1:IE Conditional Comment: Internet Explorer 6 and below }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer 6 only"
|
|
||||||
<!--[if IE 6]>${1:IE Conditional Comment: Internet Explorer 6 only }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer 7+"
|
|
||||||
<!--[if gte IE 7]>${1:IE Conditional Comment: Internet Explorer 7 and above }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: Internet Explorer"
|
|
||||||
<!--[if IE]>${1: IE Conditional Comment: Internet Explorer }<![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ! "IE Conditional Comment: NOT Internet Explorer"
|
|
||||||
<!--[if !IE]><!-->${1: IE Conditional Comment: NOT Internet Explorer }<!-- <![endif]-->$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
#############
|
|
||||||
# HTML TAGS #
|
|
||||||
#############
|
|
||||||
snippet input "Input with Label" w
|
|
||||||
<label for="${2:${1/[[:alpha:]]+|( )/(?1:_:\L$0)/g}}">$1</label><input type="${3:text/submit/hidden/button}" name="${4:$2}" value="$5"${6: id="${7:$2}"}`!p x(snip)`>
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet input "XHTML <input>" w
|
|
||||||
<input type="${1:text/submit/hidden/button}" name="${2:some_name}" value="$3"${4: id="${5:$2}"}`!p x(snip)`>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet opt "Option" w
|
|
||||||
<option${1: value="${2:option}"}>${3:$2}</option>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet select "Select Box" w
|
|
||||||
<select name="${1:some_name}" id="${2:$1}"${3:${4: multiple}${5: onchange="${6:}"}${7: size="${8:1}"}}>
|
|
||||||
<option${9: value="${10:option1}"}>${11:$10}</option>
|
|
||||||
<option${12: value="${13:option2}"}>${14:$13}</option>${15:}
|
|
||||||
$0
|
|
||||||
</select>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet textarea "XHTML <textarea>" w
|
|
||||||
<textarea name="${1:Name}" rows="${2:8}" cols="${3:40}">$0</textarea>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mailto "XHTML <a mailto: >" w
|
|
||||||
<a href="mailto:${1:joe@example.com}?subject=${2:feedback}">${3:email me}</a>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet base "XHTML <base>" w
|
|
||||||
<base href="$1"${2: target="$3"}`!p x(snip)`>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet img "XHTML <img>" w
|
|
||||||
<img src="${1:imgsrc}">
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet body "XHTML <body>"
|
|
||||||
<body id="${1:`!p
|
|
||||||
snip.rv = snip.fn and 'Hallo' or 'Nothin'
|
|
||||||
`}"${2: onload="$3"}>
|
|
||||||
$0
|
|
||||||
</body>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet div "XHTML <div>" w
|
|
||||||
<div`!p snip.rv=' id="' if t[1] else ""`${1:name}`!p snip.rv = '"' if t[1] else ""``!p snip.rv=' class="' if t[2] else ""`${2:name}`!p snip.rv = '"' if t[2] else ""`>
|
|
||||||
$0
|
|
||||||
</div>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet form "XHTML <form>" w
|
|
||||||
<form action="${1:`!p
|
|
||||||
snip.rv = (snip.basename or 'unnamed') + '_submit'
|
|
||||||
`}" method="${2:get}" accept-charset="utf-8">
|
|
||||||
$0
|
|
||||||
|
|
||||||
<p><input type="submit" value="Continue →"`!p x(snip)`></p>
|
|
||||||
</form>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet h1 "XHTML <h1>" w
|
|
||||||
<h1 id="${1/[\w\d]+|( )/(?1:_:\L$0\E)/g}">${1}</h1>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet head "XHTML <head>"
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8"`!p x(snip)`>
|
|
||||||
<title>${1:`!p snip.rv = snip.basename or "Page Title"`}</title>
|
|
||||||
$0
|
|
||||||
</head>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet link "XHTML <link>" w
|
|
||||||
<link rel="${1:stylesheet}" href="${2:/css/master.css}" type="text/css" media="${3:screen}" title="${4:no title}" charset="${5:utf-8}"`!p x(snip)`>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet meta "XHTML <meta>" w
|
|
||||||
<meta name="${1:name}" content="${2:content}"`!p x(snip)`>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scriptsrc "XHTML <script src...>" w
|
|
||||||
<script src="$1" type="text/javascript" charset="${3:utf-8}"></script>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet script "XHTML <script>" w
|
|
||||||
<script type="text/javascript" charset="utf-8">
|
|
||||||
$0
|
|
||||||
</script>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet style "XHTML <style>" w
|
|
||||||
<style type="text/css" media="screen">
|
|
||||||
$0
|
|
||||||
</style>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet table "XHTML <table>" w
|
|
||||||
<table border="${1:0}"${2: cellspacing="${3:5}" cellpadding="${4:5}"}>
|
|
||||||
<tr><th>${5:Header}</th></tr>
|
|
||||||
<tr><td>${0:Data}</td></tr>
|
|
||||||
</table>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet a "Link" w
|
|
||||||
<a href="${1:http://www.${2:url.com}}"${3: target="_blank"}>${4:Anchor Text}</a>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet p "paragraph" w
|
|
||||||
<p>$0</p>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet li "list item" w
|
|
||||||
<li>$0</li>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ul "unordered list" w
|
|
||||||
<ul>
|
|
||||||
$0
|
|
||||||
</ul>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet td "table cell" w
|
|
||||||
<td>$0</td>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tr "table row" w
|
|
||||||
<tr>$0</tr>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet title "XHTML <title>" w
|
|
||||||
<title>${1:`!p snip.rv = snip.basename or "Page Title"`}</title>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fieldset "Fieldset" w
|
|
||||||
<fieldset id="${1/[\w\d]+|( )/(?1:_:\L$0\E)/g}" ${2:class="${3:}"}>
|
|
||||||
<legend>$1</legend>
|
|
||||||
$0
|
|
||||||
</fieldset>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet movie "Embed QT movie (movie)" b
|
|
||||||
<object width="$2" height="$3" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab">
|
|
||||||
<param name="src" value="$1"`!p x(snip)`>
|
|
||||||
<param name="controller" value="$4"`!p x(snip)`>
|
|
||||||
<param name="autoplay" value="$5"`!p x(snip)`>
|
|
||||||
<embed src="${1:movie.mov}"
|
|
||||||
width="${2:320}" height="${3:240}"
|
|
||||||
controller="${4:true}" autoplay="${5:true}"
|
|
||||||
scale="tofit" cache="true"
|
|
||||||
pluginspage="http://www.apple.com/quicktime/download/"
|
|
||||||
`!p x(snip)`>
|
|
||||||
</object>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet html5 "HTML5 Template"
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>${1}</title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
${2}
|
|
||||||
</header>
|
|
||||||
<footer>
|
|
||||||
${4}
|
|
||||||
</footer>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
endsnippet
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends html, django
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends html, jinja2
|
|
||||||
@ -1,431 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
# Many of the snippets here use a global option called
|
|
||||||
# "g:ultisnips_java_brace_style" which, if set to "nl" will put a newline
|
|
||||||
# before '{' braces.
|
|
||||||
# Setting "g:ultisnips_java_junit" will change how the test method snippet
|
|
||||||
# looks, it is defaulted to junit4, setting this option to 3 will remove the
|
|
||||||
# @Test annotation from the method
|
|
||||||
|
|
||||||
global !p
|
|
||||||
def junit(snip):
|
|
||||||
if snip.opt("g:ultisnips_java_junit", "") == "3":
|
|
||||||
snip += ""
|
|
||||||
else:
|
|
||||||
snip.rv += "@Test\n\t"
|
|
||||||
|
|
||||||
def nl(snip):
|
|
||||||
if snip.opt("g:ultisnips_java_brace_style", "") == "nl":
|
|
||||||
snip += ""
|
|
||||||
else:
|
|
||||||
snip.rv += " "
|
|
||||||
def getArgs(group):
|
|
||||||
import re
|
|
||||||
word = re.compile('[a-zA-Z><.]+ \w+')
|
|
||||||
return [i.split(" ") for i in word.findall(group) ]
|
|
||||||
|
|
||||||
def camel(word):
|
|
||||||
return word[0].upper() + word[1:]
|
|
||||||
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
snippet sleep "try sleep catch" b
|
|
||||||
try {
|
|
||||||
Thread.sleep(${1:1000});
|
|
||||||
} catch (InterruptedException e){
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /i|n/ "new primitive or int" br
|
|
||||||
${1:int} ${2:i} = ${3:1};
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /o|v/ "new Object or variable" br
|
|
||||||
${1:Object} ${2:var} = new $1(${3});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f "field" b
|
|
||||||
${1:private} ${2:String} ${3:`!p snip.rv = t[2].lower()`};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ab "abstract" b
|
|
||||||
abstract $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet as "assert" b
|
|
||||||
assert ${1:test}${2/(.+)/(?1: \: ")/}${2:Failure message}${2/(.+)/(?1:")/};$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet at "assert true" b
|
|
||||||
assertTrue(${1:actual});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet af "assert false" b
|
|
||||||
assertFalse(${1:actual});$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ae "assert equals" b
|
|
||||||
assertEquals(${1:expected}, ${2:actual});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet br "break"
|
|
||||||
break;
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cs "case" b
|
|
||||||
case $1:
|
|
||||||
$2
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ca "catch" b
|
|
||||||
catch (${1:Exception} ${2:e})`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cle "class extends" b
|
|
||||||
public class ${1:`!p
|
|
||||||
snip.rv = snip.basename or "untitled"`} ${2:extends ${3:Parent} }${4:implements ${5:Interface} }{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet clc "class with constructor, fields, setter and getters" b
|
|
||||||
public class `!p
|
|
||||||
snip.rv = snip.basename or "untitled"` {
|
|
||||||
`!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
if len(args) == 0: snip.rv = ""
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
|
||||||
if len(args) > 0:
|
|
||||||
snip.rv += "\n"`
|
|
||||||
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1] + ";"
|
|
||||||
if len(args) == 0:
|
|
||||||
snip.rv += "\n"`
|
|
||||||
}$0
|
|
||||||
`!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
if len(args) == 0: snip.rv = ""
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\tpublic void set" + camel(i[1]) + "(" + i[0] + " " + i[1] + ") {\n" + "\
|
|
||||||
\tthis." + i[1] + " = " + i[1] + ";\n\t}\n"
|
|
||||||
|
|
||||||
snip.rv += "\n\tpublic " + i[0] + " get" + camel(i[1]) + "() {\
|
|
||||||
\n\t\treturn " + i[1] + ";\n\t}\n"
|
|
||||||
`
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet clc "class with constructor, with field names" b
|
|
||||||
public class `!p
|
|
||||||
snip.rv = snip.basename or "untitled"` {
|
|
||||||
`!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
|
||||||
if len(args) > 0:
|
|
||||||
snip.rv += "\n"`
|
|
||||||
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1]
|
|
||||||
if len(args) == 0:
|
|
||||||
snip.rv += "\n"`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet clc "class and constructor" b
|
|
||||||
public class `!p
|
|
||||||
snip.rv = snip.basename or "untitled"` {
|
|
||||||
|
|
||||||
public `!p snip.rv = snip.basename or "untitled"`($2) {
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cl "class" b
|
|
||||||
public class ${1:`!p
|
|
||||||
snip.rv = snip.basename or "untitled"`} {
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cos "constant string" b
|
|
||||||
public static final String ${1:var} = "$2";$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet co "constant" b
|
|
||||||
public static final ${1:String} ${2:var} = $3;$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet de "default" b
|
|
||||||
default:
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet elif "else if" b
|
|
||||||
else if ($1)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /el(se)?/ "else" br
|
|
||||||
else`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fi "final" b
|
|
||||||
final $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fore "for (each)" b
|
|
||||||
for ($1 : $2)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fori "for" b
|
|
||||||
for (int ${1:i} = 0; $1 < ${2:10}; $1++)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for" b
|
|
||||||
for ($1; $2; $3)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if" b
|
|
||||||
if ($1)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet imt "import junit_framework_TestCase;" b
|
|
||||||
import junit.framework.TestCase;
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet im "import" b
|
|
||||||
import ${1:java}.${2:util}.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet in "interface" b
|
|
||||||
interface ${1:`!p snip.rv = snip.basename or "untitled"`} ${2:extends ${3:Parent} }{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cc "constructor call or setter body"
|
|
||||||
this.${1:var} = $1;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet list "Collections List" b
|
|
||||||
List<${1:String}> ${2:list} = new ${3:Array}List<$1>();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet map "Collections Map" b
|
|
||||||
Map<${1:String}, ${2:String}> ${3:map} = new ${4:Hash}Map<$1, $2>();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet set "Collections Set" b
|
|
||||||
Set<${1:String}> ${2:set} = new ${3:Hash}Set<$1>();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /Str?|str/ "String" br
|
|
||||||
String $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cn "Constructor" b
|
|
||||||
public `!p snip.rv = snip.basename or "untitled"`(${1:}) {
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cn "constructor, \w fields + assigments" b
|
|
||||||
`!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
|
||||||
if len(args) > 0:
|
|
||||||
snip.rv += "\n"`
|
|
||||||
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
|
||||||
args = getArgs(t[1])
|
|
||||||
for i in args:
|
|
||||||
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1]
|
|
||||||
if len(args) == 0:
|
|
||||||
snip.rv += "\n"`
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet j.b "java_beans_" i
|
|
||||||
java.beans.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet j.i "java_io" i
|
|
||||||
java.io.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet j.m "java_math" i
|
|
||||||
java.math.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet j.n "java_net_" i
|
|
||||||
java.net.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet j.u "java_util_" i
|
|
||||||
java.util.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet main "method (main)" b
|
|
||||||
public static void main(String[] args)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "try/catch" b
|
|
||||||
try {
|
|
||||||
$1
|
|
||||||
} catch(${2:Exception} ${3:e}){
|
|
||||||
${4:e.printStackTrace();}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mt "method throws" b
|
|
||||||
${1:private} ${2:void} ${3:method}(${4}) ${5:throws $6 }{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet m "method" b
|
|
||||||
${1:private} ${2:void} ${3:method}(${4}) {
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet md "Method With javadoc" b
|
|
||||||
/**
|
|
||||||
* ${7:Short Description}`!p
|
|
||||||
for i in getArgs(t[4]):
|
|
||||||
snip.rv += "\n\t * @param " + i[1] + " usage..."`
|
|
||||||
* `!p
|
|
||||||
if "throws" in t[5]:
|
|
||||||
snip.rv = "\n\t * @throws " + t[6]
|
|
||||||
else:
|
|
||||||
snip.rv = ""` `!p
|
|
||||||
if not "void" in t[2]:
|
|
||||||
snip.rv = "\n\t * @return object"
|
|
||||||
else:
|
|
||||||
snip.rv = ""`
|
|
||||||
**/
|
|
||||||
${1:public} ${2:void} ${3:method}($4) ${5:throws $6 }{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /get(ter)?/ "getter" br
|
|
||||||
public ${1:String} get${2:Name}() {
|
|
||||||
return `!p snip.rv = t[2].lower()`;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /set(ter)?/ "setter" br
|
|
||||||
public void set${1:Name}(${2:String} $1) {
|
|
||||||
return this.`!p snip.rv = t[1].lower()` = `!p snip.rv = t[1].lower()`;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /se?tge?t|ge?tse?t|gs/ "setter and getter" br
|
|
||||||
public void set${1:Name}(${2:String} `!p snip.rv = t[1].lower()`) {
|
|
||||||
this.`!p snip.rv = t[1].lower()` = `!p snip.rv = t[1].lower()`;
|
|
||||||
}
|
|
||||||
|
|
||||||
public $2 get$1() {
|
|
||||||
return `!p snip.rv = t[1].lower()`;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pa "package" b
|
|
||||||
package $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet p "print" b
|
|
||||||
System.out.print($1);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pl "println" b
|
|
||||||
System.out.println($1);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pr "private" b
|
|
||||||
private $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet po "protected" b
|
|
||||||
protected $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pu "public" b
|
|
||||||
public $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet re "return" b
|
|
||||||
return $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet st "static"
|
|
||||||
static $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sw "switch" b
|
|
||||||
switch ($1)`!p nl(snip)`{
|
|
||||||
case $2: $0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sy "synchronized"
|
|
||||||
synchronized $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tc "test case"
|
|
||||||
public class ${1:`!p snip.rv = snip.basename or "untitled"`} extends ${2:TestCase}`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t "test" b
|
|
||||||
`!p junit(snip)`public void test${1:Name}() {
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tt "test throws" b
|
|
||||||
`!p junit(snip)`public void test${1:Name}() ${2:throws Exception }{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet th "throw" b
|
|
||||||
throw new $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wh "while" b
|
|
||||||
while ($1)`!p nl(snip)`{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,162 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
snippet get "Get Elements"
|
|
||||||
getElement${1/(T)|.*/(?1:s)/}By${1:T}${1/(T)|(I)|.*/(?1:agName)(?2:d)/}('$2')
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet '':f "object method string"
|
|
||||||
'${1:${2:#thing}:${3:click}}': function(element) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}${10:,}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet :f "Object Method"
|
|
||||||
${1:method_name}: function(${3:attribute}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}${10:,}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet :, "Object Value JS"
|
|
||||||
${1:value_name}: ${0:value},
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet : "Object key key: 'value'"
|
|
||||||
${1:key}: ${2:"${3:value}"}${4:, }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet proto "Prototype (proto)"
|
|
||||||
${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
};
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for (...) {...} (counting up)" b
|
|
||||||
for (var ${1:i} = 0, ${2:len} = ${3:Things.length}; $1 < $2; $1++) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ford "for (...) {...} (counting down, faster)" b
|
|
||||||
for (var ${2:i} = ${1:Things.length} - 1; $2 >= 0; $2--) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fun "function (fun)"
|
|
||||||
function ${1:function_name}(${2:argument}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet iife "Immediately-Invoked Function Expression (iife)"
|
|
||||||
(function (${1:argument}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}(${2:$1}));
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "if ___ else"
|
|
||||||
if (${1:condition}) {
|
|
||||||
${2://code}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
${3://code}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if"
|
|
||||||
if (${1:condition}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet timeout "setTimeout function"
|
|
||||||
setTimeout(function() {
|
|
||||||
${VISUAL}$0
|
|
||||||
}${2:.bind(${3:this})}, ${1:10});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Snippets for Console Debug Output
|
|
||||||
|
|
||||||
snippet ca "console.assert" b
|
|
||||||
console.assert(${1:assertion}, ${2:"${3:message}"});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cclear "console.clear" b
|
|
||||||
console.clear();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cdir "console.dir" b
|
|
||||||
console.dir(${1:object});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cdirx "console.dirxml" b
|
|
||||||
console.dirxml(${1:object});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ce "console.error" b
|
|
||||||
console.error(${1:"${2:value}"});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cgroup "console.group" b
|
|
||||||
console.group("${1:label}");
|
|
||||||
${VISUAL}$0
|
|
||||||
console.groupEnd();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cgroupc "console.groupCollapsed" b
|
|
||||||
console.groupCollapsed("${1:label}");
|
|
||||||
${VISUAL}$0
|
|
||||||
console.groupEnd();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ci "console.info" b
|
|
||||||
console.info(${1:"${2:value}"});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cl "console.log" b
|
|
||||||
console.log(${1:"${2:value}"});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cprof "console.profile" b
|
|
||||||
console.profile("${1:label}");
|
|
||||||
${VISUAL}$0
|
|
||||||
console.profileEnd();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ctable "console.table" b
|
|
||||||
console.table(${1:"${2:value}"});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ctime "console.time" b
|
|
||||||
console.time("${1:label}");
|
|
||||||
${VISUAL}$0
|
|
||||||
console.timeEnd("$1");
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ctimestamp "console.timeStamp" b
|
|
||||||
console.timeStamp("${1:label}");
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ctrace "console.trace" b
|
|
||||||
console.trace();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cw "console.warn" b
|
|
||||||
console.warn(${1:"${2:value}"});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# AMD (Asynchronous Module Definition) snippets
|
|
||||||
|
|
||||||
snippet def "define an AMD module"
|
|
||||||
define(${1:optional_name, }[${2:'jquery'}], ${3:callback});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet req "require an AMD module"
|
|
||||||
require([${1:'dependencies'}], ${2:callback});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,169 +0,0 @@
|
|||||||
priority -50
|
|
||||||
extends javascript
|
|
||||||
priority -49
|
|
||||||
|
|
||||||
# JavaScript versions -- from the TextMate bundle + some additions
|
|
||||||
# for jasmine-jquery matchers
|
|
||||||
#
|
|
||||||
|
|
||||||
snippet des "Describe (js)" b
|
|
||||||
describe('${1:description}', function() {
|
|
||||||
$0
|
|
||||||
});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet it "it (js)" b
|
|
||||||
it('${1:description}', function() {
|
|
||||||
$0
|
|
||||||
});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet bef "before each (js)" b
|
|
||||||
beforeEach(function() {
|
|
||||||
$0
|
|
||||||
});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aft "after each (js)" b
|
|
||||||
afterEach(function() {
|
|
||||||
$0
|
|
||||||
});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet any "any (js)" b
|
|
||||||
jasmine.any($1)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ru "runs (js)" b
|
|
||||||
runs(function() {
|
|
||||||
$0
|
|
||||||
});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wa "waits (js)" b
|
|
||||||
waits($1);
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ex "expect (js)" b
|
|
||||||
expect(${1:target})$0;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ee "expect to equal (js)" b
|
|
||||||
expect(${1:target}).toEqual(${2:value});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet em "expect to match (js)" b
|
|
||||||
expect(${1:target}).toMatch(${2:pattern});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eha "expect to have attribute (js)" b
|
|
||||||
expect(${1:target}).toHaveAttr('${2:attr}'${3:, '${4:value}'});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet et "expect to be truthy (js)" b
|
|
||||||
expect(${1:target}).toBeTruthy();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ef "expect to be falsy (js)" b
|
|
||||||
expect(${1:target}).toBeFalsy();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ed "expect to be defined (js)" b
|
|
||||||
expect(${1:target}).toBeDefined();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet en "expect to be null (js)" b
|
|
||||||
expect(${1:target}).toBeNull();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ec "expect to contain (js)" b
|
|
||||||
expect(${1:target}).toContain(${2:value});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ev "expect to be visible (js)" b
|
|
||||||
expect(${1:target}).toBeVisible();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eh "expect to be hidden (js)" b
|
|
||||||
expect(${1:target}).toBeHidden();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notx "expect not (js)" b
|
|
||||||
expect(${1:target}).not$0;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet note "expect not to equal (js)" b
|
|
||||||
expect(${1:target}).not.toEqual(${2:value});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notm "expect not to match (js)" b
|
|
||||||
expect(${1:target}).not.toMatch(${2:pattern});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notha "expect to not have attribute (js)" b
|
|
||||||
expect(${1:target}).not.toHaveAttr('${2:attr}'${3:, '${4:value}'});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet nott "expect not to be truthy (js)" b
|
|
||||||
expect(${1:target}).not.toBeTruthy();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notf "expect not to be falsy (js)" b
|
|
||||||
expect(${1:target}).not.toBeFalsy();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notd "expect not to be defined (js)" b
|
|
||||||
expect(${1:target}).not.toBeDefined();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notn "expect not to be null (js)" b
|
|
||||||
expect(${1:target}).not.toBeNull();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notc "expect not to contain (js)" b
|
|
||||||
expect(${1:target}).not.toContain(${2:value});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notv "expect not to be visible (js)" b
|
|
||||||
expect(${1:target}).not.toBeVisible();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet noth "expect not to be hidden (js)" b
|
|
||||||
expect(${1:target}).not.toBeHidden();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet s "spy on (js)" b
|
|
||||||
spyOn(${1:object}, '${2:method}')$0;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sr "spy on and return (js)" b
|
|
||||||
spyOn(${1:object}, '${2:method}').andReturn(${3:arguments});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet st "spy on and throw (js)" b
|
|
||||||
spyOn(${1:object}, '${2:method}').andThrow(${3:exception});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sct "spy on and call through (js)" b
|
|
||||||
spyOn(${1:object}, '${2:method}').andCallThrough();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scf "spy on and call fake (js)" b
|
|
||||||
spyOn(${1:object}, '${2:method}').andCallFake(${3:function});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet esc "expect was called (js)" b
|
|
||||||
expect(${1:target}).wasCalled();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet escw "expect was called with (js)" b
|
|
||||||
expect(${1:target}).wasCalledWith(${2:arguments});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notsc "expect was not called (js)" b
|
|
||||||
expect(${1:target}).wasNotCalled();
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet noscw "expect was not called with (js)" b
|
|
||||||
expect(${1:target}).wasNotCalledWith(${2:arguments});
|
|
||||||
endsnippet
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
# JSDoc snippets
|
|
||||||
|
|
||||||
snippet /* "A JSDoc comment" b
|
|
||||||
/**
|
|
||||||
* ${1:${VISUAL}}$0
|
|
||||||
*/
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @au "@author email (First Last)"
|
|
||||||
@author ${1:`!v g:snips_author_email`} (${2:`!v g:snips_author`})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @li "@license Description"
|
|
||||||
@license ${1:MIT}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @ver "@version Semantic version"
|
|
||||||
@version ${1:0.1.0}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @fileo "@fileoverview Description" b
|
|
||||||
/**
|
|
||||||
* @fileoverview ${1:${VISUAL:A description of the file}}$0
|
|
||||||
*/
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @constr "@constructor"
|
|
||||||
@constructor
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @p "@param {Type} varname Description"
|
|
||||||
@param {${1:Type}} ${2:varname} ${3:Description}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @ret "@return {Type} Description"
|
|
||||||
@return {${1:Type}} ${2:Description}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @pri "@private"
|
|
||||||
@private
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @over "@override"
|
|
||||||
@override
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet @pro "@protected"
|
|
||||||
@protected
|
|
||||||
endsnippet
|
|
||||||
@ -1,209 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
# http://jinja.pocoo.org/
|
|
||||||
|
|
||||||
# jinja2 is a full featured template engine for Python. It has full
|
|
||||||
# unicode support, an optional integrated sandboxed execution
|
|
||||||
# environment, widely used and BSD licensed.
|
|
||||||
|
|
||||||
# possible extends:
|
|
||||||
#extends html
|
|
||||||
|
|
||||||
|
|
||||||
snippet block "block" b
|
|
||||||
{% block ${1:name} %}
|
|
||||||
$2
|
|
||||||
{% endblock $1 %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet {{ "variable" b
|
|
||||||
{{ $1 }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet {# "comment" b
|
|
||||||
{# $1 #}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet # "comment" b
|
|
||||||
{# $1 #}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet raw "escaped block" b
|
|
||||||
{% raw %}
|
|
||||||
$1
|
|
||||||
{% endraw %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet extends "extends" b
|
|
||||||
{% extends "${1:template}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet include "include" b
|
|
||||||
{% include "${1:template}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet import "import" b
|
|
||||||
{% import "${1:template}" %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet from "from/import/as" b
|
|
||||||
{% from "${1:template}" import ${2:name}${3: as ${4:$2}} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet filter "filter" b
|
|
||||||
{% filter ${1:filter} %}
|
|
||||||
$2
|
|
||||||
{% endfilter %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# Being able to quickly remove the whole 'else' block seems faster to me than
|
|
||||||
# choosing between 'for' and 'for/else' snippets from the menu.
|
|
||||||
# snippet for "for" b
|
|
||||||
# {% for ${1:item} in ${2:sequence} %}
|
|
||||||
# $3${4:
|
|
||||||
# {% else %}
|
|
||||||
# $5}
|
|
||||||
# {% endfor %}
|
|
||||||
# endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet for "for" b
|
|
||||||
{% for ${1:item} in ${2:sequence} %}
|
|
||||||
$3
|
|
||||||
{% endfor %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet for "for/else" b
|
|
||||||
{% for ${1:item} in ${2:sequence} %}
|
|
||||||
$3
|
|
||||||
{% else %}
|
|
||||||
$4
|
|
||||||
{% endfor %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet if "if" b
|
|
||||||
{% if ${1:expr} %}
|
|
||||||
$2
|
|
||||||
{% endif %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet if "if/else" b
|
|
||||||
{% if ${1:expr} %}
|
|
||||||
$2
|
|
||||||
{% else %}
|
|
||||||
$3
|
|
||||||
{% endif %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet if "if/elif/else" b
|
|
||||||
{% if ${1:expr} %}
|
|
||||||
$2
|
|
||||||
{% elif %}
|
|
||||||
$3
|
|
||||||
{% else %}
|
|
||||||
$4
|
|
||||||
{% endif %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet macro "macro" b
|
|
||||||
{% macro ${1:name}(${2:args}) %}
|
|
||||||
$3
|
|
||||||
{% endmacro %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet call "call" b
|
|
||||||
{% call ${1:name}(${2:args}) %}
|
|
||||||
$3
|
|
||||||
{% endcall %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet set "set" b
|
|
||||||
{% set ${1:name} = ${2:'value'} %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet trans "translation" b
|
|
||||||
{% trans %}
|
|
||||||
$1
|
|
||||||
{% endtrans %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet with "with" b
|
|
||||||
{% with %}
|
|
||||||
$1
|
|
||||||
{% endwith %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet autoescape "autoescape" b
|
|
||||||
{% autoescape ${1:true} %}
|
|
||||||
$2
|
|
||||||
{% endautoescape %}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Filters
|
|
||||||
# @todo: expand only when snippet is preceeded by a |
|
|
||||||
|
|
||||||
snippet batch "batch items" w
|
|
||||||
batch(linecount=$1, fill_with=${2:None})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet dictsort "sort and yield (key, value) pairs" w
|
|
||||||
dictsort(case_sensitive=${1:False}, by=${2:'key'})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet round "round number" w
|
|
||||||
round(precision=${1:0}, method=${2:'common|ceil|floor'})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet urlize "convert plain-text url to <a/>" w
|
|
||||||
urlize(trim_url_limit=${1:None}, nofollow=${2:False})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet wordwrap "wordwrap" w
|
|
||||||
wordwrap(width=${1:79}, break_long_words=${2:True})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet truncate "truncate" w
|
|
||||||
truncate(lenght=${1:79}, killwords=${2:False}, end=${3:'...''})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet sum "sum of sequence of numbers + start" w
|
|
||||||
sum(attribute=${1:None}, start=${2:0})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet sort "sort an iterable" w
|
|
||||||
sort(reverse=${1:False}, case_sensitive=${2:False}, attribute=${3:None})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet indent "indent" w
|
|
||||||
indent(width=${1:4}, indentfirst=${2:False})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet s "String" b
|
|
||||||
"${1:key}": "${0:value}",
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet n "number" b
|
|
||||||
"${1:key}": ${0:value},
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet a "Array" b
|
|
||||||
[
|
|
||||||
${VISUAL}$0
|
|
||||||
],
|
|
||||||
endsnippet
|
|
||||||
snippet o "Object" b
|
|
||||||
{
|
|
||||||
${VISUAL}$0
|
|
||||||
},
|
|
||||||
endsnippet
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet t "Transaction" b
|
|
||||||
${1:`!v strftime("%Y")`}-${2:`!v strftime("%m")`}-${3:`!v strftime("%d")`} ${4:*} ${5:Payee}
|
|
||||||
${6:Expenses} \$${7:0.00}
|
|
||||||
${8:Assets:Checking}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends haskell
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
#################################
|
|
||||||
# Snippets for the Lua language #
|
|
||||||
#################################
|
|
||||||
snippet #! "Shebang header" b
|
|
||||||
#!/usr/bin/env lua
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet !fun(ction)?! "New function" br
|
|
||||||
function ${1:new_function}(${2:args})
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forp "pair for loop" b
|
|
||||||
for ${1:name},${2:val} in pairs(${3:table_name}) do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fori "ipair for foop" b
|
|
||||||
for ${1:idx},${2:val} in ipairs(${3:table_name}) do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "numeric for loop" b
|
|
||||||
for ${1:i}=${2:first},${3:last}${4/^..*/(?0:,:)/}${4:step} do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet local "local x = 1"
|
|
||||||
local ${1:x} = ${0:1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,92 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
#################
|
|
||||||
# From snipmate #
|
|
||||||
#################
|
|
||||||
snippet def "definition" b
|
|
||||||
<%def name="${1:name}">
|
|
||||||
${2:}
|
|
||||||
</%def>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet call "call" b
|
|
||||||
<%call expr="${1:name}">
|
|
||||||
${2:}
|
|
||||||
</%call>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doc "doc" b
|
|
||||||
<%doc>
|
|
||||||
${1:}
|
|
||||||
</%doc>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet text "text" b
|
|
||||||
<%text>
|
|
||||||
${1:}
|
|
||||||
</%text>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for" b
|
|
||||||
% for ${1:i} in ${2:iter}:
|
|
||||||
${3:}
|
|
||||||
% endfor
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if " b
|
|
||||||
% if ${1:condition}:
|
|
||||||
${2:}
|
|
||||||
% endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if/else" b
|
|
||||||
% if ${1:condition}:
|
|
||||||
${2:}
|
|
||||||
% else:
|
|
||||||
${3:}
|
|
||||||
% endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "try" b
|
|
||||||
% try:
|
|
||||||
${1:}
|
|
||||||
% except${2:}:
|
|
||||||
${3:pass}
|
|
||||||
% endtry
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wh "wh" b
|
|
||||||
% while ${1:}:
|
|
||||||
${2:}
|
|
||||||
% endwhile
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet $ "$" i
|
|
||||||
${${1:}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet <% "<%" b
|
|
||||||
<% ${1:} %>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet <!% "<!%" b
|
|
||||||
<!% ${1:} %>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inherit "inherit" b
|
|
||||||
<%inherit file="${1:filename}" />
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet include "include" b
|
|
||||||
<%include file="${1:filename}" />
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet namespace "namespace" b
|
|
||||||
<%namespace file="${1:name}" />
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet page "page" b
|
|
||||||
<%page args="${1:}" />
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################
|
|
||||||
# Sections and Paragraphs #
|
|
||||||
###########################
|
|
||||||
snippet sec "Section" b
|
|
||||||
# ${1:Section Name} #
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ssec "Sub Section" b
|
|
||||||
## ${1:Section Name} ##
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sssec "SubSub Section" b
|
|
||||||
### ${1:Section Name} ###
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet par "Paragraph" b
|
|
||||||
#### ${1:Paragraph Name} ####
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet spar "Paragraph" b
|
|
||||||
##### ${1:Paragraph Name} #####
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
################
|
|
||||||
# Common stuff #
|
|
||||||
################
|
|
||||||
snippet link "Link to something"
|
|
||||||
[${1:${VISUAL:Text}}](${3:http://${2:www.url.com}})$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet img "Image"
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,272 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
snippet imp "#import (imp)" b
|
|
||||||
#import "${1:`!p snip.rv = re.sub(r'\..*$', '.h', fn)`}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Imp "#import <> (Imp)"
|
|
||||||
#import <${1:Cocoa/Cocoa.h}>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cl "020 Class (objc)"
|
|
||||||
@interface ${1:`!p
|
|
||||||
if len(fn):
|
|
||||||
snip.rv = re.sub(r'\..*$', '', fn)
|
|
||||||
else:
|
|
||||||
snip.rv = "object"
|
|
||||||
`} : ${2:NSObject}
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation $1
|
|
||||||
- (id)init
|
|
||||||
{
|
|
||||||
if((self = [super init]))
|
|
||||||
{$0
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet array "NSArray (array)"
|
|
||||||
NSMutableArray *${1:array} = [NSMutableArray array];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet dict "NSDictionary (dict)"
|
|
||||||
NSMutableDictionary *${1:dict} = [NSMutableDictionary dictionary];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forarray "for NSArray loop (forarray)"
|
|
||||||
unsigned int ${1:object}Count = [${2:array} count];
|
|
||||||
|
|
||||||
for(unsigned int index = 0; index < $1Count; index += 1)
|
|
||||||
{
|
|
||||||
${3:id} $1 = [$2 objectAtIndex:index];
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet objacc "Object Accessors (objacc)"
|
|
||||||
- (${1:id})${2:thing}
|
|
||||||
{
|
|
||||||
return $2;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)set${2/./\u$0/}:($1)aValue
|
|
||||||
{
|
|
||||||
$0${1/( \*)?$/(?1:$1: )/}old${2/./\u$0/} = $2;
|
|
||||||
$2 = [aValue retain];
|
|
||||||
[old${2/./\u$0/} release];
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sel "@selector"
|
|
||||||
@selector(${1:method}:)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cdacc "CoreData Accessors Implementation"
|
|
||||||
- (${1:id})${2:attribute}
|
|
||||||
{
|
|
||||||
[self willAccessValueForKey:@"$2"];
|
|
||||||
$1 value = [self primitiveValueForKey:@"$2"];
|
|
||||||
[self didAccessValueForKey:@"$2"];
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)set${2/./\u$0/}:($1)aValue
|
|
||||||
{
|
|
||||||
[self willChangeValueForKey:@"$2"];
|
|
||||||
[self setPrimitiveValue:aValue forKey:@"$2"];
|
|
||||||
[self didChangeValueForKey:@"$2"];
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet delegate "Delegate Responds to Selector"
|
|
||||||
if([${1:[self delegate]} respondsToSelector:@selector(${2:selfDidSomething:})])
|
|
||||||
[$1 ${3:${2/((^\s*([A-Za-z0-9_]*:)\s*)|(:\s*$)|(:\s*))/(?2:$2self :\:<>)(?4::)(?5: :)/g}}];
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet thread "Detach New NSThread"
|
|
||||||
[NSThread detachNewThreadSelector:@selector(${1:method}:) toTarget:${2:aTarget} withObject:${3:anArgument}]
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ibo "IBOutlet (ibo)"
|
|
||||||
IBOutlet ${1:NSSomeClass} *${2:${1/^[A-Z](?:[A-Z]+|[a-z]+)([A-Z]\w*)/\l$1/}};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet I "Initialize Implementation (I)"
|
|
||||||
+ (void)initialize
|
|
||||||
{
|
|
||||||
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
|
|
||||||
$0@"value", @"key",
|
|
||||||
nil]];
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet bind "Key:value binding (bind)"
|
|
||||||
bind:@"${1:binding}" toObject:${2:observableController} withKeyPath:@"${3:keyPath}" options:${4:nil}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet arracc "LoD array (arracc)"
|
|
||||||
- (void)addObjectTo${1:Things}:(${2:id})anObject
|
|
||||||
{
|
|
||||||
[${3:${1/./\l$0/}} addObject:anObject];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)insertObject:($2)anObject in$1AtIndex:(unsigned int)i
|
|
||||||
{
|
|
||||||
[$3 insertObject:anObject atIndex:i];
|
|
||||||
}
|
|
||||||
|
|
||||||
- ($2)objectIn$1AtIndex:(unsigned int)i
|
|
||||||
{
|
|
||||||
return [$3 objectAtIndex:i];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (unsigned int)indexOfObjectIn$1:($2)anObject
|
|
||||||
{
|
|
||||||
return [$3 indexOfObject:anObject];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)removeObjectFrom$1AtIndex:(unsigned int)i
|
|
||||||
{
|
|
||||||
[$3 removeObjectAtIndex:i];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (unsigned int)countOf$1
|
|
||||||
{
|
|
||||||
return [$3 count];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSArray *${1/./\l$0/}
|
|
||||||
{
|
|
||||||
return $3;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)set$1:(NSArray *)new$1
|
|
||||||
{
|
|
||||||
[$3 setArray:new$1];
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet arracc "LoD array interface (arracc)"
|
|
||||||
- (void)addObjectTo${1:Things}:(${2:id})anObject;
|
|
||||||
- (void)insertObject:($2)anObject in$1AtIndex:(unsigned int)i;
|
|
||||||
- ($2)objectIn$1AtIndex:(unsigned int)i;
|
|
||||||
- (unsigned int)indexOfObjectIn$1:($2)anObject;
|
|
||||||
- (void)removeObjectFrom$1AtIndex:(unsigned int)i;
|
|
||||||
- (unsigned int)countOf$1;
|
|
||||||
- (NSArray *)${1/./\l$0/};
|
|
||||||
- (void)set$1:(NSArray *)new$1;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet focus "Lock Focus"
|
|
||||||
[self lockFocus];
|
|
||||||
$0
|
|
||||||
[self unlockFocus];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pool "NSAutoreleasePool (pool)"
|
|
||||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
|
||||||
$0
|
|
||||||
[pool drain];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet log "NSLog (log) 2"
|
|
||||||
NSLog(@"$1"${1/[^%]*(%)?.*/(?1:, :\);)/}$2${1/[^%]*(%)?.*/(?1:\);)/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet alert "NSRunAlertPanel (alert)"
|
|
||||||
int choice = NSRunAlertPanel(@"${1:Something important!}", @"${2:Something important just happend, and now I need to ask you, do you want to continue?}", @"${3:Continue}", @"${4:Cancel}", nil);
|
|
||||||
if(choice == NSAlertDefaultReturn) // "$3"
|
|
||||||
{
|
|
||||||
$0;
|
|
||||||
}
|
|
||||||
else if(choice == NSAlertAlternateReturn) // "$4"
|
|
||||||
{
|
|
||||||
$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet format "NSString stringWithFormat (format)"
|
|
||||||
[NSString stringWithFormat:@"$1", $2]$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet objacc "Object Accessors Interface (objacc)"
|
|
||||||
- (${1:id})${2:thing};
|
|
||||||
- (void)set${2/./\u$0/}:($1)aValue;
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet prop "Property"
|
|
||||||
@property (${1/^(e)$|.*/(?1:r)/}${1:r}${1/^(?:(r)|(e)|(c)|(a))$|.*/(?1:etain)(?2:adonly)(?3:opy)(?4:ssign)/}) ${2:NSSomeClass}$ *${3:${2/^[A-Z](?:[A-Z]+|[a-z]+)([A-Z]\w*)/\l$1/}};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet getprefs "Read from defaults (getprefs)"
|
|
||||||
[[NSUserDefaults standardUserDefaults] objectForKey:${1:key}];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet obs "Register for Notification"
|
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:${1:self} selector:@selector(${3:${2/^([A-Z]{2})?(.+?)(Notification)?$/\l$2/}}:) name:${2:NSWindowDidBecomeMainNotification} object:${4:nil}];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet responds "Responds to Selector"
|
|
||||||
if ([${1:self} respondsToSelector:@selector(${2:someSelector:})])
|
|
||||||
{
|
|
||||||
[$1 ${3:${2/((:\s*$)|(:\s*))/:<>(?3: )/g}}];
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet gsave "Save and Restore Graphics Context (gsave)"
|
|
||||||
[NSGraphicsContext saveGraphicsState];
|
|
||||||
$0
|
|
||||||
[NSGraphicsContext restoreGraphicsState];
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet acc "Scalar Accessors (acc)"
|
|
||||||
- (${1:unsigned int})${2:thing}
|
|
||||||
{
|
|
||||||
return ${3:$2};
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)set${2/./\u$0/}:(${1:unsigned int})new${2/./\u$0/}
|
|
||||||
{
|
|
||||||
$3 = new${2/./\u$0/};
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet acc "Scalar Accessors Interface (acc)"
|
|
||||||
- (${1:unsigned int})${2:thing};
|
|
||||||
- (void)set${2/./\u$0/}:($1)new${2/./\u$0/};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet stracc "String Accessors (stracc)"
|
|
||||||
- (NSString *)${1:thing}
|
|
||||||
{
|
|
||||||
return ${2:$1};
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)set${1/.*/\u$0/}:(NSString *)/})${3:a${1/.*/\u$0/}}
|
|
||||||
{
|
|
||||||
$3 = [$3 copy];
|
|
||||||
[$2 release];
|
|
||||||
$2 = $3;
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet syn "Synthesize"
|
|
||||||
@synthesize ${1:property};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet setprefs "Write to defaults (setprefs)"
|
|
||||||
[[NSUserDefaults standardUserDefaults] setObject:${1:object} forKey:${2:key}];
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,174 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet rs "raise" b
|
|
||||||
raise (${1:Not_found})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet open "open"
|
|
||||||
let open ${1:module} in
|
|
||||||
${2:e}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "try"
|
|
||||||
try ${1:e}
|
|
||||||
with ${2:Not_found} -> ${3:()}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ref "ref"
|
|
||||||
let ${1:name} = ref ${2:val} in
|
|
||||||
${3:e}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet matchl "pattern match on a list"
|
|
||||||
match ${1:list} with
|
|
||||||
| [] -> ${2:()}
|
|
||||||
| x::xs -> ${3:()}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet matcho "pattern match on an option type"
|
|
||||||
match ${1:x} with
|
|
||||||
| Some(${2:y}) -> ${3:()}
|
|
||||||
| None -> ${4:()}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fun "anonymous function"
|
|
||||||
(fun ${1:x} -> ${2:x})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cc "commment"
|
|
||||||
(* ${1:comment} *)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet let "let .. in binding"
|
|
||||||
let ${1:x} = ${2:v} in
|
|
||||||
${3:e}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lr "let rec"
|
|
||||||
let rec ${1:f} =
|
|
||||||
${2:expr}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if"
|
|
||||||
if ${1:(* condition *)} then
|
|
||||||
${2:(* A *)}
|
|
||||||
else
|
|
||||||
${3:(* B *)}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet If "If"
|
|
||||||
if ${1:(* condition *)} then
|
|
||||||
${2:(* A *)}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet while "while"
|
|
||||||
while ${1:(* condition *)} do
|
|
||||||
${2:(* A *)}
|
|
||||||
done
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for"
|
|
||||||
for ${1:i} = ${2:1} to ${3:10} do
|
|
||||||
${4:(* BODY *)}
|
|
||||||
done
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet match "match"
|
|
||||||
match ${1:(* e1 *)} with
|
|
||||||
| ${2:p} -> ${3:e2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Match "match"
|
|
||||||
match ${1:(* e1 *)} with
|
|
||||||
| ${2:p} -> ${3:e2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet class "class"
|
|
||||||
class ${1:name} = object
|
|
||||||
${2:methods}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet obj "obj"
|
|
||||||
object
|
|
||||||
${2:methods}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Obj "object"
|
|
||||||
object (self)
|
|
||||||
${2:methods}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet {{ "object functional update"
|
|
||||||
{< ${1:x} = ${2:y} >}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet beg "beg"
|
|
||||||
begin
|
|
||||||
${1:block}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ml "module instantiantion with functor"
|
|
||||||
module ${1:Mod} = ${2:Functor}(${3:Arg})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mod "module - no signature"
|
|
||||||
module ${1:(* Name *)} = struct
|
|
||||||
${2:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Mod "module with signature"
|
|
||||||
module ${1:(* Name *)} : ${2:(* SIG *)} = struct
|
|
||||||
${3:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sig "anonymous signature"
|
|
||||||
sig
|
|
||||||
${2:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sigf "functor signature or anonymous functor"
|
|
||||||
functor (${1:Arg} : ${2:ARG}) -> ${3:(* BODY *)}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet func "define functor - no signature"
|
|
||||||
module ${1:M} (${2:Arg} : ${3:ARG}) = struct
|
|
||||||
${4:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet Func "define functor - with signature"
|
|
||||||
module ${1:M} (${2:Arg} : ${3:ARG}) : ${4:SIG} = struct
|
|
||||||
${5:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mot "Declare module signature"
|
|
||||||
module type ${1:(* Name *)} = sig
|
|
||||||
${2:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet module "Module with anonymous signature"
|
|
||||||
module ${1:(* Name *)} : sig
|
|
||||||
${2:(* SIGNATURE *)}
|
|
||||||
end = struct
|
|
||||||
${3:(* BODY *)}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet oo "odoc"
|
|
||||||
(** ${1:odoc} *)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet qt "inline qtest"
|
|
||||||
(*$T ${1:name}
|
|
||||||
${2:test}
|
|
||||||
*)
|
|
||||||
endsnippet
|
|
||||||
@ -1,132 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
snippet ife "Conditional if..else (ife)"
|
|
||||||
if ($1) {
|
|
||||||
${2:# body...}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
${3:# else...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifee "Conditional if..elsif..else (ifee)"
|
|
||||||
if ($1) {
|
|
||||||
${2:# body...}
|
|
||||||
}
|
|
||||||
elsif ($3) {
|
|
||||||
${4:# elsif...}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
${5:# else...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xunless "Conditional one-line (unless)"
|
|
||||||
${1:expression} unless ${2:condition};
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xif "Conditional one-line (xif)"
|
|
||||||
${1:expression} if ${2:condition};
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sub "Function (sub)"
|
|
||||||
sub ${1:function_name} {
|
|
||||||
${2:# body...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xfore "Loop one-line (xforeach)"
|
|
||||||
${1:expression} foreach @${2:array};
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xwhile "Loop one-line (xwhile)"
|
|
||||||
${1:expression} while ${2:condition};
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet test "Test"
|
|
||||||
#!/usr/bin/env perl -w
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Test::More tests => ${1:1};
|
|
||||||
use ${2:ModuleName};
|
|
||||||
|
|
||||||
ok(${3:assertion});
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet class "class"
|
|
||||||
package ${1:ClassName};
|
|
||||||
|
|
||||||
${2:use parent qw(${3:ParentClass});}${2/.+/\n\n/}sub new {
|
|
||||||
my $class = shift;
|
|
||||||
$class = ref $class if ref $class;
|
|
||||||
my $self = bless {}, $class;
|
|
||||||
$self;
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eval "eval"
|
|
||||||
local $@;
|
|
||||||
eval {
|
|
||||||
${1:# do something risky...}
|
|
||||||
};
|
|
||||||
if (my $${2:exception} = $@) {
|
|
||||||
${3:# handle failure...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for"
|
|
||||||
for (my $${1:var} = 0; $$1 < ${2:expression}; $$1++) {
|
|
||||||
${3:# body...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fore "foreach"
|
|
||||||
foreach ${1:my $${2:x}} (@${3:array}) {
|
|
||||||
${4:# body...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if"
|
|
||||||
if ($1) {
|
|
||||||
${2:# body...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet slurp "slurp"
|
|
||||||
my $${1:var} = do { local $/ = undef; open my $fh, '<', ${2:$file}; <$fh> };
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet unless "unless"
|
|
||||||
unless ($1) {
|
|
||||||
${2:# body...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet while "while"
|
|
||||||
while ($1) {
|
|
||||||
${2:# body...}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,264 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
## Snippets from SnipMate, taken from
|
|
||||||
## https://github.com/scrooloose/snipmate-snippets.git
|
|
||||||
|
|
||||||
snippet array "array"
|
|
||||||
$${1:arrayName} = array('${2}' => ${3});${4}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet def "def"
|
|
||||||
define('${1}'${2});${3}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet do "do"
|
|
||||||
do {
|
|
||||||
${2:// code... }
|
|
||||||
} while (${1:/* condition */});"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doc_f "doc_f"
|
|
||||||
/**
|
|
||||||
* $2
|
|
||||||
* @return ${4:void}
|
|
||||||
* @author ${5:`!v g:snips_author`}
|
|
||||||
**/
|
|
||||||
${1:public }function ${2:someFunc}(${3})
|
|
||||||
{${6}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet doc_i "doc_i"
|
|
||||||
/**
|
|
||||||
* $1
|
|
||||||
* @package ${2:default}
|
|
||||||
* @author ${3:`!v g:snips_author`}
|
|
||||||
**/
|
|
||||||
interface ${1:someClass}
|
|
||||||
{${4}
|
|
||||||
} // END interface $1"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet else "else"
|
|
||||||
else {
|
|
||||||
${1:// code...}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for"
|
|
||||||
for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {
|
|
||||||
${4:// code...}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet foreachk "foreachk"
|
|
||||||
foreach ($${1:variable} as $${2:key} => $${3:value}){
|
|
||||||
${4:// code...}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet get "get"
|
|
||||||
$_GET['${1}']${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if"
|
|
||||||
if (${1:/* condition */}) {
|
|
||||||
${2:// code...}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inc "inc"
|
|
||||||
include '${1:file}';${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet log "log"
|
|
||||||
error_log(var_export(${1}, true));${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet post "post"
|
|
||||||
$_POST['${1}']${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet req1 "req1"
|
|
||||||
require_once '${1:file}';${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet session "session"
|
|
||||||
$_SESSION['${1}']${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t "t"
|
|
||||||
$${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b};${5}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet var "var"
|
|
||||||
var_export(${1});${2}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet getter "PHP Class Getter" b
|
|
||||||
/*
|
|
||||||
* Getter for $1
|
|
||||||
*/
|
|
||||||
public function get${1/\w+\s*/\u$0/}()
|
|
||||||
{
|
|
||||||
return $this->$1;$2
|
|
||||||
}
|
|
||||||
$4
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet setter "PHP Class Setter" b
|
|
||||||
/*
|
|
||||||
* Setter for $1
|
|
||||||
*/
|
|
||||||
public function set${1/\w+\s*/\u$0/}($$1)
|
|
||||||
{
|
|
||||||
$this->$1 = $$1;$3
|
|
||||||
${4:return $this;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet gs "PHP Class Getter Setter" b
|
|
||||||
/*
|
|
||||||
* Getter for ${1/(\w+)\s*;/$1/}
|
|
||||||
*/
|
|
||||||
public function get${1/(\w+)\s*;/\u$1/}()
|
|
||||||
{
|
|
||||||
return $this->${1/(\w+)\s*;/$1/};$2
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setter for ${1/(\w+)\s*;/$1/}
|
|
||||||
*/
|
|
||||||
public function set${1/(\w+)\s*;/\u$1/}($${1/(\w+)\s*;/$1/})
|
|
||||||
{
|
|
||||||
$this->${1/(\w+)\s*;/$1/} = $${1/(\w+)\s*;/$1/};$3
|
|
||||||
${4:return $this;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pub "Public function" b
|
|
||||||
public function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pro "Protected function" b
|
|
||||||
protected function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pri "Private function" b
|
|
||||||
private function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pubs "Public static function" b
|
|
||||||
public static function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pros "Protected static function" b
|
|
||||||
protected static function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pris "Private static function" b
|
|
||||||
private static function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fu "Function snip" b
|
|
||||||
function ${1:name}(${2:$param})
|
|
||||||
{
|
|
||||||
${VISUAL}${3:return null;}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fore "Foreach loop"
|
|
||||||
foreach ($${1:variable} as $${3:value}){
|
|
||||||
${VISUAL}${4}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet new "New class instance" b
|
|
||||||
$$1 = new $1($2);
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "if else"
|
|
||||||
if (${1:/* condition */}) {
|
|
||||||
${2:// code...}
|
|
||||||
} else {
|
|
||||||
${3:// code...}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet class "Class declaration template" b
|
|
||||||
/**
|
|
||||||
* Class ${1:`!p snip.rv=snip.fn.split('.')[0]`}
|
|
||||||
* @author ${2:`!v g:snips_author`}
|
|
||||||
*/
|
|
||||||
class $1
|
|
||||||
{
|
|
||||||
public function ${3:__construct}(${4:$options})
|
|
||||||
{
|
|
||||||
${4:// code}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet construct "__construct()" b
|
|
||||||
/**
|
|
||||||
* @param $2mixed ${1/, /\n * \@param mixed /g}
|
|
||||||
*/
|
|
||||||
public function __construct(${1:$dependencies})
|
|
||||||
{${1/\$(\w+)(, )*/\n $this->$1 = $$1;/g}
|
|
||||||
}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pr "Dumb debug helper in HTML"
|
|
||||||
echo '<pre>' . var_export($1, 1) . '</pre>';$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pc "Dumb debug helper in cli"
|
|
||||||
var_export($1);$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# Symfony 2 based snippets
|
|
||||||
snippet sfa "Symfony 2 Controller action"
|
|
||||||
/**
|
|
||||||
* @Route("/${1:route_name}", name="$1")
|
|
||||||
* @Template()
|
|
||||||
*/
|
|
||||||
public function $1Action($2)
|
|
||||||
{
|
|
||||||
$3
|
|
||||||
return ${4:array();}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# :vim:ft=snippets:
|
|
||||||
@ -1,232 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
# Python helper code #
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
global !p
|
|
||||||
import vim
|
|
||||||
import os.path
|
|
||||||
def get_module_namespace_and_basename():
|
|
||||||
"""This function will try to guess the current class or define name you are
|
|
||||||
trying to create. Note that for this to work you should be using the module
|
|
||||||
structure as per the style guide. Examples inputs and it's output
|
|
||||||
* /home/nikolavp/puppet/modules/collectd/manifests/init.pp -> collectd
|
|
||||||
* /home/nikolavp/puppet/modules/collectd/manfistes/mysql.pp -> collectd::mysql
|
|
||||||
"""
|
|
||||||
first_time = True
|
|
||||||
current_file_path_without_ext = vim.eval('expand("%:p:r")') or ""
|
|
||||||
if not current_file_path_without_ext:
|
|
||||||
return "name"
|
|
||||||
parts = os.path.split(current_file_path_without_ext)
|
|
||||||
namespace = ''
|
|
||||||
while parts[0] and parts[0] != '/':
|
|
||||||
if parts[1] == 'init' and first_time and not namespace:
|
|
||||||
first_time = False
|
|
||||||
parts = os.path.split(parts[0])
|
|
||||||
continue
|
|
||||||
if parts[1] == 'manifests':
|
|
||||||
return os.path.split(parts[0])[1] + ('::' + namespace).rstrip(':')
|
|
||||||
else:
|
|
||||||
namespace = parts[1] + '::' + namespace
|
|
||||||
parts = os.path.split(parts[0])
|
|
||||||
# couldn't guess the namespace. The user is editing a raw file in no module like the site.pp file
|
|
||||||
return "name"
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# Puppet Language Constructs #
|
|
||||||
# See http://docs.puppetlabs.com/puppet/latest/reference/lang_summary.html #
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
snippet class "Class declaration" b
|
|
||||||
class ${1:`!p snip.rv = get_module_namespace_and_basename()`} {
|
|
||||||
${0:# body}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet define "Definition" b
|
|
||||||
define ${1:`!p snip.rv = get_module_namespace_and_basename()`} {
|
|
||||||
${0:# body}
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
#################################################################
|
|
||||||
# Puppet Types #
|
|
||||||
# See http://docs.puppetlabs.com/references/latest/type.html #
|
|
||||||
#################################################################
|
|
||||||
|
|
||||||
snippet cron "Cron resource type" b
|
|
||||||
cron { '${1:name}':
|
|
||||||
user => ${2:user},
|
|
||||||
command => '${3:command}',
|
|
||||||
minute => ${3:minute},
|
|
||||||
hour => ${4:hour},
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet exec "Exec resource type" b
|
|
||||||
exec { '${1:command}':
|
|
||||||
refreshonly => true,
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet file "File resource type" b
|
|
||||||
file { '${1:name}':
|
|
||||||
source => "puppet://${2:path}",
|
|
||||||
mode => ${3:mode},
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet File "Defaults for file" b
|
|
||||||
File {
|
|
||||||
owner => ${1:username},
|
|
||||||
group => ${2:groupname},
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet group "Group resource type" b
|
|
||||||
group { '${1:groupname}':
|
|
||||||
ensure => ${3:present},
|
|
||||||
gid => ${2:gid},
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mount "Mount resource type" b
|
|
||||||
mount { '${1:path}':
|
|
||||||
device => '${2:/dev}',
|
|
||||||
fstype => '${3:filesystem}',
|
|
||||||
ensure => mounted,
|
|
||||||
options => 'rw,errors=remount-ro',
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet package "Package resource type" b
|
|
||||||
package { '${1:name}':
|
|
||||||
ensure => ${2:installed},
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet user "user resource type" b
|
|
||||||
user { '${1:username}':
|
|
||||||
ensure => ${2:present},
|
|
||||||
uid => ${3:uid},
|
|
||||||
gid => ${4:gid},
|
|
||||||
comment => ${5:gecos},
|
|
||||||
home => ${6:homedirectory},
|
|
||||||
managehome => false,
|
|
||||||
require => Group['${7:group'}],
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet service "Service resource type" b
|
|
||||||
service { '${1:name}':
|
|
||||||
hasstatus => true,
|
|
||||||
enable => true,
|
|
||||||
ensure => running,
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
########################################################################
|
|
||||||
# Puppet Functions #
|
|
||||||
# See http://docs.puppetlabs.com/references/latest/function.html #
|
|
||||||
########################################################################
|
|
||||||
|
|
||||||
snippet alert "Alert Function" b
|
|
||||||
alert("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet crit "Crit Function" b
|
|
||||||
crit("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet debug "Debug Function" b
|
|
||||||
debug("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet defined "Defined Function" b
|
|
||||||
defined(${1:Resource}["${2:name}"])${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet emerg "Emerg Function" b
|
|
||||||
emerg("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet extlookup "Simple Extlookup" b
|
|
||||||
$${1:Variable} = extlookup("${2:Lookup}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet extlookup "Extlookup with defaults" b
|
|
||||||
$${1:Variable} = extlookup("${2:Lookup}", ${3:Default})${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet extlookup "Extlookup with defaults and custom data file" b
|
|
||||||
$${1:Variable} = extlookup("${2:Lookup}", ${3:Default}, ${4:Data Source})${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fail "Fail Function" b
|
|
||||||
fail("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera "Hiera Function" b
|
|
||||||
$${1:Variable} = hiera("${2:Lookup}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera "Hiera with defaults" b
|
|
||||||
$${1:Variable} = hiera("${2:Lookup}", ${3:Default})${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera "Hiera with defaults and override" b
|
|
||||||
$${1:Variable} = hiera("${2:Lookup}", ${3:Default}, ${4:Override})${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera_hash "Hiera Hash Function" b
|
|
||||||
$${1:Variable} = hiera_hash("${2:Lookup}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera_hash "Hiera Hash with defaults" b
|
|
||||||
$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default})${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera_hash "Hiera Hash with defaults and override" b
|
|
||||||
$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default}, ${4:Override})${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hiera_include "Hiera Include Function" b
|
|
||||||
hiera_include("${1:Lookup}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet include "Include Function" b
|
|
||||||
include ${1:classname}${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet info "Info Function" b
|
|
||||||
info("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet inline_template "Inline Template Function" b
|
|
||||||
inline_template("<%= ${1:template} %>")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet notice "Notice Function" b
|
|
||||||
notice("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet realize "Realize Function" b
|
|
||||||
realize(${1:Resource}["${2:name}"])${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet regsubst "Regsubst Function" b
|
|
||||||
regsubst($${1:Target}, '${2:regexp}', '${3:replacement}')${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet split "Split Function" b
|
|
||||||
$${1:Variable} = split($${1:Target}, '${2:regexp}')${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet versioncmp "Version Compare Function" b
|
|
||||||
$${1:Variable} = versioncmp('${1:version}', '${2:version}')${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet warning "Warning Function" b
|
|
||||||
warning("${1:message}")${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,533 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TEXTMATE SNIPPETS #
|
|
||||||
###########################################################################
|
|
||||||
|
|
||||||
#! header
|
|
||||||
snippet #! "Shebang header for python scripts" b
|
|
||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifmain "ifmain" b
|
|
||||||
if __name__ == '__main__':
|
|
||||||
${1:main()}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for loop" b
|
|
||||||
for ${1:item} in ${2:iterable}:
|
|
||||||
${3:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
##########
|
|
||||||
# COMMON #
|
|
||||||
##########
|
|
||||||
|
|
||||||
# The smart def and smart class snippets use a global option called
|
|
||||||
# "g:ultisnips_python_style" which, if set to "doxygen" will use doxygen
|
|
||||||
# style comments in docstrings.
|
|
||||||
|
|
||||||
global !p
|
|
||||||
|
|
||||||
NORMAL = 0x1
|
|
||||||
DOXYGEN = 0x2
|
|
||||||
SPHINX = 0x3
|
|
||||||
|
|
||||||
SINGLE_QUOTES = 0x1
|
|
||||||
DOUBLE_QUOTES = 0x2
|
|
||||||
|
|
||||||
def get_args(arglist):
|
|
||||||
args = [arg.split('=')[0].strip() for arg in arglist.split(',') if arg]
|
|
||||||
args = [arg for arg in args if arg and arg != "self"]
|
|
||||||
|
|
||||||
return args
|
|
||||||
|
|
||||||
|
|
||||||
def get_quoting_style(snip):
|
|
||||||
style = snip.opt("g:ultisnips_python_quoting_style", "double")
|
|
||||||
if style == 'single':
|
|
||||||
return SINGLE_QUOTES
|
|
||||||
return DOUBLE_QUOTES
|
|
||||||
|
|
||||||
def tripple_quotes(snip):
|
|
||||||
if get_quoting_style(snip) == SINGLE_QUOTES:
|
|
||||||
return "'''"
|
|
||||||
return '"""'
|
|
||||||
|
|
||||||
def get_style(snip):
|
|
||||||
style = snip.opt("g:ultisnips_python_style", "normal")
|
|
||||||
|
|
||||||
if style == "doxygen": return DOXYGEN
|
|
||||||
elif style == "sphinx": return SPHINX
|
|
||||||
else: return NORMAL
|
|
||||||
|
|
||||||
|
|
||||||
def format_arg(arg, style):
|
|
||||||
if style == DOXYGEN:
|
|
||||||
return "@param %s @todo" % arg
|
|
||||||
elif style == SPHINX:
|
|
||||||
return ":param %s: @todo" % arg
|
|
||||||
elif style == NORMAL:
|
|
||||||
return ":%s: @todo" % arg
|
|
||||||
|
|
||||||
|
|
||||||
def format_return(style):
|
|
||||||
if style == DOXYGEN:
|
|
||||||
return "@return: @todo"
|
|
||||||
elif style in (NORMAL, SPHINX):
|
|
||||||
return ":returns: @todo"
|
|
||||||
|
|
||||||
|
|
||||||
def write_docstring_args(args, snip):
|
|
||||||
if not args:
|
|
||||||
snip.rv += ' {0}'.format(tripple_quotes(snip))
|
|
||||||
return
|
|
||||||
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
|
|
||||||
style = get_style(snip)
|
|
||||||
|
|
||||||
for arg in args:
|
|
||||||
snip += format_arg(arg, style)
|
|
||||||
|
|
||||||
|
|
||||||
def write_init_body(args, parents, snip):
|
|
||||||
parents = [p.strip() for p in parents.split(",")]
|
|
||||||
parents = [p for p in parents if p != 'object']
|
|
||||||
|
|
||||||
for p in parents:
|
|
||||||
snip += p + ".__init__(self)"
|
|
||||||
|
|
||||||
if parents:
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
|
|
||||||
for arg in args:
|
|
||||||
snip += "self._%s = %s" % (arg, arg)
|
|
||||||
|
|
||||||
|
|
||||||
def write_slots_args(args, snip):
|
|
||||||
args = ['"_%s"' % arg for arg in args]
|
|
||||||
snip += '__slots__ = (%s,)' % ', '.join(args)
|
|
||||||
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
########################################
|
|
||||||
# Class & Special Method Name Snippets #
|
|
||||||
########################################
|
|
||||||
|
|
||||||
snippet class "class with docstrings" b
|
|
||||||
class ${1:MyClass}(${2:object}):
|
|
||||||
|
|
||||||
`!p snip.rv = tripple_quotes(snip)`${3:Docstring for $1. }`!p snip.rv = tripple_quotes(snip)`
|
|
||||||
|
|
||||||
def __init__(self$4):
|
|
||||||
`!p snip.rv = tripple_quotes(snip)`${5:@todo: to be defined1.}`!p
|
|
||||||
snip.rv = ""
|
|
||||||
snip >> 2
|
|
||||||
|
|
||||||
args = get_args(t[4])
|
|
||||||
|
|
||||||
write_docstring_args(args, snip)
|
|
||||||
if args:
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
snip += '{0}'.format(tripple_quotes(snip))
|
|
||||||
|
|
||||||
write_init_body(args, t[2], snip)
|
|
||||||
`
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet slotclass "class with slots and docstrings" b
|
|
||||||
class ${1:MyClass}(${2:object}):
|
|
||||||
|
|
||||||
`!p snip.rv = tripple_quotes(snip)`${3:Docstring for $1. }`!p snip.rv = tripple_quotes(snip)`
|
|
||||||
`!p
|
|
||||||
snip >> 1
|
|
||||||
args = get_args(t[4])
|
|
||||||
write_slots_args(args, snip)
|
|
||||||
`
|
|
||||||
|
|
||||||
def __init__(self$4):
|
|
||||||
`!p snip.rv = tripple_quotes(snip)`${5:@todo: to be defined.}`!p
|
|
||||||
snip.rv = ""
|
|
||||||
snip >> 2
|
|
||||||
|
|
||||||
args = get_args(t[4])
|
|
||||||
|
|
||||||
write_docstring_args(args, snip)
|
|
||||||
if args:
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
snip += tripple_quotes(snip)
|
|
||||||
|
|
||||||
write_init_body(args, t[2], snip)
|
|
||||||
`
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet contain "methods for emulating a container type" b
|
|
||||||
def __len__(self):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
|
||||||
${2:pass}
|
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
|
||||||
${3:pass}
|
|
||||||
|
|
||||||
def __delitem__(self, key):
|
|
||||||
${4:pass}
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
${5:pass}
|
|
||||||
|
|
||||||
def __reversed__(self):
|
|
||||||
${6:pass}
|
|
||||||
|
|
||||||
def __contains__(self, item):
|
|
||||||
${7:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet context "context manager methods" b
|
|
||||||
def __enter__(self):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_value, traceback):
|
|
||||||
${2:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet attr "methods for customizing attribute access" b
|
|
||||||
def __getattr__(self, name):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
|
||||||
${2:pass}
|
|
||||||
|
|
||||||
def __delattr__(self, name):
|
|
||||||
${3:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet desc "methods implementing descriptors" b
|
|
||||||
def __get__(self, instance, owner):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __set__(self, instance, value):
|
|
||||||
${2:pass}
|
|
||||||
|
|
||||||
def __delete__(self, instance):
|
|
||||||
${3:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet cmp "methods implementing rich comparison"
|
|
||||||
def __eq__(self, other):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __ne__(self, other):
|
|
||||||
${2:pass}
|
|
||||||
|
|
||||||
def __lt__(self, other):
|
|
||||||
${3:pass}
|
|
||||||
|
|
||||||
def __le__(self, other):
|
|
||||||
${4:pass}
|
|
||||||
|
|
||||||
def __gt__(self, other):
|
|
||||||
${5:pass}
|
|
||||||
|
|
||||||
def __ge__(self, other):
|
|
||||||
${6:pass}
|
|
||||||
|
|
||||||
def __cmp__(self, other):
|
|
||||||
${7:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet repr "methods implementing string representation"
|
|
||||||
def __repr__(self):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
${2:pass}
|
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
${3:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# note: reflected operands and augmented arithmeitc assignements have been
|
|
||||||
# intentionally ommited to reduce verbosity.
|
|
||||||
snippet numeric "methods for emulating a numeric type" b
|
|
||||||
def __add__(self, other):
|
|
||||||
${1:pass}
|
|
||||||
|
|
||||||
def __sub__(self, other):
|
|
||||||
${2:pass}
|
|
||||||
|
|
||||||
def __mul__(self, other):
|
|
||||||
${3:pass}
|
|
||||||
|
|
||||||
def __div__(self, other):
|
|
||||||
${4:pass}
|
|
||||||
|
|
||||||
def __truediv__(self, other):
|
|
||||||
${5:pass}
|
|
||||||
|
|
||||||
def __floordiv__(self, other):
|
|
||||||
${6:pass}
|
|
||||||
|
|
||||||
|
|
||||||
def __mod__(self, other):
|
|
||||||
${7:pass}
|
|
||||||
|
|
||||||
def __divmod__(self, other):
|
|
||||||
${8:pass}
|
|
||||||
|
|
||||||
def __pow__(self, other):
|
|
||||||
${9:pass}
|
|
||||||
|
|
||||||
|
|
||||||
def __lshift__(self, other):
|
|
||||||
${10:pass}
|
|
||||||
|
|
||||||
def __rshift__(self, other):
|
|
||||||
${11:pass}
|
|
||||||
|
|
||||||
def __and__(self, other):
|
|
||||||
${12:pass}
|
|
||||||
|
|
||||||
def __xor__(self, other):
|
|
||||||
${13:pass}
|
|
||||||
|
|
||||||
def __or__(self, other):
|
|
||||||
${14:pass}
|
|
||||||
|
|
||||||
|
|
||||||
def __neg__(self):
|
|
||||||
${15:pass}
|
|
||||||
|
|
||||||
def __pos__(self):
|
|
||||||
${16:pass}
|
|
||||||
|
|
||||||
def __abs__(self):
|
|
||||||
${17:pass}
|
|
||||||
|
|
||||||
def __invert__(self):
|
|
||||||
${18:pass}
|
|
||||||
|
|
||||||
|
|
||||||
def __complex__(self):
|
|
||||||
${19:pass}
|
|
||||||
|
|
||||||
def __int__(self):
|
|
||||||
${20:pass}
|
|
||||||
|
|
||||||
def __long__(self):
|
|
||||||
${21:pass}
|
|
||||||
|
|
||||||
def __float__(self):
|
|
||||||
${22:pass}
|
|
||||||
|
|
||||||
|
|
||||||
def __oct__(self):
|
|
||||||
${22:pass}
|
|
||||||
|
|
||||||
def __hex__(self):
|
|
||||||
${23:pass}
|
|
||||||
|
|
||||||
|
|
||||||
def __index__(self):
|
|
||||||
${24:pass}
|
|
||||||
|
|
||||||
def __coerce__(self, other):
|
|
||||||
${25:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet def "function with docstrings" b
|
|
||||||
def ${1:function}(`!p
|
|
||||||
if snip.indent:
|
|
||||||
snip.rv = 'self' + (", " if len(t[2]) else "")`${2:arg1}):
|
|
||||||
`!p snip.rv = tripple_quotes(snip)`${4:@todo: Docstring for $1.}`!p
|
|
||||||
snip.rv = ""
|
|
||||||
snip >> 1
|
|
||||||
|
|
||||||
args = get_args(t[2])
|
|
||||||
if args:
|
|
||||||
write_docstring_args(args, snip)
|
|
||||||
|
|
||||||
style = get_style(snip)
|
|
||||||
snip += format_return(style)
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
snip += tripple_quotes(snip) `
|
|
||||||
${0:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
# doesn't expand when there is a word in front
|
|
||||||
snippet /(^|(?<=\W))\./ "self." r
|
|
||||||
self.
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet from "from module import name" b
|
|
||||||
from ${1:module} import ${2:Stuff}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
##############
|
|
||||||
# PROPERTIES #
|
|
||||||
##############
|
|
||||||
snippet roprop "Read Only Property" b
|
|
||||||
@property
|
|
||||||
def ${1:name}(self):
|
|
||||||
${2:return self._$1}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rwprop "Read write property" b
|
|
||||||
def ${1:name}():
|
|
||||||
`!p snip.rv = tripple_quotes(snip) if t[2] else ''
|
|
||||||
`${2:@todo: Docstring for $1.}`!p
|
|
||||||
if t[2]:
|
|
||||||
snip >> 1
|
|
||||||
|
|
||||||
style = get_style(snip)
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
snip += format_return(style)
|
|
||||||
snip.rv += '\n' + snip.mkline('', indent='')
|
|
||||||
snip += tripple_quotes(snip)
|
|
||||||
else:
|
|
||||||
snip.rv = ""`
|
|
||||||
def fget(self):
|
|
||||||
return self._$1$0
|
|
||||||
|
|
||||||
def fset(self, value):
|
|
||||||
self._$1 = value
|
|
||||||
return locals()
|
|
||||||
|
|
||||||
$1 = property(**$1(), doc=$1.__doc__)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
####################
|
|
||||||
# If / Else / Elif #
|
|
||||||
####################
|
|
||||||
snippet if "If" b
|
|
||||||
if ${1:condition}:
|
|
||||||
${2:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife "If / Else" b
|
|
||||||
if ${1:condition}:
|
|
||||||
${2:pass}
|
|
||||||
else:
|
|
||||||
${3:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ifee "If / Elif / Else" b
|
|
||||||
if ${1:condition}:
|
|
||||||
${2:pass}
|
|
||||||
elif ${3:condition}:
|
|
||||||
${4:pass}
|
|
||||||
else:
|
|
||||||
${5:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
##########################
|
|
||||||
# Try / Except / Finally #
|
|
||||||
##########################
|
|
||||||
snippet try "Try / Except" b
|
|
||||||
try:
|
|
||||||
${1:pass}
|
|
||||||
except ${2:Exception}, ${3:e}:
|
|
||||||
${4:raise $3}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "Try / Except / Else" b
|
|
||||||
try:
|
|
||||||
${1:pass}
|
|
||||||
except ${2:Exception}, ${3:e}:
|
|
||||||
${4:raise $3}
|
|
||||||
else:
|
|
||||||
${5:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "Try / Except / Finally" b
|
|
||||||
try:
|
|
||||||
${1:pass}
|
|
||||||
except ${2:Exception}, ${3:e}:
|
|
||||||
${4:raise $3}
|
|
||||||
finally:
|
|
||||||
${5:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet try "Try / Except / Else / Finally" b
|
|
||||||
try:
|
|
||||||
${1:pass}
|
|
||||||
except${2: ${3:Exception}, ${4:e}}:
|
|
||||||
${5:raise}
|
|
||||||
else:
|
|
||||||
${6:pass}
|
|
||||||
finally:
|
|
||||||
${7:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
#####################
|
|
||||||
# Assertions & Tests #
|
|
||||||
#####################
|
|
||||||
|
|
||||||
snippet pdb "Set PDB breakpoint" b
|
|
||||||
import pdb; pdb.set_trace()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ipdb "Set IPDB breakpoint" b
|
|
||||||
import ipdb; ipdb.set_trace()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pudb "Set PUDB breakpoint" b
|
|
||||||
import pudb; pudb.set_trace()
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ae "Assert equal" b
|
|
||||||
self.assertEqual(${1:first},${2:second})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet at "Assert True" b
|
|
||||||
self.assertTrue(${0:exp})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet af "Assert False" b
|
|
||||||
self.assertFalse(${1:expression})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aae "Assert almost equal" b
|
|
||||||
self.assertAlmostEqual(${1:first},${2:second})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ar "Assert raises" b
|
|
||||||
self.assertRaises(${1:exception}, ${2:func}${3/.+/, /}${3:arguments})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet testcase "pyunit testcase" b
|
|
||||||
class Test${1:Class}(${2:unittest.TestCase}):
|
|
||||||
|
|
||||||
`!p snip.rv = tripple_quotes(snip)`${3:Test case docstring.}`!p snip.rv = tripple_quotes(snip)`
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
${4:pass}
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
${5:pass}
|
|
||||||
|
|
||||||
def test_${6:name}(self):
|
|
||||||
${7:pass}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,904 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet anaf "accepts_nested_attributes_for"
|
|
||||||
accepts_nested_attributes_for :${1:association_name}${2:${3:, :allow_destroy => true}${4:, :reject_if => proc \{ |obj| ${5:obj.blank?} \}}}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcbi "Create binary column"
|
|
||||||
t.binary :${1:title}${2:, :limit => ${3:2}.megabytes}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcb "Create boolean column"
|
|
||||||
t.boolean :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cla "Create controller class"
|
|
||||||
class ${1:Model}Controller < ApplicationController
|
|
||||||
before_filter :find_${2:model}
|
|
||||||
|
|
||||||
$0
|
|
||||||
|
|
||||||
private
|
|
||||||
def find_${2}
|
|
||||||
@$2 = ${3:$1}.find(params[:id]) if params[:id]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcda "Create date column"
|
|
||||||
t.date :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcdt "Create datetime column"
|
|
||||||
t.datetime :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcd "Create decimal column"
|
|
||||||
t.decimal :${1:title}${2:${3:, :precision => ${4:10}}${5:, :scale => ${6:2}}}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcf "Create float column"
|
|
||||||
t.float :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cla "Create functional test class"
|
|
||||||
require 'test_helper'
|
|
||||||
|
|
||||||
class ${1:Model}ControllerTest < ActionController::TestCase
|
|
||||||
test$0
|
|
||||||
end
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tci "Create integer column"
|
|
||||||
t.integer :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcl "Create lock_version column"
|
|
||||||
t.integer :lock_version, :null => false, :default => 0
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# FIXME: handling literal bracket pair inside of nested tab groups?
|
|
||||||
snippet tcr "Create references column"
|
|
||||||
t.references :${1:taggable}${2:, :polymorphic => ${3:{ :default => '${4:Photo}' \}}}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet resources "Create resources controller class"
|
|
||||||
class ${1:Model}sController < ApplicationController
|
|
||||||
before_filter :find_${1/./\l$0/}, :only => [:show, :edit, :update, :destroy]
|
|
||||||
|
|
||||||
# GET /${1/./\l$0/}s
|
|
||||||
# GET /${1/./\l$0/}s.xml
|
|
||||||
def index
|
|
||||||
@${1/./\l$0/}s = ${1:Model}.all
|
|
||||||
|
|
||||||
respond_to do |wants|
|
|
||||||
wants.html # index.html.erb
|
|
||||||
wants.xml { render :xml => @${1/./\l$0/}s }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# GET /${1/./\l$0/}s/1
|
|
||||||
# GET /${1/./\l$0/}s/1.xml
|
|
||||||
def show
|
|
||||||
respond_to do |wants|
|
|
||||||
wants.html # show.html.erb
|
|
||||||
wants.xml { render :xml => @${1/./\l$0/} }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# GET /${1/./\l$0/}s/new
|
|
||||||
# GET /${1/./\l$0/}s/new.xml
|
|
||||||
def new
|
|
||||||
@${1/./\l$0/} = ${1:Model}.new
|
|
||||||
|
|
||||||
respond_to do |wants|
|
|
||||||
wants.html # new.html.erb
|
|
||||||
wants.xml { render :xml => @${1/./\l$0/} }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# GET /${1/./\l$0/}s/1/edit
|
|
||||||
def edit
|
|
||||||
end
|
|
||||||
|
|
||||||
# POST /${1/./\l$0/}s
|
|
||||||
# POST /${1/./\l$0/}s.xml
|
|
||||||
def create
|
|
||||||
@${1/./\l$0/} = ${1:Model}.new(params[:${1/./\l$0/}])
|
|
||||||
|
|
||||||
respond_to do |wants|
|
|
||||||
if @${1/./\l$0/}.save
|
|
||||||
flash[:notice] = '${1:Model} was successfully created.'
|
|
||||||
wants.html { redirect_to(@${1/./\l$0/}) }
|
|
||||||
wants.xml { render :xml => @${1/./\l$0/}, :status => :created, :location => @${1/./\l$0/} }
|
|
||||||
else
|
|
||||||
wants.html { render :action => "new" }
|
|
||||||
wants.xml { render :xml => @${1/./\l$0/}.errors, :status => :unprocessable_entity }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# PUT /${1/./\l$0/}s/1
|
|
||||||
# PUT /${1/./\l$0/}s/1.xml
|
|
||||||
def update
|
|
||||||
respond_to do |wants|
|
|
||||||
if @${1/./\l$0/}.update_attributes(params[:${1/./\l$0/}])
|
|
||||||
flash[:notice] = '${1:Model} was successfully updated.'
|
|
||||||
wants.html { redirect_to(@${1/./\l$0/}) }
|
|
||||||
wants.xml { head :ok }
|
|
||||||
else
|
|
||||||
wants.html { render :action => "edit" }
|
|
||||||
wants.xml { render :xml => @${1/./\l$0/}.errors, :status => :unprocessable_entity }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# DELETE /${1/./\l$0/}s/1
|
|
||||||
# DELETE /${1/./\l$0/}s/1.xml
|
|
||||||
def destroy
|
|
||||||
@${1/./\l$0/}.destroy
|
|
||||||
|
|
||||||
respond_to do |wants|
|
|
||||||
wants.html { redirect_to(${1/./\l$0/}s_url) }
|
|
||||||
wants.xml { head :ok }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def find_${1/./\l$0/}
|
|
||||||
@${1/./\l$0/} = ${1:Model}.find(params[:id])
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcs "Create string column"
|
|
||||||
t.string :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tct "Create text column"
|
|
||||||
t.text :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcti "Create time column"
|
|
||||||
t.time :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tcts "Create timestamp column"
|
|
||||||
t.timestamp :${1:title}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tctss "Create timestamps columns"
|
|
||||||
t.timestamps
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mcol "Migration Create Column (mcc)"
|
|
||||||
t.column ${1:title}, :${2:string}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mccc "Migration Create Column Continue (mccc)"
|
|
||||||
t.column ${1:title}, :${2:string}
|
|
||||||
mccc$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mtab "Migration Drop Create Table (mdct)"
|
|
||||||
drop_table :${1:table}${2: [press tab twice to generate create_table]}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mcol "Migration Remove and Add Column (mrac)"
|
|
||||||
remove_column :${1:table}, :${2:column}${3: [press tab twice to generate add_column]}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rdb "RAILS_DEFAULT_LOGGER.debug (rdb)"
|
|
||||||
RAILS_DEFAULT_LOGGER.debug "${1:message}"$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tre "Table column(s) rename"
|
|
||||||
t.rename(:${1:old_column_name}, :${2:new_column_name})
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet art "Test Assert Redirected To (art)"
|
|
||||||
assert_redirected_to ${2::action => "${1:index}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet asre "Test Assert Response (are)"
|
|
||||||
assert_response :${1:success}, @response.body$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aftc "after_create"
|
|
||||||
after_create $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aftd "after_destroy"
|
|
||||||
after_destroy $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet afts "after_save"
|
|
||||||
after_save $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aftu "after_update"
|
|
||||||
after_update $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aftv "after_validation"
|
|
||||||
after_validation $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aftvoc "after_validation_on_create"
|
|
||||||
after_validation_on_create $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet aftvou "after_validation_on_update"
|
|
||||||
after_validation_on_update $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet asg "assert(var = assigns(:var))"
|
|
||||||
assert(${1:var} = assigns(:${1}), "Cannot find @${1}")
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet asd "assert_difference"
|
|
||||||
assert_difference "${1:Model}.${2:count}", ${3:1} do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet asnd "assert_no_difference"
|
|
||||||
assert_no_difference "${1:Model}.${2:count}" do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet artnpp "assert_redirected_to (nested path plural)"
|
|
||||||
assert_redirected_to ${10:${2:parent}_${3:child}_path(${4:@}${5:${2}})}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet artnp "assert_redirected_to (nested path)"
|
|
||||||
assert_redirected_to ${2:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet artpp "assert_redirected_to (path plural)"
|
|
||||||
assert_redirected_to ${10:${2:model}s_path}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet artp "assert_redirected_to (path)"
|
|
||||||
assert_redirected_to ${2:${12:model}_path(${13:@}${14:${12}})}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet asrj "assert_rjs"
|
|
||||||
assert_rjs :${1:replace}, ${2:"${3:dom id}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ass "assert_select"
|
|
||||||
assert_select '${1:path}'${2:, :${3:text} => ${4:'${5:inner_html}'}}${6: do
|
|
||||||
$0
|
|
||||||
end}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befc "before_create"
|
|
||||||
before_create $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befd "before_destroy"
|
|
||||||
before_destroy $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befs "before_save"
|
|
||||||
before_save $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befu "before_update"
|
|
||||||
before_update $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befv "before_validation"
|
|
||||||
before_validation $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befvoc "before_validation_on_create"
|
|
||||||
before_validation_on_create $0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet befvou "before_validation_on_update"
|
|
||||||
before_validation_on_update
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet bt "belongs_to (bt)"
|
|
||||||
belongs_to :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:${1}_id}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet crw "cattr_accessor"
|
|
||||||
cattr_accessor :${0:attr_names}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet defcreate "def create - resource"
|
|
||||||
def create
|
|
||||||
@${1:model} = ${2:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}.new(params[:$1])
|
|
||||||
$0
|
|
||||||
respond_to do |wants|
|
|
||||||
if @$1.save
|
|
||||||
flash[:notice] = '$2 was successfully created.'
|
|
||||||
wants.html { redirect_to(@$1) }
|
|
||||||
wants.xml { render :xml => @$1, :status => :created, :location => @$1 }
|
|
||||||
else
|
|
||||||
wants.html { render :action => "new" }
|
|
||||||
wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet test "test do..end"
|
|
||||||
test "${1:something interesting}" do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet deftg "def get request"
|
|
||||||
def test_should_get_${1:action}
|
|
||||||
${2:@${3:model} = ${4:$3s}(:${5:fixture_name})
|
|
||||||
}get :${1}${6:, :id => @$3.to_param}
|
|
||||||
assert_response :success
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet deftp "def post request"
|
|
||||||
def test_should_post_${1:action}
|
|
||||||
${3:@$2 = ${4:$2s}(:${5:fixture_name})
|
|
||||||
}post :${1}${6:, :id => @$2.to_param}, :${2:model} => { $0 }
|
|
||||||
assert_response :redirect
|
|
||||||
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fina "find(:all)"
|
|
||||||
find(:all${1:, :conditions => ['${2:${3:field} = ?}', ${5:true}]})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet finf "find(:first)"
|
|
||||||
find(:first${1:, :conditions => ['${2:${3:field} = ?}', ${5:true}]})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fini "find(id)"
|
|
||||||
find(${1:id})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fine "find_each"
|
|
||||||
find_each(${1::conditions => {:${2:field} => ${3:true}\}}) do |${4:${TM_CURRENT_WORD/(\w+)\./\L$1/g}}|
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet finb "find_in_batches"
|
|
||||||
find_in_batches(${1::conditions => {:${2:field} => ${3:true}\}}) do |${4:${TM_CURRENT_WORD/(\w+)\./\L$1/g}}s|
|
|
||||||
$4s.each do |$4|
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet habtm "has_and_belongs_to_many (habtm)"
|
|
||||||
has_and_belongs_to_many :${1:object}${2:, :join_table => "${3:table_name}", :foreign_key => "${4:${1}_id}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hm "has_many (hm)"
|
|
||||||
has_many :${1:object}s${2:, :class_name => "${1}", :foreign_key => "${4:reference}_id"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hmt "has_many (through)"
|
|
||||||
has_many :${1:objects}, :through => :${2:join_association}${3:, :source => :${4:${2}_table_foreign_key_to_${1}_table}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet hmd "has_many :dependent => :destroy"
|
|
||||||
has_many :${1:object}s${2:, :class_name => "${1}", :foreign_key => "${4:reference}_id"}, :dependent => :destroy$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ho "has_one (ho)"
|
|
||||||
has_one :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:${1}_id}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet logd "logger.debug"
|
|
||||||
${1:Rails.}logger.debug { "${1:message}" }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet loge "logger.error"
|
|
||||||
logger.error { "${1:message}" }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet logf "logger.fatal"
|
|
||||||
logger.fatal { "${1:message}" }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet logi "logger.info"
|
|
||||||
logger.info { "${1:message}" }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet logw "logger.warn"
|
|
||||||
logger.warn { "${1:message}" }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mp "map(&:sym_proc)"
|
|
||||||
map(&:${1:id})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mapca "map.catch_all"
|
|
||||||
${1:map}.catch_all "*${2:anything}", :controller => "${3:default}", :action => "${4:error}"
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet map "map.named_route"
|
|
||||||
${1:map}.${2:connect} '${3::controller/:action/:id}'
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mapr "map.resource"
|
|
||||||
${1:map}.resource :${2:resource}${10: do |${11:$2}|
|
|
||||||
$0
|
|
||||||
end}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet maprs "map.resources"
|
|
||||||
${1:map}.resources :${2:resource}${10: do |${11:$2}|
|
|
||||||
$0
|
|
||||||
end}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mapwo "map.with_options"
|
|
||||||
${1:map}.with_options :${2:controller} => '${3:thing}' do |${4:$3}|
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mrw "mattr_accessor"
|
|
||||||
mattr_accessor :${0:attr_names}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ncl "named_scope lambda"
|
|
||||||
named_scope :name, lambda { |${1:param}| { :conditions => ${3:['${4:${5:field} = ?}', ${6:$1}]} } }
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet nc "named_scope"
|
|
||||||
named_scope :name${1:, :joins => :${2:table}}, :conditions => ${3:['${4:${5:field} = ?}', ${6:true}]}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet dscope "default_scope"
|
|
||||||
default_scope ${1:order(${2:'${3:created_at DESC}'})}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet flash "flash[...]"
|
|
||||||
flash[:${1:notice}] = "${2:Successfully created...}"$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rea "redirect_to (action)"
|
|
||||||
redirect_to :action => "${1:index}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet reai "redirect_to (action, id)"
|
|
||||||
redirect_to :action => "${1:show}", :id => ${0:@item}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rec "redirect_to (controller)"
|
|
||||||
redirect_to :controller => "${1:items}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet reca "redirect_to (controller, action)"
|
|
||||||
redirect_to :controller => "${1:items}", :action => "${2:list}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet recai "redirect_to (controller, action, id)"
|
|
||||||
redirect_to :controller => "${1:items}", :action => "${2:show}", :id => ${0:@item}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet renpp "redirect_to (nested path plural)"
|
|
||||||
redirect_to(${2:${10:parent}_${11:child}_path(${12:@}${13:${10}})})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet renp "redirect_to (nested path)"
|
|
||||||
redirect_to(${2:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet repp "redirect_to (path plural)"
|
|
||||||
redirect_to(${2:${10:model}s_path})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rep "redirect_to (path)"
|
|
||||||
redirect_to(${2:${12:model}_path(${13:@}${14:${12}})})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet reb "redirect_to :back"
|
|
||||||
redirect_to :back
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ra "render (action)... (ra)"
|
|
||||||
render :action => "${1:action}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ral "render (action,layout) (ral)"
|
|
||||||
render :action => "${1:action}", :layout => "${2:layoutname}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rf "render (file) (rf)"
|
|
||||||
render :file => "${1:filepath}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rfu "render (file,use_full_path) (rfu)"
|
|
||||||
render :file => "${1:filepath}", :use_full_path => ${2:false}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ri "render (inline) (ri)"
|
|
||||||
render :inline => "${1:<%= 'hello' %>}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ril "render (inline,locals) (ril)"
|
|
||||||
render :inline => "${1:<%= 'hello' %>}", :locals => { ${2::name} => "${3:value}"$4 }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rit "render (inline,type) (rit)"
|
|
||||||
render :inline => "${1:<%= 'hello' %>}", :type => ${2::rxml}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rl "render (layout) (rl)"
|
|
||||||
render :layout => "${1:layoutname}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rn "render (nothing) (rn)"
|
|
||||||
render :nothing => ${1:true}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rns "render (nothing,status) (rns)"
|
|
||||||
render :nothing => ${1:true}, :status => ${2:401}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rt "render (text) (rt)"
|
|
||||||
render :text => "${1:text to render...}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rtl "render (text,layout) (rtl)"
|
|
||||||
render :text => "${1:text to render...}", :layout => "${2:layoutname}"
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rtlt "render (text,layout => true) (rtlt)"
|
|
||||||
render :text => "${1:text to render...}", :layout => ${2:true}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rts "render (text,status) (rts)"
|
|
||||||
render :text => "${1:text to render...}", :status => ${2:401}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ru "render (update)"
|
|
||||||
render :update do |${2:page}|
|
|
||||||
$2.$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet rest "respond_to"
|
|
||||||
respond_to do |wants|
|
|
||||||
wants.${1:html}${2: { $0 \}}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet resw "respond_with"
|
|
||||||
respond_with(${1:@${2:model}})${3: do |format|
|
|
||||||
format.${4:html} { $0 \}
|
|
||||||
end}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# FIXME
|
|
||||||
snippet returning "returning do |variable| ... end"
|
|
||||||
returning ${1:variable} do${2/(^(?<var>\s*[a-z_][a-zA-Z0-9_]*\s*)(,\g<var>)*,?\s*$)|.*/(?1: |)/}${2:v}${2/(^(?<var>\s*[a-z_][a-zA-Z0-9_]*\s*)(,\g<var>)*,?\s*$)|.*/(?1:|)/}
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.binary (tcbi)"
|
|
||||||
t.binary :${1:title}${2:, :limit => ${3:2}.megabytes}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.boolean (tcb)"
|
|
||||||
t.boolean :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.date (tcda)"
|
|
||||||
t.date :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.datetime (tcdt)"
|
|
||||||
t.datetime :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.decimal (tcd)"
|
|
||||||
t.decimal :${1:title}${2:${3:, :precision => ${4:10}}${5:, :scale => ${6:2}}}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.float (tcf)"
|
|
||||||
t.float :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.integer (tci)"
|
|
||||||
t.integer :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.lock_version (tcl)"
|
|
||||||
t.integer :lock_version, :null => false, :default => 0
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.references (tcr)"
|
|
||||||
t.references :${1:taggable}${2:, :polymorphic => ${3:{ :default => '${4:Photo}' \}}}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.rename (tre)"
|
|
||||||
t.rename(:${1:old_column_name}, :${2:new_column_name})
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.string (tcs)"
|
|
||||||
t.string :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.text (tct)"
|
|
||||||
t.text :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.time (tcti)"
|
|
||||||
t.time :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.timestamp (tcts)"
|
|
||||||
t.timestamp :${1:title}
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t. "t.timestamps (tctss)"
|
|
||||||
t.timestamps
|
|
||||||
t.$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vaoif "validates_acceptance_of if"
|
|
||||||
validates_acceptance_of :${1:terms}${2:${3:, :accept => "${4:1}"}${5:, :message => "${6:You must accept the terms of service}"}}, :if => proc { |obj| ${7:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vao "validates_acceptance_of"
|
|
||||||
validates_acceptance_of :${1:terms}${2:${3:, :accept => "${4:1}"}${5:, :message => "${6:You must accept the terms of service}"}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet va "validates_associated (va)"
|
|
||||||
validates_associated :${1:attribute}${2:, :on => :${3:create}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vaif "validates_associated if (vaif)"
|
|
||||||
validates_associated :${1:attribute}${2:, :on => :${3:create}, :if => proc { |obj| ${5:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vc "validates_confirmation_of (vc)"
|
|
||||||
validates_confirmation_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:should match confirmation}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vcif "validates_confirmation_of if (vcif)"
|
|
||||||
validates_confirmation_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:should match confirmation}", :if => proc { |obj| ${5:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ve "validates_exclusion_of (ve)"
|
|
||||||
validates_exclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not allowed}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet veif "validates_exclusion_of if (veif)"
|
|
||||||
validates_exclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not allowed}"}, :if => proc { |obj| ${7:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vfif "validates_format_of if"
|
|
||||||
validates_format_of :${1:attribute}, :with => /${2:^[${3:\w\d}]+\$}/${4:, :on => :${5:create}, :message => "${6:is invalid}"}, :if => proc { |obj| ${7:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vf "validates_format_of"
|
|
||||||
validates_format_of :${1:attribute}, :with => /${2:^[${3:\w\d}]+\$}/${4:, :on => :${5:create}, :message => "${6:is invalid}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet viif "validates_inclusion_of if"
|
|
||||||
validates_inclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not included in the list}"}, :if => proc { |obj| ${7:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vi "validates_inclusion_of"
|
|
||||||
validates_inclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not included in the list}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vl "validates_length_of (vl)"
|
|
||||||
validates_length_of :${1:attribute}, :within => ${2:3..20}${3:, :on => :${4:create}, :message => "${5:must be present}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vlif "validates_length_of if"
|
|
||||||
validates_length_of :${1:attribute}, :within => ${2:3..20}${3:, :on => :${4:create}, :message => "${5:must be present}"}, :if => proc { |obj| ${6:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vnif "validates_numericality_of if"
|
|
||||||
validates_numericality_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:is not a number}"}, :if => proc { |obj| ${5:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vn "validates_numericality_of"
|
|
||||||
validates_numericality_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:is not a number}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vp "validates_presence_of (vp)"
|
|
||||||
validates_presence_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:can't be blank}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vpif "validates_presence_of if (vpif) 2"
|
|
||||||
validates_presence_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:can't be blank}"}, :if => proc { |obj| ${5:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vu "validates_uniqueness_of (vu)"
|
|
||||||
validates_uniqueness_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:must be unique}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vuif "validates_uniqueness_of if (vuif)"
|
|
||||||
validates_uniqueness_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:must be unique}", :if => proc { |obj| ${6:obj.condition?} }}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet verify "verify -- render"
|
|
||||||
verify :only => [:$1], :method => :post, :render => {:status => 500, :text => "use HTTP-POST"}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet verify "verify -- redirect"
|
|
||||||
verify :only => [:$1], :session => :user, :params => :id, :redirect_to => {:action => '${2:index}'}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wants "wants_format"
|
|
||||||
wants.${1:js|xml|html}${2: { $0 \}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xdelete "xhr delete"
|
|
||||||
xhr :delete, :${1:destroy}, :id => ${2:1}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xget "xhr get"
|
|
||||||
xhr :get, :${1:show}${2:, :id => ${3:1}}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xpost "xhr post"
|
|
||||||
xhr :post, :${1:create}, :${2:object} => { $3 }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet xput "xhr put"
|
|
||||||
xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { $4 }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet finl "find(:last)"
|
|
||||||
find(:last${1:, :conditions => ['${2:${3:field} = ?}', ${5:true}]})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sweeper "Create sweeper class"
|
|
||||||
class ${1:Model}Sweeper < ActionController::Caching::Sweeper
|
|
||||||
observe ${1:Model}
|
|
||||||
|
|
||||||
def after_save(${1/./\l$0/})
|
|
||||||
expire_cache(${1/./\l$0/})
|
|
||||||
end
|
|
||||||
|
|
||||||
def after_destroy(${1/./\l$0/})
|
|
||||||
expire_cache(${1/./\l$0/})
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def expire_cache(${1/./\l$0/})
|
|
||||||
${0:expire_page ${1/./\l$0/}s_path
|
|
||||||
expire_page ${1/./\l$0/}_path(${1/./\l$0/})}
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet col "collection routes"
|
|
||||||
collection do
|
|
||||||
${1:get :${2:action}}
|
|
||||||
${3:put :${4:action}}
|
|
||||||
${5:post :${6:action}}
|
|
||||||
${7:delete :${8:action}}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet format "format (respond_with)"
|
|
||||||
format.${1:html|xml|json|js|any} { $0 }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet gem "gem"
|
|
||||||
gem '${1:name}'${2:${3:, "${4:1.0}"}${5:${6:, :require => ${7:"${8:$1}"}}${9:, :group => :${10:test}}}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet gemg "gem :git"
|
|
||||||
gem '${1:paperclip}', :git => "${2:git://github.com/thoughtbot/paperclip.git}"${3:, :branch => "${4:rails3}"}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet match "match"
|
|
||||||
match '${1:${2::controller}${3:/${4::action}${5:/${6::id}${7:(.:format)}}}}'${8: => '${9:$2}#${10:$4}'${11:, :as => :${12:$10}}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet member "member routes"
|
|
||||||
member do
|
|
||||||
${1:get :${2:action}}
|
|
||||||
${3:put :${4:action}}
|
|
||||||
${5:post :${6:action}}
|
|
||||||
${7:delete :${8:action}}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet res "resources"
|
|
||||||
resources :${1:posts}${2: do
|
|
||||||
$3
|
|
||||||
end}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scope "scope"
|
|
||||||
scope :${1:name}, ${2:joins(:${3:table}).}where(${4:'${5:$3.${6:field}} = ?', ${7:'${8:value}'}})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scopel "scope lambda"
|
|
||||||
scope :${1:name}, lambda { |${2:param}| ${3:where(${4::${5:field} => ${6:"${7:value}"}})} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet scopee "scope with extension"
|
|
||||||
scope :${1:name}, ${2:where(${3::${4:field} => ${5:'${6:value}'}})} do
|
|
||||||
def ${7:method_name}
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sb "scoped_by"
|
|
||||||
scoped_by_${1:attribute}(${2:id})
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet setup "setup do..end"
|
|
||||||
setup do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet trans "Translation snippet"
|
|
||||||
I18n.t('`!v substitute(substitute(substitute(@%, substitute(getcwd() . "/", "\/", "\\\\/", "g"), "", ""), "\\(\\.\\(html\\|js\\)\\.\\(haml\\|erb\\)\\|\\(_controller\\)\\?\\.rb\\)$", "", ""), "/", ".", "g")`.${2:${1/[^\w]/_/g}}${3}', :default => "${1:some_text}"${4})${5:$0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet route_spec
|
|
||||||
it 'routes to #${1:action}' do
|
|
||||||
${2:get}('/${3:url}').should route_to('`!v substitute(expand('%:t:r'), '_routing_spec$', '', '')`#$1'${4:, ${5:params}})${6}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# General Stuff #
|
|
||||||
###########################################################################
|
|
||||||
snippet part "Part" b
|
|
||||||
`!p snip.rv = len(t[1])*'#'`
|
|
||||||
${1:Part name}
|
|
||||||
`!p snip.rv = len(t[1])*'#'`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sec "Section" b
|
|
||||||
${1:Section name}
|
|
||||||
`!p snip.rv = len(t[1])*'='`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ssec "Subsection" b
|
|
||||||
${1:Section name}
|
|
||||||
`!p snip.rv = len(t[1])*'-'`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sssec "Subsubsection" b
|
|
||||||
${1:Section name}
|
|
||||||
`!p snip.rv = len(t[1])*'^'`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet chap "Chapter" b
|
|
||||||
`!p snip.rv = len(t[1])*'*'`
|
|
||||||
${1:Chapter name}
|
|
||||||
`!p snip.rv = len(t[1])*'*'`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet para "Paragraph" b
|
|
||||||
${1:Paragraph name}
|
|
||||||
`!p snip.rv = len(t[1])*'"'`
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# More Specialized Stuff. #
|
|
||||||
###########################################################################
|
|
||||||
snippet cb "Code Block" b
|
|
||||||
.. code-block:: ${1:lua}
|
|
||||||
|
|
||||||
${2:code}
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,570 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet "^#!" "#!/usr/bin/env ruby" r
|
|
||||||
#!/usr/bin/env ruby
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet "^# ?[uU][tT][fF]-?8" "# encoding: UTF-8" r
|
|
||||||
# encoding: UTF-8
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet If "<command> if <expression>"
|
|
||||||
${1:command} if ${0:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet Unless "<command> unless <expression>"
|
|
||||||
${1:command} unless ${0:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet if "if <condition> ... end"
|
|
||||||
if ${1:condition}
|
|
||||||
${2:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet ife "if <condition> ... else ... end"
|
|
||||||
if ${1:condition}
|
|
||||||
${2:# TODO}
|
|
||||||
else
|
|
||||||
${3:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet ifee "if <condition> ... elseif <condition> ... else ... end"
|
|
||||||
if ${1:condition}
|
|
||||||
${2:# TODO}
|
|
||||||
elsif ${3:condition}
|
|
||||||
${4:# TODO}
|
|
||||||
else
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet unless "unless <condition> ... end"
|
|
||||||
unless ${1:condition}
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet unlesse "unless <condition> ... else ... end"
|
|
||||||
unless ${1:condition}
|
|
||||||
${2:# TODO}
|
|
||||||
else
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet unlesee "unless <condition> ... elseif <condition> ... else ... end"
|
|
||||||
unless ${1:condition}
|
|
||||||
${2:# TODO}
|
|
||||||
elsif ${3:condition}
|
|
||||||
${4:# TODO}
|
|
||||||
else
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "\b(de)?f" "def <name>..." r
|
|
||||||
def ${1:function_name}${2: ${3:*args}}
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet defi "def initialize ..."
|
|
||||||
def initialize${1: ${2:*args}}
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet defr "def <name> ... rescue ..."
|
|
||||||
def ${1:function_name}${2: ${3:*args}}
|
|
||||||
${4:# TODO}
|
|
||||||
rescue
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet For "(<from>..<to>).each { |<i>| <block> }"
|
|
||||||
(${1:from}..${2:to}).each { |${3:i}| ${4:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet for "(<from>..<to>).each do |<i>| <block> end"
|
|
||||||
(${1:from}..${2:to}).each do |${3:i}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Merge!" ".merge!(<other_hash>) { |<key>,<oldval>,<newval>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.merge!(${1:other_hash}) { |${2:key},${3:oldval},${4:newval}| ${5:block} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.merge!" ".merge!(<other_hash>) do |<key>,<oldval>,<newval>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.merge!(${1:other_hash}) do |${2:key},${3:oldval},${4:newval}|
|
|
||||||
${0:block}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Del(ete)?_?if" ".delete_if { |<key>,<value>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.delete_if { |${1:key},${2:value}| ${3:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.del(ete)?_?if" ".delete_if do |<key>,<value>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.delete_if do |${1:key},${2:value}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Keep_?if" ".keep_if { |<key>,<value>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.keep_if { |${1:key},${2:value}| ${3:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.keep_?if" ".keep_if do <key>,<value>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.keep_if do |${1:key},${2:value}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Reject" ".reject { |<key>,<value>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.reject { |${1:key},${2:value}| ${3:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.reject" ".reject do <key>,<value>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.reject do |${1:key},${2:value}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Select" ".select { |<item>| <block>}" r
|
|
||||||
`!p snip.rv=match.group(1)`.select { |${1:item}| ${2:block} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.select" ".select do |<item>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.select do |${1:item}|
|
|
||||||
${0:block}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Sort" ".sort { |<a>,<b>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.sort { |${1:a},${2:b}| ${3:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.sort" ".sort do |<a>,<b>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.sort do |${1:a},${2:b}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Each_?k(ey)?" ".each_key { |<key>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_key { |${1:key}| ${2:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.each_?k(ey)?" ".each_key do |key| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_key do |${1:key}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Each_?val(ue)?" ".each_value { |<value>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_value { |${1:value}| ${2:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.each_?val(ue)?" ".each_value do |<value>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_value do |${1:value}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet Each "<elements>.each { |<element>| <block> }"
|
|
||||||
${1:elements}.each { |${2:${1/s$//}}| ${3:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet each "<elements>.each do |<element>| <block> end"
|
|
||||||
${1:elements}.each do |${2:${1/s$//}}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "each_?s(lice)?" "<array>.each_slice(n) do |slice| <block> end" r
|
|
||||||
${1:elements}.each_slice(${2:2}) do |${3:slice}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "Each_?s(lice)?" "<array>.each_slice(n) { |slice| <block> }" r
|
|
||||||
${1:elements}.each_slice(${2:2}) { |${3:slice}| ${0:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Map" ".map { |<element>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.map { |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`}| ${2:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.map" ".map do |<element>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.map do |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Rev(erse)?_?each" ".reverse_each { |<element>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.reverse_each { |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`}| ${2:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.rev(erse)?_?each" ".reverse_each do |<element>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.reverse_each do |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Each" ".each { |<element>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.each { |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`}| ${2:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.each" ".each do |<element>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.each do |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Each_?w(ith)?_?i(ndex)?" ".each_with_index { |<element>,<i>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_with_index { |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`},${2:i}| ${3:# TODO} }$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.each_?w(ith)?_?i(ndex)?" ".each_with_index do |<element>,<i>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_with_index do |${1:`!p
|
|
||||||
element_name = match.group(1).lstrip('$@')
|
|
||||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
|
||||||
try:
|
|
||||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
|
||||||
snip.rv = wmatch.group(1).lower()
|
|
||||||
except:
|
|
||||||
snip.rv = 'element'
|
|
||||||
`},${2:i}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Each_?p(air)?" ".each_pair { |<key>,<value>| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_pair { |${1:key},${2:value}| ${3:# TODO} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.each_?p(air)?" ".each_pair do |<key>,<value>| <block> end" r
|
|
||||||
`!p snip.rv=match.group(1)`.each_pair do |${1:key},${2:value}|
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.sub" ".sub(<expression>) { <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.sub(${1:expression}) { ${2:"replace_with"} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.gsub" ".gsub(<expression>) { <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.gsub(${1:expression}) { ${2:"replace_with"} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.index" ".index { |item| <block> }" r
|
|
||||||
`!p snip.rv=match.group(1)`.index { |${1:item}| ${2:block} }
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "(\S+)\.Index" ".index do |item| ... end" r
|
|
||||||
`!p snip.rv=match.group(1)`.index do |${1:item}|
|
|
||||||
${0:block}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet do "do |<key>| ... end" i
|
|
||||||
do |${1:args}|
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet Do "do ... end" i
|
|
||||||
do
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
snippet until "until <expression> ... end"
|
|
||||||
until ${1:expression}
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet Until "begin ... end until <expression>"
|
|
||||||
begin
|
|
||||||
${0:# TODO}
|
|
||||||
end until ${1:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet while "while <expression> ... end"
|
|
||||||
while ${1:expression}
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet While "begin ... end while <expression>"
|
|
||||||
begin
|
|
||||||
${0:# TODO}
|
|
||||||
end while ${1:expression}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "\b(r|attr)" "attr_reader :<attr_names>" r
|
|
||||||
attr_reader :${0:attr_names}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "\b(w|attr)" "attr_writer :<attr_names>" r
|
|
||||||
attr_writer :${0:attr_names}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "\b(rw|attr)" "attr_accessor :<attr_names>" r
|
|
||||||
attr_accessor :${0:attr_names}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet begin "begin ... rescue ... end"
|
|
||||||
begin
|
|
||||||
${1:# TODO}
|
|
||||||
rescue
|
|
||||||
${0:# TODO}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet begin "begin ... rescue ... else ... ensure ... end"
|
|
||||||
begin
|
|
||||||
${1:# Raise exception}
|
|
||||||
rescue Exception => e
|
|
||||||
puts e.message
|
|
||||||
puts e.backtrace.inspect
|
|
||||||
${2:# Rescue}
|
|
||||||
else
|
|
||||||
${3:# other exception}
|
|
||||||
ensure
|
|
||||||
${0:# always excute}
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet rescue
|
|
||||||
rescue Exception => e
|
|
||||||
puts e.message
|
|
||||||
puts e.backtrace.inspect
|
|
||||||
${0:# Rescue}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet "\b(case|sw(itch)?)" "case <variable> when <expression> ... end" r
|
|
||||||
case ${1:variable}
|
|
||||||
when ${2:expression}
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet alias "alias :<new_name> :<old_name>"
|
|
||||||
alias :${1:new_name} :${2:old_name}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet class "class <class_name> def initialize ... end end"
|
|
||||||
class ${1:class_name}
|
|
||||||
def initialize ${2:*args}
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet module "module"
|
|
||||||
module ${1:module_name}
|
|
||||||
$0
|
|
||||||
end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
snippet ###
|
|
||||||
=begin
|
|
||||||
$0
|
|
||||||
=end
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim: set ts=2 sw=2 expandtab:
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet /@?imp/ "@import '...';" br
|
|
||||||
@import '${1:file}';
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?inc/ "@include mixin(...);" br
|
|
||||||
@include ${1:mixin}(${2:arguments});
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?ext?/ "@extend %placeholder;" br
|
|
||||||
@extend %${1:placeholder};
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?mixin/ "@mixin (...) { ... }" br
|
|
||||||
@mixin ${1:name}(${2:arguments}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?fun/ "@function (...) { ... }" br
|
|
||||||
@function ${1:name}(${2:arguments}) {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?if/ "@if (...) { ... }" br
|
|
||||||
@if ${1:condition} {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /(} )?@?else/ "@else { ... }" br
|
|
||||||
@else ${1:condition} {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?for/ "@for loop" br
|
|
||||||
@for ${1:$i} from ${2:1} through ${3:3} {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?each/ "@each loop" br
|
|
||||||
@each ${1:$item} in ${2:item, item, item} {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet /@?while/ "@while loop" br
|
|
||||||
@while ${1:$i} ${2:>} ${3:0} {
|
|
||||||
${VISUAL}$0
|
|
||||||
}
|
|
||||||
endsnippet
|
|
||||||
@ -1,92 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
global !p
|
|
||||||
import vim
|
|
||||||
|
|
||||||
# Tests for the existence of a variable declared by Vim's filetype detection
|
|
||||||
# suggesting the type of shell script of the current file
|
|
||||||
def testShell(scope, shell):
|
|
||||||
return vim.eval("exists('" + scope + ":is_" + shell + "')")
|
|
||||||
|
|
||||||
# Loops over the possible variables, checking for global variables
|
|
||||||
# first since they indicate an override by the user.
|
|
||||||
def getShell():
|
|
||||||
for scope in ["g", "b"]:
|
|
||||||
for shell in ["bash", "posix", "sh", "kornshell"]:
|
|
||||||
if testShell(scope, shell) == "1":
|
|
||||||
if shell == "kornshell":
|
|
||||||
return "ksh"
|
|
||||||
if shell == "posix":
|
|
||||||
return "sh"
|
|
||||||
return shell
|
|
||||||
return "sh"
|
|
||||||
endglobal
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TextMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
snippet #!
|
|
||||||
`!p snip.rv = '#!/bin/' + getShell() + "\n\n" `
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet !env "#!/usr/bin/env (!env)"
|
|
||||||
`!p snip.rv = '#!/usr/bin/env ' + getShell() + "\n\n" `
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet temp "Tempfile"
|
|
||||||
${1:TMPFILE}="$(mktemp -t ${2:`!p
|
|
||||||
snip.rv = re.sub(r'[^a-zA-Z]', '_', snip.fn) or "untitled"
|
|
||||||
`})"
|
|
||||||
${3:${4/(.+)/trap "/}${4:rm -f '$${1/.*\s//}'}${4/(.+)/" 0 # EXIT\n/}${5/(.+)/trap "/}${5:rm -f '$${1/.*\s//}'; exit 1}${5/(.+)/" 2 # INT\n/}${6/(.+)/trap "/}${6:rm -f '$${1/.*\s//}'; exit 1}${6/(.+)/" 1 15 # HUP TERM\n/}}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet case "case .. esac (case)"
|
|
||||||
case ${1:word} in
|
|
||||||
${2:pattern} )
|
|
||||||
$0;;
|
|
||||||
esac
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet elif "elif .. (elif)"
|
|
||||||
elif ${2:[[ ${1:condition} ]]}; then
|
|
||||||
${0:#statements}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for "for ... done (for)"
|
|
||||||
for (( i = 0; i < ${1:10}; i++ )); do
|
|
||||||
${0:#statements}
|
|
||||||
done
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet forin "for ... in ... done (forin)"
|
|
||||||
for ${1:i}${2/.+/ in /}${2:words}; do
|
|
||||||
${0:#statements}
|
|
||||||
done
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet here "here document (here)"
|
|
||||||
<<-${2:'${1:TOKEN}'}
|
|
||||||
$0
|
|
||||||
${1/['"`](.+)['"`]/$1/}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if ... then (if)"
|
|
||||||
if ${2:[[ ${1:condition} ]]}; then
|
|
||||||
${0:#statements}
|
|
||||||
fi
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet until "until ... (done)"
|
|
||||||
until ${2:[[ ${1:condition} ]]}; do
|
|
||||||
${0:#statements}
|
|
||||||
done
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet while "while ... (done)"
|
|
||||||
while ${2:[[ ${1:condition} ]]}; do
|
|
||||||
${0:#statements}
|
|
||||||
done
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
# We use a little hack so that the snippet is expanded
|
|
||||||
# and parsed correctly
|
|
||||||
snippet snip "Snippet definition" b
|
|
||||||
`!p snip.rv = "snippet"` ${1:Tab_trigger} "${2:Description}" ${3:b}
|
|
||||||
$0
|
|
||||||
`!p snip.rv = "endsnippet"`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet global "Global snippet" b
|
|
||||||
`!p snip.rv = "global"` !p
|
|
||||||
$0
|
|
||||||
`!p snip.rv = "endglobal"`
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet vis "${VISUAL}" i
|
|
||||||
\$\{VISUAL${1:${2:default}${3:/transform/}}\}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,52 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# TEXTMATE SNIPPETS #
|
|
||||||
###########################################################################
|
|
||||||
snippet for "for... (for)" b
|
|
||||||
for {${1:set i 0}} {${2:\$i < \$n}} {${3:incr i}} {
|
|
||||||
${4}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet foreach "foreach... (foreach)"
|
|
||||||
foreach ${1:var} ${2:\$list} {
|
|
||||||
${3}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if "if... (if)" b
|
|
||||||
if {${1:condition}} {
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet proc "proc... (proc)" b
|
|
||||||
proc ${1:name} {${2:args}} \
|
|
||||||
{
|
|
||||||
${3}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet switch "switch... (switch)" b
|
|
||||||
switch ${1:-exact} -- ${2:\$var} {
|
|
||||||
${3:match} {
|
|
||||||
${4}
|
|
||||||
}
|
|
||||||
default {${5}}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet while "while... (while)" b
|
|
||||||
while {${1:condition}} {
|
|
||||||
${2}
|
|
||||||
}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,110 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends texmath
|
|
||||||
|
|
||||||
snippet "b(egin)?" "begin{} / end{}" br
|
|
||||||
\begin{${1:something}}
|
|
||||||
${0:${VISUAL}}
|
|
||||||
\end{$1}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet tab
|
|
||||||
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
|
|
||||||
$0${2/((?<=.)c|l|r)|./(?1: & )/g}
|
|
||||||
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet fig "Figure environment" b
|
|
||||||
\begin{figure}${2:[htpb]}
|
|
||||||
\centering
|
|
||||||
\includegraphics[width=${3:0.8}\linewidth]{${4:name.ext}}
|
|
||||||
\caption{${4/(\w+)\.\w+/\u$1/}$0}
|
|
||||||
\label{fig:${4/(\w+)\.\w+/$1/}}
|
|
||||||
\end{figure}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet enum "Enumerate" b
|
|
||||||
\begin{enumerate}
|
|
||||||
\item $0
|
|
||||||
\end{enumerate}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet item "Itemize" b
|
|
||||||
\begin{itemize}
|
|
||||||
\item $0
|
|
||||||
\end{itemize}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet desc "Description" b
|
|
||||||
\begin{description}
|
|
||||||
\item[$1] $0
|
|
||||||
\end{description}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet it "Individual item" b
|
|
||||||
\item ${1}
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet part "Part" b
|
|
||||||
\part{${1:part name}}
|
|
||||||
\label{prt:${2:${1/(\w+)|\W+/(?1:\L$0\E:_)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet cha "Chapter" b
|
|
||||||
\chapter{${1:chapter name}}
|
|
||||||
\label{cha:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sec "Section" b
|
|
||||||
\section{${1:section name}}
|
|
||||||
\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet sub "Subsection" b
|
|
||||||
\subsection{${1:subsection name}}
|
|
||||||
\label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ssub "Subsubsection" b
|
|
||||||
\subsubsection{${1:subsubsection name}}
|
|
||||||
\label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet par "Paragraph" b
|
|
||||||
\paragraph{${1:paragraph name}}
|
|
||||||
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet subp "Subparagraph" b
|
|
||||||
\subparagraph{${1:subparagraph name}}
|
|
||||||
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
|
||||||
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ni "Non-indented paragraph" b
|
|
||||||
\noindent
|
|
||||||
${0}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet pac "Package" b
|
|
||||||
\usepackage[${1:options}]{${2:package}}$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lp "Long parenthesis"
|
|
||||||
\left(${1:${VISUAL:contents}}\right)$0
|
|
||||||
endsnippet
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,56 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
##############
|
|
||||||
# MATH STUFF #
|
|
||||||
##############
|
|
||||||
snippet eq "Equation" b
|
|
||||||
\begin{equation}
|
|
||||||
$0
|
|
||||||
\end{equation}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eqnn "Equation without number" b
|
|
||||||
\begin{equation*}
|
|
||||||
$0
|
|
||||||
\end{equation*}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eqa "Equation array" b
|
|
||||||
\begin{eqnarray}
|
|
||||||
$1 & $2 & $0
|
|
||||||
\end{eqnarray}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet eqann "Equation array without numbers" b
|
|
||||||
\begin{eqnarray*}
|
|
||||||
$1 & $2 & $0
|
|
||||||
\end{eqnarray*}
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
snippet frac "Fraction" w
|
|
||||||
\frac{${1:${VISUAL:nom}}}{${2:denom}}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet mat "Smart Matrix"
|
|
||||||
\begin{${1:p/b/v/V/B/small}matrix}
|
|
||||||
$0
|
|
||||||
\end{$1matrix}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lr( "left( right)" w
|
|
||||||
\left( ${1:${VISUAL}} \right)
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lr| "left| right|" w
|
|
||||||
\left| ${1:${VISUAL}} \right|
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lr{ "left\{ right\}" w
|
|
||||||
\left\\{ ${1:${VISUAL}} \right\\}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet lr[ "left[ right]" w
|
|
||||||
\left[ ${1:${VISUAL}} \right]
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
###########################################################################
|
|
||||||
# SnipMate Snippets #
|
|
||||||
###########################################################################
|
|
||||||
snippet header
|
|
||||||
" File: ${1:`!v expand('%:t')`}
|
|
||||||
" Author: ${2:`!v g:snips_author`}
|
|
||||||
" Description: ${3}
|
|
||||||
${4:" Last Modified: `!v strftime("%B %d, %Y")`}
|
|
||||||
|
|
||||||
$0
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet gvar "Global / configuration variable"
|
|
||||||
if !exists("g:${1:MyUltraImportantVar}")
|
|
||||||
let g:$1 = ${2:"${3:<tab>}"}
|
|
||||||
endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet guard
|
|
||||||
if exists('${1:did_`!p snip.rv = snip.fn.replace('.','_')`}') || &cp${2: || version < 700}
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let $1 = 1${3}
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet f
|
|
||||||
fun ${1:function_name}(${2})
|
|
||||||
${3:" code}
|
|
||||||
endf
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet for
|
|
||||||
for ${1:needle} in ${2:haystack}
|
|
||||||
${3:" code}
|
|
||||||
endfor
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet wh
|
|
||||||
while ${1:condition}
|
|
||||||
${2:" code}
|
|
||||||
endw
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet if
|
|
||||||
if ${1:condition}
|
|
||||||
${2:" code}
|
|
||||||
endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ife
|
|
||||||
if ${1:condition}
|
|
||||||
${2}
|
|
||||||
else
|
|
||||||
${3}
|
|
||||||
endif
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends html
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
snippet xml "XML declaration" b
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet t "Simple tag" b
|
|
||||||
<${1:tag}>
|
|
||||||
${2:content}
|
|
||||||
</${1/([\w:._-]+).*/$1/}>
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet ti "Inline tag" b
|
|
||||||
<${1:tag}>${2:content}</${1/([\w:._-]+).*/$1/}>
|
|
||||||
endsnippet
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
priority -50
|
|
||||||
|
|
||||||
extends sh
|
|
||||||
|
|
||||||
priority -49
|
|
||||||
|
|
||||||
snippet #! "shebang" b
|
|
||||||
#!/bin/zsh
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
snippet !env "#!/usr/bin/env (!env)" b
|
|
||||||
#!/usr/bin/env zsh
|
|
||||||
|
|
||||||
endsnippet
|
|
||||||
|
|
||||||
# vim:ft=snippets:
|
|
||||||
@ -1,13 +1,8 @@
|
|||||||
" File: UltiSnips_after.vim
|
" Called after everything else to reclaim keys (Needed for Supertab)
|
||||||
" Author: Holger Rapp <SirVer@gmx.de>
|
|
||||||
" Description: Called after everything else to reclaim keys (Needed for
|
|
||||||
" Supertab)
|
|
||||||
" Last Modified: July 27, 2009
|
|
||||||
|
|
||||||
if exists('did_UltiSnips_after') || &cp || version < 700
|
if exists("b:did_after_plugin_ultisnips_after") || !exists("g:_uspy")
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
let b:did_after_plugin_ultisnips_after = 1
|
||||||
|
|
||||||
call UltiSnips#map_keys#MapKeys()
|
call UltiSnips#map_keys#MapKeys()
|
||||||
|
|
||||||
let did_UltiSnips_after=1
|
|
||||||
|
|||||||
@ -1,40 +1,19 @@
|
|||||||
" File: UltiSnips.vim
|
if exists("b:did_autoload_ultisnips") || !exists("g:_uspy")
|
||||||
" Author: Holger Rapp <SirVer@gmx.de>
|
" Define no-op function, called via ftdetect/UltiSnips.vim.
|
||||||
" Description: The Ultimate Snippets solution for Vim
|
" TODO(sirver): Add a test for that using a bad g:UltiSnipsPythonVersion
|
||||||
|
" setting. Without this fix moving the cursor will spam errors, with this
|
||||||
|
" it should not.
|
||||||
|
function! UltiSnips#FileTypeChanged()
|
||||||
|
endfunction
|
||||||
|
|
||||||
if exists('did_UltiSnips_autoload') || &cp || version < 700
|
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
let b:did_autoload_ultisnips = 1
|
||||||
|
|
||||||
" Define dummy version of function called by autocommand setup in
|
" Also import vim as we expect it to be imported in many places.
|
||||||
" ftdetect/UltiSnips.vim. If the function isn't defined (probably due to
|
exec g:_uspy "import vim"
|
||||||
" using a copy of vim without python support) it will cause an error anytime a
|
exec g:_uspy "from UltiSnips import UltiSnips_Manager"
|
||||||
" new file is opened.
|
|
||||||
function! UltiSnips#FileTypeChanged()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if !exists("g:UltiSnipsUsePythonVersion")
|
|
||||||
let g:_uspy=":py3 "
|
|
||||||
if !has("python3")
|
|
||||||
if !has("python")
|
|
||||||
if !exists("g:UltiSnipsNoPythonWarning")
|
|
||||||
echo "UltiSnips requires py >= 2.6 or any py3"
|
|
||||||
endif
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:_uspy=":py "
|
|
||||||
endif
|
|
||||||
let g:UltiSnipsUsePythonVersion = "<tab>"
|
|
||||||
else
|
|
||||||
if g:UltiSnipsUsePythonVersion == 2
|
|
||||||
let g:_uspy=":py "
|
|
||||||
else
|
|
||||||
let g:_uspy=":py3 "
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTIONS {{{
|
|
||||||
function! s:compensate_for_pum()
|
function! s:compensate_for_pum()
|
||||||
""" The CursorMovedI event is not triggered while the popup-menu is visible,
|
""" The CursorMovedI event is not triggered while the popup-menu is visible,
|
||||||
""" and it's by this event that UltiSnips updates its vim-state. The fix is
|
""" and it's by this event that UltiSnips updates its vim-state. The fix is
|
||||||
@ -45,13 +24,17 @@ function! s:compensate_for_pum()
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! UltiSnips#Edit(...)
|
function! UltiSnips#Edit(bang, ...)
|
||||||
if a:0 == 1 && a:1 != ''
|
if a:0 == 1 && a:1 != ''
|
||||||
let type = a:1
|
let type = a:1
|
||||||
else
|
else
|
||||||
exec g:_uspy "vim.command(\"let type = '%s'\" % UltiSnips_Manager._primary_filetype)"
|
let type = ""
|
||||||
|
endif
|
||||||
|
exec g:_uspy "vim.command(\"let file = '%s'\" % UltiSnips_Manager._file_to_edit(vim.eval(\"type\"), vim.eval('a:bang')))"
|
||||||
|
|
||||||
|
if !len(file)
|
||||||
|
return
|
||||||
endif
|
endif
|
||||||
exec g:_uspy "vim.command(\"let file = '%s'\" % UltiSnips_Manager._file_to_edit(vim.eval(\"type\")))"
|
|
||||||
|
|
||||||
let mode = 'e'
|
let mode = 'e'
|
||||||
if exists('g:UltiSnipsEditSplit')
|
if exists('g:UltiSnipsEditSplit')
|
||||||
@ -59,9 +42,14 @@ function! UltiSnips#Edit(...)
|
|||||||
let mode = 'vs'
|
let mode = 'vs'
|
||||||
elseif g:UltiSnipsEditSplit == 'horizontal'
|
elseif g:UltiSnipsEditSplit == 'horizontal'
|
||||||
let mode = 'sp'
|
let mode = 'sp'
|
||||||
|
elseif g:UltiSnipsEditSplit == 'context'
|
||||||
|
let mode = 'vs'
|
||||||
|
if winwidth(0) <= 2 * (&tw ? &tw : 80)
|
||||||
|
let mode = 'sp'
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
exe ':'.mode.' '.file
|
exe ':'.mode.' '.escape(file, ' ')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! UltiSnips#AddFiletypes(filetypes)
|
function! UltiSnips#AddFiletypes(filetypes)
|
||||||
@ -101,9 +89,13 @@ function! UltiSnips#ListSnippets()
|
|||||||
return ""
|
return ""
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! UltiSnips#SnippetsInCurrentScope()
|
function! UltiSnips#SnippetsInCurrentScope(...)
|
||||||
let g:current_ulti_dict = {}
|
let g:current_ulti_dict = {}
|
||||||
exec g:_uspy "UltiSnips_Manager.snippets_in_current_scope()"
|
let all = get(a:, 1, 0)
|
||||||
|
if all
|
||||||
|
let g:current_ulti_dict_info = {}
|
||||||
|
endif
|
||||||
|
exec g:_uspy "UltiSnips_Manager.snippets_in_current_scope(" . all . ")"
|
||||||
return g:current_ulti_dict
|
return g:current_ulti_dict
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@ -131,18 +123,6 @@ function! UltiSnips#FileTypeChanged()
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! UltiSnips#AddSnippet(trigger, value, description, options, ...)
|
|
||||||
" Takes the same arguments as SnippetManager.add_snippet.
|
|
||||||
echoerr "Deprecated UltiSnips#AddSnippet called. Please use UltiSnips#AddSnippetWithPriority." | sleep 1
|
|
||||||
exec g:_uspy "args = vim.eval(\"a:000\")"
|
|
||||||
exec g:_uspy "trigger = vim.eval(\"a:trigger\")"
|
|
||||||
exec g:_uspy "value = vim.eval(\"a:value\")"
|
|
||||||
exec g:_uspy "description = vim.eval(\"a:description\")"
|
|
||||||
exec g:_uspy "options = vim.eval(\"a:options\")"
|
|
||||||
exec g:_uspy "UltiSnips_Manager.add_snippet(trigger, value, description, options, *args)"
|
|
||||||
return ""
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips#AddSnippetWithPriority(trigger, value, description, options, filetype, priority)
|
function! UltiSnips#AddSnippetWithPriority(trigger, value, description, options, filetype, priority)
|
||||||
exec g:_uspy "trigger = vim.eval(\"a:trigger\")"
|
exec g:_uspy "trigger = vim.eval(\"a:trigger\")"
|
||||||
exec g:_uspy "value = vim.eval(\"a:value\")"
|
exec g:_uspy "value = vim.eval(\"a:value\")"
|
||||||
@ -175,14 +155,8 @@ endf
|
|||||||
function! UltiSnips#LeavingInsertMode()
|
function! UltiSnips#LeavingInsertMode()
|
||||||
exec g:_uspy "UltiSnips_Manager._leaving_insert_mode()"
|
exec g:_uspy "UltiSnips_Manager._leaving_insert_mode()"
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! UltiSnips#TrackChange()
|
||||||
|
exec g:_uspy "UltiSnips_Manager._track_change()"
|
||||||
|
endfunction
|
||||||
" }}}
|
" }}}
|
||||||
|
|
||||||
" Expand our path
|
|
||||||
exec g:_uspy "import vim, os, sys"
|
|
||||||
exec g:_uspy "new_path = os.path.abspath(os.path.join(
|
|
||||||
\ vim.eval('expand(\"<sfile>:h\")'), '..', 'pythonx'))"
|
|
||||||
exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)"
|
|
||||||
exec g:_uspy "if not hasattr(vim, 'VIM_SPECIAL_PATH'): sys.path.append(new_path)"
|
|
||||||
exec g:_uspy "from UltiSnips import UltiSnips_Manager"
|
|
||||||
|
|
||||||
let did_UltiSnips_autoload=1
|
|
||||||
|
|||||||
@ -1,38 +1,72 @@
|
|||||||
call UltiSnips#variables#WasRun()
|
if exists("b:did_autoload_ultisnips_map_keys") || !exists("g:_uspy")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_autoload_ultisnips_map_keys = 1
|
||||||
|
|
||||||
|
" The trigger used to expand a snippet.
|
||||||
|
" NOTE: expansion and forward jumping can, but needn't be the same trigger
|
||||||
|
if !exists("g:UltiSnipsExpandTrigger")
|
||||||
|
let g:UltiSnipsExpandTrigger = "<tab>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
" The trigger used to display all triggers that could possible
|
||||||
|
" match in the current position.
|
||||||
|
if !exists("g:UltiSnipsListSnippets")
|
||||||
|
let g:UltiSnipsListSnippets = "<c-tab>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
" The trigger used to jump forward to the next placeholder.
|
||||||
|
" NOTE: expansion and forward jumping can be the same trigger.
|
||||||
|
if !exists("g:UltiSnipsJumpForwardTrigger")
|
||||||
|
let g:UltiSnipsJumpForwardTrigger = "<c-j>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
" The trigger to jump backward inside a snippet
|
||||||
|
if !exists("g:UltiSnipsJumpBackwardTrigger")
|
||||||
|
let g:UltiSnipsJumpBackwardTrigger = "<c-k>"
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Should UltiSnips unmap select mode mappings automagically?
|
||||||
|
if !exists("g:UltiSnipsRemoveSelectModeMappings")
|
||||||
|
let g:UltiSnipsRemoveSelectModeMappings = 1
|
||||||
|
end
|
||||||
|
|
||||||
|
" If UltiSnips should remove Mappings, which should be ignored
|
||||||
|
if !exists("g:UltiSnipsMappingsToIgnore")
|
||||||
|
let g:UltiSnipsMappingsToIgnore = []
|
||||||
|
endif
|
||||||
|
|
||||||
|
" UltiSnipsEdit will use this variable to decide if a new window
|
||||||
|
" is opened when editing. default is "normal", allowed are also
|
||||||
|
" "vertical", "horizontal", and "context".
|
||||||
|
if !exists("g:UltiSnipsEditSplit")
|
||||||
|
let g:UltiSnipsEditSplit = 'normal'
|
||||||
|
endif
|
||||||
|
|
||||||
|
" A list of directory names that are searched for snippets.
|
||||||
|
if !exists("g:UltiSnipsSnippetDirectories")
|
||||||
|
let g:UltiSnipsSnippetDirectories = [ "UltiSnips" ]
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Enable or Disable snipmate snippet expansion.
|
||||||
|
if !exists("g:UltiSnipsEnableSnipMate")
|
||||||
|
let g:UltiSnipsEnableSnipMate = 1
|
||||||
|
endif
|
||||||
|
|
||||||
function! UltiSnips#map_keys#MapKeys()
|
function! UltiSnips#map_keys#MapKeys()
|
||||||
" Map the keys correctly
|
|
||||||
if g:UltiSnipsExpandTrigger == g:UltiSnipsJumpForwardTrigger
|
if g:UltiSnipsExpandTrigger == g:UltiSnipsJumpForwardTrigger
|
||||||
|
|
||||||
exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=UltiSnips#ExpandSnippetOrJump()<cr>"
|
exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=UltiSnips#ExpandSnippetOrJump()<cr>"
|
||||||
exec "snoremap <silent> " . g:UltiSnipsExpandTrigger . " <Esc>:call UltiSnips#ExpandSnippetOrJump()<cr>"
|
exec "snoremap <silent> " . g:UltiSnipsExpandTrigger . " <Esc>:call UltiSnips#ExpandSnippetOrJump()<cr>"
|
||||||
else
|
else
|
||||||
exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=UltiSnips#ExpandSnippet()<cr>"
|
exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=UltiSnips#ExpandSnippet()<cr>"
|
||||||
exec "snoremap <silent> " . g:UltiSnipsExpandTrigger . " <Esc>:call UltiSnips#ExpandSnippet()<cr>"
|
exec "snoremap <silent> " . g:UltiSnipsExpandTrigger . " <Esc>:call UltiSnips#ExpandSnippet()<cr>"
|
||||||
endif
|
endif
|
||||||
exec 'xnoremap ' . g:UltiSnipsExpandTrigger. ' :call UltiSnips#SaveLastVisualSelection()<cr>gvs'
|
exec "xnoremap <silent> " . g:UltiSnipsExpandTrigger. " :call UltiSnips#SaveLastVisualSelection()<cr>gvs"
|
||||||
exec "inoremap <silent> " . g:UltiSnipsListSnippets . " <C-R>=UltiSnips#ListSnippets()<cr>"
|
exec "inoremap <silent> " . g:UltiSnipsListSnippets . " <C-R>=UltiSnips#ListSnippets()<cr>"
|
||||||
exec "snoremap <silent> " . g:UltiSnipsListSnippets . " <Esc>:call UltiSnips#ListSnippets()<cr>"
|
exec "snoremap <silent> " . g:UltiSnipsListSnippets . " <Esc>:call UltiSnips#ListSnippets()<cr>"
|
||||||
|
|
||||||
snoremap <silent> <BS> <c-g>c
|
snoremap <silent> <BS> <c-g>c
|
||||||
snoremap <silent> <DEL> <c-g>c
|
snoremap <silent> <DEL> <c-g>c
|
||||||
snoremap <silent> <c-h> <c-g>c
|
snoremap <silent> <c-h> <c-g>c
|
||||||
endf
|
snoremap <c-r> <c-g>"_c<c-r>
|
||||||
|
|
||||||
function! UltiSnips#map_keys#MapInnerKeys()
|
|
||||||
if g:UltiSnipsExpandTrigger != g:UltiSnipsJumpForwardTrigger
|
|
||||||
exec "inoremap <buffer> <silent> " . g:UltiSnipsJumpForwardTrigger . " <C-R>=UltiSnips#JumpForwards()<cr>"
|
|
||||||
exec "snoremap <buffer> <silent> " . g:UltiSnipsJumpForwardTrigger . " <Esc>:call UltiSnips#JumpForwards()<cr>"
|
|
||||||
endif
|
|
||||||
exec "inoremap <buffer> <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=UltiSnips#JumpBackwards()<cr>"
|
|
||||||
exec "snoremap <buffer> <silent> " . g:UltiSnipsJumpBackwardTrigger . " <Esc>:call UltiSnips#JumpBackwards()<cr>"
|
|
||||||
endf
|
|
||||||
|
|
||||||
function! UltiSnips#map_keys#RestoreInnerKeys()
|
|
||||||
if g:UltiSnipsExpandTrigger != g:UltiSnipsJumpForwardTrigger
|
|
||||||
exec "iunmap <buffer> " . g:UltiSnipsJumpForwardTrigger
|
|
||||||
exec "sunmap <buffer> " . g:UltiSnipsJumpForwardTrigger
|
|
||||||
endif
|
|
||||||
exec "iunmap <buffer> " . g:UltiSnipsJumpBackwardTrigger
|
|
||||||
exec "sunmap <buffer> " . g:UltiSnipsJumpBackwardTrigger
|
|
||||||
endf
|
endf
|
||||||
|
|||||||
@ -1,48 +0,0 @@
|
|||||||
" Kludge to make sure that this file is really run.
|
|
||||||
function! UltiSnips#variables#WasRun()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" The trigger used to expand a snippet.
|
|
||||||
" NOTE: expansion and forward jumping can, but needn't be the same trigger
|
|
||||||
if !exists("g:UltiSnipsExpandTrigger")
|
|
||||||
let g:UltiSnipsExpandTrigger = "<tab>"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" The trigger used to display all triggers that could possible
|
|
||||||
" match in the current position.
|
|
||||||
if !exists("g:UltiSnipsListSnippets")
|
|
||||||
let g:UltiSnipsListSnippets = "<c-tab>"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" The trigger used to jump forward to the next placeholder.
|
|
||||||
" NOTE: expansion and forward jumping can, but needn't be the same trigger
|
|
||||||
if !exists("g:UltiSnipsJumpForwardTrigger")
|
|
||||||
let g:UltiSnipsJumpForwardTrigger = "<c-j>"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" The trigger to jump backward inside a snippet
|
|
||||||
if !exists("g:UltiSnipsJumpBackwardTrigger")
|
|
||||||
let g:UltiSnipsJumpBackwardTrigger = "<c-k>"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Should UltiSnips unmap select mode mappings automagically?
|
|
||||||
if !exists("g:UltiSnipsRemoveSelectModeMappings")
|
|
||||||
let g:UltiSnipsRemoveSelectModeMappings = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
" If UltiSnips should remove Mappings, which should be ignored
|
|
||||||
if !exists("g:UltiSnipsMappingsToIgnore")
|
|
||||||
let g:UltiSnipsMappingsToIgnore = []
|
|
||||||
endif
|
|
||||||
|
|
||||||
" UltiSnipsEdit will use this variable to decide if a new window
|
|
||||||
" is opened when editing. default is "normal", allowed are also
|
|
||||||
" "vertical", "horizontal"
|
|
||||||
if !exists("g:UltiSnipsEditSplit")
|
|
||||||
let g:UltiSnipsEditSplit = 'normal'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" A list of directory names that are searched for snippets.
|
|
||||||
if !exists("g:UltiSnipsSnippetDirectories")
|
|
||||||
let g:UltiSnipsSnippetDirectories = [ "UltiSnips" ]
|
|
||||||
endif
|
|
||||||
32
autoload/neocomplete/sources/ultisnips.vim
Normal file
32
autoload/neocomplete/sources/ultisnips.vim
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
let s:source = {
|
||||||
|
\ 'name' : 'ultisnips',
|
||||||
|
\ 'kind' : 'keyword',
|
||||||
|
\ 'mark' : '[US]',
|
||||||
|
\ 'rank' : 8,
|
||||||
|
\ 'matchers' :
|
||||||
|
\ (g:neocomplete#enable_fuzzy_completion ?
|
||||||
|
\ ['matcher_fuzzy'] : ['matcher_head']),
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function! s:source.gather_candidates(context)
|
||||||
|
let suggestions = []
|
||||||
|
let snippets = UltiSnips#SnippetsInCurrentScope()
|
||||||
|
for trigger in keys(snippets)
|
||||||
|
let description = get(snippets, trigger)
|
||||||
|
call add(suggestions, {
|
||||||
|
\ 'word' : trigger,
|
||||||
|
\ 'menu' : self.mark . ' '. description
|
||||||
|
\ })
|
||||||
|
endfor
|
||||||
|
return suggestions
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! neocomplete#sources#ultisnips#define()
|
||||||
|
return s:source
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
82
autoload/unite/sources/ultisnips.vim
Normal file
82
autoload/unite/sources/ultisnips.vim
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
|
let s:unite_source = {
|
||||||
|
\ 'name': 'ultisnips',
|
||||||
|
\ 'hooks': {},
|
||||||
|
\ 'action_table': {},
|
||||||
|
\ 'syntax' : 'uniteSource__Ultisnips',
|
||||||
|
\ 'default_action': 'expand',
|
||||||
|
\ }
|
||||||
|
|
||||||
|
let s:unite_source.action_table.preview = {
|
||||||
|
\ 'description' : 'ultisnips snippets',
|
||||||
|
\ 'is_quit' : 0,
|
||||||
|
\ }
|
||||||
|
|
||||||
|
function! s:unite_source.hooks.on_syntax(args, context) abort
|
||||||
|
syntax case ignore
|
||||||
|
syntax match uniteSource__UltisnipsHeader /^.*$/
|
||||||
|
\ containedin=uniteSource__Ultisnips
|
||||||
|
syntax match uniteSource__UltisnipsTrigger /\v^\s.{-}\ze\s/ contained
|
||||||
|
\ containedin=uniteSource__UltisnipsHeader
|
||||||
|
\ nextgroup=uniteSource__UltisnipsDescription
|
||||||
|
syntax match uniteSource__UltisnipsDescription /\v.{3}\s\zs\w.*$/ contained
|
||||||
|
\ containedin=uniteSource__UltisnipsHeader
|
||||||
|
|
||||||
|
highlight default link uniteSource__UltisnipsTrigger Identifier
|
||||||
|
highlight default link uniteSource__UltisnipsDescription Statement
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:unite_source.action_table.preview.func(candidate)
|
||||||
|
" no nice preview at this point, cannot get snippet text
|
||||||
|
let snippet_preview = a:candidate['word']
|
||||||
|
echo snippet_preview
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
let s:unite_source.action_table.expand = {
|
||||||
|
\ 'description': 'expand the current snippet',
|
||||||
|
\ 'is_quit': 1
|
||||||
|
\}
|
||||||
|
|
||||||
|
function! s:unite_source.action_table.expand.func(candidate)
|
||||||
|
let delCurrWord = (getline(".")[col(".")-1] == " ") ? "" : "diw"
|
||||||
|
exe "normal " . delCurrWord . "a" . a:candidate['trigger'] . " "
|
||||||
|
call UltiSnips#ExpandSnippet()
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:unite_source.get_longest_snippet_len(snippet_list)
|
||||||
|
let longest = 0
|
||||||
|
for snip in items(a:snippet_list)
|
||||||
|
if strlen(snip['word']) > longest
|
||||||
|
let longest = strlen(snip['word'])
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
return longest
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:unite_source.gather_candidates(args, context)
|
||||||
|
let default_val = {'word': '', 'unite__abbr': '', 'is_dummy': 0, 'source':
|
||||||
|
\ 'ultisnips', 'unite__is_marked': 0, 'kind': 'command', 'is_matched': 1,
|
||||||
|
\ 'is_multiline': 0}
|
||||||
|
let snippet_list = UltiSnips#SnippetsInCurrentScope()
|
||||||
|
let max_len = s:unite_source.get_longest_snippet_len(snippet_list)
|
||||||
|
let canditates = []
|
||||||
|
for snip in items(snippet_list)
|
||||||
|
let curr_val = copy(default_val)
|
||||||
|
let curr_val['word'] = printf('%-*s', max_len, snip[0]) . " " . snip[1]
|
||||||
|
let curr_val['trigger'] = snip[0]
|
||||||
|
call add(canditates, curr_val)
|
||||||
|
endfor
|
||||||
|
return canditates
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! unite#sources#ultisnips#define()
|
||||||
|
return s:unite_source
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
"unlet s:unite_source
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
3
ctags/UltiSnips.cnf
Normal file
3
ctags/UltiSnips.cnf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
--langdef=UltiSnips
|
||||||
|
--langmap=UltiSnips:.snippets
|
||||||
|
--regex-UltiSnips=/^snippet (.*)/\1/s,snippet/
|
||||||
@ -12,7 +12,8 @@ UltiSnips *snippet* *snippets* *UltiSnips*
|
|||||||
3.1 Commands |UltiSnips-commands|
|
3.1 Commands |UltiSnips-commands|
|
||||||
3.2 Triggers |UltiSnips-triggers|
|
3.2 Triggers |UltiSnips-triggers|
|
||||||
3.2.1 Using your own trigger functions |UltiSnips-trigger-functions|
|
3.2.1 Using your own trigger functions |UltiSnips-trigger-functions|
|
||||||
3.2.2 Path to Python Module |UltiSnips-python-module-path|
|
3.2.2 Custom autocommands |UltiSnips-custom-autocommands|
|
||||||
|
3.2.3 Path to Python Module |UltiSnips-python-module-path|
|
||||||
3.3 Snippet Search Path |UltiSnips-snippet-search-path|
|
3.3 Snippet Search Path |UltiSnips-snippet-search-path|
|
||||||
3.4 Warning About Select Mode Mappings |UltiSnips-warning-smappings|
|
3.4 Warning About Select Mode Mappings |UltiSnips-warning-smappings|
|
||||||
3.5 Functions |UltiSnips-functions|
|
3.5 Functions |UltiSnips-functions|
|
||||||
@ -36,12 +37,17 @@ UltiSnips *snippet* *snippets* *UltiSnips*
|
|||||||
4.7.1 Replacement String |UltiSnips-replacement-string|
|
4.7.1 Replacement String |UltiSnips-replacement-string|
|
||||||
4.7.2 Demos |UltiSnips-demos|
|
4.7.2 Demos |UltiSnips-demos|
|
||||||
4.8 Clearing snippets |UltiSnips-clearing-snippets|
|
4.8 Clearing snippets |UltiSnips-clearing-snippets|
|
||||||
5. Support for other plugins |UltiSnips-other-plugins|
|
4.9 Context snippets |UltiSnips-context-snippets|
|
||||||
|
4.10 Snippet actions |UltiSnips-snippet-actions|
|
||||||
|
4.10.1 Pre-expand actions |UltiSnips-pre-expand-actions|
|
||||||
|
4.10.2 Post-expand actions |UltiSnips-post-expand-actions|
|
||||||
|
4.10.3 Post-jump actions |UltiSnips-post-jump-actions|
|
||||||
|
4.11 Autotrigger |UltiSnips-autotrigger|
|
||||||
|
5. UltiSnips and Other Plugins |UltiSnips-other-plugins|
|
||||||
|
5.1 Existing Integrations |UltiSnips-integrations|
|
||||||
|
5.2 Extending UltiSnips |UltiSnips-extending|
|
||||||
6. Helping Out |UltiSnips-helping|
|
6. Helping Out |UltiSnips-helping|
|
||||||
7. Contact |UltiSnips-contact|
|
7. Contributors |UltiSnips-contributors|
|
||||||
8. Contributors |UltiSnips-contributors|
|
|
||||||
8.1 Patches & Coding |UltiSnips-contricoding|
|
|
||||||
8.2 Snippets |UltiSnips-contrisnippets|
|
|
||||||
|
|
||||||
This plugin only works if 'compatible' is not set.
|
This plugin only works if 'compatible' is not set.
|
||||||
{Vi does not have any of these features}
|
{Vi does not have any of these features}
|
||||||
@ -58,28 +64,29 @@ Snippets are common in structured text like source code but can also be used
|
|||||||
for general editing like, for example, inserting a signature in an email or
|
for general editing like, for example, inserting a signature in an email or
|
||||||
inserting the current date in a text file.
|
inserting the current date in a text file.
|
||||||
|
|
||||||
UltiSnips was developed using the TDD (Test-driven development) philosophy.
|
@SirVer posted several short screencasts which make a great introduction to
|
||||||
This ensures that features do not disappear and bugs do not reappear after
|
UltiSnips, illustrating its features and usage.
|
||||||
they have been fixed.
|
|
||||||
|
|
||||||
On my blog, http://www.sirver.net, I posted several short screencasts, which
|
|
||||||
make a great introduction to UltiSnips, illustrating its features and usage.
|
|
||||||
|
|
||||||
http://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/
|
http://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/
|
||||||
http://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/
|
http://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/
|
||||||
http://www.sirver.net/blog/2012/02/05/third-episode-of-ultisnips-screencast/
|
http://www.sirver.net/blog/2012/02/05/third-episode-of-ultisnips-screencast/
|
||||||
http://www.sirver.net/blog/2012/03/31/fourth-episode-of-ultisnips-screencast/
|
http://www.sirver.net/blog/2012/03/31/fourth-episode-of-ultisnips-screencast/
|
||||||
|
|
||||||
|
Also the excellent [Vimcasts](http://vimcasts.org) dedicated three episodes to
|
||||||
|
UltiSnips:
|
||||||
|
|
||||||
|
http://vimcasts.org/episodes/meet-ultisnips/
|
||||||
|
http://vimcasts.org/episodes/ultisnips-python-interpolation/
|
||||||
|
http://vimcasts.org/episodes/ultisnips-visual-placeholder/
|
||||||
|
|
||||||
1.1 Requirements *UltiSnips-requirements*
|
1.1 Requirements *UltiSnips-requirements*
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
This plugin works with Vim version 7.0 or later. It only works if the
|
This plugin works with Vim version 7.4 or later. It only works if the
|
||||||
'compatible' setting is not set.
|
'compatible' setting is not set.
|
||||||
|
|
||||||
This plugin requires python >= 2.6. It has been specifically tested using
|
This plugin is tested against Python 2.7, 3.3 or 3.4. All other versions are
|
||||||
python 2.7 and python 3.2 but should theoretically work on all versions of
|
unsupported, but might work.
|
||||||
python >= 2.6.
|
|
||||||
|
|
||||||
The Python 2.x or Python 3.x interface must be available. In other words, Vim
|
The Python 2.x or Python 3.x interface must be available. In other words, Vim
|
||||||
must be compiled with either the |+python| feature or the |+python3| feature.
|
must be compiled with either the |+python| feature or the |+python3| feature.
|
||||||
@ -124,7 +131,7 @@ permission to use his snippets.
|
|||||||
=============================================================================
|
=============================================================================
|
||||||
2. Installation and Updating *UltiSnips-installnupdate*
|
2. Installation and Updating *UltiSnips-installnupdate*
|
||||||
|
|
||||||
The recommended way of getting ultisnips is to track SirVer/ultisnips on
|
The recommended way of getting UltiSnips is to track SirVer/ultisnips on
|
||||||
github. The master branch is always stable.
|
github. The master branch is always stable.
|
||||||
|
|
||||||
Using Pathogen: *UltiSnips-using-pathogen*
|
Using Pathogen: *UltiSnips-using-pathogen*
|
||||||
@ -132,8 +139,11 @@ Using Pathogen: *UltiSnips-using-pathogen*
|
|||||||
If you are a pathogen user, you can track the official mirror of UltiSnips on
|
If you are a pathogen user, you can track the official mirror of UltiSnips on
|
||||||
github: >
|
github: >
|
||||||
|
|
||||||
$ cd ~/.vim/
|
$ cd ~/.vim/bundle && git clone git://github.com/SirVer/ultisnips.git
|
||||||
$ git submodule add git://github.com/SirVer/ultisnips.git bundle/ultisnips
|
|
||||||
|
If you also want the default snippets, also track >
|
||||||
|
|
||||||
|
$ cd ~/.vim/bundle && git clone git://github.com/honza/vim-snippets.git
|
||||||
|
|
||||||
See the pathogen documentation for more details on how to update a bundle.
|
See the pathogen documentation for more details on how to update a bundle.
|
||||||
|
|
||||||
@ -154,16 +164,19 @@ Restart Vim and UltiSnips should work. To access the help, use >
|
|||||||
:helptags ~/.vim/ultisnips_rep/doc
|
:helptags ~/.vim/ultisnips_rep/doc
|
||||||
:help UltiSnips
|
:help UltiSnips
|
||||||
|
|
||||||
|
UltiSnips comes without snippets. The default snippets can be found here:
|
||||||
|
https://github.com/honza/vim-snippets
|
||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
3. Settings & Commands *UltiSnips-settings*
|
3. Settings & Commands *UltiSnips-settings*
|
||||||
|
|
||||||
3.1 Commands *UltiSnips-commands*
|
3.1 Commands *UltiSnips-commands*
|
||||||
------------
|
------------
|
||||||
*:UltiSnipsEdit*
|
*:UltiSnipsEdit*
|
||||||
The UltiSnipsEdit command opens the private snippet definition file for the
|
The UltiSnipsEdit command opens a private snippet definition file for the
|
||||||
current filetype for editing. If a definition file does not exist, a new file
|
current filetype. If no snippet file exists, a new file is created. If used as
|
||||||
is opened with the appropriate name. Snippet definition files are standard
|
UltiSnipsEdit! all public snippet files are taken into account too. If
|
||||||
text files and can be edited directly. UltiSnipsEdit makes it easier.
|
multiple files match the search, the user gets to choose the file.
|
||||||
|
|
||||||
There are several variables associated with the UltiSnipsEdit command.
|
There are several variables associated with the UltiSnipsEdit command.
|
||||||
|
|
||||||
@ -173,6 +186,8 @@ g:UltiSnipsEditSplit Defines how the edit window is opened. Possible
|
|||||||
|normal| Default. Opens in the current window.
|
|normal| Default. Opens in the current window.
|
||||||
|horizontal| Splits the window horizontally.
|
|horizontal| Splits the window horizontally.
|
||||||
|vertical| Splits the window vertically.
|
|vertical| Splits the window vertically.
|
||||||
|
|context| Splits the window vertically or
|
||||||
|
horizontally depending on context.
|
||||||
|
|
||||||
*g:UltiSnipsSnippetsDir*
|
*g:UltiSnipsSnippetsDir*
|
||||||
g:UltiSnipsSnippetsDir
|
g:UltiSnipsSnippetsDir
|
||||||
@ -180,7 +195,25 @@ g:UltiSnipsSnippetsDir
|
|||||||
files are stored in. For example, if the variable
|
files are stored in. For example, if the variable
|
||||||
is set to "~/.vim/mydir/UltiSnips" and the current
|
is set to "~/.vim/mydir/UltiSnips" and the current
|
||||||
'filetype' is "cpp", then :UltiSnipsEdit will open
|
'filetype' is "cpp", then :UltiSnipsEdit will open
|
||||||
"~/.vim/mydir/UltiSnips/cpp.snippets".
|
"~/.vim/mydir/UltiSnips/cpp.snippets". Note that
|
||||||
|
directories named "snippets" are reserved for
|
||||||
|
snipMate snippets and cannot be used.
|
||||||
|
|
||||||
|
*g:UltiSnipsSnippetDirectories*
|
||||||
|
g:UltiSnipsSnippetDirectories
|
||||||
|
Defines the directories for looking for snippets.
|
||||||
|
Do not mix up this variable with previous one.
|
||||||
|
More information about that variable can
|
||||||
|
be found at section |UltiSnips-snippet-search-path|.
|
||||||
|
|
||||||
|
*g:UltiSnipsEnableSnipMate*
|
||||||
|
g:UltiSnipsEnableSnipMate
|
||||||
|
Enable looking for SnipMate snippets in
|
||||||
|
&runtimepath. UltiSnips will search only for
|
||||||
|
directories named 'snippets' while looking for
|
||||||
|
SnipMate snippets. Defaults to "1", so UltiSnips
|
||||||
|
will look for SnipMate snippets.
|
||||||
|
|
||||||
|
|
||||||
*:UltiSnipsAddFiletypes*
|
*:UltiSnipsAddFiletypes*
|
||||||
The UltiSnipsAddFiletypes command allows for explicit merging of other snippet
|
The UltiSnipsAddFiletypes command allows for explicit merging of other snippet
|
||||||
@ -209,24 +242,20 @@ The priority will then be rails -> ruby -> programming -> all.
|
|||||||
3.2 Triggers *UltiSnips-triggers*
|
3.2 Triggers *UltiSnips-triggers*
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
*g:UltiSnipsExpandTrigger* *g:UltiSnipsListSnippets*
|
||||||
|
*g:UltiSnipsJumpForwardTrigger* *g:UltiSnipsJumpBackwardTrigger*
|
||||||
You can define the keys used to trigger UltiSnips actions by setting global
|
You can define the keys used to trigger UltiSnips actions by setting global
|
||||||
variables. Variables define the keys used to expand a snippet, jump forward
|
variables. Variables define the keys used to expand a snippet, jump forward
|
||||||
and jump backwards within a snippet, and list all available snippets in the
|
and jump backwards within a snippet, and list all available snippets in the
|
||||||
current expand context. The variables with their default values are: >
|
current expand context. Be advised, that some terminal emulators don't send
|
||||||
|
<c-tab> to the running program. The variables with their default values are: >
|
||||||
g:UltiSnipsExpandTrigger <tab>
|
g:UltiSnipsExpandTrigger <tab>
|
||||||
g:UltiSnipsListSnippets <c-tab>
|
g:UltiSnipsListSnippets <c-tab>
|
||||||
g:UltiSnipsJumpForwardTrigger <c-j>
|
g:UltiSnipsJumpForwardTrigger <c-j>
|
||||||
g:UltiSnipsJumpBackwardTrigger <c-k>
|
g:UltiSnipsJumpBackwardTrigger <c-k>
|
||||||
|
|
||||||
The g:UltiSnipsExpandTrigger and g:UltiSnipsJumpForwardTrigger can be set to
|
|
||||||
the same value. To simulate TextMate behavior, add the following lines to your
|
|
||||||
vimrc file. >
|
|
||||||
let g:UltiSnipsExpandTrigger="<tab>"
|
|
||||||
let g:UltiSnipsJumpForwardTrigger="<tab>"
|
|
||||||
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
|
|
||||||
|
|
||||||
UltiSnips will only map the jump triggers while a snippet is active to
|
UltiSnips will only map the jump triggers while a snippet is active to
|
||||||
interfer as little as possible with other mappings.
|
interfere as little as possible with other mappings.
|
||||||
|
|
||||||
The default value for g:UltiSnipsJumpBackwardTrigger interferes with the
|
The default value for g:UltiSnipsJumpBackwardTrigger interferes with the
|
||||||
built-in complete function: |i_CTRL-X_CTRL-K|. A workaround is to add the
|
built-in complete function: |i_CTRL-X_CTRL-K|. A workaround is to add the
|
||||||
@ -248,9 +277,9 @@ to the same value then the function you are actually going to use is
|
|||||||
UltiSnips#ExpandSnippetOrJump.
|
UltiSnips#ExpandSnippetOrJump.
|
||||||
|
|
||||||
Each time any of the functions UltiSnips#ExpandSnippet,
|
Each time any of the functions UltiSnips#ExpandSnippet,
|
||||||
UltiSnips#ExpandSnippet, UltiSnips#JumpBackwards or UltiSnips#JumpBackwards is
|
UltiSnips#ExpandSnippetOrJump, UltiSnips#JumpForwards or
|
||||||
called a global variable is set that contains the return value of the
|
UltiSnips#JumpBackwards is called a global variable is set that contains the
|
||||||
corresponding function.
|
return value of the corresponding function.
|
||||||
|
|
||||||
The corresponding variables and functions are:
|
The corresponding variables and functions are:
|
||||||
UltiSnips#ExpandSnippet --> g:ulti_expand_res (0: fail, 1: success)
|
UltiSnips#ExpandSnippet --> g:ulti_expand_res (0: fail, 1: success)
|
||||||
@ -279,7 +308,39 @@ then you define your mapping as >
|
|||||||
and if the you can't expand or jump from the current location then the
|
and if the you can't expand or jump from the current location then the
|
||||||
alternative function IMAP_Jumpfunc('', 0) is called.
|
alternative function IMAP_Jumpfunc('', 0) is called.
|
||||||
|
|
||||||
3.2.2 Path to Python module *UltiSnips-python-module-path*
|
3.2.2 Custom autocommands *UltiSnips-custom-autocommands*
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Note Autocommands must *not* change the buffer in any way. If lines are added,
|
||||||
|
deleted, or modified it will confuse UltiSnips which might scramble your
|
||||||
|
snippets contents.
|
||||||
|
|
||||||
|
*UltiSnipsEnterFirstSnippet* *UltiSnipsExitLastSnippet*
|
||||||
|
For maximum compatibility with other plug-ins, UltiSnips sets up some special
|
||||||
|
state, include mappings and autocommands, when a snippet starts being
|
||||||
|
expanded, and tears them down once the last snippet has been exited. In order
|
||||||
|
to make it possible to override these "inner" settings, it fires the following
|
||||||
|
"User" autocommands:
|
||||||
|
|
||||||
|
UltiSnipsEnterFirstSnippet
|
||||||
|
UltiSnipsExitLastSnippet
|
||||||
|
|
||||||
|
For example, to call a pair of custom functions in response to these events,
|
||||||
|
you might do: >
|
||||||
|
|
||||||
|
autocmd! User UltiSnipsEnterFirstSnippet
|
||||||
|
autocmd User UltiSnipsEnterFirstSnippet call CustomInnerKeyMapper()
|
||||||
|
autocmd! User UltiSnipsExitLastSnippet
|
||||||
|
autocmd User UltiSnipsExitLastSnippet call CustomInnerKeyUnmapper()
|
||||||
|
|
||||||
|
Note that snippet expansion may be nested, in which case
|
||||||
|
|UltiSnipsEnterFirstSnippet| will fire only as the first (outermost) snippet
|
||||||
|
is entered, and |UltiSnipsExitLastSnippet| will only fire once the last
|
||||||
|
(outermost) snippet have been exited.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
3.2.3 Path to Python module *UltiSnips-python-module-path*
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
For even more advanced usage, you can directly write python functions using
|
For even more advanced usage, you can directly write python functions using
|
||||||
@ -306,9 +367,10 @@ how UltiSnips loads snippets.
|
|||||||
Snippet definition files are stored in snippet directories. A snippet
|
Snippet definition files are stored in snippet directories. A snippet
|
||||||
directory must be a subdirectory of a directory defined in the 'runtimepath'
|
directory must be a subdirectory of a directory defined in the 'runtimepath'
|
||||||
option. The variable g:UltiSnipsSnippetDirectories defines a list of names
|
option. The variable g:UltiSnipsSnippetDirectories defines a list of names
|
||||||
used for snippet directories. The default is shown below. >
|
used for snippet directories. Note that "snippets" is reserved for snipMate
|
||||||
|
snippets and cannot be used. The default is shown below. >
|
||||||
|
|
||||||
g:UltiSnipsSnippetDirectories ["UltiSnips"]
|
let g:UltiSnipsSnippetDirectories=["UltiSnips"]
|
||||||
|
|
||||||
UltiSnips will search each 'runtimepath' directory for the subdirectory names
|
UltiSnips will search each 'runtimepath' directory for the subdirectory names
|
||||||
defined in g:UltiSnipsSnippetDirectories in the order they are defined. For
|
defined in g:UltiSnipsSnippetDirectories in the order they are defined. For
|
||||||
@ -316,8 +378,8 @@ example, if you keep your snippets in a .vim subdirectory called
|
|||||||
"mycoolsnippets" and you want to make use of the default snippets that come
|
"mycoolsnippets" and you want to make use of the default snippets that come
|
||||||
with UltiSnips, add the following to your vimrc file. >
|
with UltiSnips, add the following to your vimrc file. >
|
||||||
let g:UltiSnipsSnippetDirectories=["UltiSnips", "mycoolsnippets"]
|
let g:UltiSnipsSnippetDirectories=["UltiSnips", "mycoolsnippets"]
|
||||||
If you do not want to use the snippets that come with UltiSnips, define the
|
If you do not want to use the third party snippets that come with plugins,
|
||||||
variable accordingly. >
|
define the variable accordingly: >
|
||||||
let g:UltiSnipsSnippetDirectories=["mycoolsnippets"]
|
let g:UltiSnipsSnippetDirectories=["mycoolsnippets"]
|
||||||
|
|
||||||
You can also redefine the search path on a buffer by buffer basis by setting
|
You can also redefine the search path on a buffer by buffer basis by setting
|
||||||
@ -326,6 +388,15 @@ over the global variable.
|
|||||||
|
|
||||||
|UltiSnips-adding-snippets| explains which files are parsed for a given filetype.
|
|UltiSnips-adding-snippets| explains which files are parsed for a given filetype.
|
||||||
|
|
||||||
|
If only one directory is specified in this variable and this directory is
|
||||||
|
specified by absolute path, UltiSnips will not look for snippets in
|
||||||
|
&runtimepath, which can lead to significant speedup. So, the common case is:
|
||||||
|
|
||||||
|
let g:UltiSnipsSnippetDirectories=[$HOME.'/.vim/UltiSnips']
|
||||||
|
|
||||||
|
However, you will not able to use snippets that are shipped with third party
|
||||||
|
plugins out of the box. You'll need to copy them into your chosen directory.
|
||||||
|
|
||||||
|
|
||||||
3.4 Warning About Select Mode Mappings *UltiSnips-warning-smappings*
|
3.4 Warning About Select Mode Mappings *UltiSnips-warning-smappings*
|
||||||
--------------------------------------
|
--------------------------------------
|
||||||
@ -381,8 +452,9 @@ snippets, so they cannot be expanded a second time unless the function is
|
|||||||
called again. The function takes three optional arguments, in order: trigger,
|
called again. The function takes three optional arguments, in order: trigger,
|
||||||
description, options. Arguments coincide with the arguments of the
|
description, options. Arguments coincide with the arguments of the
|
||||||
|UltiSnips#AddSnippetWithPriority| function of the same name. The trigger and
|
|UltiSnips#AddSnippetWithPriority| function of the same name. The trigger and
|
||||||
options arguments can change the way the snippet expands. The description is
|
options arguments can change the way the snippet expands. Same options
|
||||||
unused at this point.
|
can be specified as in the snippet definition. See full list of options at
|
||||||
|
|UltiSnips-snippet-options|. The description is unused at this point.
|
||||||
|
|
||||||
An example use case might be this line from a reStructuredText plugin file:
|
An example use case might be this line from a reStructuredText plugin file:
|
||||||
|
|
||||||
@ -398,8 +470,13 @@ typed so it can determine if the trigger matches or not.
|
|||||||
|
|
||||||
A third function is UltiSnips#SnippetsInCurrentScope which is the equivalent
|
A third function is UltiSnips#SnippetsInCurrentScope which is the equivalent
|
||||||
of snipmate GetSnipsInCurrentScope function.
|
of snipmate GetSnipsInCurrentScope function.
|
||||||
|
|
||||||
This function simply returns a vim dictionary with the snippets whose trigger
|
This function simply returns a vim dictionary with the snippets whose trigger
|
||||||
matches the current word.
|
matches the current word. If you need all snippets information of current
|
||||||
|
buffer, you can simply pass 1 (which means all) as first argument of this
|
||||||
|
function, and use a global variable g:current_ulti_dict_info to get the
|
||||||
|
result (see example below).
|
||||||
|
|
||||||
This function does not add any new functionality to ultisnips directly but
|
This function does not add any new functionality to ultisnips directly but
|
||||||
allows to use third party plugins to integrate the current available snippets.
|
allows to use third party plugins to integrate the current available snippets.
|
||||||
|
|
||||||
@ -439,6 +516,27 @@ If the trigger for your snippet is lorem, you type lor, and you have no other
|
|||||||
snippets whose trigger matches lor then hitting <C-L> will expand to whatever
|
snippets whose trigger matches lor then hitting <C-L> will expand to whatever
|
||||||
lorem expands to.
|
lorem expands to.
|
||||||
|
|
||||||
|
A third example on how to use this function to extract all snippets of
|
||||||
|
current buffer: >
|
||||||
|
|
||||||
|
function! GetAllSnippets()
|
||||||
|
call UltiSnips#SnippetsInCurrentScope(1)
|
||||||
|
let list = []
|
||||||
|
for [key, info] in items(g:current_ulti_dict_info)
|
||||||
|
let parts = split(info.location, ':')
|
||||||
|
call add(list, {
|
||||||
|
\"key": key,
|
||||||
|
\"path": parts[0],
|
||||||
|
\"linenr": parts[1],
|
||||||
|
\"description": info.description,
|
||||||
|
\})
|
||||||
|
endfor
|
||||||
|
return list
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
The new variable g:current_ulti_dict_info is made to avoid confilct with
|
||||||
|
exists third party plugins. The definition location contains file path and
|
||||||
|
line number is also included in this variable.
|
||||||
|
|
||||||
3.6 Warning about missing python support *UltiSnips-python-warning*
|
3.6 Warning about missing python support *UltiSnips-python-warning*
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
@ -516,7 +614,7 @@ permitted in a snippet file, and they can be included anywhere in the file.
|
|||||||
A line beginning with the keyword 'priority' sets the priority for all
|
A line beginning with the keyword 'priority' sets the priority for all
|
||||||
snippets defined in the current file after this line. The default priority for
|
snippets defined in the current file after this line. The default priority for
|
||||||
a file is always 0. When a snippet should be expanded, UltiSnips will collect
|
a file is always 0. When a snippet should be expanded, UltiSnips will collect
|
||||||
all snippet definitons from all sources that match the trigger and keep only
|
all snippet definitions from all sources that match the trigger and keep only
|
||||||
the ones with the highest priority. For example, all shipped snippets have a
|
the ones with the highest priority. For example, all shipped snippets have a
|
||||||
priority < 0, so that user defined snippets always overwrite shipped snippets.
|
priority < 0, so that user defined snippets always overwrite shipped snippets.
|
||||||
|
|
||||||
@ -564,6 +662,8 @@ same tab trigger. When a snippet is activated and more than one tab trigger
|
|||||||
match, UltiSnips displays a list of the matching snippets with their
|
match, UltiSnips displays a list of the matching snippets with their
|
||||||
descriptions. The user then selects the snippet they want.
|
descriptions. The user then selects the snippet they want.
|
||||||
|
|
||||||
|
*UltiSnips-snippet-options*
|
||||||
|
|
||||||
The 'options' control the behavior of the snippet. Options are indicated by
|
The 'options' control the behavior of the snippet. Options are indicated by
|
||||||
single characters. The 'options' characters for a snippet are combined into
|
single characters. The 'options' characters for a snippet are combined into
|
||||||
a word without spaces.
|
a word without spaces.
|
||||||
@ -609,6 +709,19 @@ The options currently supported are: >
|
|||||||
before jumping to the next tabstop. This is useful if there is a
|
before jumping to the next tabstop. This is useful if there is a
|
||||||
tabstop with optional text at the end of a line.
|
tabstop with optional text at the end of a line.
|
||||||
|
|
||||||
|
m Trim all whitespaces from right side of snippet lines. Useful when
|
||||||
|
snippet contains empty lines which should remain empty after expanding.
|
||||||
|
Without this option empty lines in snippets definition will have
|
||||||
|
indentation too.
|
||||||
|
|
||||||
|
e Context snippets - With this option expansion of snippet can be
|
||||||
|
controlled not only by previous characters in line, but by any given
|
||||||
|
python expression. This option can be specified along with other
|
||||||
|
options, like 'b'. See |UltiSnips-context-snippets| for more info.
|
||||||
|
|
||||||
|
A Snippet will be triggered automatically, when condition matches.
|
||||||
|
See |UltiSnips-autotrigger| for more info.
|
||||||
|
|
||||||
The end line is the 'endsnippet' keyword on a line by itself. >
|
The end line is the 'endsnippet' keyword on a line by itself. >
|
||||||
|
|
||||||
endsnippet
|
endsnippet
|
||||||
@ -619,9 +732,9 @@ from the 'endsnippet' end line.
|
|||||||
|
|
||||||
4.1.1 Character Escaping: *UltiSnips-character-escaping*
|
4.1.1 Character Escaping: *UltiSnips-character-escaping*
|
||||||
|
|
||||||
In snippet definitions, the characters '`', '{', '$', '\' and "'" (single
|
In snippet definitions, the characters '`', '{', '$' and '\' have special
|
||||||
quote) have special meaning. If you want to insert one of these characters
|
meaning. If you want to insert one of these characters literally, escape them
|
||||||
literally, escape them with a backslash, '\'.
|
with a backslash, '\'.
|
||||||
|
|
||||||
|
|
||||||
4.2 Plaintext Snippets *UltiSnips-plaintext-snippets*
|
4.2 Plaintext Snippets *UltiSnips-plaintext-snippets*
|
||||||
@ -769,11 +882,12 @@ output is ignored.
|
|||||||
|
|
||||||
The variables automatically defined in python code are: >
|
The variables automatically defined in python code are: >
|
||||||
|
|
||||||
fn - The current filename
|
fn - The current filename
|
||||||
path - The complete path to the current file
|
path - The complete path to the current file
|
||||||
t - The values of the placeholders, t[1] is the text of ${1}, and so on
|
t - The values of the placeholders, t[1] is the text of ${1}, etc.
|
||||||
snip - UltiSnips.TextObjects.SnippetUtil object instance. Has methods that
|
snip - UltiSnips.TextObjects.SnippetUtil object instance. Has methods
|
||||||
simplify indentation handling.
|
that simplify indentation handling.
|
||||||
|
context - Result of context condition. See |UltiSnips-context-snippets|.
|
||||||
|
|
||||||
The 'snip' object provides the following methods: >
|
The 'snip' object provides the following methods: >
|
||||||
|
|
||||||
@ -825,6 +939,14 @@ The 'snip' object provides some properties as well: >
|
|||||||
snip.ft:
|
snip.ft:
|
||||||
The current filetype.
|
The current filetype.
|
||||||
|
|
||||||
|
snip.p:
|
||||||
|
Last selected placeholder. Will contain placeholder object with
|
||||||
|
following properties:
|
||||||
|
|
||||||
|
'current_text' - text in the placeholder on the moment of selection;
|
||||||
|
'start' - placeholder start on the moment of selection;
|
||||||
|
'end' - placeholder end on the moment of selection;
|
||||||
|
|
||||||
For your convenience, the 'snip' object also provides the following
|
For your convenience, the 'snip' object also provides the following
|
||||||
operators: >
|
operators: >
|
||||||
|
|
||||||
@ -915,10 +1037,10 @@ directly inside your snippets. For example to use
|
|||||||
|
|
||||||
global !p
|
global !p
|
||||||
from my_snippet_helpers import *
|
from my_snippet_helpers import *
|
||||||
endglobals
|
endglobal
|
||||||
|
|
||||||
|
|
||||||
4.4 Tabstops and Placeholders *UltiSnips-tabstops* *UltiSnips-placeholders*
|
4.5 Tabstops and Placeholders *UltiSnips-tabstops* *UltiSnips-placeholders*
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
Snippets are used to quickly insert reused text into a document. Often the
|
Snippets are used to quickly insert reused text into a document. Often the
|
||||||
@ -931,7 +1053,8 @@ until all the variable components are complete.
|
|||||||
The syntax for a tabstop is the dollar sign followed by a number, for example,
|
The syntax for a tabstop is the dollar sign followed by a number, for example,
|
||||||
'$1'. Tabstops start at number 1 and are followed in sequential order. The
|
'$1'. Tabstops start at number 1 and are followed in sequential order. The
|
||||||
'$0' tabstop is a special tabstop. It is always the last tabstop in the
|
'$0' tabstop is a special tabstop. It is always the last tabstop in the
|
||||||
snippet no matter how many tabstops are defined.
|
snippet no matter how many tabstops are defined. If there is no '$0' defined,
|
||||||
|
'$0' tabstop will be defined at the end of snippet.
|
||||||
|
|
||||||
Here is a simple example.
|
Here is a simple example.
|
||||||
|
|
||||||
@ -1120,6 +1243,13 @@ The options can be any combination of >
|
|||||||
i - case insensitive
|
i - case insensitive
|
||||||
By default, regular expression matching is case sensitive. With this
|
By default, regular expression matching is case sensitive. With this
|
||||||
option, matching is done without regard to case.
|
option, matching is done without regard to case.
|
||||||
|
m - multiline
|
||||||
|
By default, the '^' and '$' special characters only apply to the
|
||||||
|
start and end of the entire string; so if you select multiple lines,
|
||||||
|
transformations are made on them entirely as a whole single line
|
||||||
|
string. With this option, '^' and '$' special characters match the
|
||||||
|
start or end of any line within a string ( separated by newline
|
||||||
|
character - '\n' ).
|
||||||
a - ascii conversion
|
a - ascii conversion
|
||||||
By default, transformation are made on the raw utf-8 string. With
|
By default, transformation are made on the raw utf-8 string. With
|
||||||
this option, matching is done on the corresponding ASCII string
|
this option, matching is done on the corresponding ASCII string
|
||||||
@ -1226,94 +1356,432 @@ directive.
|
|||||||
clearsnippets
|
clearsnippets
|
||||||
------------------- SNAP -------------------
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
Without arguments, 'clearsnippets' removes all snippets defined up to that
|
'clearsnippets' removes all snippets with a priority lower than the current
|
||||||
point far for the current file type. Just a reminder, by default UltiSnips
|
one. For example, the following cleares all snippets that have priority <= 1,
|
||||||
traverses 'runtimepath' in reverse order, so 'clearsnippets' removes snippet
|
even though the example snippet is defined after the 'clearsnippets'.
|
||||||
definitions appearing in files in 'runtimepath' after the '.snippets' file in
|
|
||||||
which it is encountered.
|
|
||||||
|
|
||||||
To clear one or more specific snippet, provide the names of the snippets as
|
------------------- SNIP -------------------
|
||||||
arguments to the 'clearsnippets' command. The following example will clear
|
priority 1
|
||||||
the snippets 'trigger1' and 'trigger2'.
|
clearsnippets
|
||||||
|
|
||||||
|
priority -1
|
||||||
|
snippet example "Cleared example"
|
||||||
|
This will never be expanded.
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
To clear one or more specific snippet, provide the triggers of the snippets as
|
||||||
|
arguments to the 'clearsnippets' command. The following example will clear the
|
||||||
|
snippets 'trigger1' and 'trigger2'.
|
||||||
|
|
||||||
------------------- SNIP -------------------
|
------------------- SNIP -------------------
|
||||||
clearsnippets trigger1 trigger2
|
clearsnippets trigger1 trigger2
|
||||||
------------------- SNAP -------------------
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
UltiSnips comes with a set of default snippets for many file types. If you
|
|
||||||
would rather not have some of them defined, you can use 'clearsnippets' in
|
|
||||||
your personal snippets files to remove them. Note: you do not need to remove
|
|
||||||
snippets if you wish to replace them. Simply use the '!' option. (See
|
|
||||||
|UltiSnips-adding-snippets| for the options).
|
|
||||||
|
|
||||||
|
4.9 Context snippets *UltiSnips-context-snippets*
|
||||||
|
|
||||||
|
Context snippets can be enabled by using 'e' option in snippet definition.
|
||||||
|
|
||||||
|
In that case snippet should be defined using this syntax: >
|
||||||
|
|
||||||
|
snippet tab_trigger "description" "expression" options
|
||||||
|
|
||||||
|
The 'expression' can be any python expression. If 'expression' evaluates to
|
||||||
|
'True', then this snippet will be chosen for expansion. The 'expression' must
|
||||||
|
be wrapped with double-quotes.
|
||||||
|
|
||||||
|
The following python modules are automatically imported into the scope before
|
||||||
|
'expression' is evaluated: 're', 'os', 'vim', 'string', 'random'.
|
||||||
|
|
||||||
|
Global variable `snip` will be available with following properties:
|
||||||
|
'snip.window' - alias for 'vim.current.window'
|
||||||
|
'snip.buffer' - alias for 'vim.current.window.buffer'
|
||||||
|
'snip.cursor' - cursor object, which behaves like
|
||||||
|
'vim.current.window.cursor', but zero-indexed and with following
|
||||||
|
additional methods:
|
||||||
|
- 'preserve()' - special method for executing pre/post/jump actions;
|
||||||
|
- 'set(line, column)' - sets cursor to specified line and column;
|
||||||
|
- 'to_vim_cursor()' - returns 1-indexed cursor, suitable for assigning
|
||||||
|
to 'vim.current.window.cursor';
|
||||||
|
'snip.line' and 'snip.column' - aliases for cursor position (zero-indexed);
|
||||||
|
'snip.visual_mode' - ('v', 'V', '^V', see |visual-mode|);
|
||||||
|
'snip.visual_text' - last visually-selected text;
|
||||||
|
'snip.last_placeholder' - last active placeholder from previous snippet
|
||||||
|
with following properties:
|
||||||
|
|
||||||
|
- 'current_text' - text in the placeholder on the moment of selection;
|
||||||
|
- 'start' - placeholder start on the moment of selection;
|
||||||
|
- 'end' - placeholder end on the moment of selection;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
snippet r "return" "re.match('^\s+if err ', snip.buffer[snip.line-1])" be
|
||||||
|
return err
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
That snippet will expand to 'return err' only if the previous line is starting
|
||||||
|
from 'if err' prefix.
|
||||||
|
|
||||||
|
Note: context snippets prioritized over non-context ones. It makes possible to
|
||||||
|
use non-context snippets as fallback, if no context matched:
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
snippet i "if ..." b
|
||||||
|
if $1 {
|
||||||
|
$2
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet i "if err != nil" "re.match('^\s+[^=]*err\s*:?=', snip.buffer[snip.line-1])" be
|
||||||
|
if err != nil {
|
||||||
|
$1
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
That snippet will expand into 'if err != nil' if previous line will
|
||||||
|
match 'err :=' prefix, otherwise the default 'if' snippet will be expanded.
|
||||||
|
|
||||||
|
It's a good idea to move context conditions to a separate module, so it can be
|
||||||
|
used by other UltiSnips users. In that case, module should be imported
|
||||||
|
using 'global' keyword, like this:
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
global !p
|
||||||
|
import my_utils
|
||||||
|
endglobal
|
||||||
|
|
||||||
|
snippet , "return ..., nil/err" "my_utils.is_return_argument(snip)" ie
|
||||||
|
, `!p if my_utils.is_in_err_condition():
|
||||||
|
snip.rv = "err"
|
||||||
|
else:
|
||||||
|
snip.rv = "nil"`
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
That snippet will expand only if the cursor is located in the return statement,
|
||||||
|
and then it will expand either to 'err' or to 'nil' depending on which 'if'
|
||||||
|
statement it's located. 'is_return_argument' and 'is_in_err_condition' are
|
||||||
|
part of custom python module which is called 'my_utils' in this example.
|
||||||
|
|
||||||
|
Context condition can return any value which python can use as condition in
|
||||||
|
it's 'if' statement, and if it's considered 'True', then snippet will be
|
||||||
|
expanded. The evaluated value of 'condition' is available in the 'snip.context'
|
||||||
|
variable inside the snippet:
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
snippet + "var +=" "re.match('\s*(.*?)\s*:?=', snip.buffer[snip.line-1])" ie
|
||||||
|
`!p snip.rv = snip.context.group(1)` += $1
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
That snippet will expand to 'var1 +=' after line, which begins from 'var1 :='.
|
||||||
|
|
||||||
|
*UltiSnips-capture-placeholder*
|
||||||
|
|
||||||
|
You can capture placeholder text from previous snippet by using following
|
||||||
|
trick:
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
snippet = "desc" "snip.last_placeholder" Ae
|
||||||
|
`!p snip.rv = snip.context.current_text` == nil
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
That snippet will be expanded only if you will replace selected tabstop in
|
||||||
|
other snippet (like, as in 'if ${1:var}') and will replace that tabstop by
|
||||||
|
tabstop value following by ' == nil'.
|
||||||
|
|
||||||
|
|
||||||
|
4.10 Snippets actions *UltiSnips-snippet-actions*
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Snippet actions is an arbitrary python code which can be executed at specific
|
||||||
|
points in lifetime of the snippet.
|
||||||
|
|
||||||
|
There are three types of actions:
|
||||||
|
|
||||||
|
* Pre-expand - invoked just after trigger condition was matched, but before
|
||||||
|
snippet actually expanded;
|
||||||
|
* Post-expand - invoked after snippet was expanded and interpolations
|
||||||
|
was applied for the first time, but before jump on the first placeholder.
|
||||||
|
* Jump - invoked just after jump to the next/prev placeholder.
|
||||||
|
|
||||||
|
Specified code will be evaluated at stages defined above and same global
|
||||||
|
variables and modules will be available that are stated in
|
||||||
|
the |UltiSnips-context-snippets| section.
|
||||||
|
|
||||||
|
*UltiSnips-buffer-proxy*
|
||||||
|
|
||||||
|
Note: special variable called 'snip.buffer' should be used for all buffer
|
||||||
|
modifications. Not 'vim.current.buffer' and not 'vim.command("...")', because
|
||||||
|
of in that case UltiSnips will not be able to track changes in buffer from
|
||||||
|
actions.
|
||||||
|
|
||||||
|
'snip.buffer' has the same interface as 'vim.current.window.buffer'.
|
||||||
|
|
||||||
|
4.10.1 Pre-expand actions *UltiSnips-pre-expand-actions*
|
||||||
|
|
||||||
|
Pre-expand actions can be used to match snippet in one location and then
|
||||||
|
expand it in the different location. Some useful cases are: correcting
|
||||||
|
indentation for snippet; expanding snippet for function declaration in another
|
||||||
|
function body with moving expansion point beyond initial function; performing
|
||||||
|
extract method refactoring via expanding snippet in different place.
|
||||||
|
|
||||||
|
Pre-expand action declared as follows: >
|
||||||
|
pre_expand "python code here"
|
||||||
|
snippet ...
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
Buffer can be modified in pre-expand action code through variable called
|
||||||
|
'snip.buffer', snippet expansion position will be automatically adjusted.
|
||||||
|
|
||||||
|
If cursor line (where trigger was matched) need to be modified, then special
|
||||||
|
variable method 'snip.cursor.set(line, column)' must be called with the
|
||||||
|
desired cursor position. In that case UltiSnips will not remove any matched
|
||||||
|
trigger text and it should be done manually in action code.
|
||||||
|
|
||||||
|
To addition to the scope variables defined above 'snip.visual_content' will be
|
||||||
|
also declared and will contain text that was selected before snippet expansion
|
||||||
|
(similar to $VISUAL placeholder).
|
||||||
|
|
||||||
|
Following snippet will be expanded at 4 spaces indentation level no matter
|
||||||
|
where it was triggered.
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
pre_expand "snip.buffer[snip.line] = ' '*4; snip.cursor.set(line, 4)"
|
||||||
|
snippet d
|
||||||
|
def $1():
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
Following snippet will move the selected code to the end of file and create
|
||||||
|
new method definition for it:
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
pre_expand "del snip.buffer[snip.line]; snip.buffer.append(''); snip.cursor.set(len(snip.buffer)-1, 0)"
|
||||||
|
snippet x
|
||||||
|
def $1():
|
||||||
|
${2:${VISUAL}}
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
4.10.2 Post-expand actions *UltiSnips-post-expand-actions*
|
||||||
|
|
||||||
|
Post-expand actions can be used to perform some actions based on the expanded
|
||||||
|
snippet text. Some cases are: code style formatting (e.g. inserting newlines
|
||||||
|
before and after method declaration), apply actions depending on python
|
||||||
|
interpolation result.
|
||||||
|
|
||||||
|
Post-expand action declared as follows: >
|
||||||
|
post_expand "python code here"
|
||||||
|
snippet ...
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
Buffer can be modified in post-expand action code through variable called
|
||||||
|
'snip.buffer', snippet expansion position will be automatically adjusted.
|
||||||
|
|
||||||
|
Variables 'snip.snippet_start' and 'snip.snippet_end' will be defined at the
|
||||||
|
action code scope and will point to positions of the start and end of expanded
|
||||||
|
snippet accordingly in the form '(line, column)'.
|
||||||
|
|
||||||
|
Note: 'snip.snippet_start' and 'snip.snippet_end' will automatically adjust to
|
||||||
|
the correct positions if post-action will insert or delete lines before
|
||||||
|
expansion.
|
||||||
|
|
||||||
|
Following snippet will expand to method definition and automatically insert
|
||||||
|
additional newline after end of the snippet. It's very useful to create a
|
||||||
|
function that will insert as many newlines as required in specific context.
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
post_expand "snip.buffer[snip.snippet_end[0]+1:snip.snippet_end[0]+1] = ['']"
|
||||||
|
snippet d "Description" b
|
||||||
|
def $1():
|
||||||
|
$2
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
4.10.3 Post-jump actions *UltiSnips-post-jump-actions*
|
||||||
|
|
||||||
|
Post-jump actions can be used to trigger some code based on user input into
|
||||||
|
the placeholders. Notable use cases: expand another snippet after jump or
|
||||||
|
anonymous snippet after last jump (e.g. perform move method refactoring and
|
||||||
|
then insert new method invokation); insert heading into TOC after last jump.
|
||||||
|
|
||||||
|
Jump-expand action declared as follows: >
|
||||||
|
post_jump "python code here"
|
||||||
|
snippet ...
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
Buffer can be modified in post-jump action code through variable called
|
||||||
|
'snip.buffer', snippet expansion position will be automatically adjusted.
|
||||||
|
|
||||||
|
Next variables and methods will be also defined in the action code scope:
|
||||||
|
* 'snip.tabstop' - number of tabstop jumped onto;
|
||||||
|
* 'snip.jump_direction' - '1' if jumped forward and '-1' otherwise;
|
||||||
|
* 'snip.tabstops' - list with tabstop objects, see above;
|
||||||
|
* 'snip.snippet_start' - (line, column) of start of the expanded snippet;
|
||||||
|
* 'snip.snippet_end' - (line, column) of end of the expanded snippet;
|
||||||
|
* 'snip.expand_anon()' - alias for 'UltiSnips_Manager.expand_anon()';
|
||||||
|
|
||||||
|
Tabstop object has several useful properties:
|
||||||
|
* 'start' - (line, column) of the starting position of the tabstop (also
|
||||||
|
accessible as 'tabstop.line' and 'tabstop.col').
|
||||||
|
* 'end' - (line, column) of the ending position;
|
||||||
|
* 'current_text' - text inside the tabstop.
|
||||||
|
|
||||||
|
Following snippet will insert section in the Table of Contents in the vim-help
|
||||||
|
file:
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
post_jump "if snip.tabstop == 0: insert_toc_item(snip.tabstops[1], snip.buffer)"
|
||||||
|
snippet s "section" b
|
||||||
|
`!p insert_delimiter_0(snip, t)`$1`!p insert_section_title(snip, t)`
|
||||||
|
`!p insert_delimiter_1(snip, t)`
|
||||||
|
$0
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
'insert_toc_item' will be called after first jump and will add newly entered
|
||||||
|
section into the TOC for current file.
|
||||||
|
|
||||||
|
Note: It is also possible to trigger snippet expansion from the jump action.
|
||||||
|
In that case method 'snip.cursor.preserve()' should be called, so UltiSnips
|
||||||
|
will know that cursor is already at the required position.
|
||||||
|
|
||||||
|
Following example will insert method call at the end of file after user jump
|
||||||
|
out of method declaration snippet.
|
||||||
|
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
global !p
|
||||||
|
def insert_method_call(name):
|
||||||
|
vim.command('normal G')
|
||||||
|
snip.expand_anon(name + '($1)\n')
|
||||||
|
endglobal
|
||||||
|
|
||||||
|
post_jump "if snip.tabstop == 0: insert_method_call(snip.tabstops[1].current_text)"
|
||||||
|
snippet d "method declaration" b
|
||||||
|
def $1():
|
||||||
|
$2
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
4.11 Autotrigger *UltiSnips-autotrigger*
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Note: vim should be newer than 7.4.214 to support this feature.
|
||||||
|
|
||||||
|
Many language constructs can occur only at specific places, so it's
|
||||||
|
possible to use snippets without manually triggering them.
|
||||||
|
|
||||||
|
Snippet can be marked as autotriggered by specifying 'A' option in the snippet
|
||||||
|
definition.
|
||||||
|
|
||||||
|
After snippet is defined as being autotriggered, snippet condition will be
|
||||||
|
checked on every typed character and if condition matches, then snippet will
|
||||||
|
be triggered.
|
||||||
|
|
||||||
|
*Warning:* using of this feature can lead to significant vim slowdown. If you
|
||||||
|
discovered that, report an issue to the github.com/SirVer/UltiSnips.
|
||||||
|
|
||||||
|
Consider following snippets, that can be usefull in Go programming:
|
||||||
|
------------------- SNIP -------------------
|
||||||
|
snippet "^p" "package" rbA
|
||||||
|
package ${1:main}
|
||||||
|
endsnippet
|
||||||
|
|
||||||
|
snippet "^m" "func main" rbA
|
||||||
|
func main() {
|
||||||
|
$1
|
||||||
|
}
|
||||||
|
endsnippet
|
||||||
|
------------------- SNAP -------------------
|
||||||
|
|
||||||
|
When "p" character will occur in the beginning of the line, it will be
|
||||||
|
automatically expanded into "package main". Same with "m" character. There is
|
||||||
|
no need to press trigger key after "m""
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
5. Support for other plugins *UltiSnips-other-plugins*
|
5. UltiSnips and Other Plugins *UltiSnips-other-plugins*
|
||||||
|
|
||||||
|
5.1 Existing Integrations *UltiSnips-integrations*
|
||||||
|
-------------------------
|
||||||
|
|
||||||
UltiSnips has built-in support for some common plugins and there are others
|
UltiSnips has built-in support for some common plugins and there are others
|
||||||
that are aware of UltiSnips and use it to improve the user experience. This is
|
that are aware of UltiSnips and use it to improve the user experience. This is
|
||||||
an incomplete list - if you want to have your plugin listed here, just sent me
|
an incomplete list - if you want to have your plugin listed here, just send a
|
||||||
a pull request.
|
pull request.
|
||||||
|
|
||||||
|
*UltiSnips-snipMate*
|
||||||
|
|
||||||
|
snipMate - UltiSnips is a drop-in replacement for snipMate. It has many more
|
||||||
|
features, so porting snippets is still a good idea, but switching has low
|
||||||
|
friction now. UltiSnips is trying hard to truly emulate snipMate, for example
|
||||||
|
recursive tabstops are not supported in snipMate snippets (but of course in
|
||||||
|
UltiSnips snippets).
|
||||||
|
|
||||||
YouCompleteMe - comes with out of the box completion support for UltiSnips. It
|
YouCompleteMe - comes with out of the box completion support for UltiSnips. It
|
||||||
offers a really nice completion dialogue for snippets.
|
offers a really nice completion dialogue for snippets.
|
||||||
|
|
||||||
|
neocomplete - UltiSnips ships with a source for neocomplete and therefore
|
||||||
|
offers out of the box completion dialogue support for it too.
|
||||||
|
|
||||||
|
unite - UltiSnips has a source for unite. As an example of how you can use
|
||||||
|
it add the following function and mappings to your vimrc: >
|
||||||
|
|
||||||
|
function! UltiSnipsCallUnite()
|
||||||
|
Unite -start-insert -winheight=100 -immediately -no-empty ultisnips
|
||||||
|
return ''
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
inoremap <silent> <F12> <C-R>=(pumvisible()? "\<LT>C-E>":"")<CR><C-R>=UltiSnipsCallUnite()<CR>
|
||||||
|
nnoremap <silent> <F12> a<C-R>=(pumvisible()? "\<LT>C-E>":"")<CR><C-R>=UltiSnipsCallUnite()<CR>
|
||||||
|
|
||||||
|
When typing <F12> in either insert or normal mode you will get the unite
|
||||||
|
interface with matching snippets. Pressing enter will expand the corresponding
|
||||||
|
snippet. If only one snippet matches the text in front of the cursor will be
|
||||||
|
expanded when you press the <F12> key.
|
||||||
|
|
||||||
Supertab - UltiSnips has built-in support for Supertab. Just use a recent
|
Supertab - UltiSnips has built-in support for Supertab. Just use a recent
|
||||||
enough version of both plugins and <tab> will either expand a snippet or defer
|
enough version of both plugins and <tab> will either expand a snippet or defer
|
||||||
to Supertab for expansion.
|
to Supertab for expansion.
|
||||||
|
|
||||||
neocomplcache - Stanislav Golovanov (JazzCore) has made an integration plugin
|
5.2 Extending UltiSnips *UltiSnips-extending*
|
||||||
to use UltiSnips as engine inside of neocomplcache. You can find his work at
|
-------------------------
|
||||||
https://github.com/JazzCore/neocomplcache-ultisnips.
|
|
||||||
|
|
||||||
|
UltiSnips allows other plugins to add new snippets on the fly. Since UltiSnips
|
||||||
|
is written in python, the integration is also on a python basis. A small
|
||||||
|
example can be found in `test.py`, search for AddNewSnippetSource. Please
|
||||||
|
contact us on github if you integrate UltiSnips with your plugin so it can be
|
||||||
|
listed in the docs.
|
||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
6. Helping Out *UltiSnips-helping*
|
6. Helping Out *UltiSnips-helping*
|
||||||
|
|
||||||
UltiSnips needs the help of the Vim community to keep improving. Please
|
UltiSnips needs the help of the Vim community to keep improving. Please
|
||||||
consider joining this effort by providing new snippets, new features or bug
|
consider joining this effort by providing new features or bug reports.
|
||||||
reports.
|
|
||||||
|
|
||||||
You can contribute snippets or patches in various ways. The methods are listed
|
|
||||||
below in order of convenience for me. Please be as convenient as you
|
|
||||||
can be :)
|
|
||||||
|
|
||||||
* Clone the repository on GitHub (git clone git@github.com:SirVer/ultisnips.git),
|
* Clone the repository on GitHub (git clone git@github.com:SirVer/ultisnips.git),
|
||||||
make your changes and send a pull request on GitHub.
|
make your changes and send a pull request on GitHub.
|
||||||
* Make a patch, report a bug/feature request (see below) and attach the patch
|
* Make a patch, report a bug/feature request (see below) and attach the patch
|
||||||
to it.
|
to it.
|
||||||
* Send me an Email with a patch (see Contact section below).
|
|
||||||
* Send me an Email with the changed files only.
|
|
||||||
|
|
||||||
You can contribute by fixing or reporting bugs in our issue tracker:
|
You can contribute by fixing or reporting bugs in our issue tracker:
|
||||||
https://github.com/sirver/ultisnips/issues
|
https://github.com/sirver/ultisnips/issues
|
||||||
|
|
||||||
If you like this plugin, please vote for it on its Vim script page >
|
|
||||||
http://www.vim.org/scripts/script.php?script_id=2715
|
|
||||||
It is life-changing for me. Maybe it is for you too.
|
|
||||||
|
|
||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
7. Contact *UltiSnips-contact*
|
7. Contributors *UltiSnips-contributors*
|
||||||
|
|
||||||
You can reach me at SirVer -AT- gmx -ADOT- de.
|
UltiSnips has been started and maintained from Jun 2009 - Dec 2015 by Holger
|
||||||
|
Rapp (@SirVer, SirVer@gmx.de). It is now maintained by Stanislav Seletskiy
|
||||||
|
(@seletskiy).
|
||||||
|
|
||||||
This project aims to be the one-for-all solution for Snippets for Vim. If you
|
This is the list of contributors pre-git in chronological order. For a full
|
||||||
miss a feature or find a bug, please contact me or add an issues to our issues
|
list of contributors take the union of this set and the authors according to
|
||||||
tracker.
|
git log.
|
||||||
|
|
||||||
=============================================================================
|
|
||||||
8. Contributors *UltiSnips-contributors*
|
|
||||||
|
|
||||||
The primary developer of UltiSnips is SirVer (Holger Rapp). The following
|
|
||||||
individuals have contributed to UltiSnips.
|
|
||||||
|
|
||||||
|
|
||||||
8.1 Patches & Coding *UltiSnips-contricoding*
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Contributors listed in chronological order:
|
|
||||||
|
|
||||||
JCEB - Jan Christoph Ebersbach
|
JCEB - Jan Christoph Ebersbach
|
||||||
Michael Henry
|
Michael Henry
|
||||||
@ -1357,61 +1825,21 @@ Contributors listed in chronological order:
|
|||||||
Brian Mock - saikobee
|
Brian Mock - saikobee
|
||||||
Gernot Höflechner - LFDM
|
Gernot Höflechner - LFDM
|
||||||
Marcelo D Montu - mMontu
|
Marcelo D Montu - mMontu
|
||||||
|
Karl Yngve Lervåg - lervag
|
||||||
|
Pedro Ferrari - petobens
|
||||||
8.2 Snippets *UltiSnips-contrisnippets*
|
Ches Martin - ches
|
||||||
------------
|
Christian - Oberon00
|
||||||
|
Andrew Ruder - aeruder
|
||||||
Contributors listed in chronological order:
|
Mathias Fußenegger - mfussenegger
|
||||||
|
Kevin Ballard - kballard
|
||||||
Alec Thomas
|
Ahbong Chang - cwahbong
|
||||||
Ryan Wooden
|
Glenn Griffin - ggriffiniii
|
||||||
Ches Martin
|
Michael - Pyrohh
|
||||||
Gordin (g0rdin)
|
Stanislav Seletskiy - seletskiy
|
||||||
Jan Mollowitz (phux)
|
Pawel Palucki - ppalucki
|
||||||
Georgi Valkov (gvalkov)
|
Dettorer - dettorer
|
||||||
Miek Gieben (miek)
|
Zhao Jiarong - kawing-chiu
|
||||||
Aldis Berjoza (graudeejs)
|
Ye Ding - dyng
|
||||||
Jorge Rodrigues (skeept)
|
Greg Hurrell - wincent
|
||||||
Martin Grenfell (scrooloose)
|
|
||||||
Laughedelic
|
|
||||||
Anthony Wilson (anthonywilson)
|
|
||||||
Nick Anderson (nickanderson)
|
|
||||||
Timothy Mellor (mellort)
|
|
||||||
Chris Lasher (gotgenes)
|
|
||||||
Chen Houwu (chenhouwu)
|
|
||||||
Harry Zhxu (harryzhxu)
|
|
||||||
Pavel Puchkin (neoascetic)
|
|
||||||
Jacek Wysocki (exu)
|
|
||||||
Alexander Kondratskiy (KholdStare)
|
|
||||||
Martin Krauskopf (martin-krauskopf)
|
|
||||||
Theocrite (theocrite)
|
|
||||||
Ferdinand Majerech (kiith-sa)
|
|
||||||
Vivien Didelot
|
|
||||||
Øystein Walle (osse)
|
|
||||||
Pedro Algarvio (s0undt3ch)
|
|
||||||
Steven Humphrey (shumphrey)
|
|
||||||
Björn Winckler (b4winckler)
|
|
||||||
David Brown (Nali4Freedom)
|
|
||||||
Harry Xu (harryxu)
|
|
||||||
Tom Cammann (takac)
|
|
||||||
Paolo Cretaro (melko)
|
|
||||||
Sergey Alexandrov (taketwo)
|
|
||||||
Jaromír Hradílek (jhradilek)
|
|
||||||
Vangelis Tsoumenis (kioopi)
|
|
||||||
Rudi Grinberg (rgrinberg)
|
|
||||||
javipolo
|
|
||||||
Matthew Strawbridge (pxc)
|
|
||||||
Josh Strater (jstrater)
|
|
||||||
jinzhu
|
|
||||||
Rene Vergara (ravl1084)
|
|
||||||
Johan Haals (JHaals)
|
|
||||||
Danilo Bargen (dbrgn)
|
|
||||||
Bernhard Vallant (lazerscience)
|
|
||||||
Von Welch (von)
|
|
||||||
Nikola Petrov (nikolavp)
|
|
||||||
Maarten Slagter (slagtermaarten)
|
|
||||||
|
|
||||||
Thank you for your support.
|
|
||||||
|
|
||||||
vim:tw=78:ts=8:ft=help:norl:
|
vim:tw=78:ts=8:ft=help:norl:
|
||||||
|
|||||||
BIN
doc/demo.gif
Normal file
BIN
doc/demo.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 MiB |
@ -1,5 +1,17 @@
|
|||||||
" This has to be called before ftplugins are loaded. Therefore
|
" This has to be called before ftplugins are loaded. Therefore
|
||||||
" it is here in ftdetect though it maybe shouldn't
|
" it is here in ftdetect though it maybe shouldn't
|
||||||
if has("autocmd")
|
|
||||||
autocmd FileType * call UltiSnips#FileTypeChanged()
|
" This is necessary to prevent errors when using vim as a pager.
|
||||||
|
if exists("vimpager")
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has("autocmd") && &loadplugins
|
||||||
|
augroup UltiSnipsFileType
|
||||||
|
autocmd!
|
||||||
|
autocmd FileType * call UltiSnips#FileTypeChanged()
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
" restore 'filetypedetect' group declaration
|
||||||
|
augroup filetypedetect
|
||||||
endif
|
endif
|
||||||
|
|||||||
@ -1,5 +1,13 @@
|
|||||||
" Set some sane defaults for snippet files
|
" Set some sane defaults for snippet files
|
||||||
|
|
||||||
|
if exists('b:did_ftplugin')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let b:did_ftplugin = 1
|
||||||
|
|
||||||
|
let s:save_cpo = &cpo
|
||||||
|
set cpo&vim
|
||||||
|
|
||||||
" Fold by syntax, but open all folds by default
|
" Fold by syntax, but open all folds by default
|
||||||
setlocal foldmethod=syntax
|
setlocal foldmethod=syntax
|
||||||
setlocal foldlevel=99
|
setlocal foldlevel=99
|
||||||
@ -7,10 +15,33 @@ setlocal foldlevel=99
|
|||||||
setlocal commentstring=#%s
|
setlocal commentstring=#%s
|
||||||
|
|
||||||
setlocal noexpandtab
|
setlocal noexpandtab
|
||||||
|
setlocal autoindent nosmartindent nocindent
|
||||||
|
|
||||||
" Define match words for use with matchit plugin
|
" Define match words for use with matchit plugin
|
||||||
" http://www.vim.org/scripts/script.php?script_id=39
|
" http://www.vim.org/scripts/script.php?script_id=39
|
||||||
if exists("loaded_matchit") && !exists("b:match_words")
|
if exists("loaded_matchit") && !exists("b:match_words")
|
||||||
let b:match_ignorecase = 0
|
let b:match_ignorecase = 0
|
||||||
let b:match_words = '^snippet\>:^endsnippet\>,^global\>:^endglobal\>,\${:}'
|
let b:match_words = '^snippet\>:^endsnippet\>,^global\>:^endglobal\>,\${:}'
|
||||||
|
let s:set_match_words = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Add TagBar support
|
||||||
|
let g:tagbar_type_snippets = {
|
||||||
|
\ 'ctagstype': 'UltiSnips',
|
||||||
|
\ 'kinds': [
|
||||||
|
\ 's:snippets',
|
||||||
|
\ ],
|
||||||
|
\ 'deffile': expand('<sfile>:p:h:h') . '/ctags/UltiSnips.cnf',
|
||||||
|
\ }
|
||||||
|
|
||||||
|
" don't unset g:tagbar_type_snippets, it serves no purpose
|
||||||
|
let b:undo_ftplugin = "
|
||||||
|
\ setlocal foldmethod< foldlevel< commentstring<
|
||||||
|
\|setlocal expandtab< autoindent< smartindent< cindent<
|
||||||
|
\|if get(s:, 'set_match_words')
|
||||||
|
\|unlet! b:match_ignorecase b:match_words s:set_match_words
|
||||||
|
\|endif
|
||||||
|
\"
|
||||||
|
|
||||||
|
let &cpo = s:save_cpo
|
||||||
|
unlet s:save_cpo
|
||||||
|
|||||||
@ -1,69 +1,57 @@
|
|||||||
" File: UltiSnips.vim
|
if exists('did_plugin_ultisnips') || &cp
|
||||||
" Author: Holger Rapp <SirVer@gmx.de>
|
|
||||||
" Description: The Ultimate Snippets solution for Vim
|
|
||||||
"
|
|
||||||
" Testing Info:
|
|
||||||
" See directions at the top of the test.py script located one
|
|
||||||
" directory above this file.
|
|
||||||
|
|
||||||
if exists('did_UltiSnips_plugin') || &cp || version < 700
|
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
|
let did_plugin_ultisnips=1
|
||||||
|
|
||||||
|
if version < 704
|
||||||
|
echohl WarningMsg
|
||||||
|
echom "UltiSnips requires Vim >= 7.4"
|
||||||
|
echohl None
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !exists("g:UltiSnipsUsePythonVersion")
|
||||||
|
let g:_uspy=":py3 "
|
||||||
|
if !has("python3")
|
||||||
|
if !has("python")
|
||||||
|
if !exists("g:UltiSnipsNoPythonWarning")
|
||||||
|
echohl WarningMsg
|
||||||
|
echom "UltiSnips requires py >= 2.7 or py3"
|
||||||
|
echohl None
|
||||||
|
endif
|
||||||
|
unlet g:_uspy
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
let g:_uspy=":py "
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
" Use user-provided value, but check if it's available.
|
||||||
|
" This uses `has()`, because e.g. `exists(":python3")` is always 2.
|
||||||
|
if g:UltiSnipsUsePythonVersion == 2 && has('python')
|
||||||
|
let g:_uspy=":python "
|
||||||
|
elseif g:UltiSnipsUsePythonVersion == 3 && has('python3')
|
||||||
|
let g:_uspy=":python3 "
|
||||||
|
endif
|
||||||
|
if !exists('g:_uspy')
|
||||||
|
echohl WarningMsg
|
||||||
|
echom "UltiSnips: the Python version from g:UltiSnipsUsePythonVersion (".g:UltiSnipsUsePythonVersion.") is not available."
|
||||||
|
echohl None
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
" The Commands we define.
|
" The Commands we define.
|
||||||
command! -nargs=? -complete=customlist,UltiSnips#FileTypeComplete UltiSnipsEdit
|
command! -bang -nargs=? -complete=customlist,UltiSnips#FileTypeComplete UltiSnipsEdit
|
||||||
\ :call UltiSnips#Edit(<q-args>)
|
\ :call UltiSnips#Edit(<q-bang>, <q-args>)
|
||||||
|
|
||||||
command! -nargs=1 UltiSnipsAddFiletypes :call UltiSnips#AddFiletypes(<q-args>)
|
command! -nargs=1 UltiSnipsAddFiletypes :call UltiSnips#AddFiletypes(<q-args>)
|
||||||
|
|
||||||
" Backwards compatible functions. Prefer the ones in autoload/.
|
augroup UltiSnips_AutoTrigger
|
||||||
function! UltiSnips_FileTypeChanged()
|
au!
|
||||||
echoerr "Deprecated UltiSnips_FileTypeChanged called. Please use UltiSnips#FileTypeChanged." | sleep 1
|
au InsertCharPre * call UltiSnips#TrackChange()
|
||||||
return UltiSnips#FileTypeChanged()
|
au TextChangedI * call UltiSnips#TrackChange()
|
||||||
endfunction
|
augroup END
|
||||||
|
|
||||||
function! UltiSnips_ExpandSnippet()
|
|
||||||
echoerr "Deprecated UltiSnips_ExpandSnippet called. Please use UltiSnips#ExpandSnippet." | sleep 1
|
|
||||||
return UltiSnips#ExpandSnippet()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips_ExpandSnippetOrJump()
|
|
||||||
echoerr "Deprecated UltiSnips_ExpandSnippetOrJump called. Please use UltiSnips#ExpandSnippetOrJump." | sleep 1
|
|
||||||
return UltiSnips#ExpandSnippetOrJump()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips_SnippetsInCurrentScope()
|
|
||||||
echoerr "Deprecated UltiSnips_SnippetsInCurrentScope called. Please use UltiSnips#SnippetsInCurrentScope." | sleep 1
|
|
||||||
return UltiSnips#SnippetsInCurrentScope()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips_JumpBackwards()
|
|
||||||
echoerr "Deprecated UltiSnips_JumpBackwards called. Please use UltiSnips#JumpBackwards." | sleep 1
|
|
||||||
return UltiSnips#JumpBackwards()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips_JumpForwards()
|
|
||||||
echoerr "Deprecated UltiSnips_JumpForwards called. Please use UltiSnips#JumpForwards." | sleep 1
|
|
||||||
return UltiSnips#JumpForwards()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips_AddSnippet(...)
|
|
||||||
echoerr "Deprecated UltiSnips_AddSnippet called. Please use UltiSnips#AddSnippetWithPriority." | sleep 1
|
|
||||||
return call(function('UltiSnips#AddSnippet'), a:000)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! UltiSnips_Anon(...)
|
|
||||||
echoerr "Deprecated UltiSnips_Anon called. Please use UltiSnips#Anon." | sleep 1
|
|
||||||
return call(function('UltiSnips#Anon'), a:000)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
au CursorMovedI * call UltiSnips#CursorMoved()
|
|
||||||
au CursorMoved * call UltiSnips#CursorMoved()
|
|
||||||
au BufLeave * call UltiSnips#LeavingBuffer()
|
|
||||||
au InsertLeave * call UltiSnips#LeavingInsertMode()
|
|
||||||
|
|
||||||
call UltiSnips#map_keys#MapKeys()
|
call UltiSnips#map_keys#MapKeys()
|
||||||
|
|
||||||
let did_UltiSnips_plugin=1
|
|
||||||
|
|
||||||
" vim: ts=8 sts=4 sw=4
|
" vim: ts=8 sts=4 sw=4
|
||||||
|
|||||||
@ -1,28 +0,0 @@
|
|||||||
" File: snipMate_compatibility.vim
|
|
||||||
" Author: Phillip Berndt <phillip.berndt@gmail.com>
|
|
||||||
" Description: Snipmate compatibility helper functions for UltiSnips
|
|
||||||
"
|
|
||||||
" Snipmate defines a function named Filename and a variable called
|
|
||||||
" g:snips_author for use in snippet subtitutions. See
|
|
||||||
" https://github.com/msanders/snipmate.vim/blob/master/doc/snipMate.txt
|
|
||||||
" for details.
|
|
||||||
"
|
|
||||||
|
|
||||||
if exists('did_UltiSnips_snipmate_compatibility')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let did_UltiSnips_snipmate_compatibility = 1
|
|
||||||
|
|
||||||
" Define g:snips_author; some snipmate snippets use this
|
|
||||||
if ! exists('g:snips_author')
|
|
||||||
let g:snips_author = "John Doe"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Filename function, taken from snipMate.vim {{{
|
|
||||||
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
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
1
pylintrc
1
pylintrc
@ -44,6 +44,7 @@ disable=
|
|||||||
too-many-public-methods,
|
too-many-public-methods,
|
||||||
too-many-return-statements,
|
too-many-return-statements,
|
||||||
too-many-statements,
|
too-many-statements,
|
||||||
|
bad-continuation,
|
||||||
|
|
||||||
|
|
||||||
[REPORTS]
|
[REPORTS]
|
||||||
|
|||||||
@ -3,11 +3,4 @@
|
|||||||
|
|
||||||
"""Entry point for all thinks UltiSnips."""
|
"""Entry point for all thinks UltiSnips."""
|
||||||
|
|
||||||
import vim # pylint:disable=import-error
|
from UltiSnips.snippet_manager import UltiSnips_Manager
|
||||||
|
|
||||||
from UltiSnips.snippet_manager import SnippetManager
|
|
||||||
|
|
||||||
UltiSnips_Manager = SnippetManager( # pylint:disable=invalid-name
|
|
||||||
vim.eval('g:UltiSnipsExpandTrigger'),
|
|
||||||
vim.eval('g:UltiSnipsJumpForwardTrigger'),
|
|
||||||
vim.eval('g:UltiSnipsJumpBackwardTrigger'))
|
|
||||||
|
|||||||
@ -10,39 +10,45 @@ import sys
|
|||||||
from UltiSnips import _vim
|
from UltiSnips import _vim
|
||||||
from UltiSnips.position import Position
|
from UltiSnips.position import Position
|
||||||
|
|
||||||
|
|
||||||
def is_complete_edit(initial_line, original, wanted, cmds):
|
def is_complete_edit(initial_line, original, wanted, cmds):
|
||||||
"""Returns true if 'original' is changed to 'wanted' with the edit commands
|
"""Returns true if 'original' is changed to 'wanted' with the edit commands
|
||||||
in 'cmds'. Initial line is to change the line numbers in 'cmds'."""
|
in 'cmds'.
|
||||||
|
|
||||||
|
Initial line is to change the line numbers in 'cmds'.
|
||||||
|
|
||||||
|
"""
|
||||||
buf = original[:]
|
buf = original[:]
|
||||||
for cmd in cmds:
|
for cmd in cmds:
|
||||||
ctype, line, col, char = cmd
|
ctype, line, col, char = cmd
|
||||||
line -= initial_line
|
line -= initial_line
|
||||||
if ctype == "D":
|
if ctype == 'D':
|
||||||
if char != '\n':
|
if char != '\n':
|
||||||
buf[line] = buf[line][:col] + buf[line][col+len(char):]
|
buf[line] = buf[line][:col] + buf[line][col + len(char):]
|
||||||
else:
|
else:
|
||||||
if line + 1 < len(buf):
|
if line + 1 < len(buf):
|
||||||
buf[line] = buf[line] + buf[line+1]
|
buf[line] = buf[line] + buf[line + 1]
|
||||||
del buf[line+1]
|
del buf[line + 1]
|
||||||
else:
|
else:
|
||||||
del buf[line]
|
del buf[line]
|
||||||
elif ctype == "I":
|
elif ctype == 'I':
|
||||||
buf[line] = buf[line][:col] + char + buf[line][col:]
|
buf[line] = buf[line][:col] + char + buf[line][col:]
|
||||||
buf = '\n'.join(buf).split('\n')
|
buf = '\n'.join(buf).split('\n')
|
||||||
return (len(buf) == len(wanted) and
|
return (len(buf) == len(wanted) and
|
||||||
all(j == k for j, k in zip(buf, wanted)))
|
all(j == k for j, k in zip(buf, wanted)))
|
||||||
|
|
||||||
|
|
||||||
def guess_edit(initial_line, last_text, current_text, vim_state):
|
def guess_edit(initial_line, last_text, current_text, vim_state):
|
||||||
"""
|
"""Try to guess what the user might have done by heuristically looking at
|
||||||
Try to guess what the user might have done by heuristically looking at
|
|
||||||
cursor movement, number of changed lines and if they got longer or shorter.
|
cursor movement, number of changed lines and if they got longer or shorter.
|
||||||
This will detect most simple movements like insertion, deletion of a line
|
This will detect most simple movements like insertion, deletion of a line
|
||||||
or carriage return. 'initial_text' is the index of where the comparison
|
or carriage return. 'initial_text' is the index of where the comparison
|
||||||
starts, 'last_text' is the last text of the snippet, 'current_text' is the
|
starts, 'last_text' is the last text of the snippet, 'current_text' is the
|
||||||
current text of the snippet and 'vim_state' is the cached vim state.
|
current text of the snippet and 'vim_state' is the cached vim state.
|
||||||
|
|
||||||
Returns (True, edit_cmds) when the edit could be guessed, (False, None)
|
Returns (True, edit_cmds) when the edit could be guessed, (False,
|
||||||
otherwise.
|
None) otherwise.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
if not len(last_text) and not len(current_text):
|
if not len(last_text) and not len(current_text):
|
||||||
return True, ()
|
return True, ()
|
||||||
@ -53,83 +59,84 @@ def guess_edit(initial_line, last_text, current_text, vim_state):
|
|||||||
if (len(last_text) and
|
if (len(last_text) and
|
||||||
(not current_text or
|
(not current_text or
|
||||||
(len(current_text) == 1 and not current_text[0]))
|
(len(current_text) == 1 and not current_text[0]))
|
||||||
):
|
):
|
||||||
es = []
|
es = []
|
||||||
if not current_text:
|
if not current_text:
|
||||||
current_text = ['']
|
current_text = ['']
|
||||||
for i in last_text:
|
for i in last_text:
|
||||||
es.append(("D", initial_line, 0, i))
|
es.append(('D', initial_line, 0, i))
|
||||||
es.append(("D", initial_line, 0, "\n"))
|
es.append(('D', initial_line, 0, '\n'))
|
||||||
es.pop() # Remove final \n because it is not really removed
|
es.pop() # Remove final \n because it is not really removed
|
||||||
if is_complete_edit(initial_line, last_text, current_text, es):
|
if is_complete_edit(initial_line, last_text, current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
if ppos.mode == 'v': # Maybe selectmode?
|
if ppos.mode == 'v': # Maybe selectmode?
|
||||||
sv = list(map(int, _vim.eval("""getpos("'<")""")))
|
sv = list(map(int, _vim.eval("""getpos("'<")""")))
|
||||||
sv = Position(sv[1]-1, sv[2]-1)
|
sv = Position(sv[1] - 1, sv[2] - 1)
|
||||||
ev = list(map(int, _vim.eval("""getpos("'>")""")))
|
ev = list(map(int, _vim.eval("""getpos("'>")""")))
|
||||||
ev = Position(ev[1]-1, ev[2]-1)
|
ev = Position(ev[1] - 1, ev[2] - 1)
|
||||||
if "exclusive" in _vim.eval("&selection"):
|
if 'exclusive' in _vim.eval('&selection'):
|
||||||
ppos.col -= 1 # We want to be inclusive, sorry.
|
ppos.col -= 1 # We want to be inclusive, sorry.
|
||||||
ev.col -= 1
|
ev.col -= 1
|
||||||
es = []
|
es = []
|
||||||
if sv.line == ev.line:
|
if sv.line == ev.line:
|
||||||
es.append(("D", sv.line, sv.col,
|
es.append(('D', sv.line, sv.col,
|
||||||
last_text[sv.line - initial_line][sv.col:ev.col+1]))
|
last_text[sv.line - initial_line][sv.col:ev.col + 1]))
|
||||||
if sv != pos and sv.line == pos.line:
|
if sv != pos and sv.line == pos.line:
|
||||||
es.append(("I", sv.line, sv.col,
|
es.append(('I', sv.line, sv.col,
|
||||||
current_text[sv.line - initial_line][sv.col:pos.col+1]))
|
current_text[sv.line - initial_line][sv.col:pos.col + 1]))
|
||||||
if is_complete_edit(initial_line, last_text, current_text, es):
|
if is_complete_edit(initial_line, last_text, current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
if pos.line == ppos.line:
|
if pos.line == ppos.line:
|
||||||
if len(last_text) == len(current_text): # Movement only in one line
|
if len(last_text) == len(current_text): # Movement only in one line
|
||||||
llen = len(last_text[ppos.line - initial_line])
|
llen = len(last_text[ppos.line - initial_line])
|
||||||
clen = len(current_text[pos.line - initial_line])
|
clen = len(current_text[pos.line - initial_line])
|
||||||
if ppos < pos and clen > llen: # maybe only chars have been added
|
if ppos < pos and clen > llen: # maybe only chars have been added
|
||||||
es = (
|
es = (
|
||||||
("I", ppos.line, ppos.col,
|
('I', ppos.line, ppos.col,
|
||||||
current_text[ppos.line - initial_line]
|
current_text[ppos.line - initial_line]
|
||||||
[ppos.col:pos.col]),
|
[ppos.col:pos.col]),
|
||||||
)
|
)
|
||||||
if is_complete_edit(initial_line, last_text, current_text, es):
|
if is_complete_edit(initial_line, last_text, current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
if clen < llen:
|
if clen < llen:
|
||||||
if ppos == pos: # 'x' or DEL or dt or something
|
if ppos == pos: # 'x' or DEL or dt or something
|
||||||
es = (
|
es = (
|
||||||
("D", pos.line, pos.col,
|
('D', pos.line, pos.col,
|
||||||
last_text[ppos.line - initial_line]
|
last_text[ppos.line - initial_line]
|
||||||
[ppos.col:ppos.col + (llen - clen)]),
|
[ppos.col:ppos.col + (llen - clen)]),
|
||||||
)
|
)
|
||||||
if is_complete_edit(initial_line, last_text,
|
if is_complete_edit(initial_line, last_text,
|
||||||
current_text, es):
|
current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
if pos < ppos: # Backspacing or dT dF?
|
if pos < ppos: # Backspacing or dT dF?
|
||||||
es = (
|
es = (
|
||||||
("D", pos.line, pos.col,
|
('D', pos.line, pos.col,
|
||||||
last_text[pos.line - initial_line]
|
last_text[pos.line - initial_line]
|
||||||
[pos.col:pos.col + llen - clen]),
|
[pos.col:pos.col + llen - clen]),
|
||||||
)
|
)
|
||||||
if is_complete_edit(initial_line, last_text,
|
if is_complete_edit(initial_line, last_text,
|
||||||
current_text, es):
|
current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
elif len(current_text) < len(last_text):
|
elif len(current_text) < len(last_text):
|
||||||
# where some lines deleted? (dd or so)
|
# where some lines deleted? (dd or so)
|
||||||
es = []
|
es = []
|
||||||
for i in range(len(last_text)-len(current_text)):
|
for i in range(len(last_text) - len(current_text)):
|
||||||
es.append(("D", pos.line, 0,
|
es.append(('D', pos.line, 0,
|
||||||
last_text[pos.line - initial_line + i]))
|
last_text[pos.line - initial_line + i]))
|
||||||
es.append(("D", pos.line, 0, '\n'))
|
es.append(('D', pos.line, 0, '\n'))
|
||||||
if is_complete_edit(initial_line, last_text,
|
if is_complete_edit(initial_line, last_text,
|
||||||
current_text, es):
|
current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
else:
|
else:
|
||||||
# Movement in more than one line
|
# Movement in more than one line
|
||||||
if ppos.line + 1 == pos.line and pos.col == 0: # Carriage return?
|
if ppos.line + 1 == pos.line and pos.col == 0: # Carriage return?
|
||||||
es = (("I", ppos.line, ppos.col, "\n"),)
|
es = (('I', ppos.line, ppos.col, '\n'),)
|
||||||
if is_complete_edit(initial_line, last_text,
|
if is_complete_edit(initial_line, last_text,
|
||||||
current_text, es):
|
current_text, es):
|
||||||
return True, es
|
return True, es
|
||||||
return False, None
|
return False, None
|
||||||
|
|
||||||
|
|
||||||
def diff(a, b, sline=0):
|
def diff(a, b, sline=0):
|
||||||
"""
|
"""
|
||||||
Return a list of deletions and insertions that will turn 'a' into 'b'. This
|
Return a list of deletions and insertions that will turn 'a' into 'b'. This
|
||||||
@ -154,8 +161,8 @@ def diff(a, b, sline=0):
|
|||||||
|
|
||||||
d[0] = [(0, 0, sline, 0, ())]
|
d[0] = [(0, 0, sline, 0, ())]
|
||||||
cost = 0
|
cost = 0
|
||||||
deletion_cost = len(a)+len(b)
|
deletion_cost = len(a) + len(b)
|
||||||
insertion_cost = len(a)+len(b)
|
insertion_cost = len(a) + len(b)
|
||||||
while True:
|
while True:
|
||||||
while len(d[cost]):
|
while len(d[cost]):
|
||||||
x, y, line, col, what = d[cost].pop()
|
x, y, line, col, what = d[cost].pop()
|
||||||
@ -170,50 +177,50 @@ def diff(a, b, sline=0):
|
|||||||
ncol = 0
|
ncol = 0
|
||||||
nline += 1
|
nline += 1
|
||||||
lcost = cost + 1
|
lcost = cost + 1
|
||||||
if (what and what[-1][0] == "D" and what[-1][1] == line and
|
if (what and what[-1][0] == 'D' and what[-1][1] == line and
|
||||||
what[-1][2] == col and a[x] != '\n'):
|
what[-1][2] == col and a[x] != '\n'):
|
||||||
# Matching directly after a deletion should be as costly as
|
# Matching directly after a deletion should be as costly as
|
||||||
# DELETE + INSERT + a bit
|
# DELETE + INSERT + a bit
|
||||||
lcost = (deletion_cost + insertion_cost)*1.5
|
lcost = (deletion_cost + insertion_cost) * 1.5
|
||||||
if seen[x+1, y+1] > lcost:
|
if seen[x + 1, y + 1] > lcost:
|
||||||
d[lcost].append((x+1, y+1, nline, ncol, what))
|
d[lcost].append((x + 1, y + 1, nline, ncol, what))
|
||||||
seen[x+1, y+1] = lcost
|
seen[x + 1, y + 1] = lcost
|
||||||
if y < len(b): # INSERT
|
if y < len(b): # INSERT
|
||||||
ncol = col + 1
|
ncol = col + 1
|
||||||
nline = line
|
nline = line
|
||||||
if b[y] == '\n':
|
if b[y] == '\n':
|
||||||
ncol = 0
|
ncol = 0
|
||||||
nline += 1
|
nline += 1
|
||||||
if (what and what[-1][0] == "I" and what[-1][1] == nline and
|
if (what and what[-1][0] == 'I' and what[-1][1] == nline and
|
||||||
what[-1][2]+len(what[-1][-1]) == col and b[y] != '\n' and
|
what[-1][2] + len(what[-1][-1]) == col and b[y] != '\n' and
|
||||||
seen[x, y+1] > cost + (insertion_cost + ncol) // 2
|
seen[x, y + 1] > cost + (insertion_cost + ncol) // 2
|
||||||
):
|
):
|
||||||
seen[x, y+1] = cost + (insertion_cost + ncol) // 2
|
seen[x, y + 1] = cost + (insertion_cost + ncol) // 2
|
||||||
d[cost + (insertion_cost + ncol) // 2].append(
|
d[cost + (insertion_cost + ncol) // 2].append(
|
||||||
(x, y+1, line, ncol, what[:-1] + (
|
(x, y + 1, line, ncol, what[:-1] + (
|
||||||
("I", what[-1][1], what[-1][2],
|
('I', what[-1][1], what[-1][2],
|
||||||
what[-1][-1] + b[y]),)
|
what[-1][-1] + b[y]),)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif seen[x, y+1] > cost + insertion_cost + ncol:
|
elif seen[x, y + 1] > cost + insertion_cost + ncol:
|
||||||
seen[x, y+1] = cost + insertion_cost + ncol
|
seen[x, y + 1] = cost + insertion_cost + ncol
|
||||||
d[cost + ncol + insertion_cost].append((x, y+1, nline, ncol,
|
d[cost + ncol + insertion_cost].append((x, y + 1, nline, ncol,
|
||||||
what + (("I", line, col, b[y]),))
|
what + (('I', line, col, b[y]),))
|
||||||
)
|
)
|
||||||
if x < len(a): # DELETE
|
if x < len(a): # DELETE
|
||||||
if (what and what[-1][0] == "D" and what[-1][1] == line and
|
if (what and what[-1][0] == 'D' and what[-1][1] == line and
|
||||||
what[-1][2] == col and a[x] != '\n' and
|
what[-1][2] == col and a[x] != '\n' and
|
||||||
what[-1][-1] != '\n' and
|
what[-1][-1] != '\n' and
|
||||||
seen[x+1, y] > cost + deletion_cost // 2
|
seen[x + 1, y] > cost + deletion_cost // 2
|
||||||
):
|
):
|
||||||
seen[x+1, y] = cost + deletion_cost // 2
|
seen[x + 1, y] = cost + deletion_cost // 2
|
||||||
d[cost + deletion_cost // 2].append(
|
d[cost + deletion_cost // 2].append(
|
||||||
(x+1, y, line, col, what[:-1] + (
|
(x + 1, y, line, col, what[:-1] + (
|
||||||
("D", line, col, what[-1][-1] + a[x]),))
|
('D', line, col, what[-1][-1] + a[x]),))
|
||||||
)
|
|
||||||
elif seen[x+1, y] > cost + deletion_cost:
|
|
||||||
seen[x+1, y] = cost + deletion_cost
|
|
||||||
d[cost + deletion_cost].append((x+1, y, line, col, what +
|
|
||||||
(("D", line, col, a[x]),))
|
|
||||||
)
|
)
|
||||||
|
elif seen[x + 1, y] > cost + deletion_cost:
|
||||||
|
seen[x + 1, y] = cost + deletion_cost
|
||||||
|
d[cost + deletion_cost].append((x + 1, y, line, col, what +
|
||||||
|
(('D', line, col, a[x]),))
|
||||||
|
)
|
||||||
cost += 1
|
cost += 1
|
||||||
|
|||||||
@ -9,64 +9,87 @@ import vim # pylint:disable=import-error
|
|||||||
from vim import error # pylint:disable=import-error,unused-import
|
from vim import error # pylint:disable=import-error,unused-import
|
||||||
|
|
||||||
from UltiSnips.compatibility import col2byte, byte2col, \
|
from UltiSnips.compatibility import col2byte, byte2col, \
|
||||||
as_unicode, as_vimencoding
|
as_unicode, as_vimencoding
|
||||||
from UltiSnips.position import Position
|
from UltiSnips.position import Position
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
|
||||||
class VimBuffer(object):
|
class VimBuffer(object):
|
||||||
|
|
||||||
"""Wrapper around the current Vim buffer."""
|
"""Wrapper around the current Vim buffer."""
|
||||||
|
|
||||||
def __getitem__(self, idx):
|
def __getitem__(self, idx):
|
||||||
if isinstance(idx, slice): # Py3
|
if isinstance(idx, slice): # Py3
|
||||||
return self.__getslice__(idx.start, idx.stop)
|
return self.__getslice__(idx.start, idx.stop)
|
||||||
rv = vim.current.buffer[idx]
|
rv = vim.current.buffer[idx]
|
||||||
return as_unicode(rv)
|
return as_unicode(rv)
|
||||||
|
|
||||||
def __getslice__(self, i, j): # pylint:disable=no-self-use
|
def __getslice__(self, i, j): # pylint:disable=no-self-use
|
||||||
rv = vim.current.buffer[i:j]
|
rv = vim.current.buffer[i:j]
|
||||||
return [as_unicode(l) for l in rv]
|
return [as_unicode(l) for l in rv]
|
||||||
|
|
||||||
def __setitem__(self, idx, text):
|
def __setitem__(self, idx, text):
|
||||||
if isinstance(idx, slice): # Py3
|
if isinstance(idx, slice): # Py3
|
||||||
return self.__setslice__(idx.start, idx.stop, text)
|
return self.__setslice__(idx.start, idx.stop, text)
|
||||||
vim.current.buffer[idx] = as_vimencoding(text)
|
vim.current.buffer[idx] = as_vimencoding(text)
|
||||||
|
|
||||||
def __setslice__(self, i, j, text): # pylint:disable=no-self-use
|
def __setslice__(self, i, j, text): # pylint:disable=no-self-use
|
||||||
vim.current.buffer[i:j] = [as_vimencoding(l) for l in text]
|
vim.current.buffer[i:j] = [as_vimencoding(l) for l in text]
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(vim.current.buffer)
|
return len(vim.current.buffer)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def line_till_cursor(self): # pylint:disable=no-self-use
|
def line_till_cursor(self): # pylint:disable=no-self-use
|
||||||
"""Returns the text before the cursor."""
|
"""Returns the text before the cursor."""
|
||||||
# Note: we want byte position here
|
_, col = self.cursor
|
||||||
_, col = vim.current.window.cursor
|
return as_unicode(vim.current.line)[:col]
|
||||||
line = vim.current.line
|
|
||||||
before = as_unicode(line[:col])
|
|
||||||
return before
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def number(self): # pylint:disable=no-self-use
|
def number(self): # pylint:disable=no-self-use
|
||||||
"""The bufnr() of this buffer."""
|
"""The bufnr() of the current buffer."""
|
||||||
return int(eval("bufnr('%')"))
|
return vim.current.buffer.number
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cursor(self): # pylint:disable=no-self-use
|
def cursor(self): # pylint:disable=no-self-use
|
||||||
"""
|
"""The current windows cursor.
|
||||||
The current windows cursor. Note that this is 0 based in col and 0
|
|
||||||
based in line which is different from Vim's cursor.
|
Note that this is 0 based in col and 0 based in line which is
|
||||||
|
different from Vim's cursor.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
line, nbyte = vim.current.window.cursor
|
line, nbyte = vim.current.window.cursor
|
||||||
col = byte2col(line, nbyte)
|
col = byte2col(line, nbyte)
|
||||||
return Position(line - 1, col)
|
return Position(line - 1, col)
|
||||||
|
|
||||||
@cursor.setter
|
@cursor.setter
|
||||||
def cursor(self, pos): # pylint:disable=no-self-use
|
def cursor(self, pos): # pylint:disable=no-self-use
|
||||||
"""See getter."""
|
"""See getter."""
|
||||||
nbyte = col2byte(pos.line + 1, pos.col)
|
nbyte = col2byte(pos.line + 1, pos.col)
|
||||||
vim.current.window.cursor = pos.line + 1, nbyte
|
vim.current.window.cursor = pos.line + 1, nbyte
|
||||||
buf = VimBuffer() # pylint:disable=invalid-name
|
buf = VimBuffer() # pylint:disable=invalid-name
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def toggle_opt(name, new_value):
|
||||||
|
old_value = eval('&' + name)
|
||||||
|
command('set {0}={1}'.format(name, new_value))
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
command('set {0}={1}'.format(name, old_value))
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def save_mark(name):
|
||||||
|
old_pos = get_mark_pos(name)
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
if _is_pos_zero(old_pos):
|
||||||
|
delete_mark(name)
|
||||||
|
else:
|
||||||
|
set_mark_from_pos(name, old_pos)
|
||||||
|
|
||||||
def escape(inp):
|
def escape(inp):
|
||||||
"""Creates a vim-friendly string from a group of
|
"""Creates a vim-friendly string from a group of
|
||||||
dicts, lists and strings."""
|
dicts, lists and strings."""
|
||||||
@ -76,17 +99,19 @@ def escape(inp):
|
|||||||
rv = as_unicode('[' + ','.join(conv(o) for o in obj) + ']')
|
rv = as_unicode('[' + ','.join(conv(o) for o in obj) + ']')
|
||||||
elif isinstance(obj, dict):
|
elif isinstance(obj, dict):
|
||||||
rv = as_unicode('{' + ','.join([
|
rv = as_unicode('{' + ','.join([
|
||||||
"%s:%s" % (conv(key), conv(value))
|
'%s:%s' % (conv(key), conv(value))
|
||||||
for key, value in obj.iteritems()]) + '}')
|
for key, value in obj.iteritems()]) + '}')
|
||||||
else:
|
else:
|
||||||
rv = as_unicode('"%s"') % as_unicode(obj).replace('"', '\\"')
|
rv = as_unicode('"%s"') % as_unicode(obj).replace('"', '\\"')
|
||||||
return rv
|
return rv
|
||||||
return conv(inp)
|
return conv(inp)
|
||||||
|
|
||||||
|
|
||||||
def command(cmd):
|
def command(cmd):
|
||||||
"""Wraps vim.command."""
|
"""Wraps vim.command."""
|
||||||
return as_unicode(vim.command(as_vimencoding(cmd)))
|
return as_unicode(vim.command(as_vimencoding(cmd)))
|
||||||
|
|
||||||
|
|
||||||
def eval(text):
|
def eval(text):
|
||||||
"""Wraps vim.eval."""
|
"""Wraps vim.eval."""
|
||||||
rv = vim.eval(as_vimencoding(text))
|
rv = vim.eval(as_vimencoding(text))
|
||||||
@ -94,105 +119,127 @@ def eval(text):
|
|||||||
return as_unicode(rv)
|
return as_unicode(rv)
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
|
|
||||||
def feedkeys(keys, mode='n'):
|
def feedkeys(keys, mode='n'):
|
||||||
"""Wrapper around vim's feedkeys function. Mainly for convenience."""
|
"""Wrapper around vim's feedkeys function.
|
||||||
command(as_unicode(r'call feedkeys("%s", "%s")') % (keys, mode))
|
|
||||||
|
Mainly for convenience.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if eval('mode()') == 'n':
|
||||||
|
if keys == 'a':
|
||||||
|
cursor_pos = get_cursor_pos()
|
||||||
|
cursor_pos[2] = int(cursor_pos[2]) + 1
|
||||||
|
set_cursor_from_pos(cursor_pos)
|
||||||
|
if keys in 'ai':
|
||||||
|
keys = 'startinsert'
|
||||||
|
|
||||||
|
if keys == 'startinsert':
|
||||||
|
command('startinsert')
|
||||||
|
else:
|
||||||
|
command(as_unicode(r'call feedkeys("%s", "%s")') % (keys, mode))
|
||||||
|
|
||||||
|
|
||||||
def new_scratch_buffer(text):
|
def new_scratch_buffer(text):
|
||||||
"""Create a new scratch buffer with the text given"""
|
"""Create a new scratch buffer with the text given."""
|
||||||
vim.command("botright new")
|
vim.command('botright new')
|
||||||
vim.command("set ft=")
|
vim.command('set ft=')
|
||||||
vim.command("set buftype=nofile")
|
vim.command('set buftype=nofile')
|
||||||
|
|
||||||
vim.current.buffer[:] = text.splitlines()
|
vim.current.buffer[:] = text.splitlines()
|
||||||
|
|
||||||
feedkeys(r"\<Esc>")
|
feedkeys(r"\<Esc>")
|
||||||
|
|
||||||
def select(start, end):
|
|
||||||
"""Select the span in Select mode"""
|
|
||||||
|
|
||||||
|
def virtual_position(line, col):
|
||||||
|
"""Runs the position through virtcol() and returns the result."""
|
||||||
|
nbytes = col2byte(line, col)
|
||||||
|
return line, int(eval('virtcol([%d, %d])' % (line, nbytes)))
|
||||||
|
|
||||||
|
|
||||||
|
def select(start, end):
|
||||||
|
"""Select the span in Select mode."""
|
||||||
_unmap_select_mode_mapping()
|
_unmap_select_mode_mapping()
|
||||||
|
|
||||||
delta = end - start
|
selection = eval('&selection')
|
||||||
lineno, col = start.line, start.col
|
|
||||||
|
|
||||||
col = col2byte(lineno + 1, col)
|
col = col2byte(start.line + 1, start.col)
|
||||||
vim.current.window.cursor = lineno + 1, col
|
vim.current.window.cursor = start.line + 1, col
|
||||||
|
|
||||||
move_cmd = ""
|
mode = eval('mode()')
|
||||||
if eval("mode()") != 'n':
|
|
||||||
|
move_cmd = ''
|
||||||
|
if mode != 'n':
|
||||||
move_cmd += r"\<Esc>"
|
move_cmd += r"\<Esc>"
|
||||||
|
|
||||||
# Case 1: Zero Length Tabstops
|
if start == end:
|
||||||
if delta.line == delta.col == 0:
|
# Zero Length Tabstops, use 'i' or 'a'.
|
||||||
if col == 0 or eval("mode()") not in 'i' and \
|
if col == 0 or mode not in 'i' and \
|
||||||
col < len(buf[lineno]):
|
col < len(buf[start.line]):
|
||||||
move_cmd += "i"
|
move_cmd += 'i'
|
||||||
else:
|
else:
|
||||||
move_cmd += "a"
|
move_cmd += 'a'
|
||||||
else:
|
else:
|
||||||
# Case 2a: Non zero length
|
# Non zero length, use Visual selection.
|
||||||
# If a tabstop immediately starts with a newline, the selection must
|
move_cmd += 'v'
|
||||||
# start after the last character in the current line. But if we are in
|
if 'inclusive' in selection:
|
||||||
# insert mode and <Esc> out of it, we cannot go past the last character
|
if end.col == 0:
|
||||||
# with move_one_right and therefore cannot visual-select this newline.
|
move_cmd += '%iG$' % end.line
|
||||||
# We have to hack around this by adding an extra space which we can
|
else:
|
||||||
# select. Note that this problem could be circumvent by selecting the
|
move_cmd += '%iG%i|' % virtual_position(end.line + 1, end.col)
|
||||||
# tab backwards (that is starting at the end); one would not need to
|
elif 'old' in selection:
|
||||||
# modify the line for this. This creates other trouble though
|
move_cmd += '%iG%i|' % virtual_position(end.line + 1, end.col)
|
||||||
if col >= len(buf[lineno]):
|
|
||||||
buf[lineno] += " "
|
|
||||||
|
|
||||||
if delta.line:
|
|
||||||
move_lines = "%ij" % delta.line
|
|
||||||
else:
|
else:
|
||||||
move_lines = ""
|
move_cmd += '%iG%i|' % virtual_position(end.line + 1, end.col + 1)
|
||||||
# Depending on the current mode and position, we
|
move_cmd += 'o%iG%i|o\\<c-g>' % virtual_position(
|
||||||
# might need to move escape out of the mode and this
|
start.line + 1, start.col + 1)
|
||||||
# will move our cursor one left
|
|
||||||
if col != 0 and eval("mode()") == 'i':
|
|
||||||
move_one_right = "l"
|
|
||||||
else:
|
|
||||||
move_one_right = ""
|
|
||||||
|
|
||||||
# After moving to the correct line, we go back to column 0
|
|
||||||
# and select right from there. Note that the we have to select
|
|
||||||
# one column less since Vim's visual selection is including the
|
|
||||||
# ending while Python slicing is excluding the ending.
|
|
||||||
inclusive = "inclusive" in eval("&selection")
|
|
||||||
if end.col == 0:
|
|
||||||
# Selecting should end at beginning of line -> Select the
|
|
||||||
# previous line till its end
|
|
||||||
do_select = "k$"
|
|
||||||
if not inclusive:
|
|
||||||
do_select += "j0"
|
|
||||||
elif end.col > 1:
|
|
||||||
do_select = "0%il" % (end.col-1 if inclusive else end.col)
|
|
||||||
else:
|
|
||||||
do_select = "0" if inclusive else "0l"
|
|
||||||
|
|
||||||
move_cmd += _LangMapTranslator().translate(
|
|
||||||
r"%sv%s%s\<c-g>" % (move_one_right, move_lines, do_select)
|
|
||||||
)
|
|
||||||
|
|
||||||
feedkeys(move_cmd)
|
feedkeys(move_cmd)
|
||||||
|
|
||||||
|
def set_mark_from_pos(name, pos):
|
||||||
|
return _set_pos("'" + name, pos)
|
||||||
|
|
||||||
|
def get_mark_pos(name):
|
||||||
|
return _get_pos("'" + name)
|
||||||
|
|
||||||
|
def set_cursor_from_pos(pos):
|
||||||
|
return _set_pos('.', pos)
|
||||||
|
|
||||||
|
def get_cursor_pos():
|
||||||
|
return _get_pos('.')
|
||||||
|
|
||||||
|
def delete_mark(name):
|
||||||
|
try:
|
||||||
|
return command('delma ' + name)
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _set_pos(name, pos):
|
||||||
|
return eval("setpos(\"{0}\", {1})".format(name, pos))
|
||||||
|
|
||||||
|
def _get_pos(name):
|
||||||
|
return eval("getpos(\"{0}\")".format(name))
|
||||||
|
|
||||||
|
def _is_pos_zero(pos):
|
||||||
|
return ['0'] * 4 == pos or [0] == pos
|
||||||
|
|
||||||
def _unmap_select_mode_mapping():
|
def _unmap_select_mode_mapping():
|
||||||
"""This function unmaps select mode mappings if so wished by the user.
|
"""This function unmaps select mode mappings if so wished by the user.
|
||||||
|
|
||||||
Removes select mode mappings that can actually be typed by the user
|
Removes select mode mappings that can actually be typed by the user
|
||||||
(ie, ignores things like <Plug>).
|
(ie, ignores things like <Plug>).
|
||||||
"""
|
|
||||||
if int(eval("g:UltiSnipsRemoveSelectModeMappings")):
|
|
||||||
ignores = eval("g:UltiSnipsMappingsToIgnore") + ['UltiSnips']
|
|
||||||
|
|
||||||
for option in ("<buffer>", ""):
|
"""
|
||||||
|
if int(eval('g:UltiSnipsRemoveSelectModeMappings')):
|
||||||
|
ignores = eval('g:UltiSnipsMappingsToIgnore') + ['UltiSnips']
|
||||||
|
|
||||||
|
for option in ('<buffer>', ''):
|
||||||
# Put all smaps into a var, and then read the var
|
# Put all smaps into a var, and then read the var
|
||||||
command(r"redir => _tmp_smaps | silent smap %s " % option +
|
command(r"redir => _tmp_smaps | silent smap %s " % option +
|
||||||
"| redir END")
|
'| redir END')
|
||||||
|
|
||||||
# Check if any mappings where found
|
# Check if any mappings where found
|
||||||
all_maps = list(filter(len, eval(r"_tmp_smaps").splitlines()))
|
all_maps = list(filter(len, eval(r"_tmp_smaps").splitlines()))
|
||||||
if len(all_maps) == 1 and all_maps[0][0] not in " sv":
|
if len(all_maps) == 1 and all_maps[0][0] not in ' sv':
|
||||||
# "No maps found". String could be localized. Hopefully
|
# "No maps found". String could be localized. Hopefully
|
||||||
# it doesn't start with any of these letters in any
|
# it doesn't start with any of these letters in any
|
||||||
# language
|
# language
|
||||||
@ -200,37 +247,38 @@ def _unmap_select_mode_mapping():
|
|||||||
|
|
||||||
# Only keep mappings that should not be ignored
|
# Only keep mappings that should not be ignored
|
||||||
maps = [m for m in all_maps if
|
maps = [m for m in all_maps if
|
||||||
not any(i in m for i in ignores) and len(m.strip())]
|
not any(i in m for i in ignores) and len(m.strip())]
|
||||||
|
|
||||||
for map in maps:
|
for map in maps:
|
||||||
# The first three chars are the modes, that might be listed.
|
# The first three chars are the modes, that might be listed.
|
||||||
# We are not interested in them here.
|
# We are not interested in them here.
|
||||||
trig = map[3:].split()[0] if len(map[3:].split()) != 0 else None
|
trig = map[3:].split()[0] if len(
|
||||||
|
map[3:].split()) != 0 else None
|
||||||
|
|
||||||
if trig is None:
|
if trig is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# The bar separates commands
|
# The bar separates commands
|
||||||
if trig[-1] == "|":
|
if trig[-1] == '|':
|
||||||
trig = trig[:-1] + "<Bar>"
|
trig = trig[:-1] + '<Bar>'
|
||||||
|
|
||||||
# Special ones
|
# Special ones
|
||||||
if trig[0] == "<":
|
if trig[0] == '<':
|
||||||
add = False
|
add = False
|
||||||
# Only allow these
|
# Only allow these
|
||||||
for valid in ["Tab", "NL", "CR", "C-Tab", "BS"]:
|
for valid in ['Tab', 'NL', 'CR', 'C-Tab', 'BS']:
|
||||||
if trig == "<%s>" % valid:
|
if trig == '<%s>' % valid:
|
||||||
add = True
|
add = True
|
||||||
if not add:
|
if not add:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# UltiSnips remaps <BS>. Keep this around.
|
# UltiSnips remaps <BS>. Keep this around.
|
||||||
if trig == "<BS>":
|
if trig == '<BS>':
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Actually unmap it
|
# Actually unmap it
|
||||||
try:
|
try:
|
||||||
command("silent! sunmap %s %s" % (option, trig))
|
command('silent! sunmap %s %s' % (option, trig))
|
||||||
except: # pylint:disable=bare-except
|
except: # pylint:disable=bare-except
|
||||||
# Bug 908139: ignore unmaps that fail because of
|
# Bug 908139: ignore unmaps that fail because of
|
||||||
# unprintable characters. This is not ideal because we
|
# unprintable characters. This is not ideal because we
|
||||||
@ -241,54 +289,3 @@ def _unmap_select_mode_mapping():
|
|||||||
# This case should be rare enough to not bother us
|
# This case should be rare enough to not bother us
|
||||||
# though.
|
# though.
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class _RealLangMapTranslator(object):
|
|
||||||
"""This cares for the Vim langmap option and basically reverses the
|
|
||||||
mappings. This was the only solution to get UltiSnips to work nicely with
|
|
||||||
langmap; other stuff I tried was using inoremap movement commands and
|
|
||||||
caching and restoring the langmap option.
|
|
||||||
|
|
||||||
Note that this will not work if the langmap overwrites a character
|
|
||||||
completely, for example if 'j' is remapped, but nothing is mapped back to
|
|
||||||
'j', then moving one line down is no longer possible and UltiSnips will
|
|
||||||
fail.
|
|
||||||
"""
|
|
||||||
_maps = {}
|
|
||||||
_SEMICOLONS = re.compile(r"(?<!\\);")
|
|
||||||
_COMMA = re.compile(r"(?<!\\),")
|
|
||||||
|
|
||||||
def _create_translation(self, langmap):
|
|
||||||
"""Create the reverse mapping from 'langmap'."""
|
|
||||||
from_chars, to_chars = "", ""
|
|
||||||
for char in self._COMMA.split(langmap):
|
|
||||||
char = char.replace("\\,", ",")
|
|
||||||
res = self._SEMICOLONS.split(char)
|
|
||||||
if len(res) > 1:
|
|
||||||
from_char, to_char = [a.replace("\\;", ";") for a in res]
|
|
||||||
from_chars += from_char
|
|
||||||
to_chars += to_char
|
|
||||||
else:
|
|
||||||
from_chars += char[::2]
|
|
||||||
to_chars += char[1::2]
|
|
||||||
self._maps[langmap] = (from_chars, to_chars)
|
|
||||||
|
|
||||||
def translate(self, text):
|
|
||||||
"""Inverse map 'text' through langmap."""
|
|
||||||
langmap = eval("&langmap").strip()
|
|
||||||
if langmap == "":
|
|
||||||
return text
|
|
||||||
text = as_unicode(text)
|
|
||||||
if langmap not in self._maps:
|
|
||||||
self._create_translation(langmap)
|
|
||||||
for before, after in zip(*self._maps[langmap]):
|
|
||||||
text = text.replace(before, after)
|
|
||||||
return text
|
|
||||||
|
|
||||||
class _DummyLangMapTranslator(object):
|
|
||||||
"""If vim hasn't got the langmap compiled in, we never have to do anything.
|
|
||||||
Then this class is used. """
|
|
||||||
translate = lambda self, s: s
|
|
||||||
|
|
||||||
_LangMapTranslator = _RealLangMapTranslator
|
|
||||||
if not int(eval('has("langmap")')):
|
|
||||||
_LangMapTranslator = _DummyLangMapTranslator
|
|
||||||
|
|||||||
224
pythonx/UltiSnips/buffer_proxy.py
Normal file
224
pythonx/UltiSnips/buffer_proxy.py
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
# coding=utf8
|
||||||
|
|
||||||
|
import vim
|
||||||
|
import UltiSnips._vim
|
||||||
|
from UltiSnips.compatibility import as_unicode, as_vimencoding
|
||||||
|
from UltiSnips.position import Position
|
||||||
|
from UltiSnips._diff import diff
|
||||||
|
from UltiSnips import _vim
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def use_proxy_buffer(snippets_stack, vstate):
|
||||||
|
"""
|
||||||
|
Forward all changes made in the buffer to the current snippet stack while
|
||||||
|
function call.
|
||||||
|
"""
|
||||||
|
buffer_proxy = VimBufferProxy(snippets_stack, vstate)
|
||||||
|
old_buffer = _vim.buf
|
||||||
|
try:
|
||||||
|
_vim.buf = buffer_proxy
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
_vim.buf = old_buffer
|
||||||
|
buffer_proxy.validate_buffer()
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def suspend_proxy_edits():
|
||||||
|
"""
|
||||||
|
Prevents changes being applied to the snippet stack while function call.
|
||||||
|
"""
|
||||||
|
if not isinstance(_vim.buf, VimBufferProxy):
|
||||||
|
yield
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
_vim.buf._disable_edits()
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
_vim.buf._enable_edits()
|
||||||
|
|
||||||
|
|
||||||
|
class VimBufferProxy(_vim.VimBuffer):
|
||||||
|
"""
|
||||||
|
Proxy object used for tracking changes that made from snippet actions.
|
||||||
|
|
||||||
|
Unfortunately, vim by itself lacks of the API for changing text in
|
||||||
|
trackable maner.
|
||||||
|
|
||||||
|
Vim marks offers limited functionality for tracking line additions and
|
||||||
|
deletions, but nothing offered for tracking changes withing single line.
|
||||||
|
|
||||||
|
Instance of this class is passed to all snippet actions and behaves as
|
||||||
|
internal vim.current.window.buffer.
|
||||||
|
|
||||||
|
All changes that are made by user passed to diff algorithm, and resulting
|
||||||
|
diff applied to internal snippet structures to ensure they are in sync with
|
||||||
|
actual buffer contents.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, snippets_stack, vstate):
|
||||||
|
"""
|
||||||
|
Instantiate new object.
|
||||||
|
|
||||||
|
snippets_stack is a slice of currently active snippets.
|
||||||
|
"""
|
||||||
|
self._snippets_stack = snippets_stack
|
||||||
|
self._buffer = vim.current.buffer
|
||||||
|
self._change_tick = int(vim.eval("b:changedtick"))
|
||||||
|
self._forward_edits = True
|
||||||
|
self._vstate = vstate
|
||||||
|
|
||||||
|
def is_buffer_changed_outside(self):
|
||||||
|
"""
|
||||||
|
Returns true, if buffer was changed without using proxy object, like
|
||||||
|
with vim.command() or through internal vim.current.window.buffer.
|
||||||
|
"""
|
||||||
|
return self._change_tick < int(vim.eval("b:changedtick"))
|
||||||
|
|
||||||
|
def validate_buffer(self):
|
||||||
|
"""
|
||||||
|
Raises exception if buffer is changes beyound proxy object.
|
||||||
|
"""
|
||||||
|
if self.is_buffer_changed_outside():
|
||||||
|
raise RuntimeError('buffer was modified using vim.command or ' +
|
||||||
|
'vim.current.buffer; that changes are untrackable and leads to ' +
|
||||||
|
'errors in snippet expansion; use special variable `snip.buffer` '
|
||||||
|
'for buffer modifications.\n\n' +
|
||||||
|
'See :help UltiSnips-buffer-proxy for more info.')
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
"""
|
||||||
|
Behaves as vim.current.window.buffer.__setitem__ except it tracks
|
||||||
|
changes and applies them to the current snippet stack.
|
||||||
|
"""
|
||||||
|
if isinstance(key, slice):
|
||||||
|
value = [as_vimencoding(line) for line in value]
|
||||||
|
changes = list(self._get_diff(key.start, key.stop, value))
|
||||||
|
self._buffer[key.start:key.stop] = [
|
||||||
|
line.strip('\n') for line in value
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
value = as_vimencoding(value)
|
||||||
|
changes = list(self._get_line_diff(key, self._buffer[key], value))
|
||||||
|
self._buffer[key] = value
|
||||||
|
|
||||||
|
self._change_tick += 1
|
||||||
|
|
||||||
|
if self._forward_edits:
|
||||||
|
for change in changes:
|
||||||
|
self._apply_change(change)
|
||||||
|
if self._snippets_stack:
|
||||||
|
self._vstate.remember_buffer(self._snippets_stack[0])
|
||||||
|
|
||||||
|
def __setslice__(self, i, j, text):
|
||||||
|
"""
|
||||||
|
Same as __setitem__.
|
||||||
|
"""
|
||||||
|
self.__setitem__(slice(i, j), text)
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
"""
|
||||||
|
Just passing call to the vim.current.window.buffer.__getitem__.
|
||||||
|
"""
|
||||||
|
if isinstance(key, slice):
|
||||||
|
return [as_unicode(l) for l in self._buffer[key.start:key.stop]]
|
||||||
|
else:
|
||||||
|
return as_unicode(self._buffer[key])
|
||||||
|
|
||||||
|
def __getslice__(self, i, j):
|
||||||
|
"""
|
||||||
|
Same as __getitem__.
|
||||||
|
"""
|
||||||
|
return self.__getitem__(slice(i, j))
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
"""
|
||||||
|
Same as len(vim.current.window.buffer).
|
||||||
|
"""
|
||||||
|
return len(self._buffer)
|
||||||
|
|
||||||
|
def append(self, line, line_number=-1):
|
||||||
|
"""
|
||||||
|
Same as vim.current.window.buffer.append(), but with tracking changes.
|
||||||
|
"""
|
||||||
|
if line_number < 0:
|
||||||
|
line_number = len(self)
|
||||||
|
if not isinstance(line, list):
|
||||||
|
line = [line]
|
||||||
|
self[line_number:line_number] = [as_vimencoding(l) for l in line]
|
||||||
|
|
||||||
|
def __delitem__(self, key):
|
||||||
|
if isinstance(key, slice):
|
||||||
|
self.__setitem__(key, [])
|
||||||
|
else:
|
||||||
|
self.__setitem__(slice(key, key+1), [])
|
||||||
|
|
||||||
|
def _get_diff(self, start, end, new_value):
|
||||||
|
"""
|
||||||
|
Very fast diffing algorithm when changes are across many lines.
|
||||||
|
"""
|
||||||
|
for line_number in range(start, end):
|
||||||
|
if line_number < 0:
|
||||||
|
line_number = len(self._buffer) + line_number
|
||||||
|
yield ('D', line_number, 0, self._buffer[line_number])
|
||||||
|
|
||||||
|
if start < 0:
|
||||||
|
start = len(self._buffer) + start
|
||||||
|
for line_number in range(0, len(new_value)):
|
||||||
|
yield ('I', start+line_number, 0, new_value[line_number])
|
||||||
|
|
||||||
|
def _get_line_diff(self, line_number, before, after):
|
||||||
|
"""
|
||||||
|
Use precise diffing for tracking changes in single line.
|
||||||
|
"""
|
||||||
|
if before == '':
|
||||||
|
for change in self._get_diff(line_number, line_number+1, [after]):
|
||||||
|
yield change
|
||||||
|
else:
|
||||||
|
for change in diff(before, after):
|
||||||
|
yield (change[0], line_number, change[2], change[3])
|
||||||
|
|
||||||
|
def _apply_change(self, change):
|
||||||
|
"""
|
||||||
|
Apply changeset to current snippets stack, correctly moving around
|
||||||
|
snippet itself or its child.
|
||||||
|
"""
|
||||||
|
if not self._snippets_stack:
|
||||||
|
return
|
||||||
|
|
||||||
|
line_number = change[1]
|
||||||
|
column_number = change[2]
|
||||||
|
line_before = line_number <= self._snippets_stack[0]._start.line
|
||||||
|
column_before = column_number <= self._snippets_stack[0]._start.col
|
||||||
|
if line_before and column_before:
|
||||||
|
direction = 1
|
||||||
|
if change[0] == 'D':
|
||||||
|
direction = -1
|
||||||
|
|
||||||
|
self._snippets_stack[0]._move(
|
||||||
|
Position(line_number, 0),
|
||||||
|
Position(direction, 0)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
if line_number > self._snippets_stack[0]._end.line:
|
||||||
|
return
|
||||||
|
if column_number >= self._snippets_stack[0]._end.col:
|
||||||
|
return
|
||||||
|
self._snippets_stack[0]._do_edit(change)
|
||||||
|
|
||||||
|
def _disable_edits(self):
|
||||||
|
"""
|
||||||
|
Temporary disable applying changes to snippets stack. Should be done
|
||||||
|
while expanding anonymous snippet in the middle of jump to prevent
|
||||||
|
double tracking.
|
||||||
|
"""
|
||||||
|
self._forward_edits = False
|
||||||
|
|
||||||
|
def _enable_edits(self):
|
||||||
|
"""
|
||||||
|
Enables changes forwarding back.
|
||||||
|
"""
|
||||||
|
self._forward_edits = True
|
||||||
@ -1,45 +1,43 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
|
|
||||||
"""
|
"""This file contains compatibility code to stay compatible with as many python
|
||||||
This file contains compatibility code to stay compatible with
|
versions as possible."""
|
||||||
as many python versions as possible.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import vim # pylint:disable=import-error
|
import vim # pylint:disable=import-error
|
||||||
|
|
||||||
def _vim_dec(string):
|
|
||||||
"""Decode 'string' using &encoding."""
|
|
||||||
try:
|
|
||||||
return string.decode(vim.eval("&encoding"))
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
# At least we tried. There might be some problems down the road now
|
|
||||||
return string
|
|
||||||
|
|
||||||
def _vim_enc(string):
|
|
||||||
"""Encode 'string' using &encoding."""
|
|
||||||
try:
|
|
||||||
return string.encode(vim.eval("&encoding"))
|
|
||||||
except UnicodeEncodeError:
|
|
||||||
return string
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 0):
|
if sys.version_info >= (3, 0):
|
||||||
|
def _vim_dec(string):
|
||||||
|
"""Decode 'string' using &encoding."""
|
||||||
|
# We don't have the luxury here of failing, everything
|
||||||
|
# falls apart if we don't return a bytearray from the
|
||||||
|
# passed in string
|
||||||
|
return string.decode(vim.eval('&encoding'), 'replace')
|
||||||
|
|
||||||
|
def _vim_enc(bytearray):
|
||||||
|
"""Encode 'string' using &encoding."""
|
||||||
|
# We don't have the luxury here of failing, everything
|
||||||
|
# falls apart if we don't return a string from the passed
|
||||||
|
# in bytearray
|
||||||
|
return bytearray.encode(vim.eval('&encoding'), 'replace')
|
||||||
|
|
||||||
|
def open_ascii_file(filename, mode):
|
||||||
|
"""Opens a file in "r" mode."""
|
||||||
|
return open(filename, mode, encoding='utf-8')
|
||||||
|
|
||||||
def col2byte(line, col):
|
def col2byte(line, col):
|
||||||
"""
|
"""Convert a valid column index into a byte index inside of vims
|
||||||
Convert a valid column index into a byte index inside
|
buffer."""
|
||||||
of vims buffer.
|
# We pad the line so that selecting the +1 st column still works.
|
||||||
"""
|
pre_chars = (vim.current.buffer[line - 1] + ' ')[:col]
|
||||||
pre_chars = vim.current.buffer[line-1][:col]
|
|
||||||
return len(_vim_enc(pre_chars))
|
return len(_vim_enc(pre_chars))
|
||||||
|
|
||||||
def byte2col(line, nbyte):
|
def byte2col(line, nbyte):
|
||||||
"""
|
"""Convert a column into a byteidx suitable for a mark or cursor
|
||||||
Convert a column into a byteidx suitable for a mark or cursor
|
position inside of vim."""
|
||||||
position inside of vim
|
line = vim.current.buffer[line - 1]
|
||||||
"""
|
|
||||||
line = vim.current.buffer[line-1]
|
|
||||||
raw_bytes = _vim_enc(line)[:nbyte]
|
raw_bytes = _vim_enc(line)[:nbyte]
|
||||||
return len(_vim_dec(raw_bytes))
|
return len(_vim_dec(raw_bytes))
|
||||||
|
|
||||||
@ -54,23 +52,41 @@ if sys.version_info >= (3, 0):
|
|||||||
return string
|
return string
|
||||||
else:
|
else:
|
||||||
import warnings
|
import warnings
|
||||||
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
warnings.filterwarnings('ignore', category=DeprecationWarning)
|
||||||
|
|
||||||
|
def _vim_dec(string):
|
||||||
|
"""Decode 'string' using &encoding."""
|
||||||
|
try:
|
||||||
|
return string.decode(vim.eval('&encoding'))
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
# At least we tried. There might be some problems down the road now
|
||||||
|
return string
|
||||||
|
|
||||||
|
def _vim_enc(string):
|
||||||
|
"""Encode 'string' using &encoding."""
|
||||||
|
try:
|
||||||
|
return string.encode(vim.eval('&encoding'))
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
return string
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
return string
|
||||||
|
|
||||||
|
def open_ascii_file(filename, mode):
|
||||||
|
"""Opens a file in "r" mode."""
|
||||||
|
return open(filename, mode)
|
||||||
|
|
||||||
def col2byte(line, col):
|
def col2byte(line, col):
|
||||||
"""
|
"""Convert a valid column index into a byte index inside of vims
|
||||||
Convert a valid column index into a byte index inside
|
buffer."""
|
||||||
of vims buffer.
|
# We pad the line so that selecting the +1 st column still works.
|
||||||
"""
|
pre_chars = _vim_dec(vim.current.buffer[line - 1] + ' ')[:col]
|
||||||
pre_chars = _vim_dec(vim.current.buffer[line-1])[:col]
|
|
||||||
return len(_vim_enc(pre_chars))
|
return len(_vim_enc(pre_chars))
|
||||||
|
|
||||||
def byte2col(line, nbyte):
|
def byte2col(line, nbyte):
|
||||||
"""
|
"""Convert a column into a byteidx suitable for a mark or cursor
|
||||||
Convert a column into a byteidx suitable for a mark or cursor
|
position inside of vim."""
|
||||||
position inside of vim
|
line = vim.current.buffer[line - 1]
|
||||||
"""
|
if nbyte >= len(line): # This is beyond end of line
|
||||||
line = vim.current.buffer[line-1]
|
|
||||||
if nbyte >= len(line): # This is beyond end of line
|
|
||||||
return nbyte
|
return nbyte
|
||||||
return len(_vim_dec(line[:nbyte]))
|
return len(_vim_dec(line[:nbyte]))
|
||||||
|
|
||||||
|
|||||||
@ -1,17 +1,21 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
|
|
||||||
"""Convenience methods that help with debugging. They should never be used in
|
"""Convenience methods that help with debugging.
|
||||||
production code."""
|
|
||||||
|
They should never be used in production code.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from UltiSnips.compatibility import as_unicode
|
from UltiSnips.compatibility import as_unicode
|
||||||
|
|
||||||
DUMP_FILENAME = "/tmp/file.txt" if not sys.platform.lower().startswith("win") \
|
DUMP_FILENAME = '/tmp/file.txt' if not sys.platform.lower().startswith('win') \
|
||||||
else "C:/windows/temp/ultisnips.txt"
|
else 'C:/windows/temp/ultisnips.txt'
|
||||||
with open(DUMP_FILENAME, "w"):
|
with open(DUMP_FILENAME, 'w'):
|
||||||
pass # clears the file
|
pass # clears the file
|
||||||
|
|
||||||
|
|
||||||
def echo_to_hierarchy(text_object):
|
def echo_to_hierarchy(text_object):
|
||||||
"""Outputs the given 'text_object' and its children hierarchically."""
|
"""Outputs the given 'text_object' and its children hierarchically."""
|
||||||
@ -20,24 +24,26 @@ def echo_to_hierarchy(text_object):
|
|||||||
while parent._parent:
|
while parent._parent:
|
||||||
parent = parent._parent
|
parent = parent._parent
|
||||||
|
|
||||||
def _do_print(text_object, indent=""):
|
def _do_print(text_object, indent=''):
|
||||||
"""prints recursively."""
|
"""prints recursively."""
|
||||||
debug(indent + as_unicode(text_object))
|
debug(indent + as_unicode(text_object))
|
||||||
try:
|
try:
|
||||||
for child in text_object._children:
|
for child in text_object._children:
|
||||||
_do_print(child, indent=indent + " ")
|
_do_print(child, indent=indent + ' ')
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
_do_print(parent)
|
_do_print(parent)
|
||||||
|
|
||||||
|
|
||||||
def debug(msg):
|
def debug(msg):
|
||||||
"""Dumb 'msg' into the debug file."""
|
"""Dumb 'msg' into the debug file."""
|
||||||
msg = as_unicode(msg)
|
msg = as_unicode(msg)
|
||||||
with open(DUMP_FILENAME, "ab") as dump_file:
|
with open(DUMP_FILENAME, 'ab') as dump_file:
|
||||||
dump_file.write((msg + '\n').encode("utf-8"))
|
dump_file.write((msg + '\n').encode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
def print_stack():
|
def print_stack():
|
||||||
"""Dump a stack trace into the debug file."""
|
"""Dump a stack trace into the debug file."""
|
||||||
import traceback
|
import traceback
|
||||||
with open(DUMP_FILENAME, "ab") as dump_file:
|
with open(DUMP_FILENAME, 'ab') as dump_file:
|
||||||
traceback.print_stack(file=dump_file)
|
traceback.print_stack(file=dump_file)
|
||||||
|
|||||||
@ -1,26 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
"""Utilities to deal with text escaping."""
|
|
||||||
|
|
||||||
def unescape(text):
|
|
||||||
"""Removes '\\' escaping from 'text'."""
|
|
||||||
rv = ""
|
|
||||||
i = 0
|
|
||||||
while i < len(text):
|
|
||||||
if i+1 < len(text) and text[i] == '\\':
|
|
||||||
rv += text[i+1]
|
|
||||||
i += 1
|
|
||||||
else:
|
|
||||||
rv += text[i]
|
|
||||||
i += 1
|
|
||||||
return rv
|
|
||||||
|
|
||||||
def fill_in_whitespace(text):
|
|
||||||
"""Returns 'text' with escaped whitespace replaced through whitespaces."""
|
|
||||||
text = text.replace(r"\n", "\n")
|
|
||||||
text = text.replace(r"\t", "\t")
|
|
||||||
text = text.replace(r"\r", "\r")
|
|
||||||
text = text.replace(r"\a", "\a")
|
|
||||||
text = text.replace(r"\b", "\b")
|
|
||||||
return text
|
|
||||||
@ -3,37 +3,40 @@
|
|||||||
|
|
||||||
"""See module doc."""
|
"""See module doc."""
|
||||||
|
|
||||||
import UltiSnips._vim as _vim
|
from UltiSnips import _vim
|
||||||
|
|
||||||
|
|
||||||
class IndentUtil(object):
|
class IndentUtil(object):
|
||||||
"""Utility class for dealing properly with indentation. """
|
|
||||||
|
"""Utility class for dealing properly with indentation."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
""" Gets the spacing properties from Vim. """
|
"""Gets the spacing properties from Vim."""
|
||||||
self.shiftwidth = int(_vim.eval("&shiftwidth"))
|
self.shiftwidth = int(
|
||||||
self._expandtab = (_vim.eval("&expandtab") == "1")
|
_vim.eval("exists('*shiftwidth') ? shiftwidth() : &shiftwidth"))
|
||||||
self._tabstop = int(_vim.eval("&tabstop"))
|
self._expandtab = (_vim.eval('&expandtab') == '1')
|
||||||
|
self._tabstop = int(_vim.eval('&tabstop'))
|
||||||
|
|
||||||
def ntabs_to_proper_indent(self, ntabs):
|
def ntabs_to_proper_indent(self, ntabs):
|
||||||
"""Convert 'ntabs' number of tabs to the proper indent prefix."""
|
"""Convert 'ntabs' number of tabs to the proper indent prefix."""
|
||||||
line_ind = ntabs * self.shiftwidth * " "
|
line_ind = ntabs * self.shiftwidth * ' '
|
||||||
line_ind = self.indent_to_spaces(line_ind)
|
line_ind = self.indent_to_spaces(line_ind)
|
||||||
line_ind = self.spaces_to_indent(line_ind)
|
line_ind = self.spaces_to_indent(line_ind)
|
||||||
return line_ind
|
return line_ind
|
||||||
|
|
||||||
def indent_to_spaces(self, indent):
|
def indent_to_spaces(self, indent):
|
||||||
""" Converts indentation to spaces respecting Vim settings. """
|
"""Converts indentation to spaces respecting Vim settings."""
|
||||||
indent = indent.expandtabs(self._tabstop)
|
indent = indent.expandtabs(self._tabstop)
|
||||||
right = (len(indent) - len(indent.rstrip(" "))) * " "
|
right = (len(indent) - len(indent.rstrip(' '))) * ' '
|
||||||
indent = indent.replace(" ", "")
|
indent = indent.replace(' ', '')
|
||||||
indent = indent.replace('\t', " " * self._tabstop)
|
indent = indent.replace('\t', ' ' * self._tabstop)
|
||||||
return indent + right
|
return indent + right
|
||||||
|
|
||||||
def spaces_to_indent(self, indent):
|
def spaces_to_indent(self, indent):
|
||||||
""" Converts spaces to proper indentation respecting Vim settings """
|
"""Converts spaces to proper indentation respecting Vim settings."""
|
||||||
if not self._expandtab:
|
if not self._expandtab:
|
||||||
indent = indent.replace(" " * self._tabstop, '\t')
|
indent = indent.replace(' ' * self._tabstop, '\t')
|
||||||
return indent
|
return indent
|
||||||
|
|||||||
@ -4,7 +4,9 @@
|
|||||||
"""Represents a Position in a text file: (0 based line index, 0 based column
|
"""Represents a Position in a text file: (0 based line index, 0 based column
|
||||||
index) and provides methods for moving them around."""
|
index) and provides methods for moving them around."""
|
||||||
|
|
||||||
|
|
||||||
class Position(object):
|
class Position(object):
|
||||||
|
|
||||||
"""See module docstring."""
|
"""See module docstring."""
|
||||||
|
|
||||||
def __init__(self, line, col):
|
def __init__(self, line, col):
|
||||||
@ -13,7 +15,7 @@ class Position(object):
|
|||||||
|
|
||||||
def move(self, pivot, delta):
|
def move(self, pivot, delta):
|
||||||
"""'pivot' is the position of the first changed character, 'delta' is
|
"""'pivot' is the position of the first changed character, 'delta' is
|
||||||
how text after it moved"""
|
how text after it moved."""
|
||||||
if self < pivot:
|
if self < pivot:
|
||||||
return
|
return
|
||||||
if delta.line == 0:
|
if delta.line == 0:
|
||||||
@ -62,4 +64,14 @@ class Position(object):
|
|||||||
return (self.line, self.col) <= (other.line, other.col)
|
return (self.line, self.col) <= (other.line, other.col)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "(%i,%i)" % (self.line, self.col)
|
return '(%i,%i)' % (self.line, self.col)
|
||||||
|
|
||||||
|
def __getitem__(self, index):
|
||||||
|
if index > 1:
|
||||||
|
raise IndexError(
|
||||||
|
'position can be indexed only 0 (line) and 1 (column)'
|
||||||
|
)
|
||||||
|
if index == 0:
|
||||||
|
return self.line
|
||||||
|
else:
|
||||||
|
return self.col
|
||||||
|
|||||||
@ -1,10 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
"""Sources of snippet definitions."""
|
|
||||||
|
|
||||||
# TODO(sirver): these should register themselves with the Manager, so that
|
|
||||||
# other plugins can extend them more easily.
|
|
||||||
from UltiSnips.providers.snippet_file import UltiSnipsFileProvider, \
|
|
||||||
base_snippet_files_for
|
|
||||||
from UltiSnips.providers.added_snippets_provider import AddedSnippetsProvider
|
|
||||||
@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
"""Base class for snippet providers."""
|
|
||||||
|
|
||||||
from collections import defaultdict
|
|
||||||
|
|
||||||
from UltiSnips.providers._snippet_dictionary import SnippetDictionary
|
|
||||||
|
|
||||||
class SnippetProvider(object):
|
|
||||||
"""See module docstring."""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self._snippets = defaultdict(SnippetDictionary)
|
|
||||||
|
|
||||||
def get_snippets(self, filetypes, before, possible):
|
|
||||||
"""Returns the snippets for all 'filetypes' (in order) and their
|
|
||||||
parents matching the text 'before'. If 'possible' is true, a partial
|
|
||||||
match is enough."""
|
|
||||||
found_snippets = []
|
|
||||||
for ft in filetypes:
|
|
||||||
found_snippets += self._find_snippets(ft, before, possible)
|
|
||||||
return found_snippets
|
|
||||||
|
|
||||||
def _find_snippets(self, ft, trigger, potentially=False, seen=None):
|
|
||||||
"""Find snippets matching 'trigger' for 'ft'. If 'potentially' is True,
|
|
||||||
partial matches are enough."""
|
|
||||||
snips = self._snippets.get(ft, None)
|
|
||||||
if not snips:
|
|
||||||
return []
|
|
||||||
if not seen:
|
|
||||||
seen = set()
|
|
||||||
seen.add(ft)
|
|
||||||
parent_results = []
|
|
||||||
# TODO(sirver): extends information is not bound to one
|
|
||||||
# provider. It should be tracked further up.
|
|
||||||
for parent_ft in snips.extends:
|
|
||||||
if parent_ft not in seen:
|
|
||||||
seen.add(parent_ft)
|
|
||||||
parent_results += self._find_snippets(parent_ft, trigger,
|
|
||||||
potentially, seen)
|
|
||||||
return parent_results + snips.get_matching_snippets(
|
|
||||||
trigger, potentially)
|
|
||||||
@ -1,80 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
"""Implements a container for parsed snippets."""
|
|
||||||
|
|
||||||
import hashlib
|
|
||||||
import os
|
|
||||||
|
|
||||||
def _hash_file(path):
|
|
||||||
"""Returns a hashdigest of 'path'"""
|
|
||||||
if not os.path.isfile(path):
|
|
||||||
return False
|
|
||||||
return hashlib.sha1(open(path, "rb").read()).hexdigest()
|
|
||||||
|
|
||||||
# TODO(sirver): This class should not hash any files nor keep track of extends.
|
|
||||||
class SnippetDictionary(object):
|
|
||||||
"""See module docstring."""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self._added = []
|
|
||||||
self._extends = []
|
|
||||||
self._files = {}
|
|
||||||
self._snippets = []
|
|
||||||
|
|
||||||
def add_snippet(self, snippet, filename):
|
|
||||||
"""Add 'snippet' to this dictionary. If 'filename' is given, also watch
|
|
||||||
the original file for changes."""
|
|
||||||
if filename:
|
|
||||||
self._snippets.append(snippet)
|
|
||||||
if filename not in self.files:
|
|
||||||
self.addfile(filename)
|
|
||||||
else:
|
|
||||||
self._added.append(snippet)
|
|
||||||
|
|
||||||
def get_matching_snippets(self, trigger, potentially):
|
|
||||||
"""Returns all snippets matching the given trigger. If 'potentially' is
|
|
||||||
true, returns all that could_match()."""
|
|
||||||
all_snippets = self._added + self._snippets
|
|
||||||
if not potentially:
|
|
||||||
return [s for s in all_snippets if s.matches(trigger)]
|
|
||||||
else:
|
|
||||||
return [s for s in all_snippets if s.could_match(trigger)]
|
|
||||||
|
|
||||||
def clear_snippets(self, triggers=None):
|
|
||||||
"""Remove all snippets that match each trigger in 'triggers'. When
|
|
||||||
'triggers' is None, empties this dictionary completely."""
|
|
||||||
if triggers is None:
|
|
||||||
triggers = []
|
|
||||||
if triggers:
|
|
||||||
for trigger in triggers:
|
|
||||||
for snippet in self.get_matching_snippets(trigger, False):
|
|
||||||
if snippet in self._snippets:
|
|
||||||
self._snippets.remove(snippet)
|
|
||||||
if snippet in self._added:
|
|
||||||
self._added.remove(snippet)
|
|
||||||
else:
|
|
||||||
self._snippets = []
|
|
||||||
self._added = []
|
|
||||||
|
|
||||||
def addfile(self, path):
|
|
||||||
"""Add this file to the files we read triggers from."""
|
|
||||||
self.files[path] = _hash_file(path)
|
|
||||||
|
|
||||||
def has_any_file_changed(self):
|
|
||||||
"""Returns True if any of our watched files has changed since we read
|
|
||||||
it last."""
|
|
||||||
for path, hash in self.files.items():
|
|
||||||
if not hash or hash != _hash_file(path):
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def files(self):
|
|
||||||
"""All files we have read snippets from."""
|
|
||||||
return self._files
|
|
||||||
|
|
||||||
@property
|
|
||||||
def extends(self):
|
|
||||||
"""The list of filetypes this filetype extends."""
|
|
||||||
return self._extends
|
|
||||||
@ -1,152 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
"""Code to provide access to UltiSnips files from disk."""
|
|
||||||
|
|
||||||
import glob
|
|
||||||
import os
|
|
||||||
|
|
||||||
from UltiSnips.providers._base import SnippetProvider
|
|
||||||
from UltiSnips.providers.ultisnips_file import parse_snippets_file
|
|
||||||
from UltiSnips.snippet_definition import SnippetDefinition
|
|
||||||
import UltiSnips._vim as _vim
|
|
||||||
|
|
||||||
def _plugin_dir():
|
|
||||||
"""Calculates the plugin directory for UltiSnips."""
|
|
||||||
directory = __file__
|
|
||||||
for _ in range(10):
|
|
||||||
directory = os.path.dirname(directory)
|
|
||||||
if (os.path.isdir(os.path.join(directory, "plugin")) and
|
|
||||||
os.path.isdir(os.path.join(directory, "doc"))):
|
|
||||||
return directory
|
|
||||||
raise Exception("Unable to find the plugin directory.")
|
|
||||||
|
|
||||||
def base_snippet_files_for(ft, default=True):
|
|
||||||
"""Returns a list of snippet files matching the given filetype (ft).
|
|
||||||
If default is set to false, it doesn't include shipped files.
|
|
||||||
|
|
||||||
Searches through each path in 'runtimepath' in reverse order,
|
|
||||||
in each of these, it searches each directory name listed in
|
|
||||||
'g:UltiSnipsSnippetDirectories' in order, then looks for files in these
|
|
||||||
directories called 'ft.snippets' or '*_ft.snippets' replacing ft with
|
|
||||||
the filetype.
|
|
||||||
"""
|
|
||||||
if _vim.eval("exists('b:UltiSnipsSnippetDirectories')") == "1":
|
|
||||||
snippet_dirs = _vim.eval("b:UltiSnipsSnippetDirectories")
|
|
||||||
else:
|
|
||||||
snippet_dirs = _vim.eval("g:UltiSnipsSnippetDirectories")
|
|
||||||
|
|
||||||
paths = _vim.eval("&runtimepath").split(',')
|
|
||||||
base_snippets = os.path.realpath(os.path.join(_plugin_dir(), "UltiSnips"))
|
|
||||||
ret = []
|
|
||||||
for rtp in paths:
|
|
||||||
for snippet_dir in snippet_dirs:
|
|
||||||
pth = os.path.realpath(os.path.expanduser(
|
|
||||||
os.path.join(rtp, snippet_dir)))
|
|
||||||
patterns = ["%s.snippets", "%s_*.snippets", os.path.join("%s", "*")]
|
|
||||||
if not default and pth == base_snippets:
|
|
||||||
patterns.remove("%s.snippets")
|
|
||||||
|
|
||||||
for pattern in patterns:
|
|
||||||
for fn in glob.glob(os.path.join(pth, pattern % ft)):
|
|
||||||
if fn not in ret:
|
|
||||||
ret.append(fn)
|
|
||||||
return ret
|
|
||||||
|
|
||||||
class SnippetSyntaxError(RuntimeError):
|
|
||||||
"""Thrown when a syntax error is found in a file."""
|
|
||||||
def __init__(self, filename, line_index, msg):
|
|
||||||
RuntimeError.__init__(self, "%s in %s:%d" % (
|
|
||||||
msg, filename, line_index))
|
|
||||||
|
|
||||||
class UltiSnipsFileProvider(SnippetProvider):
|
|
||||||
"""Manages all snippets definitions found in rtp."""
|
|
||||||
|
|
||||||
def get_snippets(self, filetypes, before, possible):
|
|
||||||
for ft in filetypes:
|
|
||||||
self._ensure_loaded(ft)
|
|
||||||
|
|
||||||
return SnippetProvider.get_snippets(self, filetypes, before, possible)
|
|
||||||
|
|
||||||
def _ensure_loaded(self, ft, already_loaded=None):
|
|
||||||
"""Make sure that the snippets for 'ft' and everything it extends are
|
|
||||||
loaded."""
|
|
||||||
if not already_loaded:
|
|
||||||
already_loaded = set()
|
|
||||||
|
|
||||||
if ft in already_loaded:
|
|
||||||
return
|
|
||||||
already_loaded.add(ft)
|
|
||||||
|
|
||||||
if self._needs_update(ft):
|
|
||||||
self._load_snippets_for(ft)
|
|
||||||
|
|
||||||
for parent in self._snippets[ft].extends:
|
|
||||||
self._ensure_loaded(parent, already_loaded)
|
|
||||||
|
|
||||||
def _needs_update(self, ft):
|
|
||||||
"""Returns true if any files for 'ft' have changed and must be
|
|
||||||
reloaded."""
|
|
||||||
if ft not in self._snippets:
|
|
||||||
return True
|
|
||||||
elif self._snippets[ft].has_any_file_changed():
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
cur_snips = set(base_snippet_files_for(ft))
|
|
||||||
old_snips = set(self._snippets[ft].files)
|
|
||||||
if cur_snips - old_snips:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _load_snippets_for(self, ft):
|
|
||||||
"""Load all snippets for the given 'ft'."""
|
|
||||||
if ft in self._snippets:
|
|
||||||
del self._snippets[ft]
|
|
||||||
for fn in base_snippet_files_for(ft):
|
|
||||||
self._parse_snippets(ft, fn)
|
|
||||||
# Now load for the parents
|
|
||||||
for parent_ft in self._snippets[ft].extends:
|
|
||||||
if parent_ft not in self._snippets:
|
|
||||||
self._load_snippets_for(parent_ft)
|
|
||||||
|
|
||||||
def _parse_snippets(self, ft, filename):
|
|
||||||
"""Parse the file 'filename' for the given 'ft' and watch it for
|
|
||||||
changes in the future. 'file_data' can be injected in tests."""
|
|
||||||
current_snippet_priority = 0
|
|
||||||
self._snippets[ft].addfile(filename)
|
|
||||||
file_data = open(filename, "r").read()
|
|
||||||
for event, data in parse_snippets_file(file_data):
|
|
||||||
if event == "error":
|
|
||||||
msg, line_index = data
|
|
||||||
filename = _vim.eval("""fnamemodify(%s, ":~:.")""" %
|
|
||||||
_vim.escape(filename))
|
|
||||||
raise SnippetSyntaxError(filename, line_index, msg)
|
|
||||||
elif event == "clearsnippets":
|
|
||||||
# TODO(sirver): clear snippets should clear for
|
|
||||||
# more providers, not only ultisnips files.
|
|
||||||
triggers, = data
|
|
||||||
self._snippets[ft].clear_snippets(triggers)
|
|
||||||
elif event == "extends":
|
|
||||||
# TODO(sirver): extends information is more global
|
|
||||||
# than one snippet provider.
|
|
||||||
filetypes, = data
|
|
||||||
self._add_extending_info(ft, filetypes)
|
|
||||||
elif event == "snippet":
|
|
||||||
trigger, value, description, options, global_pythons = data
|
|
||||||
self._snippets[ft].add_snippet(
|
|
||||||
SnippetDefinition(current_snippet_priority, trigger, value,
|
|
||||||
description, options, global_pythons), filename
|
|
||||||
)
|
|
||||||
elif event == "priority":
|
|
||||||
priority, = data
|
|
||||||
current_snippet_priority = priority
|
|
||||||
else:
|
|
||||||
assert False, "Unhandled %s: %r" % (event, data)
|
|
||||||
|
|
||||||
def _add_extending_info(self, ft, parents):
|
|
||||||
"""Add the list of 'parents' as being extended by the 'ft'."""
|
|
||||||
sd = self._snippets[ft]
|
|
||||||
for parent in parents:
|
|
||||||
if parent in sd.extends:
|
|
||||||
continue
|
|
||||||
sd.extends.append(parent)
|
|
||||||
@ -1,125 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# encoding: utf-8
|
|
||||||
|
|
||||||
"""Parsing of snippet files."""
|
|
||||||
|
|
||||||
from collections import defaultdict
|
|
||||||
|
|
||||||
class _LineIterator(object):
|
|
||||||
"""Convenience class that keeps track of line numbers."""
|
|
||||||
|
|
||||||
def __init__(self, text):
|
|
||||||
self._line_index = None
|
|
||||||
self._lines = enumerate(text.splitlines(True), 1)
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __next__(self):
|
|
||||||
"""Returns the next line."""
|
|
||||||
self._line_index, line = next(self._lines)
|
|
||||||
return line
|
|
||||||
next = __next__ # for python2
|
|
||||||
|
|
||||||
@property
|
|
||||||
def line_index(self):
|
|
||||||
"""The 1 based line index in the current file."""
|
|
||||||
return self._line_index
|
|
||||||
|
|
||||||
def _handle_snippet_or_global(line, lines, globals):
|
|
||||||
"""Parses the snippet that begins at the current line."""
|
|
||||||
|
|
||||||
descr = ""
|
|
||||||
opts = ""
|
|
||||||
|
|
||||||
# Ensure this is a snippet
|
|
||||||
snip = line.split()[0]
|
|
||||||
|
|
||||||
# Get and strip options if they exist
|
|
||||||
remain = line[len(snip):].strip()
|
|
||||||
words = remain.split()
|
|
||||||
if len(words) > 2:
|
|
||||||
# second to last word ends with a quote
|
|
||||||
if '"' not in words[-1] and words[-2][-1] == '"':
|
|
||||||
opts = words[-1]
|
|
||||||
remain = remain[:-len(opts) - 1].rstrip()
|
|
||||||
|
|
||||||
# Get and strip description if it exists
|
|
||||||
remain = remain.strip()
|
|
||||||
if len(remain.split()) > 1 and remain[-1] == '"':
|
|
||||||
left = remain[:-1].rfind('"')
|
|
||||||
if left != -1 and left != 0:
|
|
||||||
descr, remain = remain[left:], remain[:left]
|
|
||||||
|
|
||||||
# The rest is the trigger
|
|
||||||
trig = remain.strip()
|
|
||||||
if len(trig.split()) > 1 or "r" in opts:
|
|
||||||
if trig[0] != trig[-1]:
|
|
||||||
return "error", ("Invalid multiword trigger: '%s'" % trig,
|
|
||||||
lines.line_index)
|
|
||||||
trig = trig[1:-1]
|
|
||||||
end = "end" + snip
|
|
||||||
content = ""
|
|
||||||
|
|
||||||
found_end = False
|
|
||||||
for line in lines:
|
|
||||||
if line.rstrip() == end:
|
|
||||||
content = content[:-1] # Chomp the last newline
|
|
||||||
found_end = True
|
|
||||||
break
|
|
||||||
content += line
|
|
||||||
|
|
||||||
if not found_end:
|
|
||||||
return "error", ("Missing 'endsnippet' for %r" % trig, lines.line_index)
|
|
||||||
|
|
||||||
if snip == "global":
|
|
||||||
globals[trig].append(content)
|
|
||||||
elif snip == "snippet":
|
|
||||||
return "snippet", (trig, content, descr, opts, globals)
|
|
||||||
else:
|
|
||||||
return "error", ("Invalid snippet type: '%s'" % snip, lines.line_index)
|
|
||||||
|
|
||||||
def _head_tail(line):
|
|
||||||
"""Returns the first word in 'line' and the rest of 'line' or None if the
|
|
||||||
line is too short."""
|
|
||||||
generator = (t.strip() for t in line.split(None, 1))
|
|
||||||
head = next(generator).strip()
|
|
||||||
tail = ''
|
|
||||||
try:
|
|
||||||
tail = next(generator).strip()
|
|
||||||
except StopIteration:
|
|
||||||
pass
|
|
||||||
return head, tail
|
|
||||||
|
|
||||||
|
|
||||||
def parse_snippets_file(data):
|
|
||||||
"""Parse 'data' assuming it is a snippet file. Yields events in the
|
|
||||||
file."""
|
|
||||||
|
|
||||||
globals = defaultdict(list)
|
|
||||||
lines = _LineIterator(data)
|
|
||||||
for line in lines:
|
|
||||||
if not line.strip():
|
|
||||||
continue
|
|
||||||
|
|
||||||
head, tail = _head_tail(line)
|
|
||||||
if head == "extends":
|
|
||||||
if tail:
|
|
||||||
yield "extends", ([p.strip() for p in tail.split(',')],)
|
|
||||||
else:
|
|
||||||
yield "error", ("'extends' without file types",
|
|
||||||
lines.line_index)
|
|
||||||
elif head in ("snippet", "global"):
|
|
||||||
snippet = _handle_snippet_or_global(line, lines, globals)
|
|
||||||
if snippet is not None:
|
|
||||||
yield snippet
|
|
||||||
elif head == "clearsnippets":
|
|
||||||
yield "clearsnippets", (tail.split(),)
|
|
||||||
elif head == "priority":
|
|
||||||
try:
|
|
||||||
priority = int(tail.split()[0])
|
|
||||||
yield "priority", (priority,)
|
|
||||||
except (ValueError, IndexError):
|
|
||||||
yield "error", ("Invalid priority %r" % tail, lines.line_index)
|
|
||||||
elif head and not head.startswith('#'):
|
|
||||||
yield "error", ("Invalid line %r" % line.rstrip(), lines.line_index)
|
|
||||||
1
pythonx/UltiSnips/snippet/__init__.py
Normal file
1
pythonx/UltiSnips/snippet/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""Code related to snippets."""
|
||||||
4
pythonx/UltiSnips/snippet/definition/__init__.py
Normal file
4
pythonx/UltiSnips/snippet/definition/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
"""In memory representation of snippet definitions."""
|
||||||
|
|
||||||
|
from UltiSnips.snippet.definition.ultisnips import UltiSnipsSnippetDefinition
|
||||||
|
from UltiSnips.snippet.definition.snipmate import SnipMateSnippetDefinition
|
||||||
433
pythonx/UltiSnips/snippet/definition/_base.py
Normal file
433
pythonx/UltiSnips/snippet/definition/_base.py
Normal file
@ -0,0 +1,433 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Snippet representation after parsing."""
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
import vim
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
from UltiSnips import _vim
|
||||||
|
from UltiSnips.compatibility import as_unicode
|
||||||
|
from UltiSnips.indent_util import IndentUtil
|
||||||
|
from UltiSnips.position import Position
|
||||||
|
from UltiSnips.text import escape
|
||||||
|
from UltiSnips.text_objects import SnippetInstance
|
||||||
|
from UltiSnips.text_objects._python_code import SnippetUtilCursor, SnippetUtilForAction
|
||||||
|
|
||||||
|
__WHITESPACE_SPLIT = re.compile(r"\s")
|
||||||
|
def split_at_whitespace(string):
|
||||||
|
"""Like string.split(), but keeps empty words as empty words."""
|
||||||
|
return re.split(__WHITESPACE_SPLIT, string)
|
||||||
|
|
||||||
|
def _words_for_line(trigger, before, num_words=None):
|
||||||
|
"""Gets the final 'num_words' words from 'before'.
|
||||||
|
|
||||||
|
If num_words is None, then use the number of words in 'trigger'.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if num_words is None:
|
||||||
|
num_words = len(split_at_whitespace(trigger))
|
||||||
|
|
||||||
|
word_list = split_at_whitespace(before)
|
||||||
|
if len(word_list) <= num_words:
|
||||||
|
return before.strip()
|
||||||
|
else:
|
||||||
|
before_words = before
|
||||||
|
for i in range(-1, -(num_words + 1), -1):
|
||||||
|
left = before_words.rfind(word_list[i])
|
||||||
|
before_words = before_words[:left]
|
||||||
|
return before[len(before_words):].strip()
|
||||||
|
|
||||||
|
|
||||||
|
class SnippetDefinition(object):
|
||||||
|
|
||||||
|
"""Represents a snippet as parsed from a file."""
|
||||||
|
|
||||||
|
_INDENT = re.compile(r"^[ \t]*")
|
||||||
|
_TABS = re.compile(r"^\t*")
|
||||||
|
|
||||||
|
def __init__(self, priority, trigger, value, description,
|
||||||
|
options, globals, location, context, actions):
|
||||||
|
self._priority = int(priority)
|
||||||
|
self._trigger = as_unicode(trigger)
|
||||||
|
self._value = as_unicode(value)
|
||||||
|
self._description = as_unicode(description)
|
||||||
|
self._opts = options
|
||||||
|
self._matched = ''
|
||||||
|
self._last_re = None
|
||||||
|
self._globals = globals
|
||||||
|
self._location = location
|
||||||
|
self._context_code = context
|
||||||
|
self._context = None
|
||||||
|
self._actions = actions
|
||||||
|
|
||||||
|
# Make sure that we actually match our trigger in case we are
|
||||||
|
# immediately expanded.
|
||||||
|
self.matches(self._trigger)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '_SnippetDefinition(%r,%s,%s,%s)' % (
|
||||||
|
self._priority, self._trigger, self._description, self._opts)
|
||||||
|
|
||||||
|
def _re_match(self, trigger):
|
||||||
|
"""Test if a the current regex trigger matches `trigger`.
|
||||||
|
|
||||||
|
If so, set _last_re and _matched.
|
||||||
|
|
||||||
|
"""
|
||||||
|
for match in re.finditer(self._trigger, trigger):
|
||||||
|
if match.end() != len(trigger):
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
self._matched = trigger[match.start():match.end()]
|
||||||
|
|
||||||
|
self._last_re = match
|
||||||
|
return match
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _context_match(self, visual_content):
|
||||||
|
# skip on empty buffer
|
||||||
|
if len(vim.current.buffer) == 1 and vim.current.buffer[0] == "":
|
||||||
|
return
|
||||||
|
|
||||||
|
locals = {
|
||||||
|
'context': None,
|
||||||
|
'visual_mode': '',
|
||||||
|
'visual_text': '',
|
||||||
|
'last_placeholder': None
|
||||||
|
}
|
||||||
|
|
||||||
|
if visual_content:
|
||||||
|
locals['visual_mode'] = visual_content.mode
|
||||||
|
locals['visual_text'] = visual_content.text
|
||||||
|
locals['last_placeholder'] = visual_content.placeholder
|
||||||
|
|
||||||
|
return self._eval_code('snip.context = ' + self._context_code,
|
||||||
|
locals).context
|
||||||
|
|
||||||
|
def _eval_code(self, code, additional_locals={}):
|
||||||
|
code = "\n".join([
|
||||||
|
'import re, os, vim, string, random',
|
||||||
|
'\n'.join(self._globals.get('!p', [])).replace('\r\n', '\n'),
|
||||||
|
code
|
||||||
|
])
|
||||||
|
|
||||||
|
current = vim.current
|
||||||
|
|
||||||
|
locals = {
|
||||||
|
'window': current.window,
|
||||||
|
'buffer': current.buffer,
|
||||||
|
'line': current.window.cursor[0]-1,
|
||||||
|
'column': current.window.cursor[1]-1,
|
||||||
|
'cursor': SnippetUtilCursor(current.window.cursor),
|
||||||
|
}
|
||||||
|
|
||||||
|
locals.update(additional_locals)
|
||||||
|
|
||||||
|
snip = SnippetUtilForAction(locals)
|
||||||
|
|
||||||
|
try:
|
||||||
|
exec(code, {'snip': snip})
|
||||||
|
except Exception as e:
|
||||||
|
e.snippet_info = textwrap.dedent("""
|
||||||
|
Defined in: {}
|
||||||
|
Trigger: {}
|
||||||
|
Description: {}
|
||||||
|
Context: {}
|
||||||
|
Pre-expand: {}
|
||||||
|
Post-expand: {}
|
||||||
|
""").format(
|
||||||
|
self._location,
|
||||||
|
self._trigger,
|
||||||
|
self._description,
|
||||||
|
self._context_code if self._context_code else '<none>',
|
||||||
|
self._actions['pre_expand'] if 'pre_expand' in self._actions
|
||||||
|
else '<none>',
|
||||||
|
self._actions['post_expand'] if 'post_expand' in self._actions
|
||||||
|
else '<none>',
|
||||||
|
code,
|
||||||
|
)
|
||||||
|
|
||||||
|
e.snippet_code = code
|
||||||
|
|
||||||
|
raise
|
||||||
|
|
||||||
|
return snip
|
||||||
|
|
||||||
|
def _execute_action(
|
||||||
|
self,
|
||||||
|
action,
|
||||||
|
context,
|
||||||
|
additional_locals={}
|
||||||
|
):
|
||||||
|
mark_to_use = '`'
|
||||||
|
with _vim.save_mark(mark_to_use):
|
||||||
|
_vim.set_mark_from_pos(mark_to_use, _vim.get_cursor_pos())
|
||||||
|
|
||||||
|
cursor_line_before = _vim.buf.line_till_cursor
|
||||||
|
|
||||||
|
locals = {
|
||||||
|
'context': context,
|
||||||
|
}
|
||||||
|
|
||||||
|
locals.update(additional_locals)
|
||||||
|
|
||||||
|
snip = self._eval_code(action, locals)
|
||||||
|
|
||||||
|
if snip.cursor.is_set():
|
||||||
|
vim.current.window.cursor = snip.cursor.to_vim_cursor()
|
||||||
|
else:
|
||||||
|
new_mark_pos = _vim.get_mark_pos(mark_to_use)
|
||||||
|
|
||||||
|
cursor_invalid = False
|
||||||
|
|
||||||
|
if _vim._is_pos_zero(new_mark_pos):
|
||||||
|
cursor_invalid = True
|
||||||
|
else:
|
||||||
|
_vim.set_cursor_from_pos(new_mark_pos)
|
||||||
|
if cursor_line_before != _vim.buf.line_till_cursor:
|
||||||
|
cursor_invalid = True
|
||||||
|
|
||||||
|
if cursor_invalid:
|
||||||
|
raise RuntimeError(
|
||||||
|
'line under the cursor was modified, but ' +
|
||||||
|
'"snip.cursor" variable is not set; either set set ' +
|
||||||
|
'"snip.cursor" to new cursor position, or do not ' +
|
||||||
|
'modify cursor line'
|
||||||
|
)
|
||||||
|
|
||||||
|
return snip
|
||||||
|
|
||||||
|
def has_option(self, opt):
|
||||||
|
"""Check if the named option is set."""
|
||||||
|
return opt in self._opts
|
||||||
|
|
||||||
|
@property
|
||||||
|
def description(self):
|
||||||
|
"""Descriptive text for this snippet."""
|
||||||
|
return ('(%s) %s' % (self._trigger, self._description)).strip()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def priority(self):
|
||||||
|
"""The snippets priority, which defines which snippet will be preferred
|
||||||
|
over others with the same trigger."""
|
||||||
|
return self._priority
|
||||||
|
|
||||||
|
@property
|
||||||
|
def trigger(self):
|
||||||
|
"""The trigger text for the snippet."""
|
||||||
|
return self._trigger
|
||||||
|
|
||||||
|
@property
|
||||||
|
def matched(self):
|
||||||
|
"""The last text that matched this snippet in match() or
|
||||||
|
could_match()."""
|
||||||
|
return self._matched
|
||||||
|
|
||||||
|
@property
|
||||||
|
def location(self):
|
||||||
|
"""Where this snippet was defined."""
|
||||||
|
return self._location
|
||||||
|
|
||||||
|
@property
|
||||||
|
def context(self):
|
||||||
|
"""The matched context."""
|
||||||
|
return self._context
|
||||||
|
|
||||||
|
def matches(self, before, visual_content=None):
|
||||||
|
"""Returns True if this snippet matches 'before'."""
|
||||||
|
# If user supplies both "w" and "i", it should perhaps be an
|
||||||
|
# error, but if permitted it seems that "w" should take precedence
|
||||||
|
# (since matching at word boundary and within a word == matching at word
|
||||||
|
# boundary).
|
||||||
|
self._matched = ''
|
||||||
|
|
||||||
|
words = _words_for_line(self._trigger, before)
|
||||||
|
|
||||||
|
if 'r' in self._opts:
|
||||||
|
match = self._re_match(before)
|
||||||
|
elif 'w' in self._opts:
|
||||||
|
words_len = len(self._trigger)
|
||||||
|
words_prefix = words[:-words_len]
|
||||||
|
words_suffix = words[-words_len:]
|
||||||
|
match = (words_suffix == self._trigger)
|
||||||
|
if match and words_prefix:
|
||||||
|
# Require a word boundary between prefix and suffix.
|
||||||
|
boundary_chars = escape(words_prefix[-1:] +
|
||||||
|
words_suffix[:1], r'\"')
|
||||||
|
match = _vim.eval(
|
||||||
|
'"%s" =~# "\\\\v.<."' %
|
||||||
|
boundary_chars) != '0'
|
||||||
|
elif 'i' in self._opts:
|
||||||
|
match = words.endswith(self._trigger)
|
||||||
|
else:
|
||||||
|
match = (words == self._trigger)
|
||||||
|
|
||||||
|
# By default, we match the whole trigger
|
||||||
|
if match and not self._matched:
|
||||||
|
self._matched = self._trigger
|
||||||
|
|
||||||
|
# Ensure the match was on a word boundry if needed
|
||||||
|
if 'b' in self._opts and match:
|
||||||
|
text_before = before.rstrip()[:-len(self._matched)]
|
||||||
|
if text_before.strip(' \t') != '':
|
||||||
|
self._matched = ''
|
||||||
|
return False
|
||||||
|
|
||||||
|
self._context = None
|
||||||
|
if match and self._context_code:
|
||||||
|
self._context = self._context_match(visual_content)
|
||||||
|
if not self.context:
|
||||||
|
match = False
|
||||||
|
|
||||||
|
return match
|
||||||
|
|
||||||
|
def could_match(self, before):
|
||||||
|
"""Return True if this snippet could match the (partial) 'before'."""
|
||||||
|
self._matched = ''
|
||||||
|
|
||||||
|
# List all on whitespace.
|
||||||
|
if before and before[-1] in (' ', '\t'):
|
||||||
|
before = ''
|
||||||
|
if before and before.rstrip() is not before:
|
||||||
|
return False
|
||||||
|
|
||||||
|
words = _words_for_line(self._trigger, before)
|
||||||
|
|
||||||
|
if 'r' in self._opts:
|
||||||
|
# Test for full match only
|
||||||
|
match = self._re_match(before)
|
||||||
|
elif 'w' in self._opts:
|
||||||
|
# Trim non-empty prefix up to word boundary, if present.
|
||||||
|
qwords = escape(words, r'\"')
|
||||||
|
words_suffix = _vim.eval(
|
||||||
|
'substitute("%s", "\\\\v^.+<(.+)", "\\\\1", "")' % qwords)
|
||||||
|
match = self._trigger.startswith(words_suffix)
|
||||||
|
self._matched = words_suffix
|
||||||
|
|
||||||
|
# TODO: list_snippets() function cannot handle partial-trigger
|
||||||
|
# matches yet, so for now fail if we trimmed the prefix.
|
||||||
|
if words_suffix != words:
|
||||||
|
match = False
|
||||||
|
elif 'i' in self._opts:
|
||||||
|
# TODO: It is hard to define when a inword snippet could match,
|
||||||
|
# therefore we check only for full-word trigger.
|
||||||
|
match = self._trigger.startswith(words)
|
||||||
|
else:
|
||||||
|
match = self._trigger.startswith(words)
|
||||||
|
|
||||||
|
# By default, we match the words from the trigger
|
||||||
|
if match and not self._matched:
|
||||||
|
self._matched = words
|
||||||
|
|
||||||
|
# Ensure the match was on a word boundry if needed
|
||||||
|
if 'b' in self._opts and match:
|
||||||
|
text_before = before.rstrip()[:-len(self._matched)]
|
||||||
|
if text_before.strip(' \t') != '':
|
||||||
|
self._matched = ''
|
||||||
|
return False
|
||||||
|
|
||||||
|
return match
|
||||||
|
|
||||||
|
def instantiate(self, snippet_instance, initial_text, indent):
|
||||||
|
"""Parses the content of this snippet and brings the corresponding text
|
||||||
|
objects alive inside of Vim."""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def do_pre_expand(self, visual_content, snippets_stack):
|
||||||
|
if 'pre_expand' in self._actions:
|
||||||
|
locals = {'buffer': _vim.buf, 'visual_content': visual_content}
|
||||||
|
|
||||||
|
snip = self._execute_action(
|
||||||
|
self._actions['pre_expand'], self._context, locals
|
||||||
|
)
|
||||||
|
|
||||||
|
self._context = snip.context
|
||||||
|
|
||||||
|
return snip.cursor.is_set()
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def do_post_expand(self, start, end, snippets_stack):
|
||||||
|
if 'post_expand' in self._actions:
|
||||||
|
locals = {
|
||||||
|
'snippet_start': start,
|
||||||
|
'snippet_end': end,
|
||||||
|
'buffer': _vim.buf
|
||||||
|
}
|
||||||
|
|
||||||
|
snip = self._execute_action(
|
||||||
|
self._actions['post_expand'], snippets_stack[-1].context, locals
|
||||||
|
)
|
||||||
|
|
||||||
|
snippets_stack[-1].context = snip.context
|
||||||
|
|
||||||
|
return snip.cursor.is_set()
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def do_post_jump(
|
||||||
|
self, tabstop_number, jump_direction, snippets_stack, current_snippet
|
||||||
|
):
|
||||||
|
if 'post_jump' in self._actions:
|
||||||
|
start = current_snippet.start
|
||||||
|
end = current_snippet.end
|
||||||
|
|
||||||
|
locals = {
|
||||||
|
'tabstop': tabstop_number,
|
||||||
|
'jump_direction': jump_direction,
|
||||||
|
'tabstops': current_snippet.get_tabstops(),
|
||||||
|
'snippet_start': start,
|
||||||
|
'snippet_end': end,
|
||||||
|
'buffer': _vim.buf
|
||||||
|
}
|
||||||
|
|
||||||
|
snip = self._execute_action(
|
||||||
|
self._actions['post_jump'], current_snippet.context, locals
|
||||||
|
)
|
||||||
|
|
||||||
|
current_snippet.context = snip.context
|
||||||
|
|
||||||
|
return snip.cursor.is_set()
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def launch(self, text_before, visual_content, parent, start, end):
|
||||||
|
"""Launch this snippet, overwriting the text 'start' to 'end' and
|
||||||
|
keeping the 'text_before' on the launch line.
|
||||||
|
|
||||||
|
'Parent' is the parent snippet instance if any.
|
||||||
|
|
||||||
|
"""
|
||||||
|
indent = self._INDENT.match(text_before).group(0)
|
||||||
|
lines = (self._value + '\n').splitlines()
|
||||||
|
ind_util = IndentUtil()
|
||||||
|
|
||||||
|
# Replace leading tabs in the snippet definition via proper indenting
|
||||||
|
initial_text = []
|
||||||
|
for line_num, line in enumerate(lines):
|
||||||
|
if 't' in self._opts:
|
||||||
|
tabs = 0
|
||||||
|
else:
|
||||||
|
tabs = len(self._TABS.match(line).group(0))
|
||||||
|
line_ind = ind_util.ntabs_to_proper_indent(tabs)
|
||||||
|
if line_num != 0:
|
||||||
|
line_ind = indent + line_ind
|
||||||
|
|
||||||
|
result_line = line_ind + line[tabs:]
|
||||||
|
if 'm' in self._opts:
|
||||||
|
result_line = result_line.rstrip()
|
||||||
|
initial_text.append(result_line)
|
||||||
|
initial_text = '\n'.join(initial_text)
|
||||||
|
|
||||||
|
snippet_instance = SnippetInstance(
|
||||||
|
self, parent, initial_text, start, end, visual_content,
|
||||||
|
last_re=self._last_re, globals=self._globals,
|
||||||
|
context=self._context)
|
||||||
|
self.instantiate(snippet_instance, initial_text, indent)
|
||||||
|
|
||||||
|
snippet_instance.update_textobjects()
|
||||||
|
return snippet_instance
|
||||||
22
pythonx/UltiSnips/snippet/definition/snipmate.py
Normal file
22
pythonx/UltiSnips/snippet/definition/snipmate.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""A snipMate snippet after parsing."""
|
||||||
|
|
||||||
|
from UltiSnips.snippet.definition._base import SnippetDefinition
|
||||||
|
from UltiSnips.snippet.parsing.snipmate import parse_and_instantiate
|
||||||
|
|
||||||
|
|
||||||
|
class SnipMateSnippetDefinition(SnippetDefinition):
|
||||||
|
|
||||||
|
"""See module doc."""
|
||||||
|
|
||||||
|
SNIPMATE_SNIPPET_PRIORITY = -1000
|
||||||
|
|
||||||
|
def __init__(self, trigger, value, description, location):
|
||||||
|
SnippetDefinition.__init__(self, self.SNIPMATE_SNIPPET_PRIORITY,
|
||||||
|
trigger, value, description, '', {}, location,
|
||||||
|
None, {})
|
||||||
|
|
||||||
|
def instantiate(self, snippet_instance, initial_text, indent):
|
||||||
|
parse_and_instantiate(snippet_instance, initial_text, indent)
|
||||||
15
pythonx/UltiSnips/snippet/definition/ultisnips.py
Normal file
15
pythonx/UltiSnips/snippet/definition/ultisnips.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""A UltiSnips snippet after parsing."""
|
||||||
|
|
||||||
|
from UltiSnips.snippet.definition._base import SnippetDefinition
|
||||||
|
from UltiSnips.snippet.parsing.ultisnips import parse_and_instantiate
|
||||||
|
|
||||||
|
|
||||||
|
class UltiSnipsSnippetDefinition(SnippetDefinition):
|
||||||
|
|
||||||
|
"""See module doc."""
|
||||||
|
|
||||||
|
def instantiate(self, snippet_instance, initial_text, indent):
|
||||||
|
return parse_and_instantiate(snippet_instance, initial_text, indent)
|
||||||
1
pythonx/UltiSnips/snippet/parsing/__init__.py
Normal file
1
pythonx/UltiSnips/snippet/parsing/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""Code related to turning text into snippets."""
|
||||||
68
pythonx/UltiSnips/snippet/parsing/_base.py
Normal file
68
pythonx/UltiSnips/snippet/parsing/_base.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Common functionality of the snippet parsing codes."""
|
||||||
|
|
||||||
|
from UltiSnips.position import Position
|
||||||
|
from UltiSnips.snippet.parsing._lexer import tokenize, TabStopToken
|
||||||
|
from UltiSnips.text_objects import TabStop
|
||||||
|
|
||||||
|
from UltiSnips.text_objects import Mirror
|
||||||
|
from UltiSnips.snippet.parsing._lexer import MirrorToken
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_ambiguity(all_tokens, seen_ts):
|
||||||
|
"""$1 could be a Mirror or a TabStop.
|
||||||
|
|
||||||
|
This figures this out.
|
||||||
|
|
||||||
|
"""
|
||||||
|
for parent, token in all_tokens:
|
||||||
|
if isinstance(token, MirrorToken):
|
||||||
|
if token.number not in seen_ts:
|
||||||
|
seen_ts[token.number] = TabStop(parent, token)
|
||||||
|
else:
|
||||||
|
Mirror(parent, seen_ts[token.number], token)
|
||||||
|
|
||||||
|
|
||||||
|
def tokenize_snippet_text(snippet_instance, text, indent,
|
||||||
|
allowed_tokens_in_text, allowed_tokens_in_tabstops,
|
||||||
|
token_to_textobject):
|
||||||
|
"""Turns 'text' into a stream of tokens and creates the text objects from
|
||||||
|
those tokens that are mentioned in 'token_to_textobject' assuming the
|
||||||
|
current 'indent'.
|
||||||
|
|
||||||
|
The 'allowed_tokens_in_text' define which tokens will be recognized
|
||||||
|
in 'text' while 'allowed_tokens_in_tabstops' are the tokens that
|
||||||
|
will be recognized in TabStop placeholder text.
|
||||||
|
|
||||||
|
"""
|
||||||
|
seen_ts = {}
|
||||||
|
all_tokens = []
|
||||||
|
|
||||||
|
def _do_parse(parent, text, allowed_tokens):
|
||||||
|
"""Recursive function that actually creates the objects."""
|
||||||
|
tokens = list(tokenize(text, indent, parent.start, allowed_tokens))
|
||||||
|
for token in tokens:
|
||||||
|
all_tokens.append((parent, token))
|
||||||
|
if isinstance(token, TabStopToken):
|
||||||
|
ts = TabStop(parent, token)
|
||||||
|
seen_ts[token.number] = ts
|
||||||
|
_do_parse(ts, token.initial_text,
|
||||||
|
allowed_tokens_in_tabstops)
|
||||||
|
else:
|
||||||
|
klass = token_to_textobject.get(token.__class__, None)
|
||||||
|
if klass is not None:
|
||||||
|
klass(parent, token)
|
||||||
|
_do_parse(snippet_instance, text, allowed_tokens_in_text)
|
||||||
|
return all_tokens, seen_ts
|
||||||
|
|
||||||
|
|
||||||
|
def finalize(all_tokens, seen_ts, snippet_instance):
|
||||||
|
"""Adds a tabstop 0 if non is in 'seen_ts' and brings the text of the
|
||||||
|
snippet instance into Vim."""
|
||||||
|
if 0 not in seen_ts:
|
||||||
|
mark = all_tokens[-1][1].end # Last token is always EndOfText
|
||||||
|
m1 = Position(mark.line, mark.col)
|
||||||
|
TabStop(snippet_instance, 0, mark, m1)
|
||||||
|
snippet_instance.replace_initial_text()
|
||||||
@ -1,19 +1,19 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
|
|
||||||
"""
|
"""Not really a lexer in the classical sense, but code to convert snippet
|
||||||
Not really a lexer in the classical sense, but code to convert snippet
|
definitions into logical units called Tokens."""
|
||||||
definitions into logical units called Tokens.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import string
|
import string
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from UltiSnips.compatibility import as_unicode
|
from UltiSnips.compatibility import as_unicode
|
||||||
from UltiSnips.position import Position
|
from UltiSnips.position import Position
|
||||||
from UltiSnips.escaping import unescape
|
from UltiSnips.text import unescape
|
||||||
|
|
||||||
|
|
||||||
class _TextIterator(object):
|
class _TextIterator(object):
|
||||||
|
|
||||||
"""Helper class to make iterating over text easier."""
|
"""Helper class to make iterating over text easier."""
|
||||||
|
|
||||||
def __init__(self, text, offset):
|
def __init__(self, text, offset):
|
||||||
@ -44,7 +44,7 @@ class _TextIterator(object):
|
|||||||
|
|
||||||
def peek(self, count=1):
|
def peek(self, count=1):
|
||||||
"""Returns the next 'count' characters without advancing the stream."""
|
"""Returns the next 'count' characters without advancing the stream."""
|
||||||
if count > 1: # This might return '' if nothing is found
|
if count > 1: # This might return '' if nothing is found
|
||||||
return self._text[self._idx:self._idx + count]
|
return self._text[self._idx:self._idx + count]
|
||||||
try:
|
try:
|
||||||
return self._text[self._idx]
|
return self._text[self._idx]
|
||||||
@ -56,17 +56,17 @@ class _TextIterator(object):
|
|||||||
"""Current position in the text."""
|
"""Current position in the text."""
|
||||||
return Position(self._line, self._col)
|
return Position(self._line, self._col)
|
||||||
|
|
||||||
|
|
||||||
def _parse_number(stream):
|
def _parse_number(stream):
|
||||||
"""
|
"""Expects the stream to contain a number next, returns the number without
|
||||||
Expects the stream to contain a number next, returns the number
|
consuming any more bytes."""
|
||||||
without consuming any more bytes
|
rv = ''
|
||||||
"""
|
|
||||||
rv = ""
|
|
||||||
while stream.peek() and stream.peek() in string.digits:
|
while stream.peek() and stream.peek() in string.digits:
|
||||||
rv += next(stream)
|
rv += next(stream)
|
||||||
|
|
||||||
return int(rv)
|
return int(rv)
|
||||||
|
|
||||||
|
|
||||||
def _parse_till_closing_brace(stream):
|
def _parse_till_closing_brace(stream):
|
||||||
"""
|
"""
|
||||||
Returns all chars till a non-escaped } is found. Other
|
Returns all chars till a non-escaped } is found. Other
|
||||||
@ -74,7 +74,7 @@ def _parse_till_closing_brace(stream):
|
|||||||
|
|
||||||
Will also consume the closing }, but not return it
|
Will also consume the closing }, but not return it
|
||||||
"""
|
"""
|
||||||
rv = ""
|
rv = ''
|
||||||
in_braces = 1
|
in_braces = 1
|
||||||
while True:
|
while True:
|
||||||
if EscapeCharToken.starts_here(stream, '{}'):
|
if EscapeCharToken.starts_here(stream, '{}'):
|
||||||
@ -90,6 +90,7 @@ def _parse_till_closing_brace(stream):
|
|||||||
rv += char
|
rv += char
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
|
|
||||||
def _parse_till_unescaped_char(stream, chars):
|
def _parse_till_unescaped_char(stream, chars):
|
||||||
"""
|
"""
|
||||||
Returns all chars till a non-escaped char is found.
|
Returns all chars till a non-escaped char is found.
|
||||||
@ -97,7 +98,7 @@ def _parse_till_unescaped_char(stream, chars):
|
|||||||
Will also consume the closing char, but and return it as second
|
Will also consume the closing char, but and return it as second
|
||||||
return value
|
return value
|
||||||
"""
|
"""
|
||||||
rv = ""
|
rv = ''
|
||||||
while True:
|
while True:
|
||||||
escaped = False
|
escaped = False
|
||||||
for char in chars:
|
for char in chars:
|
||||||
@ -111,20 +112,24 @@ def _parse_till_unescaped_char(stream, chars):
|
|||||||
rv += char
|
rv += char
|
||||||
return rv, char
|
return rv, char
|
||||||
|
|
||||||
|
|
||||||
class Token(object):
|
class Token(object):
|
||||||
|
|
||||||
"""Represents a Token as parsed from a snippet definition."""
|
"""Represents a Token as parsed from a snippet definition."""
|
||||||
|
|
||||||
def __init__(self, gen, indent):
|
def __init__(self, gen, indent):
|
||||||
self.initial_text = as_unicode("")
|
self.initial_text = as_unicode('')
|
||||||
self.start = gen.pos
|
self.start = gen.pos
|
||||||
self._parse(gen, indent)
|
self._parse(gen, indent)
|
||||||
self.end = gen.pos
|
self.end = gen.pos
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
"""Parses the token from 'stream' with the current 'indent'."""
|
"""Parses the token from 'stream' with the current 'indent'."""
|
||||||
pass # Does nothing
|
pass # Does nothing
|
||||||
|
|
||||||
|
|
||||||
class TabStopToken(Token):
|
class TabStopToken(Token):
|
||||||
|
|
||||||
"""${1:blub}"""
|
"""${1:blub}"""
|
||||||
CHECK = re.compile(r'^\${\d+[:}]')
|
CHECK = re.compile(r'^\${\d+[:}]')
|
||||||
|
|
||||||
@ -135,21 +140,23 @@ class TabStopToken(Token):
|
|||||||
return cls.CHECK.match(stream.peek(10)) is not None
|
return cls.CHECK.match(stream.peek(10)) is not None
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
next(stream) # $
|
next(stream) # $
|
||||||
next(stream) # {
|
next(stream) # {
|
||||||
|
|
||||||
self.number = _parse_number(stream)
|
self.number = _parse_number(stream)
|
||||||
|
|
||||||
if stream.peek() == ":":
|
if stream.peek() == ':':
|
||||||
next(stream)
|
next(stream)
|
||||||
self.initial_text = _parse_till_closing_brace(stream)
|
self.initial_text = _parse_till_closing_brace(stream)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "TabStopToken(%r,%r,%r,%r)" % (
|
return 'TabStopToken(%r,%r,%r,%r)' % (
|
||||||
self.start, self.end, self.number, self.initial_text
|
self.start, self.end, self.number, self.initial_text
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class VisualToken(Token):
|
class VisualToken(Token):
|
||||||
|
|
||||||
"""${VISUAL}"""
|
"""${VISUAL}"""
|
||||||
CHECK = re.compile(r"^\${VISUAL[:}/]")
|
CHECK = re.compile(r"^\${VISUAL[:}/]")
|
||||||
|
|
||||||
@ -160,15 +167,15 @@ class VisualToken(Token):
|
|||||||
return cls.CHECK.match(stream.peek(10)) is not None
|
return cls.CHECK.match(stream.peek(10)) is not None
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
for _ in range(8): # ${VISUAL
|
for _ in range(8): # ${VISUAL
|
||||||
next(stream)
|
next(stream)
|
||||||
|
|
||||||
if stream.peek() == ":":
|
if stream.peek() == ':':
|
||||||
next(stream)
|
next(stream)
|
||||||
self.alternative_text, char = _parse_till_unescaped_char(stream, '/}')
|
self.alternative_text, char = _parse_till_unescaped_char(stream, '/}')
|
||||||
self.alternative_text = unescape(self.alternative_text)
|
self.alternative_text = unescape(self.alternative_text)
|
||||||
|
|
||||||
if char == '/': # Transformation going on
|
if char == '/': # Transformation going on
|
||||||
try:
|
try:
|
||||||
self.search = _parse_till_unescaped_char(stream, '/')[0]
|
self.search = _parse_till_unescaped_char(stream, '/')[0]
|
||||||
self.replace = _parse_till_unescaped_char(stream, '/')[0]
|
self.replace = _parse_till_unescaped_char(stream, '/')[0]
|
||||||
@ -182,11 +189,13 @@ class VisualToken(Token):
|
|||||||
self.options = None
|
self.options = None
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "VisualToken(%r,%r)" % (
|
return 'VisualToken(%r,%r)' % (
|
||||||
self.start, self.end
|
self.start, self.end
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TransformationToken(Token):
|
class TransformationToken(Token):
|
||||||
|
|
||||||
"""${1/match/replace/options}"""
|
"""${1/match/replace/options}"""
|
||||||
|
|
||||||
CHECK = re.compile(r'^\${\d+\/')
|
CHECK = re.compile(r'^\${\d+\/')
|
||||||
@ -198,24 +207,26 @@ class TransformationToken(Token):
|
|||||||
return cls.CHECK.match(stream.peek(10)) is not None
|
return cls.CHECK.match(stream.peek(10)) is not None
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
next(stream) # $
|
next(stream) # $
|
||||||
next(stream) # {
|
next(stream) # {
|
||||||
|
|
||||||
self.number = _parse_number(stream)
|
self.number = _parse_number(stream)
|
||||||
|
|
||||||
next(stream) # /
|
next(stream) # /
|
||||||
|
|
||||||
self.search = _parse_till_unescaped_char(stream, '/')[0]
|
self.search = _parse_till_unescaped_char(stream, '/')[0]
|
||||||
self.replace = _parse_till_unescaped_char(stream, '/')[0]
|
self.replace = _parse_till_unescaped_char(stream, '/')[0]
|
||||||
self.options = _parse_till_closing_brace(stream)
|
self.options = _parse_till_closing_brace(stream)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "TransformationToken(%r,%r,%r,%r,%r)" % (
|
return 'TransformationToken(%r,%r,%r,%r,%r)' % (
|
||||||
self.start, self.end, self.number, self.search, self.replace
|
self.start, self.end, self.number, self.search, self.replace
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class MirrorToken(Token):
|
class MirrorToken(Token):
|
||||||
"""$1"""
|
|
||||||
|
"""$1."""
|
||||||
CHECK = re.compile(r'^\$\d+')
|
CHECK = re.compile(r'^\$\d+')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -225,16 +236,18 @@ class MirrorToken(Token):
|
|||||||
return cls.CHECK.match(stream.peek(10)) is not None
|
return cls.CHECK.match(stream.peek(10)) is not None
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
next(stream) # $
|
next(stream) # $
|
||||||
self.number = _parse_number(stream)
|
self.number = _parse_number(stream)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "MirrorToken(%r,%r,%r)" % (
|
return 'MirrorToken(%r,%r,%r)' % (
|
||||||
self.start, self.end, self.number
|
self.start, self.end, self.number
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class EscapeCharToken(Token):
|
class EscapeCharToken(Token):
|
||||||
"""\\n"""
|
|
||||||
|
"""\\n."""
|
||||||
@classmethod
|
@classmethod
|
||||||
def starts_here(cls, stream, chars=r'{}\$`'):
|
def starts_here(cls, stream, chars=r'{}\$`'):
|
||||||
"""Returns true if this token starts at the current position in
|
"""Returns true if this token starts at the current position in
|
||||||
@ -244,16 +257,18 @@ class EscapeCharToken(Token):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
next(stream) # \
|
next(stream) # \
|
||||||
self.initial_text = next(stream)
|
self.initial_text = next(stream)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "EscapeCharToken(%r,%r,%r)" % (
|
return 'EscapeCharToken(%r,%r,%r)' % (
|
||||||
self.start, self.end, self.initial_text
|
self.start, self.end, self.initial_text
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class ShellCodeToken(Token):
|
class ShellCodeToken(Token):
|
||||||
"""`! echo "hi"`"""
|
|
||||||
|
"""`echo "hi"`"""
|
||||||
@classmethod
|
@classmethod
|
||||||
def starts_here(cls, stream):
|
def starts_here(cls, stream):
|
||||||
"""Returns true if this token starts at the current position in
|
"""Returns true if this token starts at the current position in
|
||||||
@ -261,15 +276,17 @@ class ShellCodeToken(Token):
|
|||||||
return stream.peek(1) == '`'
|
return stream.peek(1) == '`'
|
||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
next(stream) # `
|
next(stream) # `
|
||||||
self.code = _parse_till_unescaped_char(stream, '`')[0]
|
self.code = _parse_till_unescaped_char(stream, '`')[0]
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "ShellCodeToken(%r,%r,%r)" % (
|
return 'ShellCodeToken(%r,%r,%r)' % (
|
||||||
self.start, self.end, self.code
|
self.start, self.end, self.code
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class PythonCodeToken(Token):
|
class PythonCodeToken(Token):
|
||||||
|
|
||||||
"""`!p snip.rv = "Hi"`"""
|
"""`!p snip.rv = "Hi"`"""
|
||||||
CHECK = re.compile(r'^`!p\s')
|
CHECK = re.compile(r'^`!p\s')
|
||||||
|
|
||||||
@ -281,7 +298,7 @@ class PythonCodeToken(Token):
|
|||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
for _ in range(3):
|
for _ in range(3):
|
||||||
next(stream) # `!p
|
next(stream) # `!p
|
||||||
if stream.peek() in '\t ':
|
if stream.peek() in '\t ':
|
||||||
next(stream)
|
next(stream)
|
||||||
|
|
||||||
@ -292,17 +309,19 @@ class PythonCodeToken(Token):
|
|||||||
lines = code.splitlines()
|
lines = code.splitlines()
|
||||||
self.code = lines[0] + '\n'
|
self.code = lines[0] + '\n'
|
||||||
self.code += '\n'.join([l[len(indent):]
|
self.code += '\n'.join([l[len(indent):]
|
||||||
for l in lines[1:]])
|
for l in lines[1:]])
|
||||||
else:
|
else:
|
||||||
self.code = code
|
self.code = code
|
||||||
self.indent = indent
|
self.indent = indent
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "PythonCodeToken(%r,%r,%r)" % (
|
return 'PythonCodeToken(%r,%r,%r)' % (
|
||||||
self.start, self.end, self.code
|
self.start, self.end, self.code
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class VimLCodeToken(Token):
|
class VimLCodeToken(Token):
|
||||||
|
|
||||||
"""`!v g:hi`"""
|
"""`!v g:hi`"""
|
||||||
CHECK = re.compile(r'^`!v\s')
|
CHECK = re.compile(r'^`!v\s')
|
||||||
|
|
||||||
@ -314,31 +333,32 @@ class VimLCodeToken(Token):
|
|||||||
|
|
||||||
def _parse(self, stream, indent):
|
def _parse(self, stream, indent):
|
||||||
for _ in range(4):
|
for _ in range(4):
|
||||||
next(stream) # `!v
|
next(stream) # `!v
|
||||||
self.code = _parse_till_unescaped_char(stream, '`')[0]
|
self.code = _parse_till_unescaped_char(stream, '`')[0]
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "VimLCodeToken(%r,%r,%r)" % (
|
return 'VimLCodeToken(%r,%r,%r)' % (
|
||||||
self.start, self.end, self.code
|
self.start, self.end, self.code
|
||||||
)
|
)
|
||||||
|
|
||||||
class EndOfTextToken(Token):
|
|
||||||
"""Appears at the end of the text."""
|
|
||||||
def __repr__(self):
|
|
||||||
return "EndOfText(%r)" % self.end
|
|
||||||
|
|
||||||
__ALLOWED_TOKENS = [
|
class EndOfTextToken(Token):
|
||||||
EscapeCharToken, VisualToken, TransformationToken, TabStopToken,
|
|
||||||
MirrorToken, PythonCodeToken, VimLCodeToken, ShellCodeToken
|
"""Appears at the end of the text."""
|
||||||
]
|
|
||||||
def tokenize(text, indent, offset):
|
def __repr__(self):
|
||||||
|
return 'EndOfText(%r)' % self.end
|
||||||
|
|
||||||
|
|
||||||
|
def tokenize(text, indent, offset, allowed_tokens):
|
||||||
"""Returns an iterator of tokens of 'text'['offset':] which is assumed to
|
"""Returns an iterator of tokens of 'text'['offset':] which is assumed to
|
||||||
have 'indent' as the whitespace of the begging of the lines."""
|
have 'indent' as the whitespace of the begging of the lines. Only
|
||||||
|
'allowed_tokens' are considered to be valid tokens."""
|
||||||
stream = _TextIterator(text, offset)
|
stream = _TextIterator(text, offset)
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
done_something = False
|
done_something = False
|
||||||
for token in __ALLOWED_TOKENS:
|
for token in allowed_tokens:
|
||||||
if token.starts_here(stream):
|
if token.starts_here(stream):
|
||||||
yield token(stream, indent)
|
yield token(stream, indent)
|
||||||
done_something = True
|
done_something = True
|
||||||
38
pythonx/UltiSnips/snippet/parsing/snipmate.py
Normal file
38
pythonx/UltiSnips/snippet/parsing/snipmate.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Parses a snipMate snippet definition and launches it into Vim."""
|
||||||
|
|
||||||
|
from UltiSnips.snippet.parsing._base import tokenize_snippet_text, finalize, resolve_ambiguity
|
||||||
|
from UltiSnips.snippet.parsing._lexer import EscapeCharToken, \
|
||||||
|
VisualToken, TabStopToken, MirrorToken, ShellCodeToken
|
||||||
|
from UltiSnips.text_objects import EscapedChar, Mirror, VimLCode, Visual
|
||||||
|
|
||||||
|
_TOKEN_TO_TEXTOBJECT = {
|
||||||
|
EscapeCharToken: EscapedChar,
|
||||||
|
VisualToken: Visual,
|
||||||
|
ShellCodeToken: VimLCode, # `` is VimL in snipMate
|
||||||
|
}
|
||||||
|
|
||||||
|
__ALLOWED_TOKENS = [
|
||||||
|
EscapeCharToken, VisualToken, TabStopToken, MirrorToken, ShellCodeToken
|
||||||
|
]
|
||||||
|
|
||||||
|
__ALLOWED_TOKENS_IN_TABSTOPS = [
|
||||||
|
EscapeCharToken, VisualToken, MirrorToken, ShellCodeToken
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def parse_and_instantiate(parent_to, text, indent):
|
||||||
|
"""Parses a snippet definition in snipMate format from 'text' assuming the
|
||||||
|
current 'indent'.
|
||||||
|
|
||||||
|
Will instantiate all the objects and link them as children to
|
||||||
|
parent_to. Will also put the initial text into Vim.
|
||||||
|
|
||||||
|
"""
|
||||||
|
all_tokens, seen_ts = tokenize_snippet_text(parent_to, text, indent,
|
||||||
|
__ALLOWED_TOKENS, __ALLOWED_TOKENS_IN_TABSTOPS,
|
||||||
|
_TOKEN_TO_TEXTOBJECT)
|
||||||
|
resolve_ambiguity(all_tokens, seen_ts)
|
||||||
|
finalize(all_tokens, seen_ts, parent_to)
|
||||||
50
pythonx/UltiSnips/snippet/parsing/ultisnips.py
Normal file
50
pythonx/UltiSnips/snippet/parsing/ultisnips.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Parses a UltiSnips snippet definition and launches it into Vim."""
|
||||||
|
|
||||||
|
from UltiSnips.snippet.parsing._base import tokenize_snippet_text, finalize, resolve_ambiguity
|
||||||
|
from UltiSnips.snippet.parsing._lexer import EscapeCharToken, \
|
||||||
|
VisualToken, TransformationToken, TabStopToken, MirrorToken, \
|
||||||
|
PythonCodeToken, VimLCodeToken, ShellCodeToken
|
||||||
|
from UltiSnips.text_objects import EscapedChar, Mirror, PythonCode, \
|
||||||
|
ShellCode, TabStop, Transformation, VimLCode, Visual
|
||||||
|
|
||||||
|
_TOKEN_TO_TEXTOBJECT = {
|
||||||
|
EscapeCharToken: EscapedChar,
|
||||||
|
VisualToken: Visual,
|
||||||
|
ShellCodeToken: ShellCode,
|
||||||
|
PythonCodeToken: PythonCode,
|
||||||
|
VimLCodeToken: VimLCode,
|
||||||
|
}
|
||||||
|
|
||||||
|
__ALLOWED_TOKENS = [
|
||||||
|
EscapeCharToken, VisualToken, TransformationToken, TabStopToken,
|
||||||
|
MirrorToken, PythonCodeToken, VimLCodeToken, ShellCodeToken
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def _create_transformations(all_tokens, seen_ts):
|
||||||
|
"""Create the objects that need to know about tabstops."""
|
||||||
|
for parent, token in all_tokens:
|
||||||
|
if isinstance(token, TransformationToken):
|
||||||
|
if token.number not in seen_ts:
|
||||||
|
raise RuntimeError(
|
||||||
|
'Tabstop %i is not known but is used by a Transformation'
|
||||||
|
% token.number)
|
||||||
|
Transformation(parent, seen_ts[token.number], token)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_and_instantiate(parent_to, text, indent):
|
||||||
|
"""Parses a snippet definition in UltiSnips format from 'text' assuming the
|
||||||
|
current 'indent'.
|
||||||
|
|
||||||
|
Will instantiate all the objects and link them as children to
|
||||||
|
parent_to. Will also put the initial text into Vim.
|
||||||
|
|
||||||
|
"""
|
||||||
|
all_tokens, seen_ts = tokenize_snippet_text(parent_to, text, indent,
|
||||||
|
__ALLOWED_TOKENS, __ALLOWED_TOKENS, _TOKEN_TO_TEXTOBJECT)
|
||||||
|
resolve_ambiguity(all_tokens, seen_ts)
|
||||||
|
_create_transformations(all_tokens, seen_ts)
|
||||||
|
finalize(all_tokens, seen_ts, parent_to)
|
||||||
10
pythonx/UltiSnips/snippet/source/__init__.py
Normal file
10
pythonx/UltiSnips/snippet/source/__init__.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Sources of snippet definitions."""
|
||||||
|
|
||||||
|
from UltiSnips.snippet.source._base import SnippetSource
|
||||||
|
from UltiSnips.snippet.source.added import AddedSnippetsSource
|
||||||
|
from UltiSnips.snippet.source.file.snipmate import SnipMateFileSource
|
||||||
|
from UltiSnips.snippet.source.file.ultisnips import UltiSnipsFileSource, \
|
||||||
|
find_all_snippet_files, find_snippet_files
|
||||||
97
pythonx/UltiSnips/snippet/source/_base.py
Normal file
97
pythonx/UltiSnips/snippet/source/_base.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Base class for snippet sources."""
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
|
from UltiSnips.snippet.source._snippet_dictionary import SnippetDictionary
|
||||||
|
|
||||||
|
|
||||||
|
class SnippetSource(object):
|
||||||
|
|
||||||
|
"""See module docstring."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._snippets = defaultdict(SnippetDictionary)
|
||||||
|
self._extends = defaultdict(set)
|
||||||
|
|
||||||
|
def ensure(self, filetypes, cached):
|
||||||
|
"""Update/reload the snippets in the source when needed.
|
||||||
|
|
||||||
|
It makes sure that the snippets are not outdated.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def loaded(self, filetypes):
|
||||||
|
return len(self._snippets) > 0
|
||||||
|
|
||||||
|
def _get_existing_deep_extends(self, base_filetypes):
|
||||||
|
"""Helper for get all existing filetypes extended by base filetypes."""
|
||||||
|
deep_extends = self.get_deep_extends(base_filetypes)
|
||||||
|
return [ft for ft in deep_extends if ft in self._snippets]
|
||||||
|
|
||||||
|
def get_snippets(self, filetypes, before, possible, autotrigger_only,
|
||||||
|
visual_content):
|
||||||
|
"""Returns the snippets for all 'filetypes' (in order) and their
|
||||||
|
parents matching the text 'before'. If 'possible' is true, a partial
|
||||||
|
match is enough. Base classes can override this method to provide means
|
||||||
|
of creating snippets on the fly.
|
||||||
|
|
||||||
|
Returns a list of SnippetDefinition s.
|
||||||
|
|
||||||
|
"""
|
||||||
|
result = []
|
||||||
|
for ft in self._get_existing_deep_extends(filetypes):
|
||||||
|
snips = self._snippets[ft]
|
||||||
|
result.extend(snips.get_matching_snippets(before, possible,
|
||||||
|
autotrigger_only,
|
||||||
|
visual_content))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_clear_priority(self, filetypes):
|
||||||
|
"""Get maximum clearsnippets priority without arguments for specified
|
||||||
|
filetypes, if any.
|
||||||
|
|
||||||
|
It returns None if there are no clearsnippets.
|
||||||
|
|
||||||
|
"""
|
||||||
|
pri = None
|
||||||
|
for ft in self._get_existing_deep_extends(filetypes):
|
||||||
|
snippets = self._snippets[ft]
|
||||||
|
if pri is None or snippets._clear_priority > pri:
|
||||||
|
pri = snippets._clear_priority
|
||||||
|
return pri
|
||||||
|
|
||||||
|
def get_cleared(self, filetypes):
|
||||||
|
"""Get a set of cleared snippets marked by clearsnippets with arguments
|
||||||
|
for specified filetypes."""
|
||||||
|
cleared = {}
|
||||||
|
for ft in self._get_existing_deep_extends(filetypes):
|
||||||
|
snippets = self._snippets[ft]
|
||||||
|
for key, value in snippets._cleared.items():
|
||||||
|
if key not in cleared or value > cleared[key]:
|
||||||
|
cleared[key] = value
|
||||||
|
return cleared
|
||||||
|
|
||||||
|
def update_extends(self, child_ft, parent_fts):
|
||||||
|
"""Update the extending relation by given child filetype and its parent
|
||||||
|
filetypes."""
|
||||||
|
self._extends[child_ft].update(parent_fts)
|
||||||
|
|
||||||
|
def get_deep_extends(self, base_filetypes):
|
||||||
|
"""Get a list of filetypes that is either directed or indirected
|
||||||
|
extended by given base filetypes.
|
||||||
|
|
||||||
|
Note that the returned list include the root filetype itself.
|
||||||
|
|
||||||
|
"""
|
||||||
|
seen = set(base_filetypes)
|
||||||
|
todo_fts = list(set(base_filetypes))
|
||||||
|
while todo_fts:
|
||||||
|
todo_ft = todo_fts.pop()
|
||||||
|
unseen_extends = set(
|
||||||
|
ft for ft in self._extends[todo_ft] if ft not in seen)
|
||||||
|
seen.update(unseen_extends)
|
||||||
|
todo_fts.extend(unseen_extends)
|
||||||
|
return seen
|
||||||
60
pythonx/UltiSnips/snippet/source/_snippet_dictionary.py
Normal file
60
pythonx/UltiSnips/snippet/source/_snippet_dictionary.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Implements a container for parsed snippets."""
|
||||||
|
|
||||||
|
class SnippetDictionary(object):
|
||||||
|
|
||||||
|
"""See module docstring."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self._snippets = []
|
||||||
|
self._cleared = {}
|
||||||
|
self._clear_priority = float("-inf")
|
||||||
|
|
||||||
|
def add_snippet(self, snippet):
|
||||||
|
"""Add 'snippet' to this dictionary."""
|
||||||
|
self._snippets.append(snippet)
|
||||||
|
|
||||||
|
def get_matching_snippets(self, trigger, potentially, autotrigger_only,
|
||||||
|
visual_content):
|
||||||
|
"""Returns all snippets matching the given trigger.
|
||||||
|
|
||||||
|
If 'potentially' is true, returns all that could_match().
|
||||||
|
|
||||||
|
If 'autotrigger_only' is true, function will return only snippets which
|
||||||
|
are marked with flag 'A' (should be automatically expanded without
|
||||||
|
trigger key press).
|
||||||
|
It's handled specially to avoid walking down the list of all snippets,
|
||||||
|
which can be very slow, because function will be called on each change
|
||||||
|
made in insert mode.
|
||||||
|
|
||||||
|
"""
|
||||||
|
all_snippets = self._snippets
|
||||||
|
if autotrigger_only:
|
||||||
|
all_snippets = [s for s in all_snippets if s.has_option('A')]
|
||||||
|
|
||||||
|
if not potentially:
|
||||||
|
return [s for s in all_snippets if s.matches(trigger,
|
||||||
|
visual_content)]
|
||||||
|
else:
|
||||||
|
return [s for s in all_snippets if s.could_match(trigger)]
|
||||||
|
|
||||||
|
def clear_snippets(self, priority, triggers):
|
||||||
|
"""Clear the snippets by mark them as cleared.
|
||||||
|
|
||||||
|
If trigger is None, it updates the value of clear priority
|
||||||
|
instead.
|
||||||
|
|
||||||
|
"""
|
||||||
|
if not triggers:
|
||||||
|
if self._clear_priority is None or priority > self._clear_priority:
|
||||||
|
self._clear_priority = priority
|
||||||
|
else:
|
||||||
|
for trigger in triggers:
|
||||||
|
if (trigger not in self._cleared or
|
||||||
|
priority > self._cleared[trigger]):
|
||||||
|
self._cleared[trigger] = priority
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return len(self._snippets)
|
||||||
@ -3,11 +3,13 @@
|
|||||||
|
|
||||||
"""Handles manually added snippets UltiSnips_Manager.add_snippet()."""
|
"""Handles manually added snippets UltiSnips_Manager.add_snippet()."""
|
||||||
|
|
||||||
from UltiSnips.providers._base import SnippetProvider
|
from UltiSnips.snippet.source._base import SnippetSource
|
||||||
|
|
||||||
|
|
||||||
|
class AddedSnippetsSource(SnippetSource):
|
||||||
|
|
||||||
class AddedSnippetsProvider(SnippetProvider):
|
|
||||||
"""See module docstring."""
|
"""See module docstring."""
|
||||||
|
|
||||||
def add_snippet(self, ft, snippet):
|
def add_snippet(self, ft, snippet):
|
||||||
"""Adds the given 'snippet' for 'ft'."""
|
"""Adds the given 'snippet' for 'ft'."""
|
||||||
self._snippets[ft].add_snippet(snippet, None)
|
self._snippets[ft].add_snippet(snippet)
|
||||||
1
pythonx/UltiSnips/snippet/source/file/__init__.py
Normal file
1
pythonx/UltiSnips/snippet/source/file/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
"""Snippet sources that are file based."""
|
||||||
112
pythonx/UltiSnips/snippet/source/file/_base.py
Normal file
112
pythonx/UltiSnips/snippet/source/file/_base.py
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Code to provide access to UltiSnips files from disk."""
|
||||||
|
|
||||||
|
from collections import defaultdict
|
||||||
|
import hashlib
|
||||||
|
import os
|
||||||
|
|
||||||
|
from UltiSnips import _vim
|
||||||
|
from UltiSnips import compatibility
|
||||||
|
from UltiSnips.snippet.source._base import SnippetSource
|
||||||
|
|
||||||
|
|
||||||
|
def _hash_file(path):
|
||||||
|
"""Returns a hashdigest of 'path'."""
|
||||||
|
if not os.path.isfile(path):
|
||||||
|
return False
|
||||||
|
return hashlib.sha1(open(path, 'rb').read()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
class SnippetSyntaxError(RuntimeError):
|
||||||
|
|
||||||
|
"""Thrown when a syntax error is found in a file."""
|
||||||
|
|
||||||
|
def __init__(self, filename, line_index, msg):
|
||||||
|
RuntimeError.__init__(self, '%s in %s:%d' % (
|
||||||
|
msg, filename, line_index))
|
||||||
|
|
||||||
|
|
||||||
|
class SnippetFileSource(SnippetSource):
|
||||||
|
|
||||||
|
"""Base class that abstracts away 'extends' info and file hashes."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
SnippetSource.__init__(self)
|
||||||
|
self._files_for_ft = defaultdict(set)
|
||||||
|
self._file_hashes = defaultdict(lambda: None)
|
||||||
|
self._ensure_cached = False
|
||||||
|
|
||||||
|
def ensure(self, filetypes, cached):
|
||||||
|
if cached and self._ensure_cached:
|
||||||
|
return
|
||||||
|
|
||||||
|
for ft in self.get_deep_extends(filetypes):
|
||||||
|
if self._needs_update(ft):
|
||||||
|
self._load_snippets_for(ft)
|
||||||
|
|
||||||
|
self._ensure_cached = True
|
||||||
|
|
||||||
|
def _get_all_snippet_files_for(self, ft):
|
||||||
|
"""Returns a set of all files that define snippets for 'ft'."""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def _parse_snippet_file(self, filedata, filename):
|
||||||
|
"""Parses 'filedata' as a snippet file and yields events."""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def _needs_update(self, ft):
|
||||||
|
"""Returns true if any files for 'ft' have changed and must be
|
||||||
|
reloaded."""
|
||||||
|
existing_files = self._get_all_snippet_files_for(ft)
|
||||||
|
if existing_files != self._files_for_ft[ft]:
|
||||||
|
self._files_for_ft[ft] = existing_files
|
||||||
|
return True
|
||||||
|
|
||||||
|
for filename in self._files_for_ft[ft]:
|
||||||
|
if _hash_file(filename) != self._file_hashes[filename]:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _load_snippets_for(self, ft):
|
||||||
|
"""Load all snippets for the given 'ft'."""
|
||||||
|
if ft in self._snippets:
|
||||||
|
del self._snippets[ft]
|
||||||
|
del self._extends[ft]
|
||||||
|
try:
|
||||||
|
for fn in self._files_for_ft[ft]:
|
||||||
|
self._parse_snippets(ft, fn)
|
||||||
|
except:
|
||||||
|
del self._files_for_ft[ft]
|
||||||
|
raise
|
||||||
|
# Now load for the parents
|
||||||
|
for parent_ft in self.get_deep_extends([ft]):
|
||||||
|
if parent_ft != ft and self._needs_update(parent_ft):
|
||||||
|
self._load_snippets_for(parent_ft)
|
||||||
|
|
||||||
|
def _parse_snippets(self, ft, filename):
|
||||||
|
"""Parse the 'filename' for the given 'ft' and watch it for changes in
|
||||||
|
the future."""
|
||||||
|
self._file_hashes[filename] = _hash_file(filename)
|
||||||
|
file_data = compatibility.open_ascii_file(filename, 'r').read()
|
||||||
|
for event, data in self._parse_snippet_file(file_data, filename):
|
||||||
|
if event == 'error':
|
||||||
|
msg, line_index = data
|
||||||
|
filename = _vim.eval("""fnamemodify(%s, ":~:.")""" %
|
||||||
|
_vim.escape(filename))
|
||||||
|
raise SnippetSyntaxError(filename, line_index, msg)
|
||||||
|
elif event == 'clearsnippets':
|
||||||
|
priority, triggers = data
|
||||||
|
self._snippets[ft].clear_snippets(priority, triggers)
|
||||||
|
elif event == 'extends':
|
||||||
|
# TODO(sirver): extends information is more global
|
||||||
|
# than one snippet source.
|
||||||
|
filetypes, = data
|
||||||
|
self.update_extends(ft, filetypes)
|
||||||
|
elif event == 'snippet':
|
||||||
|
snippet, = data
|
||||||
|
self._snippets[ft].add_snippet(snippet)
|
||||||
|
else:
|
||||||
|
assert False, 'Unhandled %s: %r' % (event, data)
|
||||||
21
pythonx/UltiSnips/snippet/source/file/_common.py
Normal file
21
pythonx/UltiSnips/snippet/source/file/_common.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
|
||||||
|
"""Common code for snipMate and UltiSnips snippet files."""
|
||||||
|
|
||||||
|
|
||||||
|
def handle_extends(tail, line_index):
|
||||||
|
"""Handles an extends line in a snippet."""
|
||||||
|
if tail:
|
||||||
|
return 'extends', ([p.strip() for p in tail.split(',')],)
|
||||||
|
else:
|
||||||
|
return 'error', ("'extends' without file types", line_index)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_action(head, tail, line_index):
|
||||||
|
if tail:
|
||||||
|
action = tail.strip('"').replace(r'\"', '"').replace(r'\\\\', r'\\')
|
||||||
|
return head, (action,)
|
||||||
|
else:
|
||||||
|
return 'error', ("'{}' without specified action".format(head),
|
||||||
|
line_index)
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user