Mude o esquema de cores no terminal, vim e tmux de escuro para claro com um comando

Mude o esquema de cores no terminal, vim e tmux de escuro para claro com um comando

estou a usarzsh, tmux e vime gostaria de saber como alternar entre escuro/claro solarizado no terminal, vim, vim-airline e linha de status tmux com apenas um comando.

Responder1

Eu descobri um método para alternar simultaneamente o Solarized entre claro e escuro para iTerm2, tmux e Vim, com um único comando no Vim:

  1. Configure dois perfis nas preferências do iTerm2, um com o esquema de cores Solarized Dark e outro com o esquema de cores Solarized Light. As predefinições de cores são muito úteis aqui, pois incluem ambas as versões do Solarized.

    perfis solarizados iterm

  2. Adicione um atalho de teclado a cada perfil para alternar para o outro (escuro muda para claro, luz muda para escuro). Usei o mesmo atalho para ambos, então apenas alterna entre eles. Você pode usar atalhos diferentes se quiser, bastando fazer uma pequena modificação em uma etapa posterior.

    atalho de teclado do item

    Caso você não esteja familiarizado com os glifos, isso é Control- Option- Shift- s. Sinta-se à vontade para escolher algo diferente, mas lembre-se, precisaremos disso mais tarde. E estou mostrando apenas o Solarized Dark aqui, mas não se esqueça de configurá-lo paraambosperfis.

  3. Obtenha alguns esquemas de cores tmux. Usei os deeste repositóriono Github. Vou me referir à sua localização no seu computador como ~/tmux-colors-solarized.

  4. InstalarSolarizado para Vimatravés do seu método preferido. Como definimos as 16 cores ANSI para os valores Solarizados nos perfis iTerm2, podemos usar oesquema de cores solarizado padrão, em vez da versão degradada de 256 cores.

  5. Adicione uma função ao seu .vimrce, opcionalmente, um comando:

    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()
    

    Explicação linha por linha...ish:

    function! Solar_swap()
    

    Defina um functionnome Solar_swapque não aceite parâmetros (). O !final functionfaz com que ele substitua silenciosamente um recurso existente com o mesmo nome, útil se você acabar adquirindo o seu .vimrcnovamente.

        if &background ==? 'dark'
    

    Verifique simplesmente se o plano de fundo do Vim está escuro no momento. ==?faz uma comparação sem distinção entre maiúsculas e minúsculas. É &necessário usar uma configuração (como background) em uma expressão.

            set background=light
    

    Apenas definindo o plano de fundo do Vim como claro.

            execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf'))
    

    executea seguinte string como um :comando Ex (ie). silentnos salva de ter que pressionar returntodas as vezes. !executa um comando externo (para o Vim), neste caso tmux source-file [path]. O .concatena o caminho de escape expandido com o restante da sequência de comandos.

        else
            set background=dark
            execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf'))
        endif
    

    Este pedaço é basicamente apenas a versão claro para escuro das linhas acima.

        silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}'
    

    silent !é o mesmo de antes. osascriptirá executar algum AppleScript para nós. -esignifica executar o seguinte argumento como uma linha de um script. A linha que estamos executando é para enviar o atalho de teclado da etapa 2 para o aplicativo ativo, que deve, no que diz respeito ao sistema operacional, ser o iTerm2. 1 Talvez seja necessário modificar a linha para se adequar à sua escolha de atalho. Observe que se você tivesse dois atalhos diferentes para alternar o iTerm2, você precisará mover essa linha para as iframificações do e alterar as teclas para corresponder.

    endfunction
    
    command! SolarSwap call Solar_swap()
    

    E por fim, fechamos a função e definimos um commandchamado SolarSwap, que chama a função que acabamos de criar. !substitui silenciosamente qualquer comando existente com o mesmo nome.

    Agora, no Vim, basta executar :SolarSwape o Vim, o tmux e o iTerm2 devem alternar entre Solarized Light e Dark. Você pode, é claro, adicionar um mapeamento .vimrcpara tornar a alternância ainda mais fácil.


1 iTerm2 possui uma API AppleScript adequadapor si só, no entanto, não consegui localizar nenhum meio de alterar diretamente o perfil da guia atual. Apenas maneiras de criarnovoguias, janelas ou divisões com um perfil especificado ou obtenha o nome (somente leitura) do perfil da sessão atual. Daí o caminho indireto de configurar atalhos de teclado e usá-los para alternar perfis.

Responder2

Estou lutando com esse problema sozinho. Encontrei uma semi-solução imperfeita e hackeada, mas pelo que percebi, domesticar as cores dos terminais não é exatamente um problema trivial.

