如何更改Vim插入模式映射行为?

时间:2011-06-17 19:47:49

标签: vim

我在脚本中插入了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会在其他情况下起作用。

2 个答案:

答案 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")  
    

    但我很抱歉,这里也有“吃饭配对”。