从 vim 的命令行调用 hjkl 键

Calling hjkl keys from vim's command line

每当我浏览 vim 中的折叠代码并按下 l 键时,我希望它递归地打开该折叠。为此,我做了以下操作:nmap l lzO。这工作正常,除了得到 E490: No fold found 每当我按下 l 而不是折叠时。我以此为借口学习了 Vimscript 并为此编写了一个函数并避免了错误。

现在,我遗漏了 如何从函数内部调用像 llzO 这样的 vim 命令?

function! OpenFoldOrNot()
    if foldclosed(line(".")) == -1
        echo "just l"
        l # TODO
    else
        echo "open fold"
        lzO # TODO
    endif
endfunction

nmap l :call OpenFoldOrNot()<CR>

尝试 normal 命令。对于这种情况,您将需要 normal! 来避免函数的递归执行。

您可以尝试以下操作,使用 normal 命令(我的 vimscript 很生锈):

function! OpenFoldOrNot()
    if foldclosed(line(".")) == -1
        normal! l
    else
        normal! lzO
    endif
endfunction

nmap l :call OpenFoldOrNot()<CR>

或者,您可以使用映射表达式来简化此类工作。

nnoremap <expr> l foldclosed(line(".")) == -1 ? 'l' : 'lzO'

在映射表达式中,映射的右侧 {rhs} 是 VimScript 表达式。对其进行评估以获得要执行的内容。在您的情况下,它用于确定映射调用 l 还是 lz0.

如需更多帮助,请参阅:

:h :map-expression