ターミナル、vim、tmux のカラースキームを 1 つのコマンドでダークからライトに切り替える

ターミナル、vim、tmux のカラースキームを 1 つのコマンドでダークからライトに切り替える

私は使用していますzsh、tmux、vimターミナル、vim、vim-airline、tmux ステータス ラインで、ソラライズされた暗い色と明るい色を 1 つのコマンドで切り替える方法を知りたいです。

答え1

私は、Vim 内から 1 つのコマンドを実行するだけで、iTerm2、tmux、および Vim の Solarized の明るい状態と暗い状態を同時に切り替える方法を見つけました。

  1. iTerm2 の設定で 2 つのプロファイルを設定します。1 つは Solarized Dark カラー スキーム、もう 1 つは Solarized Light カラー スキームです。カラー プリセットには Solarized の両方のバージョンが含まれているため、ここでは非常に役立ちます。

    iterm ソラリゼーション プロファイル

  2. 各プロファイルにキーボード ショートカットを追加して、他のプロファイルに切り替えます (暗いプロファイルは明るいプロファイルに、明るいプロファイルは暗いプロファイルに切り替わります)。私は両方に同じショートカットを使用したので、切り替えるだけです。必要に応じて別のショートカットを使用することもできますが、その場合は後の手順で少し変更を加える必要があります。

    iterm キーボードショートカット

    グリフに馴染みがない方のために、それはControl- Option- Shift-sです。自由に別のものを選んでも構いませんが、後で必要になるので覚えておいてください。ここではSolarized Darkのみを示していますが、設定を忘れないでください。両方プロフィール。

  3. tmuxのカラースキームを入手してください。私は以下のものを使用しました。このリポジトリGithub にあります。コンピューター上の場所を と呼びます~/tmux-colors-solarized

  4. インストールVim 用の Solarizedお好みの方法で。iTerm2プロファイルで16色のANSIカラーをSolarized値に設定しているので、劣化した256色バージョンではなく、標準のSolarizedカラースキーム

  5. に関数を追加し.vimrc、オプションでコマンドを追加します。

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

    行ごとに説明:

    function! Solar_swap()
    

    パラメータを取らないfunction名前付き を定義します。の末尾の により、同じ名前の既存の関数が自動的に置き換えられます。これは、 を再度ソースすることになった場合に便利です。Solar_swap()!function.vimrc

        if &background ==? 'dark'
    

    Vim の背景が現在暗いかどうかを簡単にチェックします。==?大文字と小文字を区別しない比較を行います。式で&設定 (など) を使用するには が必要です。background

            set background=light
    

    Vim の背景を明るく設定するだけです。

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

    execute次の文字列を Ex (つまり:) コマンドとして実行します。を押すたびにsilentを押す必要がなくなります。は、外部 (Vim に対して) コマンド (この場合は ) を実行します。 は、拡張されエスケープされたパスをコマンド文字列の残りの部分に連結します。return!tmux source-file [path].

        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}'
    

    silent !は前と同じです。osascriptは AppleScript を実行します。 は、-e次の引数をスクリプトの 1 行として実行することを意味します。 実行している行は、ステップ 2 のキーボード ショートカットをアクティブなアプリケーションに送信する行です。オペレーティング システムに関する限り、アクティブなアプリケーションは iTerm2 です。1ショートカットの選択に合わせて行を変更する必要がある場合があります。 iTerm2 を切り替える 2 つの異なるショートカットがある場合は、この行を のブランチに移動し、キーストロークを一致するように変更する必要があることに注意してくださいif

    endfunction
    
    command! SolarSwap call Solar_swap()
    

    最後に、関数を閉じて、 というcommand関数を定義しますSolarSwap。これは、作成した関数を呼び出します。 は、!同じ名前の既存のコマンドを暗黙的に置き換えます。

    これで、Vim 内から を実行するだけで:SolarSwap、Vim、tmux、iTerm2 はすべて Solarized Light と Dark を切り替えることができます。もちろん、.vimrc切り替えをさらに簡単にするためにマッピングを追加することもできます。


