" File: UltiSnips.vim " Author: Holger Rapp " 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_vim') || &cp || version < 700 finish endif " Define dummy version of function called by autocommand setup in " ftdetect/UltiSnips.vim. If the function isn't defined (probably due to " using a copy of vim without python support) it will cause an error anytime a " 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 = "" else if g:UltiSnipsUsePythonVersion == 2 let g:_uspy=":py " else let g:_uspy=":py3 " endif endif " Global Variables {{{ " 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 = "" endif " The trigger used to display all triggers that could possible " match in the current position. if !exists("g:UltiSnipsListSnippets") let g:UltiSnipsListSnippets = "" 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 = "" endif " The trigger to jump backward inside a snippet if !exists("g:UltiSnipsJumpBackwardTrigger") let g:UltiSnipsJumpBackwardTrigger = "" 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 " Should UltiSnips map JumpForwardTrigger and JumpBackwardTrigger only during " snippet expansion? if !exists("g:UltiSnipsClearJumpTrigger") let g:UltiSnipsClearJumpTrigger = 1 endif " }}} " Global Commands {{{ function! UltiSnipsEdit(...) if a:0 == 1 && a:1 != '' let type = a:1 else exec g:_uspy "vim.command(\"let type = '%s'\" % UltiSnips_Manager.primary_filetype)" endif exec g:_uspy "vim.command(\"let file = '%s'\" % UltiSnips_Manager.file_to_edit(vim.eval(\"type\")))" let mode = 'e' if exists('g:UltiSnipsEditSplit') if g:UltiSnipsEditSplit == 'vertical' let mode = 'vs' elseif g:UltiSnipsEditSplit == 'horizontal' let mode = 'sp' endif endif exe ':'.mode.' '.file endfunction " edit snippets, default of current file type or the specified type command! -nargs=? -complete=customlist,UltiSnipsFiletypeComplete UltiSnipsEdit \ :call UltiSnipsEdit() " Global Commands {{{ function! UltiSnipsAddFiletypes(filetypes) exec g:_uspy "UltiSnips_Manager.add_buffer_filetypes('" . a:filetypes . ".all')" return "" endfunction command! -nargs=1 UltiSnipsAddFiletypes :call UltiSnipsAddFiletypes() "" }}} " FUNCTIONS {{{ function! CompensateForPUM() """ 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 """ to explicitly check for the presence of the popup menu, and update """ the vim-state accordingly. if pumvisible() exec g:_uspy "UltiSnips_Manager.cursor_moved()" endif endfunction function! UltiSnips_ExpandSnippet() exec g:_uspy "UltiSnips_Manager.expand()" return "" endfunction function! UltiSnips_ExpandSnippetOrJump() call CompensateForPUM() exec g:_uspy "UltiSnips_Manager.expand_or_jump()" return "" endfunction function! UltiSnips_ListSnippets() exec g:_uspy "UltiSnips_Manager.list_snippets()" return "" endfunction function! UltiSnips_SnippetsInCurrentScope() let g:current_ulti_dict = {} exec g:_uspy "UltiSnips_Manager.list_snippets_dict()" return g:current_ulti_dict endfunction function! UltiSnips_SaveLastVisualSelection() exec g:_uspy "UltiSnips_Manager.save_last_visual_selection()" return "" endfunction function! UltiSnips_JumpBackwards() call CompensateForPUM() exec g:_uspy "UltiSnips_Manager.jump_backwards()" return "" endfunction function! UltiSnips_JumpForwards() call CompensateForPUM() exec g:_uspy "UltiSnips_Manager.jump_forwards()" return "" endfunction function! UltiSnips_FileTypeChanged() exec g:_uspy "UltiSnips_Manager.reset_buffer_filetypes()" exec g:_uspy "UltiSnips_Manager.add_buffer_filetypes('" . &ft . "')" return "" endfunction function! UltiSnips_AddSnippet(trigger, value, descr, options, ...) " Takes the same arguments as SnippetManager.add_snippet: " (trigger, value, descr, options, ft = "all", globals = None) 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 "descr = vim.eval(\"a:descr\")" exec g:_uspy "options = vim.eval(\"a:options\")" exec g:_uspy "UltiSnips_Manager.add_snippet(trigger, value, descr, options, *args)" return "" endfunction function! UltiSnips_Anon(value, ...) " Takes the same arguments as SnippetManager.expand_anon: " (value, trigger="", descr="", options="", globals = None) exec g:_uspy "args = vim.eval(\"a:000\")" exec g:_uspy "value = vim.eval(\"a:value\")" exec g:_uspy "UltiSnips_Manager.expand_anon(value, *args)" return "" endfunction function! UltiSnips_MapKeys() " Map the keys correctly if g:UltiSnipsExpandTrigger == g:UltiSnipsJumpForwardTrigger exec "inoremap " . g:UltiSnipsExpandTrigger . " =UltiSnips_ExpandSnippetOrJump()" exec "snoremap " . g:UltiSnipsExpandTrigger . " :call UltiSnips_ExpandSnippetOrJump()" else exec "inoremap " . g:UltiSnipsExpandTrigger . " =UltiSnips_ExpandSnippet()" exec "snoremap " . g:UltiSnipsExpandTrigger . " :call UltiSnips_ExpandSnippet()" if g:UltiSnipsClearJumpTrigger == 0 exec "inoremap " . g:UltiSnipsJumpForwardTrigger . " =UltiSnips_JumpForwards()" exec "snoremap " . g:UltiSnipsJumpForwardTrigger . " :call UltiSnips_JumpForwards()" endif endif exec 'xnoremap ' . g:UltiSnipsExpandTrigger. ' :call UltiSnips_SaveLastVisualSelection()gvs' if g:UltiSnipsClearJumpTrigger == 0 exec "inoremap " . g:UltiSnipsJumpBackwardTrigger . " =UltiSnips_JumpBackwards()" exec "snoremap " . g:UltiSnipsJumpBackwardTrigger . " :call UltiSnips_JumpBackwards()" endif exec "inoremap " . g:UltiSnipsListSnippets . " =UltiSnips_ListSnippets()" exec "snoremap " . g:UltiSnipsListSnippets . " :call UltiSnips_ListSnippets()" snoremap c snoremap c snoremap c endf function! UltiSnips_MapInnerKeys() if g:UltiSnipsExpandTrigger != g:UltiSnipsJumpForwardTrigger exec "inoremap " . g:UltiSnipsJumpForwardTrigger . " =UltiSnips_JumpForwards()" exec "snoremap " . g:UltiSnipsJumpForwardTrigger . " :call UltiSnips_JumpForwards()" endif exec "inoremap " . g:UltiSnipsJumpBackwardTrigger . " =UltiSnips_JumpBackwards()" exec "snoremap " . g:UltiSnipsJumpBackwardTrigger . " :call UltiSnips_JumpBackwards()" endf function! UltiSnips_RestoreInnerKeys() if g:UltiSnipsExpandTrigger != g:UltiSnipsJumpForwardTrigger exec "iunmap " . g:UltiSnipsJumpForwardTrigger exec "sunmap " . g:UltiSnipsJumpForwardTrigger endif exec "iunmap " . g:UltiSnipsJumpBackwardTrigger exec "sunmap " . g:UltiSnipsJumpBackwardTrigger endf function! UltiSnips_CursorMoved() exec g:_uspy "UltiSnips_Manager.cursor_moved()" endf function! UltiSnips_EnteredInsertMode() exec g:_uspy "UltiSnips_Manager.entered_insert_mode()" endf function! UltiSnips_LeavingBuffer() exec g:_uspy "UltiSnips_Manager.leaving_buffer()" endf function! UltiSnips_LeavingInsertMode() exec g:_uspy "UltiSnips_Manager.restore_unnamed_register()" endfunction " }}} " COMPLETE FUNCTIONS {{{ function! UltiSnipsFiletypeComplete(arglead, cmdline, cursorpos) let ret = {} let items = map( \ split(globpath(&runtimepath, 'syntax/*.vim'), '\n'), \ 'fnamemodify(v:val, ":t:r")' \ ) call insert(items, 'all') for item in items if !has_key(ret, item) && item =~ '^'.a:arglead let ret[item] = 1 endif endfor return sort(keys(ret)) endfunction " }}} "" STARTUP CODE {{{ " Expand our path exec g:_uspy "import vim, os, sys" exec g:_uspy "new_path = vim.eval('expand(\":h\")')" exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)" exec g:_uspy "sys.path.append(new_path)" exec g:_uspy "from UltiSnips import UltiSnips_Manager" exec g:_uspy "UltiSnips_Manager.expand_trigger = vim.eval('g:UltiSnipsExpandTrigger')" exec g:_uspy "UltiSnips_Manager.forward_trigger = vim.eval('g:UltiSnipsJumpForwardTrigger')" exec g:_uspy "UltiSnips_Manager.backward_trigger = vim.eval('g:UltiSnipsJumpBackwardTrigger')" au CursorMovedI * call UltiSnips_CursorMoved() au CursorMoved * call UltiSnips_CursorMoved() au BufLeave * call UltiSnips_LeavingBuffer() au InsertLeave * call UltiSnips_LeavingInsertMode() call UltiSnips_MapKeys() let did_UltiSnips_vim=1 " }}} " vim: ts=8 sts=4 sw=4