首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置每个缓冲区的选项,而不仅仅是每个窗口?

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

Stack Overflow用户
提问于 2014-06-25 04:15:10
回答 2查看 94关注 0票数 1

对于大多数语言,我都使用foldmethod=syntax。一个问题是,当进入插入模式时,它会对语法进行分析,如果引入任何括号/括号/等等,就会消除折叠的状态。

这里有一个解决办法

text

代码语言:javascript
复制
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选项设置为每个缓冲区,以便将其应用于所有窗口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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代码:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-06-25 04:19:41

使用setlocal而不是set使其特定于缓冲区。

代码语言:javascript
复制
setlocal foldmethod=syntax

看看:help setlocal

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24400085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档