Cambie el esquema de colores en terminal, vim y tmux de oscuro a claro con un solo comando

Cambie el esquema de colores en terminal, vim y tmux de oscuro a claro con un solo comando

Estoy usandozsh, tmux y vimy me gustaría saber cómo cambiar entre luz/oscuridad solarizada en la línea de estado de terminal, vim, vim-airline y tmux con un solo comando.

Respuesta1

He descubierto un método para alternar simultáneamente Solarized entre claro y oscuro para iTerm2, tmux y Vim, con un solo comando desde Vim:

  1. Configure dos perfiles en las preferencias de iTerm2, uno con el esquema de color Solarized Dark y otro con el esquema de color Solarized Light. Los ajustes preestablecidos de color son muy útiles aquí, ya que incluyen ambas versiones de Solarized.

    perfiles solarizados iterm

  2. Agregue un método abreviado de teclado a cada perfil para cambiar al otro (el oscuro cambia a claro, el claro cambia a oscuro). Utilicé el mismo atajo para ambos, por lo que simplemente alterna entre ellos. Puedes usar diferentes atajos si lo deseas, solo necesitarás realizar una pequeña modificación en un paso posterior.

    método abreviado de teclado iterm

    En caso de que no estés familiarizado con los glifos, ese es Control- Option- Shift- s. Siéntete libre de elegir algo diferente, pero recuérdalo, lo necesitaremos más adelante. Y aquí solo estoy mostrando Solarized Dark, pero no olvides configurarlo paraambosperfiles.

  3. Consíguete algunos esquemas de color tmux. Yo usé los deeste repositorioen Github. Me referiré a su ubicación en su computadora como ~/tmux-colors-solarized.

  4. InstalarSolarizado para Vima través de su método preferido. Dado que hemos configurado los 16 colores ANSI en los valores Solarizados en los perfiles de iTerm2, podemos usar elEsquema de color Solarized estándar, en lugar de la versión degradada de 256 colores..

  5. Agregue una función a su .vimrcy, opcionalmente, un 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()
    

    Línea por línea... explicación más o menos:

    function! Solar_swap()
    

    Defina un functionnombre Solar_swapque no acepte parámetros (). El !final functionhace que reemplace silenciosamente una función existente del mismo nombre, lo cual es útil si terminas buscando la tuya .vimrcnuevamente.

        if &background ==? 'dark'
    

    Simplemente verifique si el fondo de Vim está actualmente oscuro. ==?hace una comparación que no distingue entre mayúsculas y minúsculas. Es &necesario utilizar una configuración (como background) en una expresión.

            set background=light
    

    Simplemente iluminando el fondo de Vim.

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

    executela siguiente cadena como un :comando Ex (es decir). silentnos ahorra tener que pulsar returncada vez. !ejecuta un comando externo (a Vim), en este caso tmux source-file [path]. Concatena la .ruta de escape expandida con el resto de la cadena de comando.

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

    Este fragmento es básicamente la versión de claro a oscuro de las líneas anteriores.

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

    silent !Es el mismo que antes. osascriptejecutará algo de AppleScript para nosotros. -esignifica ejecutar el siguiente argumento como una línea de un script. La línea que estamos ejecutando es para enviar ese método abreviado de teclado del paso 2 a la aplicación activa, que debería, en lo que respecta al sistema operativo, ser iTerm2. 1 Es posible que tengas que modificar la línea para que se ajuste al acceso directo que hayas elegido. Tenga en cuenta que si tenía dos atajos diferentes para cambiar iTerm2, deberá mover esta línea hacia las iframas de y cambiar las pulsaciones de teclas para que coincidan.

    endfunction
    
    command! SolarSwap call Solar_swap()
    

    Y finalmente, cerramos la función y definimos un commandllamado SolarSwap, que llama a la función que acabamos de crear. !reemplaza silenciosamente cualquier comando existente con el mismo nombre.

    Ahora, desde Vim, simplemente ejecute :SolarSwapy Vim, tmux e iTerm2 deberían alternar entre Luz solarizada y Oscuridad. Por supuesto, puedes agregar un mapeo para .vimrcque la alternancia sea aún más fácil.


