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:
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.
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.
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.
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
.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..
Agregue una función a su
.vimrc
y, 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
function
nombreSolar_swap
que no acepte parámetros()
. El!
finalfunction
hace que reemplace silenciosamente una función existente del mismo nombre, lo cual es útil si terminas buscando la tuya.vimrc
nuevamente.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 (comobackground
) 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'))
execute
la siguiente cadena como un:
comando Ex (es decir).silent
nos ahorra tener que pulsar returncada vez.!
ejecuta un comando externo (a Vim), en este casotmux 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.osascript
ejecutará algo de AppleScript para nosotros.-e
significa 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 lasif
ramas 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
command
llamadoSolarSwap
, que llama a la función que acabamos de crear.!
reemplaza silenciosamente cualquier comando existente con el mismo nombre.Ahora, desde Vim, simplemente ejecute
:SolarSwap
y Vim, tmux e iTerm2 deberían alternar entre Luz solarizada y Oscuridad. Por supuesto, puedes agregar un mapeo para.vimrc
que 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.
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.
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:
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-g36378c33c
puede utilizarun nuevo autocmd "Señal": autocmd Main Signal * call Solar_swap()
. Luego simplemente envíe instancias de neovim SIGUSR1
desde su script de shell para activar el autocmd. Para mi uso en Linux, consultemi respuesta aquí.