Wechseln Sie das Farbschema im Terminal, Vim und Tmux mit einem Befehl von dunkel auf hell

Wechseln Sie das Farbschema im Terminal, Vim und Tmux mit einem Befehl von dunkel auf hell

Ich benutzezsh, tmux und vimund ich möchte wissen, wie man mit nur einem Befehl zwischen solarisiertem Dunkel/Hell im Terminal, in Vim, Vim-Airline und der Tmux-Statuszeile wechselt.

Antwort1

Ich habe eine Methode gefunden, mit der man Solarized für iTerm2, tmux und Vim gleichzeitig zwischen hell und dunkel umschalten kann, und zwar mit einem einzigen Befehl aus Vim heraus:

  1. Richten Sie in den Einstellungen von iTerm2 zwei Profile ein, eines mit dem Farbschema Solarized Dark und eines mit dem Farbschema Solarized Light. Die Farbvorgaben sind hier sehr hilfreich, da sie beide Versionen von Solarized enthalten.

    iterm solarisierte Profile

  2. Fügen Sie jedem Profil eine Tastenkombination hinzu, um zum anderen zu wechseln (Dunkel wechselt zu Hell, Hell wechselt zu Dunkel). Ich habe für beide dieselbe Tastenkombination verwendet, sodass nur zwischen ihnen umgeschaltet wird. Sie können bei Bedarf auch andere Tastenkombinationen verwenden, Sie müssen nur in einem späteren Schritt eine kleine Änderung vornehmen.

    iterm-Tastenkombination

    Falls Sie mit den Glyphen nicht vertraut sind, das ist Control- Option- Shift- s. Sie können gerne etwas anderes auswählen, aber merken Sie es sich, wir werden es später brauchen. Und ich zeige hier nur Solarized Dark, aber vergessen Sie nicht, es einzurichten fürbeideProfile.

  3. Besorge dir ein paar tmux-Farbschemata. Ich habe die von verwendetdieses Repositoryauf Github. Ich werde den Speicherort auf Ihrem Computer als bezeichnen ~/tmux-colors-solarized.

  4. InstallierenSolarisiert für Vimüber Ihre bevorzugte Methode. Da wir die 16 ANSI-Farben in den iTerm2-Profilen auf die Solarized-Werte eingestellt haben, können wir dieStandard-Solarized-Farbschema anstelle der abgespeckten 256-Farben-Version.

  5. Fügen Sie Ihrer eine Funktion .vimrcund optional einen Befehl hinzu:

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

    Zeile für Zeile...-artige Erklärung:

    function! Solar_swap()
    

    Definieren Sie einen functionbenannten Wert Solar_swap, der keine Parameter annimmt (). Das !am Ende functionbewirkt, dass eine vorhandene Funktion mit demselben Namen stillschweigend ersetzt wird. Dies ist praktisch, wenn Sie Ihre Funktion erneut als Quelle verwenden .vimrc.

        if &background ==? 'dark'
    

    Einfache Überprüfung, ob der Hintergrund von Vim derzeit dunkel ist. ==?führt einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung durch. Es &ist notwendig, eine Einstellung (wie background) in einem Ausdruck zu verwenden.

            set background=light
    

    Ich stelle einfach den Hintergrund von Vim auf Licht ein.

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

    executedie folgende Zeichenfolge als Ex- :Befehl (dh ). erspart uns , jedes Mal silentdrücken zu müssen . führt einen externen (für Vim) Befehl aus, in diesem Fall . Der erweiterte, maskierte Pfad wird an den Rest der Befehlszeichenfolge angehängt.return!tmux source-file [path].

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

    Dieser Block ist im Grunde nur die Hell-Dunkel-Version der obigen Zeilen.

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

    silent !ist das gleiche wie vorher. osascriptführt ein AppleScript für uns aus. -ebedeutet, das folgende Argument als eine Zeile eines Skripts auszuführen. Die Zeile, die wir ausführen, sendet die Tastenkombination aus Schritt 2 an die aktive Anwendung, die, soweit es das Betriebssystem betrifft, iTerm2 sein sollte. 1if Möglicherweise müssen Sie die Zeile ändern, damit sie zu Ihrer gewählten Tastenkombination passt. Beachten Sie, dass Sie diese Zeile nach oben in die Zweige von verschieben und die Tastenanschläge entsprechend ändern müssen, wenn Sie zwei verschiedene Tastenkombinationen zum Umschalten zwischen iTerm2 haben .

    endfunction
    
    command! SolarSwap call Solar_swap()
    

    Und schließlich schließen wir die Funktion und definieren ein commandaufgerufenes SolarSwap, das die gerade erstellte Funktion aufruft. !ersetzt stillschweigend alle vorhandenen Befehle mit demselben Namen.

    Führen Sie es nun in Vim aus :SolarSwapund Vim, tmux und iTerm2 sollten alle zwischen Solarized Light und Dark umschalten. Sie können natürlich eine Zuordnung hinzufügen, .vimrcum das Umschalten noch einfacher zu machen.


