每当我在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>
答案 0 :(得分:3)
尝试normal
命令。对于这种情况,您将需要normal!
以避免递归执行您的函数。
答案 1 :(得分:3)
您可以使用normal命令尝试以下操作(我的vimscript非常生锈):
function! OpenFoldOrNot()
if foldclosed(line(".")) == -1
normal! l
else
normal! lzO
endif
endfunction
nmap l :call OpenFoldOrNot()<CR>
答案 2 :(得分:2)
或者,您可以使用map-expression来简化此类工作。
nnoremap <expr> l foldclosed(line(".")) == -1 ? 'l' : 'lzO'
在地图表达式中,映射的右侧{rhs}
是VimScript表达式。评估它以获得要执行的内容。在您的情况下,它用于确定映射是否调用l
或lz0
。
如需更多帮助,请参阅:
:h :map-expression