1 iTerm2 tiene una API AppleScript adecuadapor sí solo, sin embargo, no pude encontrar ningún medio para cambiar directamente el perfil de la pestaña actual. Sólo formas de crearnuevopestañas, ventanas o divisiones con un perfil específico, u obtener el nombre (solo lectura) del perfil de la sesión actual. De ahí el camino indirecto de configurar atajos de teclado y usarlos para cambiar de perfil.

Respuesta2

Yo mismo estoy luchando con este problema. He llegado a una semisolución imperfecta y complicada, pero por lo que he reunido, dominar los colores de los terminales no es exactamente un problema trivial.

Lo que descubrí es que tanto tmux como vim toman prestados los 16 valores de color ANSI definidos en el esquema de color de su terminal (negro, rojo, verde, amarillo, azul, magenta, cian, blanco y todas sus variantes "brillantes"). si en tuluzesquema de color del terminal, ustedinvertir las definiciones de ANSI blanco y negro(es decir,establezca negro/negro brillante como colores de fondo claro y blanco/blanco brillante como colores de primer plano oscuros), tmux y vim harán lo mismo. Siempre y cuando solo uses las variantes claras/oscuras de un solo esquema de color, debería funcionar decentemente.

ingrese la descripción de la imagen aquí

Como puede ver en esta captura de pantalla, no es perfecto (el frente es la terminal, la parte trasera es MacVim; observe las diferencias en el texto de la aerolínea, así como el bloque ilegible de negro cerca del medio, que se supone que es texto claro sobre un fondo oscuro). fondo), pero llega al 99% del camino sin tener que tocar ninguna configuración de vim/tmux/vim-airline.

ingrese la descripción de la imagen aquí

Respuesta3

Implementé una manera de alternar entre un esquema de color claro a oscuro para Vim y Tmux de una sola vez con un atajo simple (ingresado en Vim o Tmux). Sin embargo, uso Bash, no Zsh, pero espero que ayude a alguien. No tengo el rep para mostrar imágenes pero lo tengo.todo en una publicación de blog aquí.

En mi caso puedo hacer cualquiera de las dos cosas:

Desde un panel de Tmux: 1a) El alias 'ol' cambia tanto Vim como Tmux al modo ligero. 1b) El alias 'od' cambia tanto Vim como Tmux al modo oscuro.

De Vim: 2) 'Leader-o' alterna tanto Vim como Tmux entre combinaciones de colores claros y oscuros. ejemplo oscuro ejemplo ligero

La forma en que funciona es que defino una variable ambiental Tmux que realiza un seguimiento de si tenemos un esquema de color claro u oscuro. Cada vez que cambio, ya sea desde Vim o un panel de Tmux, la variable se actualizará. Los paneles Tmux nuevos y existentes y las instancias nuevas y existentes de Vim verificarán esta variable y seguirán el esquema.

Implementación de código

Paso 1: cambiar desde el panel Tmux

Primero, configuré mi ~/.bashrc de manera que inicie automáticamente Tmux e intente conectarse a una sesión llamada 'principal', o crearla si no existe. Creo que esto funciona para mí, pero es posible que desees modificar este paso.

Una vez que lancé Tmux, consulto la variable de entorno llamada 'THEME', si no es igual a 'THEME=light' (o simplemente no existe), entonces vamos con el tema oscuro. Esto significa que cuando iniciamos una sesión de Tmux por primera vez, usaremos de forma predeterminada un tema oscuro:

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

Al comienzo de mi archivo ~/tmux.conf, comienzo obteniendo un archivo Tmux secundario que contiene los colores oscuros que he elegido. Estos valores pueden ser anulados por un esquema de luces más adelante:

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

Estos son los colores de tema oscuro que tengo:

# 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

Además de ~/.tmux_dark.conf, tengo ~/.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

