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:
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.
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.
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.
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
.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.
Adicione uma função ao seu
.vimrc
e, 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
function
nomeSolar_swap
que não aceite parâmetros()
. O!
finalfunction
faz com que ele substitua silenciosamente um recurso existente com o mesmo nome, útil se você acabar adquirindo o seu.vimrc
novamente.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 (comobackground
) 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'))
execute
a seguinte string como um:
comando Ex (ie).silent
nos salva de ter que pressionar returntodas as vezes.!
executa um comando externo (para o Vim), neste casotmux 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.osascript
irá executar algum AppleScript para nós.-e
significa 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 asif
ramificações do e alterar as teclas para corresponder.endfunction command! SolarSwap call Solar_swap()
E por fim, fechamos a função e definimos um
command
chamadoSolarSwap
, que chama a função que acabamos de criar.!
substitui silenciosamente qualquer comando existente com o mesmo nome.Agora, no Vim, basta executar
:SolarSwap
e o Vim, o tmux e o iTerm2 devem alternar entre Solarized Light e Dark. Você pode, é claro, adicionar um mapeamento.vimrc
para 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.
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.
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:
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-g36378c33c
usarum novo autocmd "Sinal": autocmd Main Signal * call Solar_swap()
. Em seguida, basta enviar instâncias do neovim SIGUSR1
do seu script de shell para acionar o autocmd. Para meu uso no Linux, vejaminha resposta aqui.