*XPTemplate* For Vim version 7.2. Last change: 2009 Nov 08 *xptemplate* *xpt* XP's Snippet Template engine by drdr.xp drdr.xp@gmail.com XPTemplate is a snippet rendering engine. |xpt-install| |xpt-usage| |xpt-personal-var| |xpt-feature| |xpt-option| |xpt-key-bind| |xpt-tips| |xpt-with-supertab| |xpt-customize| |xpt-write-snippet| |xpt-snippet-syntax| |xpt-snippet-tutorial| |xpt-api| *xpt-install* Copy files and directories into one of your 'runtimepath's. *xpt-usage* To see what snippets have been defined for the current filetype, press in insert mode. See |xpt-key-pum|. In insert mode type the snippet name and press to insert a snippet. Use to navigate through the snippet template. For example when editing a C file: > for < generates: > for ( i = 0; i < len; ++i ) { /* cursor */ } < The first "i" being selected is the current item you are editing. "0" is the next item and you can navigate to it by pressing . To change the snippet trigger () see |xpt-key-trigger|, to change the navigate key () see |xpt-key-navigate|. NOTE with some European keyboards does NOT work. In this case you need to specify another key to trigger snippets. Now type "abc", this results in: > ////````````````````````````| edit area //// //// ////`````````````````| lively updated //// //// ////`````' for ( abc = 0; abc < len; ++abc ) { /* cursor */ } < Now press , the cursor jumps to "0", the next item: > //```````````````````````| focus here for ( abc = 0; abc < len; ++abc ) { /* cursor */ } < After pressing twice the snippet ends up with cursor staying at line 2, column 8 (or the value of 'softtabstop'): > for ( abc = 0; abc < len; ++abc ) { } \\___________________________| cursor stays here < The usage is described in more detail below. For more information regarding the syntax of snippets see |xpt-snippet-syntax|. To customize settings see |xpt-option|. *xpt-feature* Live typing update Navigate forward and backward |xpt-key-navigate| Popup hint |xpt-popup| |xpt-snippet-hint| Ordered place holders |xpt-snippet-ComeFirst| Embedded functions and variables |xpt-snippet-function| Repeatable snippet generation |xpt-repetition| Nested snippets |xpt-nested| Wrapper snippets |xpt-wrapper-snippet| Inclusion on snippet level or file level|xpt-snippet-include| |xpt-snippet-XPTinclude| Template priority |xpt-snippet-priority| Named item or anonymous item |xpt-snippet-item| Default value |xpt-snippet-default-value| Preset value |xpt-snippet-preset-value| Snippet Bundle/Library Support |xpt-bundle| and more... *xpt-name-matching* See |xpt-snippet-name-matching-rule|. *xpt-popup* If you type nothing or an incomplete snippet key and press , a popup menu shows up listing all possible snippet keys. For example: > fo < Shows: > for forever fornn forr < After selecting the item from the popup menu, press again to trigger the snippet. *xpt-nested* Templates can be expanded inside another template. There is no difference between using a nested template or a top-level template. For example, when you edit a C file type switch to generate a switch block template: > switch (fn) { case 0 : <-------------- cursor stops here after two s break; ... default: } < Now the cursor stops between "case 0 :" and "break;", type: > if < It becomes: > switch (fn) { | upper level snippet case 0 : | if () { . nested snippet . } . break; | upper level snippet ... | default: | | } | < Type , .. to navigate out of the nested snippet: > switch (fn) { case 0 : if () { } break; default: <--------------cursor stops here } < Now cursor stops after "default:" and we get out back to the "switch" snippet. ============================================================================== *`...^* *xpt-...* *xpt-repetition* Some segments can be defined as repeatable, for example the "case"s in "switch". Specifying the repetition part is easy, just wrap the part you want it to repeat with `...n^. n is a number and can be omitted if only one repetition part is used. Take the case from "switch": > XPT switch switch (`^) { `...^ | repetition part case `^0^ : | `^ | break; | `...^ | default: `^ } < When you trigger a repetition template it works as below: > switch () { <------- cursor stays here `...^ default: `^ } < Press , the |`...^| is selected. Press again to expand the repetition part. Or press |xpt-key-clear| to cancel the repetition part. These 4 lines are expanded: > switch () { case `^ : | expanded `^ | break; | `...^ | default: `^ } < Enter the repetition part. You may have noticed there is another |`...^|, that is the another repeat trigger. Press 3 times: > switch () { case 0 : break; case `^ : | selected repetition part `^ | break; | `...^ | default: `^ } < See also |xpt-snippet-repetition|. *xpt-wrapper-snippet* Wrapper snippets can be triggered in visual mode, place holder marked as "wrap" is replaced with the text selected in visual mode. Definition of wrapper snippet has no differences from normal snippet except it declaring a place holder as wrapping holder. For example: > ________/---------------------| wrapper declaration XPT if wrap=job if (`condition^){ `job^ } < For example the following snippet: > XPT call_ wrap=wrapped `name^(`wrapped^`, `^)`cursor^ < Use command |V| to select some text and press . The selected text is yanked and popup menu shows. For example we have one line of text as below: > a, b < Select this line with command |V|. And then press , choose "call_" in the popup menu. And finally it results in : > name(a, b) < NOTE Wrapper snippet declared with "wraponly" can only be triggered in visual mode, not in insert mode *xpt-context* You can define snippets that can only be triggered in certain circumstances, for example in certain syntax items. Defining context depended snippets is done by adding another parameter to the XPTemplate call "{'syn' : 'the context name'}" : > XPT para syn=comment @param {`Object^} `name^ `desc^ < Now the snippet "para" can be only triggered in syntax items named "comment". ============================================================================== *xpt-key-bind* Options can be set in |.vimrc| to modify XPTemplate's behaviors. Key mappings: |XPTrawKey| |g:xptemplate_key| |g:xptemplate_key_pum_only| |g:xptemplate_key_force_pum| |g:xptemplate_key_visual| |g:xptemplate_nav_next| |g:xptemplate_nav_prev| |g:xptemplate_nav_cancel| |g:xptemplate_goback| |g:xptemplate_to_right| |g:xptemplate_fallback| See also: |xpt-option|. *XPTrawKey* Key mapping defined as: > exe "inoremap XPTrawKey " g:xptemplate_key < *i_* *v_* *xpt-key-trigger* *g:xptemplate_key* {default:} The key to trigger snippets in insert mode. Use |g:xptemplate_key| to change this mapping. Example: > let g:xptemplate_key = '' < NOTE: You can set this key to , as most users do, for convenience. In this case pressing twice results in a normal if there is no snippet key matched. *i_* *xpt-key-pum* *g:xptemplate_key_pum_only* {default:g:xptemplate_key} Show pop up menu at cursor position. Example: > let g:xptemplate_key_pum_only = '' < By default, this key map is set to '' concatenated with |g:xptemplate_key| : ''. *g:xptemplate_key_force_pum* {default:g:xptemplate_key} Behave like that with |g:xptemplate_always_show_pum| set. If more than one snippet starts with( or exactly equals to ) the text before cursor, pop up menu shows. This key triggers snippet only when there is only one snippet of name starts with the text before cursor. See also: |g:xptemplate_always_show_pum|. *s_* *xpt-key-visual* *g:xptemplate_visual {default:g:xptemplate_key} The key to trigger snippets in visual mode. Use |g:xptemplate_key_visual| to change this mapping. Example: > let g:xptemplate_key_visual = '' < *i_* *s_* *xpt-key-navigate* *g:xptemplate_nav_next* {default:} After a snippet was triggered, this key navigates to the next item. Use |g:xptemplate_nav_next| to change this mapping. Example: > let g:xptemplate_nav_next = '' < *i_* *s_* *g:xptemplate_nav_prev* {default:} After a snippet was triggered, press this key to navigate back to the previous item. Use |g:xptemplate_nav_prev| to change this mapping. Example: > let g:xptemplate_nav_prev = '' < *s_* *xpt-key-clear* *g:xptemplate_nav_cancel* {default:} Press to clear current place holder and jump to next. Use |g:xptemplate_nav_cancel| to change this mapping. Example: > let g:xptemplate_nav_cancel = '' < *s_* *xpt-key-goto-right* *g:xptemplate_to_right* {default:} When a place holder is initially selected jump to the end of current place holder and go into insert mode. Use |g:xptemplate_to_right| to change this mapping. Example: > let g:xptemplate_to_right = '' < *g:xptemplate_fallback* {default:XPTrawKey} If a try to trigger snippet( by pressing |g:xptemplate_key| ) does not produce any match( full or partial ), contents of this setting is output instead. NOTE: Contents output is similar to user typing. And they CAN be remapped. This may produce a invoke loop. The default value of this setting is the literal text of |g:xptemplate_key|, which is defined by |XPTrawKey|. For example, if you want a completion-popup menu to show when no snippet matched, you can have this line added into your |.vimrc|: > let g:xptemplate_fallback = '' < *n_* *i_* *xpt-key-goback* *g:xptemplate_goback* {default:} When you move the cursor outside of place holder you are editing, pressing this key (in insert mode or normal mode) moves cursor back to current place holder and selects the place holder text in select mode. Use |g:xptemplate_goback| to change this mapping. Example: > let g:xptemplate_goback = '' < *xpt-customize-highlight* You can specify which highlight Group to use for each kind of highlight. *XPTcurrentPH* {default:DiffChange} The highlight group of place holder you are editing. Example: > highlight link XPTcurrentPH Visual < This statement tells XPTemplate to use the highlight group "Visual" to highlight "current" items. See |g:xptemplate_highlight|. You can also define your highlight group directly. Example: > highlight XPTcurrentPH gui=none guibg=blue < *XPTfollowingPH* {default:CursorLine} The highlight group of slave place holders you are editing. Like |XPTcurrentPH|. *XPTnextItem* {default:IncSearch} The highlight group of item you are going to edit. Like |XPTcurrentPH|. *xpt-bundle* A bundle is a collection of snippets for a certain purpose. For example a library support bundle like "ftplugin/javascript/jquery.xpt.vim". XPTemplate supplies two ways to load bundles: |g:xptemplate_bundle| and |g:XPTaddBundle()|. ============================================================================== *xpt-tips* Want to use XPTemplate with ... together? |xpt-with-supertab| *xpt-with-supertab* If you want to use supertab's but you have also set XPT to use . ============================================================================== *xpt-customize* Global customization can be done with |xpt-option|. Two options relate to personal settings: |g:xptemplate_vars| This is a easy way to set up your personal information like your name and email address. This option actually sets up two variables "$author" and "$email". See |xpt-snippet-variable| |g:xptemplate_bundle| This option sets up which library you want to load. *xpt-customize-variable* |xpt-snippet-variable| are used to configure the snippet format. Customization variables should be defined in a snippet file( like a file in |xpt-personal-folder|) with "personal" priority, to guarantee it will not be overrided by other snippet with lower priority. See |xpt-priority-value|. To create a snippet file to define your variables, see |xpt-write-lang-snippet|. See also: |xpt-customize-variable-format| |xpt-customize-variable-space| |xpt-customize-variable-datetime| *xpt-customize-variable-format* Each snippet has some variable defined to configure language format. This is useful when some snippet are shared between languages, like for loops in C and CPP or to accommodate different user preferences. Brackets style variables may be defined as below: > " if () ** { " else ** { XPTvar $BRif ' ' " } ** else { XPTvar $BRel \n " for () ** { " while () ** { " do ** { XPTvar $BRloop ' ' " struct name ** { XPTvar $BRstc ' ' " int fun() ** { " class name ** { XPTvar $BRfun ' ' < The "**" in comment marks where this variable should be used. For example following is "for" snippet for both C and CPP: > XPT for hint=for\ (..;..;++) for (`i^ = `0^; `i^ < `len^; ++`i^)`$BRloop^{ `cursor^ ****************** } < In C language "$BRloop" is set to ' '. In CPP "$BRloop" is set to "\n". You can find them in "ftplugin/c/c.xpt.vim" and "ftplugin/cpp/cpp.xpt.vim". In C this snippet results in: > for ( i = 0; i < 10; ++i ) { } < In CPP this snippet results in: > for ( i = 0; i < 10; ++i ) { } < *xpt-customize-variable-space* Another set of variables is defined to customize spaces. They are: > " int fun ** ( " class name ** ( XPTvar $SPfun '' " int fun( ** arg ** ) " if ( ** condition ** ) " for ( ** statement ** ) " [ ** a, b ** ] " { ** 'k' : 'v' ** } XPTvar $SParg ' ' " if ** ( " while ** ( " for ** ( XPTvar $SPcmd ' ' " a = a ** + ** 1 " (a, ** b, ** ) " a ** = ** b XPTvar $SPop ' ' < For example function snippet defined as below: > XPT fun int fun(`$SParg^`args^`$SParg^) < If "$SParg" is set to ' ', snippet results in: > int fun( args ) < If "$SParg" is set to '', snippet results in: > int fun(args) < *xpt-customize-variable-datetime* Variables discussed in this section defines how "date" and "time" snippet displayed. "$DATE_FMT" defines "date" snippet format. Default format is: > XPTvar $DATE_FMT '%Y %b %d' < "$TIME_FMT" defines "time snippet format. Default format is: > XPTvar $TIME_FMT '"%H:%M:%S"' < "$DATETIME_FMT" defines "datetime()" function format. Default format is: > XPTvar $DATETIME_FMT '%c' < "datetime()" has no default snippet using it. *xpt-personal-folder* *xpt-write-snippet* Snippet file is actually |ftplugin| and with file extension ".xpt.vim", like "c.xpt.vim". So you can manage snippet files just like the way you manage |ftplugin|. You have THREE place to put your own snippets: Path_to_xpt/personal Recommended. Enough for most users. What you need to do is putting snippet files into this folder. Folders in |g:xptemplate_snippet_folders| Deprecated, use 'runtimepath'. Other 'runtimepath' Need to manage 'runtimepath' yourself. Details are discussed in following section. *xpt-write-lang-snippet* You can add snippets of new language, or add snippets to currently supplied languages, in the same way. Create a new file in some |ftplugin| directory. For example, if you want to add some PHP snippet, you can create file: > path_to_xpt/personal/ftplugin/php/your_snippets.xpt.vim < Or: > &runtimepath/ftplugin/php/your_snippets.xpt.vim < &runtimepath can be ~/.vim in Unix like system, or ~/vimfiles/ folder in Windows. See 'runtimepath'. NOTE It is strongly recommended to add your own snippets in "path_to_xpt/personal". The file name "your_snippets.xpt.vim" has no limitation except it must end with ".xpt.vim". And then write your snippets in that file. Restart Vim to load them. See |xpt-snippet-syntax| and |xpt-snippet-tutorial|. *xpt-write-common-snippet* If you want to add some snippets which don't belong to any language, or you want to set multiple variables, you can use the "personal common" snippet file. 1. Rename "personal/ftplugin/_common/personal_example.xpt.vim" to "personal/ftplugin/_common/personal.xpt.vim". Or create one from scratch. 2. Add your snippets into the "personal.xpt.vim". "personal.xpt.vim" is loaded by _common/common.xpt.vim and has the highest priority. Thus it's always loaded and there are no other snippets overriding yours. Example personal/ftplugin/_common/personal.xpt.vim : > XPTemplate priority=personal XPTvar $author your_name XPTvar $email your_email XPT yoursnippet " tips here bla bla < See |xpt-snippet-syntax| and |xpt-snippet-tutorial|. ============================================================================== " vim:tw=78:ts=8:sw=8:sts=8:noet:ft=help:norl: