在vimscript中,使用当前单词作为if语句中的参数

在vimscript中,使用当前单词作为if语句中的参数,vim,Vim,我想做这样的事情 if exists(expand('<cword>')) inoremap ( (<esc>g_i)<left> else inoremap ( ()<left> endif 如果存在(展开(“”)) inoremap((g_i) 其他的 inoremap() 恩迪夫 这背后的逻辑是,如果我的游标下面有什么东西,用括号括起来,否则就创建一个闭括号 if当前无法识别光标下的元素 有解决方案吗?要使映射在调用时对当前条件作

我想做这样的事情

if exists(expand('<cword>'))
  inoremap ( (<esc>g_i)<left>
else
  inoremap ( ()<left>
endif
如果存在(展开(“”))
inoremap((g_i)
其他的
inoremap()
恩迪夫
这背后的逻辑是,如果我的游标下面有什么东西,用括号括起来,否则就创建一个闭括号

if当前无法识别光标下的元素


有解决方案吗?

要使映射在调用时对当前条件作出反应,您不能重新定义映射本身。相反,您必须使映射的右侧对条件作出反应。使用
:help:map expr
最容易做到这一点,如下所示:

:inoremap <expr> ( (empty(expand('<cword>')) ? '()<Left>' : '(<Esc>g_i)<Left>')
:inoremap((空(展开(“”))?“()”:“(g_i)”

请注意,我刚刚翻译了您的示例,我没有检查它是否有意义或是否按预期工作。

我认为这是由内而外的。而不是几行(可能是函数的一部分)有条件地定义一个
:inoremap
,您不想要一个调用具有条件代码的函数的
:inoremap
吗?在尝试编写完整函数之前,以交互方式检查:
:echo expand(“”)
:exists(expand(“”))
等等。我认为第一个会做你想做的,而不是第二个。也许你想要
strlen()
而不是
exists()
。这非常有用strlen()正是我需要的。