1 iTerm2には適切なAppleScript APIがあるしかし、現在のタブのプロファイルを直接変更する方法は見つかりませんでした。新しい指定されたプロファイルを持つタブ、ウィンドウ、または分割、または現在のセッションのプロファイルの (読み取り専用) 名前を取得します。つまり、キーボード ショートカットを設定し、それを使用してプロファイルを切り替えるという回りくどい方法です。

答え2

私自身もこの問題に苦労しています。不完全で、ハッキーな半解決法にたどり着きましたが、私が集めた情報によると、端末の色を制御することは決して簡単な問題ではありません。

私が発見したのは、tmuxとvimの両方が、ターミナルのカラースキームで定義されている16のANSIカラー値(黒、赤、緑、黄、青、マゼンタ、シアン、白、およびそれらのすべての「明るい」バリエーション)を借用しているということです。ライトターミナルのカラースキーム、ANSIの白黒の定義を反転するつまり、たとえば、明るい背景色として black/brightblack を設定し、暗い前景色として white/brightwhite を設定すると、tmux と vim もそれに従います。単一のカラー スキームの明るい/暗いバリエーションのみを使用している限り、適切に動作するはずです。

ここに画像の説明を入力してください

このスクリーンショットでわかるように、完璧ではありません (前面はターミナル、背面は MacVim です。航空会社のテキストの違いと、暗い背景に明るいテキストであるはずの中央付近の判読できない黒いブロックに注意してください) が、vim/tmux/vim-airline の設定に触れることなく、99% の目的を達成できます。

ここに画像の説明を入力してください

答え3

VimとTmuxの両方で、簡単なショートカット(VimまたはTmuxのいずれかに入力)を使用して、明るい色と暗い色のスキームを一度に切り替える方法を実装しました。私はZshではなくBashを使用していますが、誰かの役に立てば幸いです。画像を表示できるほどの知識はありませんが、すべてはここのブログ投稿でご覧いただけます。

私の場合は、次のいずれかを実行できます。

Tmux ペインから: 1a) エイリアス 'ol' は、Vim と Tmux の両方をライト モードに切り替えます。1b) エイリアス 'od' は、Vim と Tmux の両方をダーク モードに切り替えます。

Vim から: 2) 「Leader-o」は、Vim と Tmux の両方で明るい配色と暗い配色を切り替えます。 暗い例 軽い例

仕組みとしては、明るい色スキームか暗い色スキームかを追跡する Tmux 環境変数を定義します。Vim からでも Tmux ペインからでも、切り替えるたびに変数が更新されます。既存および新規の Tmux ペインと、既存および新規の Vim インスタンスはこの変数をチェックし、スキームに従います。

コードの実装

ステップ1: Tmuxパネルからの切り替え

まず、Tmux を自動的に起動し、「main」というセッションに接続しようとするか、セッションが存在しない場合は作成するように ~/.bashrc を構成しました。これでうまくいきましたが、この手順を変更したい場合があります。

Tmux を起動したら、環境変数「THEME」を照会し、それが「THEME=light」と等しくない場合 (または存在しない場合)、ダーク テーマを使用します。つまり、最初に Tmux セッションを起動すると、デフォルトでダーク テーマになります。

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

~/tmux.conf ファイルの冒頭で、選択した暗い色を含む 2 番目の Tmux ファイルをソースとして読み込みます。これらの値は、後で明るいスキームによって上書きされる可能性があります。

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

私が使用しているダークテーマの色は次のとおりです。

# 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

~/.tmux_dark.conf に加えて、~/.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

Tmux ペインでカラー スキームを切り替えたい場合は、関連するファイルをソースし、THEME 変数を更新するだけです。これを行うには、~/.bashrc に 2 つのエイリアスがあります。これらは、'ON/Light' の場合は ol、'OFF/Dark' の場合は od として覚えています。

