vim - затемнить неактивные разделенные панели

Если вы знакомы с приложением iTerm2, вы знаете, что вы можете разделять представления, как в vim, а неактивные представления «затенены».

Я обычно работаю в vim с тремя вертикальными разделенными представлениями, и было бы неплохо затемнить неактивные, например, установив цвет фона на более темный тон.

Есть ли способ сделать это?


person Community    schedule 07.12.2011    source источник


Ответы (4)


Я придумал следующее решение (используя «colorcolumn» и отключив «cursorline»):

" Dim inactive windows using 'colorcolumn' setting
" This tends to slow down redrawing, but is very useful.
" Based on https://groups.google.com/d/msg/vim_use/IJU-Vk-QLJE/xz4hjPjCRBUJ
" XXX: this will only work with lines containing text (i.e. not '~')
function! s:DimInactiveWindows()
  for i in range(1, tabpagewinnr(tabpagenr(), '$'))
    let l:range = ""
    if i != winnr()
      if &wrap
        " HACK: when wrapping lines is enabled, we use the maximum number
        " of columns getting highlighted. This might get calculated by
        " looking for the longest visible line and using a multiple of
        " winwidth().
        let l:width=256 " max
      else
        let l:width=winwidth(i)
      endif
      let l:range = join(range(1, l:width), ',')
    endif
    call setwinvar(i, '&colorcolumn', l:range)
  endfor
endfunction
augroup DimInactiveWindows
  au!
  au WinEnter * call s:DimInactiveWindows()
  au WinEnter * set cursorline
  au WinLeave * set nocursorline
augroup END

Просмотрите его в моих (текущих) файлах точек: https://github.com/blueyed/dotfiles/blob/master/vimrc#L351

Обновление Я создал из него плагин: https://github.com/blueyed/vim-diminactive

person blueyed    schedule 20.09.2012
comment
Это может быть сделано более эффективным для любых машин, которые борются. Нам действительно не нужно запускать для всех окон каждый раз, когда мы переключаем окно. Нам просто нужно выполнить setwinvar в любом окне, которое мы WinLeave, и setlocal nocolorcolumn в WinEnter. (Это при условии, что наш сеанс начинается только с одного окна, и мы никогда не создаем несколько окон, не входя в каждое из них.) - person joeytwiddle; 24.12.2013
comment
@AndyRay Я создал из него плагин: github.com/blueyed/vim-diminactive - person blueyed; 09.02.2014
comment
Я также сделал быстрый и грязный плагин, основанный на вашем ответе: github.com/joeytwiddle/rc_files/blob/master/.vim/plugin/ - person joeytwiddle; 19.02.2014
comment
@joeytwiddle круто! Было бы хорошо сейчас, прежде чем я создал свой. Я был бы признателен за запрос на вытягивание, если вы хотите объединить свои изменения (например, игнорирование некоторых типов буферов через конфигурацию). - person blueyed; 19.02.2014
comment
@blueyed В моем почти нет ничего нового, но, конечно, я внесу свой вклад в будущем, если найду какие-либо улучшения; здорово, что вы сделали репо. Есть три ограничения, которые, как мне кажется, вы также испытываете: 1. Действительно длинные строки с переносом не затемняются после столбца 256. 2. Выходящие за границы строки, также известные как ~ строки, не затемняются. 3. Подсветка линии курсора маскирует любую полезную подсветку фона, которая может быть у затемненных окон (например, последнюю строку верхней панели в QuickFix или текущую строку тега в TagList). Я мог бы отключить затемнение и для этих окон, но тогда будут затемнены только окна редактирования! - person joeytwiddle; 19.02.2014

Бросить это там как новый ответ. https://github.com/TaDaa/vimade затеняет неактивные буферы, сохраняет подсветку синтаксиса, а также может затухать знаки. Я автор, но я полагаю, что это может быть полезно для некоторых в качестве более новой альтернативы. Поддерживает nvim и vim8, 256 цветных терминалов, termguicolors и графический интерфейс.

person TaDaa    schedule 07.01.2019
comment
Попробовал, понравилось, пользуюсь. Ваше здоровье. - person Omar; 09.02.2020
comment
Тоже попробовал и понравилось. Хорошо сделано. - person Nathanael Weiss; 29.01.2021

В neovim (v0.2.1) следующая конфигурация затемняет неактивные панели:

hi ActiveWindow ctermbg=16 | hi InactiveWindow ctermbg=233
set winhighlight=Normal:ActiveWindow,NormalNC:InactiveWindow
person Alex    schedule 18.01.2018
comment
Просто хотел добавить: если вы используете nvim в графическом интерфейсе (например, nvim-qt), замените ctermbg на guibg и используйте шестнадцатеричный цвет в качестве значения, например. guibg=#E7E7E7. - person Rotareti; 31.01.2018
comment
Я думаю, что здесь есть неправильное представление, вам вообще не нужно использовать winhighlight с neovim, группы подсветки Normal и NormalNC - это все, что вам нужно, чтобы указать отдельный цвет фона неактивного окна. Вы используете winhighlight, когда хотите установить другое состояние подсветки для определенных окон. - person Steven Lu; 01.12.2020

Для изменения цвета фона, как вы описываете, потребуются разные цветовые схемы для разных окон Vim. Насколько я знаю, это невозможно, так как это глобальная настройка (см. этот ответ несколько дней назад) .

В качестве наглядного подсказки, какое окно активно, я считаю, что обычно достаточно строки состояния. Группы подсветки различаются для активного окна (hi StatusLine) и любых неактивных окон (hi StatusLineNC). Вы можете либо выбрать цветовую схему с очень резким контрастом между ними, либо отредактировать свою любимую цветовую схему.

person Prince Goulash    schedule 07.12.2011
comment
В дополнение к контрастной StatusLine я считаю полезным установить выделяющуюся CursorLine. - person David; 23.03.2012
comment
Хотя это ответ, принятый ОП, на самом деле он неверен. Ответ @blueyed предоставляет скрипт, который, помещенный в мой .vimrc, действительно эффективно меняет цвет фона неактивных буферов (окон). Это немного хак, но он работает. - person monotasker; 25.10.2013