Si estoy en un panel Tmux y quiero cambiar la combinación de colores, simplemente obtengo el archivo relevante y actualizo la variable TEMA. Tengo dos alias en mi ~/.bashrc para hacer esto. Los recuerdo como ol para 'ON/Light' y 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'"

Paso 2: cambiar de Vim

En mi ~/.vimrc, he definido dos funciones, una para establecer el esquema de color y otra para manejar la lectura y actualización de la variable Tmux THEME. El esquema de color que elegimos está dictado por la variable Tmux THEME, que leemos con una llamada del sistema a Tmux. Esto devuelve la variable TEMA, así como un mensaje que dice "Presione ENTER o escriba un comando para continuar". Obviamente sólo nos interesa la variable. Si la variable indica que debemos ser oscuros, elegimos un esquema de color oscuro (en mi caso zenburn), de lo contrario elegimos uno claro (en mi caso seoul256-light). Es importante destacar que, dado que estoy comprobando una coincidencia con 'THEME=dark', debemos tomar solo los primeros 10 caracteres del mensaje devuelto por la llamada al 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 la combinación de colores entre claro y oscuro se realiza con una llamada a otra función. La función también proporciona recursos para el esquema de color Tmux apropiado y actualiza la variable TEMA. Una vez que se actualiza la variable THEME, llamamos a la función SetColorScheme anterior para cambiar los colores de 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 crear un mapeo (o un comando) para alternar rápidamente la combinación de colores de esta manera:

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

Cuando abrimos una nueva instancia de Vim, la variable Tmux THEME ya habrá sido enviada, por lo que elegimos el esquema de color usando la función SetColorScheme (tenga en cuenta que esto debe venir después de la función SetColorScheme en su ~/.vimrc):

call SetColorScheme()

Podríamos detenernos allí, pero en el caso de que tengamos una instancia de Vim ejecutándose y cambiemos el esquema usando uno de nuestros alias desde un panel Tmux, Vim no volverá a ejecutar automáticamente la función SetColorScheme.

alternar en tmux, vim ya está abierto

Podemos usar un autocmd para verificar y restablecer la combinación de colores cada vez que se vuelve a enfocar Vim. Desafortunadamente, esto no funciona para Vim en la terminal, pero afortunadamente hay un complemento que nos lo resuelve:

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

Este complemento requiere la siguiente línea en su ~/.tmux.conf (o que haya instalado elsensible a tmuxenchufar):

set -g focus-events on

Con una de las opciones anteriores (solo tengo la línea en mi ~/.tmux.conf), podemos usar el evento FocusGained en ~/.vimrc:

autocmd FocusGained * :call SetColorScheme()

Esto significará que tan pronto como regrese a vim desde el panel Tmux, la combinación de colores de Vim se actualizará automáticamente:

ejemplo ligero

Probablemente sería fácil obligar a Vim a verificar constantemente la variable Tmux THEME, pero solo cambio de claro a oscuro por la noche (es decir, una vez al día), por lo que no quiero que Vim haga un millón de comprobaciones en segundo plano durante un evento tan raro:

Una última observación es que opté por cambiar el color de mi símbolo del sistema para que sea visible en ambos esquemas de color. En mi ~/.bashrc puse 35m para especificar un color púrpura en negrita. Para mí es un misterio cómo estos números especifican un color, así que busqué un poco en Google:

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

Sin embargo, elegir colores en el archivo ~/.tmux.conf es fácil con este código que se puede pegar en la terminal para mostrar una cuadrícula de colores en el rango 0-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

Respuesta4

Si está buscando una manera de cambiar el esquema desde fuera de vim y actualizar automáticamente la interfaz de vim, consulte :h t_RB.esta respuestahace referencia a una actualización del mecanismo de consulta del terminal en vim versión 8.0.1129, 2017.

Si desea utilizar neovim después, v0.4.0-239-g36378c33cpuede utilizarun nuevo autocmd "Señal": autocmd Main Signal * call Solar_swap(). Luego simplemente envíe instancias de neovim SIGUSR1desde su script de shell para activar el autocmd. Para mi uso en Linux, consultemi respuesta aquí.

información relacionada