Vim:关闭特定行的折叠

时间:2017-10-17 17:06:19

标签: vim

我想以编程方式关闭vim中的折叠,具体取决于它是否与正则表达式匹配。我已经在我的vimrc中定义了一个函数来执行此操作:

" Support python 2 and 3 
if has('python')
    command! -nargs=1 Python2or3 python <args>
elseif has('python3')
    command! -nargs=1 Python2or3 python3 <args>
else
    echo "Error: Requires Vim compiled with +python or +python3"
    finish
endif

" Define function
func! FoldCopyrightHeader()
Python2or3 << EOF
import re
import vim
# Look at the first 30 lines
header = '\n'.join(vim.current.buffer[0:30])
pattern = 'Copyright .* by .* THE POSSIBILITY OF SUCH DAMAGE'
match = re.search(pattern, header, flags=re.MULTILINE | re.DOTALL)
if match:
    # Find the line number of the block to fold 
    lineno = header[:match.start()].count('\n') 
    # Remember the current position
    row, col = vim.current.window.cursor
    # move cursor to the fold block
    vim.command('cal cursor({},{})'.format(lineno, 0))
    # close the fold
    vim.command('call feedkeys("zc")')  
    # move back to the original position
    vim.command('cal cursor({},{})'.format(row, col))
EOF
endfunc

想法是搜索模式(如果存在),然后移动到模式所在的位置,输入关键命令zc以关闭折叠,然后移回原始位置。

然而,这并不是很有效。如果我通过:call FoldCopyrightHeader()调用此函数,则它会关闭光标当前所在的任何折叠,并且不执行任何其他操作。

我的猜测是feedkeys命令是异步vim.command('call feedkeys("zc")'),并且在移动光标命令执行之前/之后发生。

我能做些什么来阻止这种情况吗?

1 个答案:

答案 0 :(得分:1)

我在输入问题时解决了这个问题。

使用vim.command(':foldclose')代替vim.command('call feedkeys("zc")')似乎可以解决问题。