O que descobri é que tanto o tmux quanto o vim emprestam os 16 valores de cores ANSI definidos no esquema de cores do seu terminal (preto, vermelho, verde, amarelo, azul, magenta, ciano, branco e todas as suas variantes 'brilhantes'). Se em seuluzesquema de cores do terminal, vocêinverter as definições de ANSI preto e branco(ou seja,defina preto/preto brilhante como cores claras de fundo e branco/branco brilhante como cores escuras de primeiro plano), tmux e vim seguirão o exemplo. Contanto que você esteja usando apenas as variantes claro/escuro de um único esquema de cores, ele deverá funcionar decentemente.

insira a descrição da imagem aqui

Como você pode ver nesta captura de tela, não é perfeito (a frente é o terminal, a traseira é o MacVim - observe as diferenças no texto da companhia aérea, bem como o bloco preto ilegível próximo ao meio, que deveria ser um texto claro em um escuro background), mas chega a 99% do caminho sem precisar alterar nenhuma configuração do vim/tmux/vim-airline.

insira a descrição da imagem aqui

Responder3

Implementei uma maneira de alternar entre um esquema de cores claras e escuras para Vim e Tmux de uma só vez com um atalho simples (inserido no Vim ou no Tmux). Eu uso o Bash, não o Zsh, mas espero que ajude alguém. Não tenho representante para mostrar imagens, mas tenhotudo em uma postagem no blog aqui.

No meu caso, posso fazer:

Em um painel Tmux: 1a) O alias 'ol' alterna o Vim e o Tmux para o modo light. 1b) O alias 'od' muda o Vim e o Tmux para o modo escuro.

Do Vim: 2) 'Leader-o' alterna o Vim e o Tmux entre esquemas de cores claras e escuras. exemplo sombrio exemplo leve

A forma como funciona é que eu defino uma variável ambiental Tmux que monitora se temos um esquema de cores claro ou escuro. Sempre que eu mudar, seja do Vim ou do painel Tmux, a variável será atualizada. Os painéis Tmux existentes e novos e as instâncias novas e existentes do Vim verificarão esta variável e seguirão o esquema.

Implementação de código

Etapa 1: Alternando do painel Tmux

Primeiro, configurei meu ~/.bashrc para que ele inicie automaticamente o Tmux e tente se conectar a uma sessão chamada 'main' ou crie-a se ela não existir. Acho que isso funciona para mim, mas você pode querer alterar esta etapa.

Depois de lançar o Tmux, eu consulto a variável de ambiente chamada 'THEME', se não for igual a 'THEME=light' (ou simplesmente não existe), então vamos com o tema escuro. Isso significa que quando iniciarmos uma sessão do Tmux pela primeira vez, usaremos como padrão um tema escuro:

if command -v tmux>/dev/null; then
    [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux new-session -A -s main

    # check if we have been switched to light, else go dark
    [[ ! $(tmux show-environment | grep THEME) =~ 'THEME=light' ]] && 
    tmux set-environment THEME dark
fi

No início do meu arquivo ~/tmux.conf, começo obtendo um arquivo Tmux secundário que contém as cores escuras que escolhi. Esses valores podem ser substituídos por um esquema de luz posteriormente:

# source colorscheme
set -g default-terminal 'screen-256color'
source-file ~/.tmux_dark.conf

Estas são as cores do tema escuro que tenho:

# dark colours
# fg = thin line
set -g pane-border-style "bg=colour234 fg=colour244"
set -g pane-active-border-style "bg=colour234 fg=colour208"
# fg = text
set -g window-style 'fg=colour248,bg=colour234'
set -g window-active-style 'fg=colour252,bg=colour235'
# Customize the status line
set -g status-fg colour208
set -g status-bg colour234

Além de ~/.tmux_dark.conf, tenho ~/.tmux_light.conf:

# light colours
# fg = thin line
set -g pane-border-style "bg=colour253 fg=colour244"
set -g pane-active-border-style "bg=colour253 fg=colour208"
# fg = text
set -g window-style 'fg=colour238,bg=colour253'
set -g window-active-style 'fg=colour238,bg=colour231'
# Customize the status line
set -g status-fg colour208
set -g status-bg colour253

Se estou em um painel Tmux e quero mudar os esquemas de cores, apenas forneço o arquivo relevante e atualizo a variável THEME. Eu tenho dois aliases no meu ~/.bashrc para fazer isso. Lembro-me deles como ol para 'ON/Light' e od para 'OFF/Dark':

# switch between light and dark themes
alias ol="tmux source-file ~/.tmux_light.conf; tmux set-environment THEME 'light'"
alias od="tmux source-file ~/.tmux_dark.conf; tmux set-environment THEME 'dark'"

Passo 2: Mudando do Vim

No meu ~/.vimrc, defini duas funções, uma para definir o esquema de cores e outra para lidar com a leitura e atualização da variável Tmux THEME. O esquema de cores que escolhemos é ditado pela variável Tmux THEME, que lemos com uma chamada de sistema para Tmux. Isso retorna a variável THEME, bem como uma mensagem dizendo 'Pressione ENTER ou digite um comando para continuar'. Obviamente estamos interessados ​​apenas na variável. Se a variável indicar que devemos ser escuros, escolhemos um esquema de cores escuro (no meu caso zenburn), caso contrário escolhemos um esquema de cores claro (no meu caso seoul256-light). É importante ressaltar que, como estou verificando uma correspondência com 'THEME=dark', devemos pegar apenas os primeiros 10 caracteres da mensagem retornada pela chamada do sistema:

function! SetColorScheme()
    " check if tmux colorsheme is light or dark, and pick for vim accordingly
    if system('tmux show-environment THEME')[0:9] == 'THEME=dark'
        colorscheme zenburn
    else
        colorscheme seoul256-light
    endif
endfunction

Alternar o esquema de cores entre claro e escuro é feito com uma chamada para outra função. A função também fornece recursos para o esquema de cores Tmux apropriado e atualiza a variável THEME. Assim que a variável THEME for atualizada, chamamos a função SetColorScheme acima para alterar as cores do Vim:

function! Toggle_Light_Dark_Colorscheme()
    if system('tmux show-environment THEME')[0:9] == 'THEME=dark'
        :silent :!tmux source-file ~/.tmux_light.conf
        :silent :!tmux set-environment THEME 'light'
    else
        :silent :!tmux source-file ~/.tmux_dark.conf
        :silent :!tmux set-environment THEME 'dark'
    endif
    :call SetColorScheme()
endfunction

Podemos criar um mapeamento (ou comando) para alternar rapidamente o esquema de cores assim:

nnoremap <Leader>o :call Toggle_Light_Dark_Colorscheme()<cr>

Quando abrirmos uma nova instância do Vim, a variável Tmux THEME já terá sido enviada, e então escolhemos o esquema de cores usando a função SetColorScheme (observe que isso deve vir depois da função SetColorScheme em seu ~/.vimrc):

call SetColorScheme()

Poderíamos parar por aí, mas no caso em que tivermos uma instância do Vim em execução e alterarmos o esquema usando um de nossos aliases em um painel Tmux, o Vim não executará novamente automaticamente a função SetColorScheme.

alternar no tmux, vim já aberto

Podemos usar um autocmd para verificar e redefinir o esquema de cores sempre que o Vim for refocado. Infelizmente isso não funciona para o Vim no terminal, mas felizmente existe um plugin que resolve isso para nós:

Plugin 'tmux-plugins/vim-tmux-focus-events'

Este plugin requer a seguinte linha em seu ~/.tmux.conf (ou que você tenha instalado osensível ao tmuxplugar):

set -g focus-events on

Com uma das opções acima (só tenho a linha em meu ~/.tmux.conf), podemos usar o evento FocusGained em ~/.vimrc:

autocmd FocusGained * :call SetColorScheme()

Isso significa que assim que você retornar ao vim a partir do painel Tmux, o esquema de cores do Vim será atualizado automaticamente:

exemplo leve

Provavelmente seria fácil forçar o Vim a verificar constantemente a variável Tmux THEME, mas eu só mudo de claro para escuro à noite (ou seja, uma vez por dia), então não quero fazer o Vim fazer um milhão de verificações em segundo plano para um evento tão raro:

Uma última observação é que optei por alterar a cor do meu prompt de comando para ficar visível em ambos os esquemas de cores. No meu ~/.bashrc coloquei 35m para especificar uma cor roxa em negrito. Como esses números especificam uma cor é um mistério para mim, então pesquisei um pouco no Google:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;35m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '

No entanto, escolher cores no arquivo ~/.tmux.conf é fácil com este código que pode ser colado no terminal para exibir uma grade de cores na faixa de 0 a 255:

for i in {0..255} ; do \
printf "\x1b[48;5;%sm%3d\e[0m " "$i" "$i"; \
if (( i == 15 )) || (( i > 15 )) && (( (i-15) % 6 == 0 )); then \
printf "\n"; \
fi; done

Responder4

Se você está procurando uma maneira de alterar o esquema fora do vim e atualizar automaticamente a interface do vim, consulte :h t_RB.Esta respostafaz referência a uma atualização do mecanismo de consulta do terminal no vim versão 8.0.1129, 2017.

Se você quiser usar o neovim depois de v0.4.0-239-g36378c33cusarum novo autocmd "Sinal": autocmd Main Signal * call Solar_swap(). Em seguida, basta enviar instâncias do neovim SIGUSR1do seu script de shell para acionar o autocmd. Para meu uso no Linux, vejaminha resposta aqui.

informação relacionada