Vim 在某些情况下更改映射行为,并在所有其他情况下重用功能

Vim 在某些情况下更改映射行为,并在所有其他情况下重用功能,vim,Vim,我试图在某些情况下更改“K”的行为,但在所有其他情况下保留其原始功能。这是我失败的尝试 function! GetDocumentation() if &filetype == 'java' JavaDocSearch else normal K endif endfunction nnoremap K :call GetDocumentation()<CR> 函数!GetDocumentation() if&fil

我试图在某些情况下更改“K”的行为,但在所有其他情况下保留其原始功能。这是我失败的尝试

function! GetDocumentation()
    if &filetype == 'java'
        JavaDocSearch
    else
        normal K
    endif
endfunction

nnoremap K :call GetDocumentation()<CR>
函数!GetDocumentation()
if&filetype=='java'
JavaDocSearch
其他的
正常钾
恩迪夫
端功能
nnoremap K:调用GetDocumentation()
然而,由于我在函数中使用了K,当它作为重新映射的结果被调用时,使用了K的新映射,我得到了无限递归。我想我可以将函数的要点放在
nnoremap
行中,但这看起来很尴尬,强制使用键的原始映射也不错

希望这有意义


谢谢。

使用
:正常的
命令,不使用
修改器,因为它在
函数将其参数作为正常模式命令执行,并将映射考虑在内
考虑这就是为什么要排队

        normal K
运行已覆盖默认处理程序的映射。所以,忽略 映射阴影命令,按如下所示更改行

        normal! K

:不带
的正常
命令修改器,因为它在 函数将其参数作为正常模式命令执行,并将映射考虑在内 考虑这就是为什么要排队

        normal K
运行已覆盖默认处理程序的映射。所以,忽略 映射阴影命令,按如下所示更改行

        normal! K

@ib.是对的:您应该使用
:normal这里。但函数是一个多余的功能:以下表达式映射就足够了:

nnoremap <expr> K ((&filetype is# "java")?(":JavaDocSearch\n"):("K"))
nnoremap K(&filetype为#“java”)?(“:JavaDocSearch\n”):(“K”))

由于
nore
的原因,此映射不会自动触发,而且还缩短了八行。

@ib。正确:您应该使用
:normal这里。但函数是一个多余的功能:以下表达式映射就足够了:

nnoremap <expr> K ((&filetype is# "java")?(":JavaDocSearch\n"):("K"))
nnoremap K(&filetype为#“java”)?(“:JavaDocSearch\n”):(“K”))

由于
nore
的原因,此映射不会自动触发,而且还缩短了八行。

太多不必要的括号破坏了表达式的美观。在这种情况下,所有这些都可以无缝删除:
:nnoremap K&ft是“java”吗?“:JavaDocSearch\n”:“K”
@ib。这些括号允许我用不同的语言编写程序,而不需要记住它们之间的运算符优先级差异。其主要思想是“有额外的括号不会有坏处,但没有括号会有坏处”。太多不必要的括号破坏了表达的美感。在这种情况下,所有这些都可以无缝删除:
:nnoremap K&ft是“java”吗?“:JavaDocSearch\n”:“K”
@ib。这些括号允许我用不同的语言编写程序,而不需要记住它们之间的运算符优先级差异。其主要思想是“有额外的括号不会有伤害,但没有括号会有伤害”。