Первый ответ - нет.
Второй тоже нет, но его можно эмулировать:
Общий способ следующий (требуется frawor ):
" plugin/tab.vim
execute frawor#Setup('0.0', {'@/mappings': '0.0'})
" Make sure that mappings were set up
runtime! after/plugin/snipMate.vim
" Get information about already existing mapping
" (it was defined by snipmate)
let s:snipmap=s:_r.map.maparg('<Tab>', 'i', 0)
" Create a new mapping with unique lhs
let s:snipmap.lhs='<SNR>'.s:_sid.'_OldSnipMap'
call s:_r.map.map(s:snipmap)
function s:F.insdate()
if getline('.')[:(col('.')-1)][-4:] is# 'date'
return repeat("\<BS>", 4).strftime("%Y-%m-%d")
else
" Here is the magic: I have a choice to either use remappable mapping
" or <C-\><C-o>:call feedkeys()<CR> workaround for nore mapping
return "\<C-\>\<C-o>:call feedkeys(\"\\<SNR>".s:_sid."_OldSnipMap\")\n"
endif
endfunction
call s:_f.mapgroup.add('Tab', {'tab': {'lhs': '<Tab>', 'rhs': s:F.insdate, 'mode': 'i'}})
Обратите внимание, что в вашем примере вы не отображаете <Tab>
, вы отображаете date<Tab>
, поэтому он не мешает отображению фрагмента кода.Приведенный выше код использует тот же подход, что и плагин IMAP: когда последняя клавиша {lhs} нажата, проверьте, есть ли предыдущие клавиши в буфере.Если они удалены, вставьте вместо них {rhs}.Таким образом, вы можете набрать date<Tab>
независимо от того, насколько медленно он будет работать.
Примечание 2: это общий способ.Вы можете отбросить зависимости и большую часть кода, просто взглянув на <Tab>
{rhs}:
function s:Insdate()
if getline('.')[:(col('.')-1)][-4:] is# 'date'
return repeat("\<BS>", 4).strftime("%Y-%m-%d")
else
return "\<C-g>u\<C-r>=TriggerSnippet()\n"
endif
endfunction
inoremap <Tab> <C-r>=<SID>Insdate()<CR>