Я использую zsh, tmux и vim, и мне хотелось бы узнать, как переключаться между соляризованной тьмой / светом в строке состояния терминала, vim, vim-aviation и tmux с помощью одной команды.
3 ответа
Я сам борюсь с этой проблемой. Я нашел несовершенное хакерское полу-решение, но, как я понял, укрощение терминальных цветов - не совсем тривиальная проблема.
Я обнаружил, что и tmux, и vim заимствуют 16 значений цвета ANSI, определенных в вашей цветовой схеме терминала (черный, красный, зеленый, желтый, синий, пурпурный, голубой, белый и все их «яркие» варианты). Если в вашей цветовой схеме светлого терминала вы инвертируете определения ANSI черно-белого (т. Е. Задаете черный / яркий черный в качестве светлых цветов фона и белый / ярко-белый в качестве темных цветов переднего плана), tmux и vim последуют их примеру. Пока вы используете только светлые / темные варианты одной цветовой схемы, она должна работать прилично.
Как вы можете видеть на этом скриншоте, он не идеален (спереди - терминал, сзади - MacVim - обратите внимание на различия в тексте авиакомпании, а также на неразборчивый блок черного около середины, который должен быть светлым текстом на темном в фоновом режиме), но он проходит 99% пути без необходимости касаться каких-либо настроек vim/tmux/vim-aviation.
Я нашел способ одновременно переключать Solarized между светлым и темным для iTerm2, tmux и Vim с помощью одной команды из Vim:
Установите два профиля в настройках iTerm2: один с цветовой схемой Solarized Dark, а другой с цветовой схемой Solarized Light. Здесь очень полезны предустановки цвета, поскольку они включают обе версии Solarized.
Добавьте сочетание клавиш для каждого профиля, чтобы переключиться на другой (темный цвет переключается на светлый, светлый - на темный). Я использовал один и тот же ярлык для обоих, поэтому он просто переключается между ними. Вы можете использовать различные сочетания клавиш, если хотите, вам просто нужно внести небольшие изменения в более поздний шаг.
Если вы не знакомы с глифами, это Control - Option - Shift - s. Не стесняйтесь выбирать что-то другое, но помните об этом, оно понадобится нам позже. И я показываю здесь только Solarized Dark, но не забудьте настроить его для обоих профилей.
Получите некоторые цветовые схемы Tmux. Я использовал те из этого хранилища на Github. Я буду называть его местоположение на вашем компьютере как
~/tmux-colors-solarized
.Установите Solarized для Vim с помощью вашего предпочтительного метода. Поскольку мы установили для 16 цветов ANSI значения Solarized в профилях iTerm2, мы можем использовать стандартную цветовую схему Solarized вместо ухудшенной версии с 256 цветами .
Добавьте функцию в ваш
.vimrc
и, необязательно, команду:function! Solar_swap() if &background ==? 'dark' set background=light execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf')) else set background=dark execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf')) endif silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}' endfunction command! SolarSwap call Solar_swap()
Построчно ... пояснение:
function! Solar_swap()
Определите
function
именемSolar_swap
которая не принимает параметров()
.!
в концеfunction
заставляет его молча заменить существующую функцию с тем же именем, что удобно, если вы в конечном итоге получите свой.vimrc
снова.if &background ==? 'dark'
Простая проверка, если фон Vim в настоящее время темный.
==?
делает сравнение без учета регистра. Символ&
необходим для использования параметра (например,background
) в выражении.set background=light
Просто установив фон Vim на свет.
execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf'))
execute
следующую строку как:
команды (то есть).silent
избавляет нас от необходимости каждый раз возвращаться назад.!
запускает внешнюю (для Vim) команду, в этом случаеtmux source-file [path]
..
объединяет расширенный, экранированный путь с остальной частью командной строки.else set background=dark execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf')) endif
Этот кусок является в основном просто светло-темной версией вышеупомянутых строк.
silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}'
silent !
такой же, как и раньше.osascript
запустит какой-нибудь AppleScript для нас.-e
означает выполнить следующий аргумент как одну строку скрипта. Линия, которую мы используем, - это отправка этого сочетания клавиш из шага 2 в активное приложение, которое, если говорить об операционной системе, должно быть iTerm2. 1 Возможно, вам придется изменить строку, чтобы она соответствовала вашему выбору ярлыков. Обратите внимание, что если у вас есть два разных сочетания клавиш для переключения iTerm2, вам нужно переместить эту строку вверх в ветвиif
и изменить комбинации клавиш, чтобы они соответствовали.endfunction command! SolarSwap call Solar_swap()
И, наконец, мы закрываем функцию и определяем
command
SolarSwap
, которая вызывает только что созданную нами функцию.!
молча заменяет любую существующую команду с тем же именем.Теперь из Vim просто запустите
:SolarSwap
и Vim, tmux и iTerm2 должны переключаться между Solarized Light и Dark. Конечно, вы можете добавить отображение в ваш.vimrc
чтобы сделать переключение еще проще.
1 iTerm2 имеет собственный API-интерфейс AppleScript , однако я не смог найти никаких средств для непосредственного изменения профиля текущей вкладки. Просто способы создания новых вкладок, окон или разделений с указанным профилем или получения (только для чтения) имени профиля текущего сеанса. Таким образом, обходной путь настройки сочетаний клавиш и их использования для переключения профилей.
Если вы ищете способ изменить схему вне vim и автоматически обновить интерфейс vim, смотрите :h t_RB
. Этот ответ ссылается на обновление механизма запросов терминала в версии vim 8.0.1129, 2017.
Если вы хотите использовать neovim после v0.4.0-239-g36378c33c
вы можете использовать новый "Signal" autocmd: autocmd Main Signal * call Solar_swap()
. Затем просто отправьте neovim экземпляры SIGUSR1
из вашего сценария оболочки, чтобы запустить autocmd. Для моего использования в Linux см. Мой ответ здесь .