7

Я использую zsh, tmux и vim, и мне хотелось бы узнать, как переключаться между соляризованной тьмой / светом в строке состояния терминала, vim, vim-aviation и tmux с помощью одной команды.

3 ответа3

3

Я сам борюсь с этой проблемой. Я нашел несовершенное хакерское полу-решение, но, как я понял, укрощение терминальных цветов - не совсем тривиальная проблема.

Я обнаружил, что и tmux, и vim заимствуют 16 значений цвета ANSI, определенных в вашей цветовой схеме терминала (черный, красный, зеленый, желтый, синий, пурпурный, голубой, белый и все их «яркие» варианты). Если в вашей цветовой схеме светлого терминала вы инвертируете определения ANSI черно-белого (т. Е. Задаете черный / яркий черный в качестве светлых цветов фона и белый / ярко-белый в качестве темных цветов переднего плана), tmux и vim последуют их примеру. Пока вы используете только светлые / темные варианты одной цветовой схемы, она должна работать прилично.

Как вы можете видеть на этом скриншоте, он не идеален (спереди - терминал, сзади - MacVim - обратите внимание на различия в тексте авиакомпании, а также на неразборчивый блок черного около середины, который должен быть светлым текстом на темном в фоновом режиме), но он проходит 99% пути без необходимости касаться каких-либо настроек vim/tmux/vim-aviation.

3

Я нашел способ одновременно переключать Solarized между светлым и темным для iTerm2, tmux и Vim с помощью одной команды из Vim:

  1. Установите два профиля в настройках iTerm2: один с цветовой схемой Solarized Dark, а другой с цветовой схемой Solarized Light. Здесь очень полезны предустановки цвета, поскольку они включают обе версии Solarized.

    iterm соляризованные профили

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

    сочетание клавиш iterm

    Если вы не знакомы с глифами, это Control - Option - Shift - s. Не стесняйтесь выбирать что-то другое, но помните об этом, оно понадобится нам позже. И я показываю здесь только Solarized Dark, но не забудьте настроить его для обоих профилей.

  3. Получите некоторые цветовые схемы Tmux. Я использовал те из этого хранилища на Github. Я буду называть его местоположение на вашем компьютере как ~/tmux-colors-solarized .

  4. Установите Solarized для Vim с помощью вашего предпочтительного метода. Поскольку мы установили для 16 цветов ANSI значения Solarized в профилях iTerm2, мы можем использовать стандартную цветовую схему Solarized вместо ухудшенной версии с 256 цветами .

  5. Добавьте функцию в ваш .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 , однако я не смог найти никаких средств для непосредственного изменения профиля текущей вкладки. Просто способы создания новых вкладок, окон или разделений с указанным профилем или получения (только для чтения) имени профиля текущего сеанса. Таким образом, обходной путь настройки сочетаний клавиш и их использования для переключения профилей.

0

Если вы ищете способ изменить схему вне 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 см. Мой ответ здесь .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .