我在脚本中插入了date<Tab>
模式,以YYYY-MM-DD
格式插入当前日期。
inoremap <script> <silent> <buffer> date<Tab> <C-R>=strftime("%Y-%m-%d")<CR>
当我开始在插入模式下键入模式时,只有当我按 Tab 时,才会显示完整模式而不是显示完整模式,而不是显示完整模式,Vim只显示输入的最后一个字符,它很漂亮当我不想使用它时很烦人。例如,如果我输入'date',这就是Vim显示的内容('|
'是光标表示):
|d
|a
|t
data|
另外,我已经安装了Snipmate vim插件,该插件使用 Tab 键来代替代码模板的片段,当我输入一个片段时,它的行为与我之前描述的不同。 Snipmate的作用是仅映射 Tab 键,当按下该键时,它会获取前一个单词并检查它是否与其中一个片段匹配。
那就是说,我会留下两个问题,其中一个问题的答案解决了我的问题:
有没有办法配置Vim,在将其更改为映射之前不显示完整模式?
我可以使用相同的映射使用两个插件吗?就像我也映射 Tab 键一样,每当光标前的单词是'date'时,我的插件就会起作用,而Snipmate会在其他情况下起作用。
答案 0 :(得分:2)
第一个答案是否定的。
其次也不是,但可以模仿:
通用方式如下(需要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>
,因此它不会干扰snipmate映射。上面的代码使用与IMAP插件相同的方法:当按下{lhs}的最后一个键时,检查以前的键是否在缓冲区中。如果他们删除它们并插入{rhs}。因此,无论速度有多慢,您都可以输入date<Tab>
。
注2:这是通用方式。您只需查看<Tab>
{rhs}即可删除frawor依赖项和大部分代码:
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>
答案 1 :(得分:0)
据我所知,似乎没有这样的设置来“关闭”“搜索地图”状态,如果它是键盘映射匹配中某些地图的一部分,vim会吃掉你输入的所有字符。
Vim只能将一个键绑定到一个特定的动作,所以没有办法让一个键做你想做的两件事。另一方面,您可以配置“snipmate”以使用其他键来执行“展开”操作。当你遇到关键的冲突问题时,这应该是一种通常的方式。或者,您可以使用“abbreviate”来执行某些操作:
:abbreviate <expr> :date: strftime("%Y-%m-%d")
但我很抱歉,这里也有“吃饭配对”。