我对大多数语言使用foldmethod=syntax
。一个问题是,当进入插入模式时,它会重新解析语法,如果引入了任何打开的括号/括号/等,它将摆脱折叠状态。
这里有一个解决方案
http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text
augroup folding
autocmd!
autocmd InsertEnter *
\ if !exists('w:last_fdm') |
\ let w:last_fdm=&foldmethod |
\ setlocal foldmethod=manual |
\ endif
autocmd InsertLeave,WinLeave *
\ if exists('w:last_fdm') |
\ let &l:foldmethod=w:last_fdm |
\ unlet w:last_fdm |
\ endif
augroup END
但是如果我在另一个窗口中打开了相同的文件,它将不会更改该窗口的foldmethod
。因此打破折叠,仍然很慢。
我该如何解决这个问题?我可以为每个缓冲区设置foldmethod
选项,以便它适用于所有窗口吗?
答案 0 :(得分:1)
使用setlocal
代替set
来使缓冲区具体化。
setlocal foldmethod=syntax
查看:help setlocal
答案 1 :(得分:1)
'foldmethod'
选项是按窗口进行的,无法更改。问题是您的autocmd仅修改当前窗口的选项值,但您希望为所有窗口完成该处理。这可以做到,虽然它涉及的更多。
for winNr in range(1, winnr('$'))
let w:last_fdm
。:call setwinvar()
:setlocal
可以替换为:call setwinvar()
,使用特殊的&foldmethod
表示法作为窗口本地选项。vim代码:
function! s:InsertEnter()
for n in range(1, winnr('$'))
:call setwinvar(n, "last_fdm", getwinvar(n, "&foldmethod"))
:call setwinvar(n, "&foldmethod", "manual")
endfor
endfunction
function! s:InsertLeave()
if exists('w:last_fdm')
for n in range(1, winnr('$'))
:call setwinvar(n, "&foldmethod", getwinvar(n, "last_fdm"))
endfor
unlet w:last_fdm
endif
endfunction
augroup folding
autocmd!
autocmd InsertEnter * :call <SID>InsertEnter()
autocmd InsertLeave,WinLeave * :call <SID>InsertLeave()
augroup END