Как я могу установить параметр для каждого буфера, а не только для окна?

Я использую 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

автогруппа КОНЕЦ

Но если тот же файл открыт в другом окне, он не изменит foldmethod этого окна. И, таким образом, разбить складки, и все же быть медленным.

Как я могу это исправить? Могу ли я вместо этого установить параметр foldmethod для каждого буфера, чтобы он применялся ко всем окнам?


vim
person fent    schedule 25.06.2014    source источник
comment
Могу ли я предложить более надежный, последовательный и менее затратный в вычислительном отношении метод indent?   -  person romainl    schedule 25.06.2014


Ответы (2)


Параметр 'foldmethod' предназначен для каждого окна и не может быть изменен. Проблема в том, что ваша автокоманда изменяет только значения параметров текущего окна, но вы хотите, чтобы эта обработка выполнялась для всех окон. Это можно сделать, хотя это более сложно.

  • Перебрать все окна: for winNr in range(1, winnr('$'))
  • Вместо let w:last_fdm используйте :call setwinvar().
  • Точно так же :setlocal можно заменить на :call setwinvar(), используя специальную нотацию &foldmethod для локальной опции окна.

ВИМ-код:

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
person Ingo Karkat    schedule 25.06.2014

Используйте setlocal вместо set, чтобы сделать его специфичным для буфера.

setlocal foldmethod=syntax

Взгляните на :help setlocal

person FDinoff    schedule 25.06.2014
comment
это то, что я использую. Я обновил вопрос кодом, который я использую по ссылке. - person fent; 25.06.2014