如何为每个缓冲区设置一个选项,而不仅仅是每个窗口?

时间:2014-06-25 04:15:11

标签: vim

我对大多数语言使用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选项,以便它适用于所有窗口吗?

2 个答案:

答案 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
相关问题