1 iTerm2 verfügt über eine richtige AppleScript-APIIch konnte jedoch keine Möglichkeit finden, das Profil der aktuellen Registerkarte direkt zu ändern. Nur Möglichkeiten zum ErstellenneuTabs, Fenster oder Splits mit einem angegebenen Profil oder den (schreibgeschützten) Namen des Profils der aktuellen Sitzung abrufen. Daher der Umweg, Tastaturkürzel einzurichten und diese zum Wechseln zwischen Profilen zu verwenden.

Antwort2

Ich kämpfe selbst mit diesem Problem. Ich bin auf eine unvollkommene, halbherzige Lösung gestoßen, aber soweit ich das beurteilen kann, ist das Zähmen von Terminalfarben kein ganz triviales Problem.

Ich habe festgestellt, dass sowohl tmux als auch vim die 16 ANSI-Farbwerte übernehmen, die in Ihrem Terminalfarbschema definiert sind (Schwarz, Rot, Grün, Gelb, Blau, Magenta, Cyan, Weiß und alle ihre „hellen“ Varianten). Wenn in IhremLichtTerminal-Farbschema, Sieinvertieren Sie die Definitionen von ANSI Schwarz und Weiß(dh,Legen Sie Schwarz/Hellschwarz als helle Hintergrundfarben und Weiß/Hellweiß als dunkle Vordergrundfarben fest. Tmux und Vim folgen diesem Beispiel. Solange Sie nur die hellen/dunklen Varianten eines einzigen Farbschemas verwenden, sollte es problemlos funktionieren.

Bildbeschreibung hier eingeben

Wie Sie in diesem Screenshot sehen können, ist es nicht perfekt (vorne ist das Terminal, hinten ist MacVim – beachten Sie die Unterschiede im Airline-Text sowie den unleserlichen schwarzen Block in der Mitte, der heller Text auf dunklem Hintergrund sein soll), aber es schafft 99 % des Weges, ohne dass irgendwelche vim/tmux/vim-airline-Einstellungen geändert werden müssen.

Bildbeschreibung hier eingeben

Antwort3

Ich habe eine Möglichkeit implementiert, mit der man mit einem einfachen Tastenkürzel (das in Vim oder Tmux eingegeben wird) in einem Rutsch zwischen einem hellen und einem dunklen Farbschema für Vim und Tmux wechseln kann. Ich verwende allerdings Bash und nicht Zsh, aber hoffentlich hilft es jemandem. Ich habe nicht den Ruf, Bilder anzuzeigen, aber ich habe esalles in einem Blog-Beitrag hier.

In meinem Fall kann ich Folgendes tun:

Von einem Tmux-Bereich aus: 1a) Der Alias ​​„ol“ schaltet sowohl Vim als auch Tmux in den Hellmodus. 1b) Der Alias ​​„od“ schaltet sowohl Vim als auch Tmux in den Dunkelmodus.

Von Vim: 2) „Leader-o“ schaltet sowohl Vim als auch Tmux zwischen hellen und dunklen Farbschemata um. dunkles Beispiel Lichtbeispiel

Das funktioniert so, dass ich eine Tmux-Umgebungsvariable definiere, die festhält, ob wir ein helles oder dunkles Farbschema haben. Immer wenn ich wechsle, sei es von Vim oder einem Tmux-Fenster, wird die Variable aktualisiert. Vorhandene und neue Tmux-Fenster und vorhandene und neue Instanzen von Vim überprüfen diese Variable und folgen dem Schema.

Code-Implementierung

Schritt 1: Wechseln vom Tmux-Bereich

Zuerst habe ich meine ~/.bashrc so konfiguriert, dass sie automatisch Tmux startet und versucht, eine Verbindung zu einer Sitzung namens „main“ herzustellen oder sie zu erstellen, wenn sie nicht existiert. Ich finde, das funktioniert für mich, aber Sie möchten diesen Schritt vielleicht ändern.

Sobald ich Tmux gestartet habe, frage ich die Umgebungsvariable „THEME“ ab. Wenn sie nicht gleich „THEME=light“ ist (oder einfach nicht existiert), verwenden wir das dunkle Design. Das bedeutet, dass beim ersten Starten einer Tmux-Sitzung standardmäßig ein dunkles Design verwendet wird:

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

Zu Beginn meiner Datei ~/tmux.conf lade ich eine sekundäre Tmux-Datei herunter, die die von mir gewählten dunklen Farben enthält. Diese Werte können später durch ein helles Schema überschrieben werden:

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

Dies sind die dunklen Designfarben, die ich habe:

# 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

Zusätzlich zu ~/.tmux_dark.conf habe ich ~/.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

Wenn ich mich in einem Tmux-Bereich befinde und Farbschemata ändern möchte, lade ich einfach die entsprechende Datei herunter und aktualisiere die Variable THEME. Ich habe dazu zwei Aliase in meiner ~/.bashrc. Ich erinnere mich an sie als ol für „ON/Light“ und od für „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'"

