从 vim 的命令行调用 hjkl 键
Calling hjkl keys from vim's command line
每当我浏览 vim 中的折叠代码并按下 l
键时,我希望它递归地打开该折叠。为此,我做了以下操作:nmap l lzO
。这工作正常,除了得到 E490: No fold found
每当我按下 l
而不是折叠时。我以此为借口学习了 Vimscript 并为此编写了一个函数并避免了错误。
现在,我遗漏了 如何从函数内部调用像 l
或 lzO
这样的 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
每当我浏览 vim 中的折叠代码并按下 l
键时,我希望它递归地打开该折叠。为此,我做了以下操作:nmap l lzO
。这工作正常,除了得到 E490: No fold found
每当我按下 l
而不是折叠时。我以此为借口学习了 Vimscript 并为此编写了一个函数并避免了错误。
现在,我遗漏了 如何从函数内部调用像 l
或 lzO
这样的 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