{"id":19078976,"url":"https://github.com/tomtom/tskeleton_vim","last_synced_at":"2025-07-23T00:07:37.172Z","repository":{"id":1023623,"uuid":"851562","full_name":"tomtom/tskeleton_vim","owner":"tomtom","description":"File Templates and Code Skeletons/Snippets for VIM","archived":false,"fork":false,"pushed_at":"2017-08-13T19:42:34.000Z","size":230,"stargazers_count":38,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-03T09:58:39.138Z","etag":null,"topics":["vim","vim-plugin","viml"],"latest_commit_sha":null,"homepage":"http://www.vim.org/scripts/script.php?script_id=1160","language":"Vim script","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomtom.png","metadata":{"files":{"readme":"README","changelog":"CHANGES.TXT","contributing":null,"funding":null,"license":"LICENSE.TXT","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2010-08-20T16:32:13.000Z","updated_at":"2025-03-12T08:07:55.000Z","dependencies_parsed_at":"2022-08-16T11:50:29.899Z","dependency_job_id":null,"html_url":"https://github.com/tomtom/tskeleton_vim","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/tomtom/tskeleton_vim","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomtom%2Ftskeleton_vim","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomtom%2Ftskeleton_vim/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomtom%2Ftskeleton_vim/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomtom%2Ftskeleton_vim/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomtom","download_url":"https://codeload.github.com/tomtom/tskeleton_vim/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomtom%2Ftskeleton_vim/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266592265,"owners_count":23953109,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-22T02:00:09.085Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["vim","vim-plugin","viml"],"created_at":"2024-11-09T02:12:57.587Z","updated_at":"2025-07-23T00:07:37.126Z","avatar_url":"https://github.com/tomtom.png","language":"Vim script","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\ntskeleton provides file templates and code skeletons (\"snippets\" or \"bits\"). \nThese templates may contain special tags that are replaced with some computed \nvalue (e.g., variables, user input ...), vimscript code, or place holders/jump \npositions (see |tskeleton-jump-positions|).\n\nBasic usage:\nType `:new filename.ext`. If a skeleton for the respective filetype is \ndefined (see |tskeleton-skeletons|), it will be read into the buffer.\n\nType a partial name of a snippet (at least the first letter) and press \n(in insert mode) \u003cc-space\u003e (see |tskeleton-key-bindings| for alternative \nkey maps). If the name identifies a snippet/bit, it will be replaced with \nits expansion text. If there are several snippets beginning with that \n\"name\", you will be asked to select one from a list of matching \nsnippets.\n\n\u003cc-space\u003e can be configured to expand snippets but also (albeit disabled \nby default) abbreviations, functions (VIM script only), tags, word, \n'completefunc' and 'omnifunc' items (see |g:tskelTypes| and \n|g:tskelHyperComplete| for details.)\n\nPress \u003cc-j\u003e to jump to the next place holder (see \n|tskeleton#GoToNextTag()|).\n\n\nDemo -- tskeleton and the stakeholders (vimscript #3326) plugin:\nhttp://vimsomnia.blogspot.com/2010/11/tskeleton-and-stakeholders-vim-plugins.html\n\n\nGit:\nhttps://github.com/tomtom/tskeleton_vim\n\n\nFor similar plugins see: http://vim.wikia.com/wiki/Snippet_Plugin_Comparison\n\nLimitations of tskeleton:\n    - Place holders cannot be nested.\n    - tskeleton was originally written for vim 6.0. I'd expect it to be \n      less snappy than more modern and simpler plugins, although it \n      tries to provide acceptable performance on slower computers by \n      caching frequently reused data.\n\nAdvantages of tskeleton with respect to some other plugins:\n    - tskeleton provides for more complex templates (see \n      |tskeleton-place-holder|) including conditional expansion, loops, \n      inclusion of other templates, user queries etc.\n    - Easy creation of camel case, all upper/lower case letter names etc. (see \n      |tskeleton-modifiers|).\n\nIt depends:\n    - A place holder is some text in the buffer, i.e. tskeleton uses less magic \n      when handling jump positions. As long as users don't replace all place \n      holders, the buffer's contents most likely isn't valid code and an \n      interpreter/compiler will most likely refuse to load it even if the \n      code is never executed.\n\n\n-----------------------------------------------------------------------\n                                                    *tskeleton-install*\nInstall~\n\nEdit the vba file and type:\n\n    :so %\n\nSee :help vimball for details.\n\nIt is recommended to use tskeleton in conjunction with the stakeholders plugin \n(vimscript #3326):\n\n    http://www.vim.org/scripts/script.php?script_id=3326\n    https://github.com/tomtom/stakeholders_vim\n\nIf you don't already have some skeletons, you may want to download \ntskeleton-Samples.zip from:\n\n    http://www.vim.org/scripts/script.php?script_id=1160\n\nor from\n\n    https://github.com/tomtom/tskeletons\n\nCopy the files to your local vimfiles directory (see also |add-global-plugin|). \nThe directory structure should look like this:\n\n    ~/.vim/skeletons/\n        FILE TEMPLATES ...\n        map/\n            MAP FILES FOR CONDITIONAL EXPANSION\n        bits/\n            \u0026filetype.txt (single line templates)\n            general/\n                GENERAL CODE SKELETONS ...\n            \u0026filetype/\n                FILETYPE SPECIFIC CODE SKELETONS: ONE SKELETON PER FILE ...\n\n\n                                                    *tskeleton-snippets*\ntskeleton also provides partial support for snipMate snippets (see \nhttps://github.com/honza/snipmate-snippets). The following limitations apply:\n    - tskeleton cannot handle nested tags/place holders\n\n\n                                                    *tskeleton-cache*\nIn order to speed up things, tskeleton caches intermediate results. \nThose files are created in |g:tlib_cache|. By default, the old files \nwill be removed from the cache every |g:tlib#cache#purge_every_days| \ndays. In order to disable purging (e.g. if you purge the cache directory \nby means of a cron script), set |g:tlib#cache#purge_every_days| to -1.\n\n\n-----------------------------------------------------------------------\n                                                    *tskeleton-usage*\n                                                    *tskeleton-skeletons*\nFile templates~\n\nThe file skeletons are stored in the skeletons subdirectory. Which \ntemplate is used for which new file is controlled by |:autocmd|s. This \nprovides greater flexibility than a \u0026filetype based approach as you can \nselect templates on the basis of a filename pattern or a specific \ndirectory.\n\nCurrently, the following file types are supported by default:\n\n   - batch.bat\n   - deplate.txt\n   - latex.tex\n   - php.inc.php\n   - php.php\n   - plugin.vim\n   - ruby.rb\n   - shell.sh\n   - text.txt\n\nIn order to add support for a new filetype, save a skeleton file to \n~/.vim/skeletons/file.suffix and add something like this to your .vimrc \nfile: \u003e\n\n    autocmd BufNewFile *.suffix       TSkeletonSetup template.suffix\n    autocmd BufNewFile /here/*.suffix TSkeletonSetup othertemplate.suffix\n\n\nAlternatively, you can store templates as: \u003e\n\n    ~/.vim/skeletons/templates/GROUP/FILETYPE PATTERN\n\nwhere GROUP is an arbitrary name for a collection of auto templates, \nFILETYPE is a know vim filetype, and the pattern is an encoded pattern (# == \n*, %XX=Char XXh) for auto-generated autocmds.\n\nExample: Templates file names for some vim-related files: \u003e\n\n    ~/.vim/skeletons/templates/vim/help #%2fvimfiles%2fdoc%2f#.txt\n    ~/.vim/skeletons/templates/vim/vim #%2fvimfiles#%2fftplugin%2f#.vim\n    ~/.vim/skeletons/templates/vim/vim #%2fvimfiles#%2fsyntax%2f#.vim\n\n\u003c \n                                                    *tskeleton-place-holder*\n\nTags (which look like \u003c+...+\u003e) serve two purposes:\n\n    - marker for jump positions (see |tskeleton#GoToNextTag()|)\n    - dynamic content expansion\n\nYou can use tags to define cursor jump positions. tskeleton also \nsupports some special tags that are expanded when inserting the \nskeleton.\n\nA list of special tags:\n                                                    *tSkeletion-\u003c+FILE NAME ROOT+\u003e*\n    \u003c+FILE NAME ROOT+\u003e\n        The file name root\n                                                    *tSkeletion-\u003c+FILE NAME+\u003e*\n    \u003c+FILE NAME+\u003e\n        The file name\n                                                    *tSkeletion-\u003c+FILE SUFFIX+\u003e*\n    \u003c+FILE SUFFIX+\u003e\n        The file suffix\n                                                    *tSkeletion-\u003c+FILE DIRNAME+\u003e*\n    \u003c+FILE DIRNAME+\u003e\n        The file's directory\n                                                    *tSkeletion-\u003c+NOTE+\u003e*\n    \u003c+NOTE+\u003e\n        A note\n                                                    *tSkeletion-\u003c+DATE+\u003e*\n    \u003c+DATE+\u003e\n        The current date (the format is controlled via \n        g:tskelDateFormat)\n                                                    *tSkeletion-\u003c+AUTHOR+\u003e*\n    \u003c+AUTHOR+\u003e\n        The author's name (g:tskelUserName)\n                                                    *tSkeletion-\u003c+EMAIL+\u003e*\n    \u003c+EMAIL+\u003e\n        The author's e-mail (g:tskelUserEmail)\n                                                    *tSkeletion-\u003c+COMPANY+\u003e*\n    \u003c+COMPANY+\u003e\n        The author's company (g:tskelUserCompany)\n                                                    *tSkeletion-\u003c+WEBSITE+\u003e*\n    \u003c+WEBSITE+\u003e\n        The author's homepage (g:tskelUserWWW)\n                                                    *tSkeletion-\u003c+LICENSE+\u003e*\n    \u003c+LICENSE+\u003e\n        The name of the license this file is released under \n        (g:tskelLicense)\n\nIn order to define your own tag, you have to define a function called \nTSkeleton_TAGNAME() that returns the text to be filled in.\n\n                                                    *tskeleton-tags*\ntskeleton also supports the following pseudo-tags:\n\n    \u003c+CURSOR+\u003e                                      *tSkeletion-\u003c+CURSOR+\u003e*\n        Where to place the cursor after insertion\n\n    \u003c+\u0026NAME+\u003e                                       *tSkeletion-\u003c+\u0026+\u003e*\n        A vim option\n\n    \u003c+g:NAME+\u003e                                      *tSkeletion-\u003c+g:+\u003e*\n        A global variable\n\n    \u003c+b:NAME+\u003e                                      *tSkeletion-\u003c+b:+\u003e*\n        A buffer local variable\n \n    \u003c+?QUERY?+\u003e                                     *tSkeletion-\u003c+?+\u003e*\n        Query[1] the user\n\n    \u003c+?VAR|QUERY?+\u003e\n        Query[1] the user and propose some choices from the variable VAR\n\n                                                    *tSkeletion-\u003c+bit+\u003e*\n    \u003c+bit:BIT+\u003e, \u003c+bit:BIT|\"DEFAULT\"+\u003e, \u003c+bit:BIT|COMMANDS+\u003e\n        Insert a bit; if the bit isn't defined for the current filetype, \n        use DEFAULT; if DEFAULT matches \".*\" insert it as a string; \n        otherwise interpret it as a command sequence to be fed to normal\n\n    \u003c+tskel:TSKELETON+\u003e                             *tSkeletion-\u003c+tskel+\u003e*\n        Same as the above\n\n    \u003c+call:FUNCTION(ARGS)+\u003e                         *tSkeletion-\u003c+call+\u003e*\n        Insert the result value of some function\n\n    \u003c+include(TSKELETON)+\u003e                           *tSkeletion-\u003c+include+\u003e*\n        Another synonym for the above.\n\n    \u003c+execute(EX COMMAND)+\u003e                         *tSkeletion-\u003c+execute+\u003e*\n        Run a vim command.\n\n[1] If the query ends with a colon, the second question mark will be \nremoved. Up to verson 2.4 VAR is a string, separating the items by an \n\"\\n\". From 3.0 on, VAR is a list.\n\nNOTE: Flow control and loop tags are experimental and it's more than \njust likely that the output doesn't meet your expectations.\n\nFlow control:                                       *tSkeletion-\u003c+if+\u003e*\n    \u003c+if(CONDITION)+\u003e\n    \u003c+elseif(CONDITION)+\u003e\n    \u003c+else+\u003e\n    \u003c+endif+\u003e\n\nLoops:                                              *tSkeletion-\u003c+for+\u003e*\n    \u003c+for(VAR in LIST)+\u003e\n    \u003c+endfor+\u003e, \u003c+endfor(VAR)+\u003e\n        If you nest for loops, you have to add the variable name to the \n        endfor tag. And no, this isn't the most clever way to do this.\n\nVariables:                                          *tSkeletion-\u003c+let+\u003e*\n    \u003c+let(VAR=VALUE)+\u003e\n        The variable will be unset or restored to its original value \n        after processing the current template.\n        VAR may have some modifiers attached:\n            VAR? ... Set only if undefined\n            VAR\u0026 ... Don't restore original variable\n\nInteraction:                                        *tSkeletion-\u003c+input+\u003e*\n    \u003c+input(VAR, QUERY, [DEFAULT], [COMPLETION])+\u003e\n        This will insert the user input and set the variable VAR (unless \n        empty), which can be used throughout the template. The variable \n        will be removed after finishing the current template. If the \n        variable was previously defined, the original value will be \n        restored.\n        If VAR ends with '!', no text will be inserted in the buffer. In \n        this case any whitespace (including one newline) after the tag \n        will be removed. See also the notes on |tSkeletion-\u003c+input+\u003e|.\n\n                                                    *tSkeletion-\u003c+select+\u003e*\n    \u003c+select(VAR, LIST, [TYPE='s'], [SEPARATOR=', '])+\u003e\n        Let the user select an item from a list.\n        VAR is a string.\n        TYPE is either 's' (single selection) or 'm' (multiple selection) -- \n        see also |tlib#input#List()|.\n        If TYPE is 'm', the results are joined with SEPARATOR.\n        Example: \u003e\n            before(\u003c+select(\"s:type\", [\":all\", \":each\"])+\u003e)\n            before(\u003c+select(\"s:type\", [\"A\", \"B\", \"C\", \"D\"], \"m\", \"-\")+\u003e)\n\u003c \n\nOther:                                              *tSkeletion-\u003c+nl+\u003e*\n    \u003c+nl+\u003e\n        Insert a newline\n                \n    \u003c+joinline+\u003e                                    *tSkeletion-\u003c+joinline+\u003e*\n        Join with next line. Delete any whitespace.\n            \n    \u003c+nop+\u003e                                         *tSkeletion-\u003c+nop+\u003e*\n        Insert nothing (could be necessary in conjunction with the \"for\" \n        tag)\n\nA wiki like table could then be constructed using a skeleton like this: \u003e\n\n    \u003ctskel:before\u003e\n    let s:my_rows = input('Rows: ')\n    let s:my_cols = input('Columns: ')\n    \u003c/tskel:before\u003e\n    \u003ctskel:after\u003e\n    unlet! s:my_rows s:my_cols\n    \u003c/tskel:after\u003e\n    \u003c+CURSOR+\u003e\u003c+for(i in range(s:my_rows))+\u003e\n    |\u003c+for(j in range(s:my_cols))+\u003e \u003c+CELL+\u003e |\u003c+endfor(j)+\u003e\u003c+nop+\u003e\n    \u003c+endfor(i)+\u003e\n\nor: \u003e\n\n    \u003c+input('s:my_rows?!', 'Rows: ')+\u003e\n    \u003c+input('s:my_cols?!', 'Cols: ')+\u003e\n    \u003c+for(i in range(s:my_rows))+\u003e\n    |\u003c+for(j in range(s:my_cols))+\u003e \u003c+CURSOR+\u003e |\u003c+endfor(j)+\u003e\u003c+nop+\u003e\n    \u003c+endfor(i)+\u003e\n\nNOTE: The \u003c+nop+\u003e is necessary in order to prevent the \u003c+endfor+\u003e tag to \n\"eat\" the newline. If we include this bit from another bit that already \nsets s:my_rows and/or s:my_cols, the user won't be queried again (because of \nthe \"?\" in the input statement). E.g. \u003e\n\n    \u003c+let(s:my_rows = 3)+\u003e\n    \u003c+let(s:my_cols = 3)+\u003e\n    \u003c+include(table)+\u003e\n\n                                                    *tSkeletion-backslash*\nAny special tag can be preceded with a backslash in order to prevent \nexpansion. Examples: \u003e\n\n    \u003c+\\if(foo=1)+\u003e\n    \nsurprisingly expands to \u003e\n\n    \u003c+if(foo=1)+\u003e\n\nIt's best to use global variables with \"if\" and \"for\" tags as the body \nis most likely evaluated in a different buffer in a hypothetically \nunknown context.\n\n\n                                                    *tskeleton-jump-positions*\nUnknown tags are kept in the expanded skeleton. These tags can be used \nas cursor jump marks. This syntax was originally used by imap (vimscript \n#244 or vimscript #475). If you don't want to install imap, you can also  \nuse |TSkeletonMapGoToNextTag()|.\n\nNameless tags (\u003c++\u003e) will disappear when they are selected.\n\nExample:\u003e\n\n    case \u003c+CURSOR+\u003e in\n    \u003c+PATTERN+\u003e)\n        \u003c+BODY+\u003e\n        ;;\n    *)\n        \u003c+DEFAULT+\u003e\n        ;;\n    esac\n    \u003c++\u003e\n\nWhen you insert this skeleton, the cursor will be placed at \n\"\u003c+CURSOR+\u003e\".  If you press \u003cc-j\u003e, the cursor will jump to \"\u003c+PATTERN+\u003e\" \n(the tag will remain selected). If you press \u003cc-j\u003e three times, the \ncursor will jump to \"\u003c++\u003e\" (the tag will be deleted).\n\nCheck out the \"test_tskeleton\" skeleton for examples.\n\n\n                                                    *tskeleton-modifiers*\nTags can be modified using modifiers, like in: \u003e\n\n    \u003c+TAG NAME:MODIFIER+\u003e\n\nKnown modifiers:\n\n    l          :: lower case\n    u          :: upper case\n    c          :: capitalize\n    C          :: transform to CamelCase\n    s/FROM/TO/ :: replace text (actually a s//g); this has to be the \n                  last modifier; the pattern separator can be selected \n                  arbitrarily\n\nExample for a ruby class template: \u003e\n\n    class \u003c+FILE NAME ROOT:cs*\\W*_*+\u003e\n        \u003c+CURSOR+\u003e\n    end\n    \u003c++\u003e\n\n-----------------------------------------------------------------------\n                                                    *tskeleton-code-skeletons*\n                                                    *tskeleton-bits*\nBits/Code Skeletons~\n\nSmaller skeleton bits are stored in SKELETONS/bits/FILETYPE/ or \nSKELETONS/bits/general/. I.e., code skeletons can be filetype specific \nor generally available.\n\nThe filenames of the bits may be grouped in submenus as in:\n\n    ../tex/\u0026Define.%5Cnew\u0026command\n    ../tex/\u0026Define.%5Cnew\u0026environment\n\nThis will create skeletons for \\newcommand and \\newenvironment but will \ngroup the skeletons under the TSkel.Define. menu with the respective \naccelerators.\n\n                                                    *tskeleton-Types* *g:tskelTypes*\n                                                    *tskeleton#Initialize()*\ntskeleton supports several types of code templates:\n\n    - skeleton (standard tskeleton functionality)\n    - abbreviations (VIM abbreviations)\n    - functions (VIM script functions extracted from :function)\n    - mini (\"mini\" bits, one-liners etc.)\n    - tags (tags-based code templates, requires ctags, I presume)\n\nNot all types are enabled by default. User have to select, which types \nthey want to use, by setting the g:tskelTypes at start-up. When changing \nthe variable, users might have to call tskeleton#Initialize().\n\n                                                    *tskeleton-Skeleton*\nSmaller skeleton bits are stored in SKELETONS/bits/FILETYPE/ or \nSKELETONS/bits/general/. I.e., code skeletons can be filetype specific \nor generally available.\n\nSkeleton bits can be filled in by typing: \u003e\n\n    :TSkeletonBit NAME\n\nFor this command, command line completion is implemented. Calling this \ncommand will insert the contents of the respective file below the \ncurrent line.\n\nNOTE: Bit names should not contain ampersand (as these are interpreted \nas menu accelerators) and periods (which are used to construct \nsubmenus). Other special characters can be included by encoding them in \nhex form as %XX as it is done in URLs.  Example: \"%5Csection\" becomes \n\"\\section\".\n\n                                                    *tskeleton-key-bindings*\nThe default key bindings for inserting code skeletons are:\n\n    \u003cc-space\u003e  ... In insert mode, expand name before the cursor\n    \u003cLeader\u003e## ... Expand name under cursor\n    \u003cLeader\u003e#t ... Insert code skeleton via command line\n    \u003cc-\\\u003e\u003cc-\\\u003e ... In insert mode, expand the bit before the cursor (on \n                   a German keyboard this happens to be \u003cc-#\u003e\u003cc-#\u003e)\n\n                                                    *g:tskelKeyword_{\u0026filetype}*\nA bit name usually is the |word| under the cursor. If this doesn't fit \nyour needs, you can define g:tskelKeyword_{\u0026filetype} to define what \nmakes up a skeleton name. Example: \u003e\n\n    let g:tskelKeyword_viki = '\\(#\\|{\\)\\?[^#{[:blank:]]\\{-}'\n\n\n                                                    *tskeleton-embedded-code*\nCode skeletons may contain vim code that is evaluated before or after \nexpanding the tags. The before/after blocks are fed to |:exec| and must \nnot contain function definitions.\n\nNOTE: The \"parser\" is quite primitive. These tags have to start as \nsingle statement in a line at column 1, and they have to appear in the \nfollowing order:\n\n    \u003ctskel:msg\u003e                                     *\u003ctskel:msg\u003e*\n        Display an explanatory message after template expansion\n\n    \u003ctskel:before\u003e                                  *\u003ctskel:before\u003e*\n        Execute code before template expansion in the target buffer\n\n    \u003ctskel:after\u003e                                   *\u003ctskel:after\u003e*\n        Execute code after template expansion in the target buffer\n\n    \u003ctskel:here_before\u003e                             *\u003ctskel:here_before\u003e*\n        Execute code before template expansion in the template buffer\n\n    \u003ctskel:here_after\u003e                              *\u003ctskel:here_after\u003e*\n        Execute code after template expansion in the template buffer\n\n    \u003ctskel:abbrev\u003e                                  *\u003ctskel:abbrev\u003e*\n        Make the bit available via |:abbreviate| under the enclosed name.\n\n    \u003ctskel:menu\u003e                                    *\u003ctskel:menu\u003e*\n        Use this menu name instead of the default one.\n\n    \u003ctskel:condition\u003e                               *\u003ctskel:condition\u003e*\n        An expression that checks whether a bit is eligible in the \n        current context.\n\nBibTeX example: \u003e\n\n    \u003ctskel:msg\u003e\n        Insert a collection entry\n    \u003c/tskel:msg\u003e\n    \u003ctskel:before\u003e\n        let b:tskelArticleID = input(\"ID of bibentry: \")\n        if b:tskelArticleID == \"\" | let b:tskelArticleID = \"\u003c+CURSOR+\u003e\" | endif\n    \u003c/tskel:before\u003e\n    \u003ctskel:after\u003e\n        unlet b:tskelArticleID\n    \u003c/tskel:after\u003e\n    @INCOLLECTION{\u003c+b:tskelArticleID+\u003e,\n        author   = {\u003c+CURSOR+\u003e},\n        title    = {\u003c+ARTICLE TITLE+\u003e},\n        crossref = {\u003c+CROSSREF+\u003e},\n        pages    = {\u003c+PAGES+\u003e},\n        abstract = {[[~/Docs/Abstracts/\u003c+b:tskelArticleID+\u003e.txt]]},\n    }\n    \u003c++\u003e\n\nIn the above example, we query the user for an ID and insert this ID as \nentry key and as an abstract's file name.\n\nThe before/after blocks are evaluated in the destination buffer. The \nvariants here_before/here_after are evaluated in the scratch buffer for \nthe current code skeleton.\n\n                                                    *tskeleton-groups*\n                                                    *g:tskelBitGroup_{\u0026filetype}*\nGroups~\n\nSome filetype's bits might be of use for other filetypes too. You can \nmake them accessible by defining a g:tskelBitGroup_{\u0026filetype} variable. \nE.g., in php mode all html bits are made accessible by setting this \nvariable (the default): \u003e\n\n    let g:tskelBitGroup_php = ['php', 'html']\n\nBits of type \"general\" are always available.\n\n                                                    *tskeleton-context*\n                                                    *tskeleton-map*\nMaps -- Context-sensitive expansion~\n\nTo some extent, tskeleton is capable of offering the user only a small \nselection of eligible bits for a specific context if a map file \n($VIMFILES/skeletons/map/{\u0026filetype}) is provided. Such a map file is made up \nof regular expressions matching a specific context (before the cursor \nonly) and a blank-separated list of eligible bits. The regexp and the \nlist are separated by whitespace: \u003e\n\n    REGEXP  BIT1 BIT2 ... BITn\n\nExample: \u003e\n\n    \u003cform\\\\([^\u003e]\\\\|\\\\n\\\\)*\tname= action= method=\n\nIf an eligible bit is undefined, the name is inserted as is. I.e. you \ndon't have to define skeletons for all these options and argument names.\n\n\n                                                    *tskeleton-minibits*\nMinibits~\n\nMini bits are kept in the files:\n\n    - $CWD/.tskelmini\n    - $VIMFILES/skeletons/bits/{\u0026filetype}.txt\n\nThese files contain whitespace-separated pairs of bit names and their \nexpansions. These files are meant to keep expansions of accronyms and \nabbreviations and the like. Example: \u003e\n\n    IMHO    In my humble opinion\n    AFAIK   As far as I know\n\n                                                    *tskeleton-menu*\n                                                    *g:tskelMenuPrefix*\nMenu~\n\nIf g:tskelMenuPrefix is non-empty, tskeleton will display a menu \ncontaining all eligible bits for a certain filetype.\n\nThe menu can be hierarchical and certain entries may have shortcuts by \nproperly naming the bits. Example: \u003e\n\n    \u0026Environment.\u0026Quote\n    \u0026Environment.Q\u0026uotation\n\nThis will create the submenu \"Environment\" that can be selected by \ntyping \"e\" (on Windows) and two entries, the first of which can be \nselected by typing \"q\" and the second by typing \"u\".\n\nBe aware that the actual bit names are Quote and Quotation (i.e. the \nsubmenu and the ampersand are stripped off).\n\n\n-----------------------------------------------------------------------\n                                                    *tskeleton-utilities*\nUtilities~\n\n                                                    *tskeleton#IncreaseRevisionNumber()*\nThe function tskeleton#IncreaseRevisionNumber() provides a way to \nautomatically update a revision number in the form \u003e\n\n    @Revision: 1.0.393\n\nIn order to use this function, add something like this to your |vimrc| \nfile: \u003e\n\n    autocmd BufWritePre * call tskeleton#IncreaseRevisionNumber()\n\n                                                    *:TSkeletonCleanUpBibEntry*\nThe TSkeletonCleanUpBibEntry command can be used to purge the current bibtex \nentry from expendable fields (i.e., lines matching \u003c+.\\{-}+\u003e).\n\nFor bibtex files, this command is bound to: \u003cLeader\u003etc\n\n                                                    *TSkeletonMapGoToNextTag()*\n                                                    *tskeleton#GoToNextTag()*\nIf g:tskelMapGoToNextTag is true, the \u003cc-j\u003e map will be enabled. (That \nis the key that was also used by the imaps.vim plugin.) Press \u003cc-j\u003e to \njump between tags.\n\nThis function provides one or two extras over the version of imaps.vim. \nAn explanation:\n\n    - ###, +++, ???, !!! are used as markers too.\n    - If a marker is empty (e.g. \u003c++\u003e), the marker will be removed (as \n      imaps.vim does).\n    - If a marker matches \u003c+NAME/DEFAULT+\u003e, the marker will be replaced \n      with DEFAULT.\n    - If a snippet contains numbered placeholders (e.g. \u003c+1+\u003e), these \n      will be selected first in increasing number.\n\n\n\n\nDependencies:\n  tlib (\u003e= 1.10) :: http://github.com/tomtom/tlib_vim\n\nLicense: GPLv3 or later\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomtom%2Ftskeleton_vim","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomtom%2Ftskeleton_vim","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomtom%2Ftskeleton_vim/lists"}