Schritt 2: Umstellung von Vim

In meiner ~/.vimrc habe ich zwei Funktionen definiert, eine zum Festlegen des Farbschemas und eine andere zum Lesen und Aktualisieren der Tmux THEME-Variable. Das von uns gewählte Farbschema wird von der Tmux THEME-Variable vorgegeben, die wir mit einem Systemaufruf an Tmux lesen. Dies gibt die THEME-Variable sowie die Meldung „Drücken Sie die Eingabetaste oder geben Sie einen Befehl ein, um fortzufahren“ zurück. Natürlich sind wir nur an der Variable interessiert. Wenn die Variable angibt, dass es dunkel sein soll, wählen wir ein dunkles Farbschema (in meinem Fall zenburn), andernfalls wählen wir ein helles (in meinem Fall seoul256-light). Wichtig ist, dass wir, da ich eine Übereinstimmung mit „THEME=dark“ überprüfe, nur die ersten 10 Zeichen der vom Systemaufruf zurückgegebenen Nachricht übernehmen dürfen:

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

Das Umschalten des Farbschemas zwischen hell und dunkel erfolgt durch den Aufruf einer anderen Funktion. Die Funktion stellt auch das entsprechende Tmux-Farbschema bereit und aktualisiert die Variable THEME. Sobald die Variable THEME aktualisiert ist, rufen wir die obige Funktion SetColorScheme auf, um die Farben von Vim zu ändern:

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

Wir können eine Zuordnung (oder einen Befehl) erstellen, um das Farbschema schnell umzuschalten, und zwar wie folgt:

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

Wenn wir eine neue Instanz von Vim öffnen, wurde die Tmux THEME-Variable bereits gesendet und wir wählen daher das Farbschema mit der Funktion SetColorScheme aus (beachten Sie, dass dies in Ihrer ~/.vimrc nach der Funktion SetColorScheme stehen muss):

call SetColorScheme()

Wir könnten hier aufhören, aber falls wir eine Instanz von Vim ausführen und das Schema mithilfe eines unserer Aliase innerhalb eines Tmux-Bereichs ändern, führt Vim die Funktion SetColorScheme nicht automatisch erneut aus.

Umschalten in tmux, vim bereits geöffnet

Wir können ein Autocmd verwenden, um das Farbschema zu überprüfen und zurückzusetzen, wenn Vim neu fokussiert wird. Leider funktioniert dies für Vim im Terminal nicht, aber zum Glück gibt es ein Plugin, das das Problem für uns löst:

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

Dieses Plugin erfordert die folgende Zeile in Ihrer ~/.tmux.conf (oder dass Sie dietmux-sensibelPlugin):

set -g focus-events on

Mit einer der oben genannten Optionen (ich habe nur die Zeile in meiner ~/.tmux.conf) können wir das FocusGained-Ereignis in ~/.vimrc verwenden:

autocmd FocusGained * :call SetColorScheme()

Dies bedeutet, dass das Farbschema von Vim automatisch aktualisiert wird, sobald Sie vom Tmux-Bereich zu Vim zurückkehren:

Lichtbeispiel

Es wäre wahrscheinlich einfach, Vim dazu zu zwingen, die Tmux THEME-Variable ständig zu prüfen, aber ich schalte nur abends von hell auf dunkel um (also einmal am Tag), deshalb möchte ich Vim für ein so seltenes Ereignis nicht eine Million Prüfungen im Hintergrund durchführen lassen:

Eine letzte Anmerkung: Ich habe mich dazu entschieden, die Farbe meiner Eingabeaufforderung so zu ändern, dass sie in beiden Farbschemata sichtbar ist. In meiner ~/.bashrc habe ich 35m eingegeben, um eine violette Farbe in Fettschrift anzugeben. Wie diese Zahlen eine Farbe angeben, ist mir ein Rätsel, also habe ich einfach ein bisschen gegoogelt:

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

Mit diesem Code können Sie jedoch ganz einfach Farben in der Datei ~/.tmux.conf auswählen. Dieser Code kann in das Terminal eingefügt werden, um ein Farbraster im Bereich von 0 bis 255 anzuzeigen:

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

Antwort4

Wenn Sie nach einer Möglichkeit suchen, das Schema außerhalb von Vim zu ändern und die Vim-Schnittstelle automatisch zu aktualisieren, lesen Sie :h t_RB.Diese Antwortverweist auf ein Update des Terminalabfragemechanismus in Vim Version 8.0.1129, 2017.

Wenn Sie neovim verwenden möchten, v0.4.0-239-g36378c33ckönnen Sie verwendenein neuer "Signal"-Autocmd: autocmd Main Signal * call Solar_swap(). Dann senden Sie einfach Neovim-Instanzen SIGUSR1aus Ihrem Shell-Skript, um den Autocmd auszulösen. Für meine Verwendung unter Linux siehemeine Antwort hier.

verwandte Informationen