2013-10-21 121 views
1

今天,我将Vim从7.3升级到7.4。但是,下面的函数CleverTab()似乎不起作用。 (我不知道如果这件事是更新。)该功能无法正常工作

function! CleverTab() 
    if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' 
     return "\<Tab>" 
    endif 
    if pumvisible() 
     return "\<C-N>" 
    endif 
    return "hello" 
endfunction 

inoremap <silent><tab> <C-R>=CleverTab()<CR> 

该功能的目的是根据当标签按目前的情况做不同的事情:

  1. 如果当前行充满空间,然后只需添加一个选项卡。
  2. 如果出现弹出式菜单,请向下移动。
  3. 否则,添加字符串“hello”。

(说实话,我要在方案3中做的是调用另一个函数,但是,不管 - 。使问题容易了,我只是想证明在这种情况下字符串)

假设我通过Vim编辑我的文件并输入了字符串“123”(例如)。目前,当我按标签时,实际结果是添加了<tab>。预期的结果是流程应该符合条件3并添加字符串“hello”。我今天下午花了它。

那么,谁能帮我弄明白吗?不胜感激!

+1

测试了你的函数和映射,“hello”打印在我的vim 7.4上。顺便说一句,你可以创建一个''地图而不是' =',这是专为这种情况而设计的。 – Kent

+0

感谢您的回复。但它仍然适用于我。所以你可以请帮助让我知道是否有什么封锁我的函数CloverTab()? – kevin

+0

抱歉错字错误。它仍然不起作用! – kevin

回答

2

您的CleverTab()功能是全球范围内的。如果另一个插件定义了相同的函数,则前者将被覆盖。为避免这种冲突,应避免全局功能。而是使用脚本本地功能s:CleverTab(),通过<SID>CleverTab()的映射或自动装入功能myplugin#CleverTab()来调用。

如果问题是另一个插件重写<Tab>映射,则必须选择另一个映射键,或者为其中一个选择另一个。只有当你的函数是原文的扩展(并提供兼容的返回类型)时,你可以从你的内部调用另一个函数(假设你使用了不同的函数名称,如我的第一段所述)。