对于大多数语言,我都使用foldmethod=syntax。一个问题是,当进入插入模式时,它会对语法进行分析,如果引入任何括号/括号/等等,就会消除折叠的状态。
这里有一个解决办法
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自组端
但是,如果在另一个窗口中打开相同的文件,它将不会更改该窗口的foldmethod。从而打破褶皱,仍然是缓慢的。
我怎么才能解决这个问题?我是否可以将foldmethod选项设置为每个缓冲区,以便将其应用于所有窗口?
发布于 2014-06-25 07:28:55
'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发布于 2014-06-25 04:19:41
使用setlocal而不是set使其特定于缓冲区。
setlocal foldmethod=syntax看看:help setlocal
https://stackoverflow.com/questions/24400085
复制相似问题