Что делает: set background = dark do?

35

Я не вставил color xxxсвой .vimrc. Итак, я вижу это, когда впервые открываю свою .vimrc.

:colorдает мне defaultздесь. Раньше ничего

Тогда я печатаю :color darcula. И это меняется к этому.

:colorдает мне darculaздесь (естественно). Изменить цветовую схему

Тогда я печатаю :set background=dark. И это меняется к этому.

:colorдает мне defaultздесь (удивительно). Изменить фон

Итак, мой вопрос, что именно делает :set background=dark?

Я пытался :h backgroundи не нашел ничего полезного. Я понимаю, что эта команда на самом деле не меняет фон, только vim изменит цвета соответственно. Но я все еще хочу задать этот вопрос. Потому что я действительно доволен цветом после, :color darculaи :set background=darkпоэтому мне интересно, как написать свою собственную цветовую схему без необходимости вставлять set background=darkмою .vimrc.

Я взял совет от @statox и поставил set background=darkна последнюю строчку своего darcula.vim. Затем color darculaдает мне третий скриншот. Однако, когда я помещаю его в первую строку, color darculaвыдает мне второй скриншот. Также set bg=darkизменяет его на третий скриншот.

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

Если то, что я предполагаю, произошло, правда, мой вопрос все еще остается без ответа. Что именно изменило vim, когда я использую set bg=darkПОСЛЕ того, как он загрузил светлую цветовую схему?

Вся моя конфигурация vim доступна по адресу https://github.com/MichaelMa2014/.vim

Майкл Ма
источник
@ Муру Привет! Я прочитал этот вопрос, прежде чем задавать мой. Он упоминается в этой должности , что :set bg=lightи :set bg=darkне противоположны, но что именно они не объяснена. Также этот пост, почему я хочу избежать :set background=darkв моем .vimrc.
Майкл Ма

Ответы:

32

Что происходит, когда ты :set background

Основной механизм, с помощью которого :set backgroundработает, на самом деле довольно прост, и он задокументирован (хотя и не особенно четко) в :help 'background'.

Когда задано «background», Vim настроит группы цветов по умолчанию для нового значения. Но цвета, используемые для подсветки синтаксиса, не изменятся. g: colors_name
Когда загружена цветовая схема (установлена ​​переменная «g: colors_name»), настройка «background» приведет к перезагрузке цветовой схемы. Если цветовая схема подстраивается под значение «background», это будет работать. Однако, если цветовая схема сама устанавливает «фон», эффект может быть отменен.

Итак, что на самом деле происходит при изменении 'background'опции:

Если цветовая схема не загружена в данный момент

Vim перезагружает цвета по умолчанию, используя цвета переднего плана, которые считаются подходящими для новой настройки 'background'

Если цветовая схема в настоящее время загружена

Vim перезагружает цветовую схему. Когда цветовая схема загружена, либо цветовая схема устанавливает цвета, соответствующие новой настройке 'background', либо цветовая схема сбрасывается 'background' до старого значения.

Как вы уже описали, эта 'background'опция предназначена не для установки фона, а для информирования Vim, является ли фон темным или светлым.

Поэтому, если цветовая схема сбрасывается 'background', Vim принимает это, чтобы означать, что цветовая схема просто не поддерживает новую настройку 'background'. Поскольку пользователь указал, что он использует такой фон, это означает, что текущая цветовая схема больше не подходит, и поэтому Vim сбрасывает g:colors_nameи затем загружает цвета по умолчанию.

Если вы хотите изучить фактический код, который запускается, когда 'background'он установлен, вы можете начать здесь .

Что происходит в вашей установке

Странное поведение, которое вы описываете (в первой версии вашего вопроса), может быть объяснено этой строкой в ​​приведенной выше документации:

Когда загружена цветовая схема (установлена ​​переменная "g: colors_name")

Проблема в том, что ваш colors/darcula.vimфайл не устанавливает это значение, и поэтому, несмотря на то, что цвета изменились при вызове :color darcula, Vim не считает цветовую схему загруженной в данный момент.

Поэтому при вызове :set background=darkVim выполняет шаг, описанный выше в разделе «Если цветовая схема не загружена», и устанавливает цвета по умолчанию для темного фона. Это объясняет, почему :colorтогда отчеты default.

(Заметим, однако, что установка цвета по умолчанию делает не , как можно было бы ожидать, удалить все цвета , которые ранее были установлены, и именно поэтому вы в конечном итоге с результатами , которые вы видите, а не цветами , которые отображаются при В первую очередь запустите Vim. Здесь обсуждается этот вопрос. )

Короче говоря, ваша цветовая схема неверно настроена: см. :edit $VIMRUNTIME/colors/README.txt(В частности, раздел внизу) для получения более подробной информации об этом, а также о взаимодействии 'background'цветовых схем и между ними .

Богатый
источник
Спасибо большое! Я чувствую себя полностью понятым, когда вы говорите, что «не удаляет, как вы могли ожидать, все цвета, которые были ранее установлены». Я обязательно пойду читать обсуждения!
Майкл Ма
4

Документ :h 'background' должен предоставить всю необходимую информацию:

Если установлено значение «темный», Vim будет пытаться использовать цвета, которые хорошо смотрятся на темном фоне. При установке «light» Vim будет пытаться использовать цвета, которые хорошо смотрятся на светлом фоне. Любое другое значение является незаконным.

Ваша цветовая схема определяет 2 группы цветов: те, которые используются на светлом фоне, и те, которые используются на темном фоне. backgroundОпция указывает Vim , которая должна быть использована группа цветов , определенных вашим ColorScheme.

Установка этой опции не меняет цвет фона, она сообщает Vim, как выглядит цвет фона. Для изменения цвета фона, см :h :hi-normal.

Когда задано «background», Vim настроит группы цветов по умолчанию для нового значения. Но цвета, используемые для подсветки синтаксиса, не изменятся.

Это продолжение предыдущего абзаца: это схема цветов, которая определяет группы цветов и backgroundвыбирает одну из этих групп.

Наконец, если вы хотите написать свою собственную цветовую схему, не вставляя set background=darkв свой vimrc, помните, что схема цветов - это не что иное, как программа в vimscript, поэтому ничто не мешает вам использовать команду непосредственно в коде вашей схемы цветов, например, jellybeans или подмастерье

statox
источник
1
Спасибо! Я положил set background=darkв darcula.vimи произвел тот же эффект, что, когда я положил его в .vimrc. Но мне все еще интересно, как именно Vim "пытается использовать цвета, которые хорошо смотрятся на темном фоне"? Есть ли где-то определенное отображение или что-то подобное?
Майкл Ма