let s:variables = {} " " vsnip#variable#register " function! vsnip#variable#register(name, func, ...) abort let l:option = get(a:000, 0, {}) let s:variables[a:name] = { \ 'func': a:func, \ 'once': get(l:option, 'once', v:false) \ } endfunction " " vsnip#variable#get " function! vsnip#variable#get(name) abort return get(s:variables, a:name, v:null) endfunction " " Register built-in variables. " " @see https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables " function! s:TM_SELECTED_TEXT(context) abort let l:selected_text = vsnip#selected_text() if empty(l:selected_text) return v:null endif return vsnip#indent#trim_base_indent(l:selected_text) endfunction call vsnip#variable#register('TM_SELECTED_TEXT', function('s:TM_SELECTED_TEXT')) function! s:TM_CURRENT_LINE(context) abort return getline('.') endfunction call vsnip#variable#register('TM_CURRENT_LINE', function('s:TM_CURRENT_LINE')) function! s:TM_CURRENT_WORD(context) abort return v:null endfunction call vsnip#variable#register('TM_CURRENT_WORD', function('s:TM_CURRENT_WORD')) function! s:TM_LINE_INDEX(context) abort return line('.') - 1 endfunction call vsnip#variable#register('TM_LINE_INDEX', function('s:TM_LINE_INDEX')) function! s:TM_LINE_NUMBER(context) abort return line('.') endfunction call vsnip#variable#register('TM_LINE_NUMBER', function('s:TM_LINE_NUMBER')) function! s:TM_FILENAME(context) abort return expand('%:p:t') endfunction call vsnip#variable#register('TM_FILENAME', function('s:TM_FILENAME')) function! s:TM_FILENAME_BASE(context) abort return substitute(expand('%:p:t'), '^\@ 1 ? l:chars[1] : l:chars[0] return trim(l:comment) endfunction call vsnip#variable#register('BLOCK_COMMENT_END', function('s:BLOCK_COMMENT_END')) function! s:LINE_COMMENT(context) abort let l:chars = split(&commentstring, '%s') let l:comment = &commentstring =~# '^/\*' ? '//' : substitute(&commentstring, '%s', '', 'g') return trim(l:comment) endfunction call vsnip#variable#register('LINE_COMMENT', function('s:LINE_COMMENT')) function! s:VIM(context) abort let l:script = join(map(copy(a:context.node.children), 'v:val.text()'), '') try return eval(l:script) catch /.*/ endtry return v:null endfunction call vsnip#variable#register('VIM', function('s:VIM')) function! s:VSNIP_CAMELCASE_FILENAME(context) abort let l:basename = substitute(expand('%:p:t'), '^\@