# 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'"

ステップ2: Vimからの切り替え

私の ~/.vimrc では、2 つの関数を定義しました。1 つはカラー スキームを設定する関数、もう 1 つは Tmux THEME 変数の読み取りと更新を処理する関数です。選択するカラー スキームは Tmux THEME 変数によって決定され、Tmux へのシステム コールで読み取られます。これにより、THEME 変数と、「続行するには ENTER キーを押すか、コマンドを入力してください」というメッセージが返されます。明らかに、私たちが関心を持っているのは変数だけです。変数が暗い色にすべきであることを示している場合は、暗いカラー スキーム (私の場合は zenburn) を選択し、そうでない場合は明るいカラー スキーム (私の場合は seoul256-light) を使用します。重要なのは、'THEME=dark' との一致をチェックしているため、システム コールによって返されたメッセージの最初の 10 文字のみを取得する必要があることです。

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

明るい色と暗い色の配色を切り替えるには、別の関数を呼び出します。この関数は、適切な Tmux 配色を再リソースし、THEME 変数を更新します。THEME 変数が更新されると、上記の SetColorScheme 関数を呼び出して 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

次のように、カラースキームをすばやく切り替えるためのマッピング (またはコマンド) を作成できます。

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

Vim の新しいインスタンスを開くと、Tmux THEME 変数がすでに送信されているので、SetColorScheme 関数を使用してカラー スキームを選択します (これは ~/.vimrc 内の SetColorScheme 関数の後に記述する必要があることに注意してください)。

call SetColorScheme()

ここで停止することもできますが、Vim のインスタンスが実行されていて、Tmux ペイン内からエイリアスの 1 つを使用してスキームを変更する場合、Vim は SetColorScheme 関数を自動的に再実行しません。

tmux で切り替え、vim はすでに開いている

autocmd を使用すると、Vim が再度フォーカスされるたびにカラースキームをチェックしてリセットできます。残念ながら、これはターミナルの Vim では機能しませんが、幸いなことに、これを解決してくれるプラグインがあります。

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

このプラグインは、~/.tmux.confに次の行が必要です(または、tmux に敏感プラグイン):

set -g focus-events on

上記のオプションのいずれか (~/.tmux.conf に次の行があるだけです) を使用すると、~/.vimrc で FocusGained イベントを使用できます。

autocmd FocusGained * :call SetColorScheme()

これにより、Tmux ペインから vim に戻るとすぐに、Vim のカラー スキームが自動的に更新されます。

軽い例

Vim に Tmux THEME 変数を常にチェックさせるのはおそらく簡単でしょうが、私はライトからダークに切り替えるのは夕方 (つまり 1 日に 1 回) だけなので、このようなまれなイベントのために Vim にバックグラウンドで何百万回もチェックさせたくはありません。

最後に、コマンド プロンプトの色を両方のカラー スキームで表示されるように変更することにしました。~/.bashrc に 35m と入力して、太字のフォントで紫色を指定しました。これらの数字がどのように色を指定するのかは私には謎なので、少し Google で調べてみました。

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

ただし、次のコードを使用すると、~/.tmux.conf ファイルで色を選択するのが簡単になります。このコードをターミナルに貼り付けると、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

答え4

vim の外部からスキームを変更し、vim のインターフェースを自動的に更新する方法を探している場合は、を参照してください:h t_RBこの答え2017 年の vim バージョン 8.0.1129 のターミナル クエリ メカニズムの更新を参照します。

v0.4.0-239-g36378c33cneovimを使いたい場合は、新しい「シグナル」自動コマンド: autocmd Main Signal * call Solar_swap(). 次に、SIGUSR1シェルスクリプトからneovimインスタンスを送信してautocmdを起動します。Linuxでの使用については、私の答えはここにあります

関連情報