1つのコマンドでVimとTmuxで明るいモードと暗いモードを切り替えますか?

1つのコマンドでVimとTmuxで明るいモードと暗いモードを切り替えますか?

1つのコマンドでtmuxセッション全体で背景色モードを変更できるようにしたいです。シェル機能があり、bgl背景bgd/色スキームを明るく暗くし、同様のvimキーバインディングを設定します。

複数のウィンドウが開いている場合、各ウィンドウを異なるカラーモードに切り替えるのは面倒です。

vimを実行するときに必要なtmux send-keysように、各ウィンドウに適切なコマンドを送信するスクリプトを作成できますか?それでは...(神)...私に方向を教えてもらえますか?escape<leader>bgd<enter>

ベストアンサー1

この答えから抽出しました。私のブログ

1つのコマンドでVimとTmuxで明るいモードと暗いモードを切り替える

私はあなたと同じ問題があり、次のように設定しました。

Tmuxウィンドウで:

1a) エイリアス 'ol' は Vim と Tmux を照明モードに切り替えます。

1b) エイリアス 'od' は Vim と Tmux を暗いモードに切り替えます。

Wimから:

2) 'Leader-o'はVimとTmuxを明るい色と濃い色のスキームに切り替えます。

暗いテーマ

明るいテーマ

どのように機能するかは、Tmux環境変数を定義して、明るいカラースキームか暗いカラースキームかを追跡することです。 VimウィンドウでもTmuxウィンドウでも切り替えるたびに変数が更新されます。既存および新しいTmuxウィンドウとVimの既存および新しいインスタンスはこの変数を確認し、このスキームに従います。

パスワード

ステップ1:Tmuxウィンドウ内で色を切り替える

このガイドでは、さまざまなドットファイルがホームディレクトリにあると想定しています。上記のように、作業環境をコンピュータ間で同期した状態に保つために、実際にはホームディレクトリのシンボリックリンクがあるすべてのgitリポジトリに保存してください。この子買い戻し。

まず、~/.bashrcを設定して自動的にTmuxを起動し、「main」というセッションに接続しようとし、存在しない場合はセッションを作成します。私はこれが私にとって効果的だと思いましたが、このステップを変更したいかもしれません。

Tmuxを起動した後、「THEME」という環境変数を照会し、「THEME = light」と等しくない場合(または存在しない場合)、暗いテーマを使用してそれに応じてTHEME変数を設定します。つまり、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 ファイルの先頭で、最初に選択した暗い色を含むセカンダリ 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つのエイリアスがあります。 olは「ON / Light」を表し、odは「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'"

ステップ2:Vim内で色を切り替える

私の~/.vimrcで2つの関数を定義しました。最初の関数はTmux THEME変数の更新とTmuxの色変換を処理し、2番目の関数はVimの色を設定します。

Tmuxのシステムコールを介してTmux THEME変数を読み込みます。これにより、「続行するにはEnterキーを押すか、コマンドを入力してください」というメッセージとともにTHEME変数が返されます。明らかに、我々は変数にのみ興味があります。重要なのは、「THEME = dark」と一致するかどうかを確認しているため、システムコールから返されたメッセージの最初の10文字だけを取得する必要があることです。変数が使用していることを示すシナリオに関係なく、代替テーマを取得し、THEME変数を更新します。 THEME変数が更新されたら、SetColorScheme関数を呼び出してVimの色を変更します。

function! Toggle_Light_Dark_Colorscheme()
    if system('tmux show-environment THEME')[0:9] == 'THEME=dark'
        :silent :!tmux set-environment THEME 'light'
        :silent :!tmux source-file ~/.tmux_light.conf
    else
        :silent :!tmux set-environment THEME 'dark'
        :silent :!tmux source-file ~/.tmux_dark.conf
    endif
    :call SetColorScheme()
endfunction

私たちが選択するカラースキームは、Tmux THEME変数によって決定されます。テーマが「THEME = dark」の場合は暗いカラースキーム(私の場合はzenburn)を選択し、それ以外の場合は明るいカラースキーム(私の場合はseoul256-light)を選択します。

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

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

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

Vimの新しいインスタンスを開くと、Tmux THEME変数はすでに定義されているため、SetColorScheme関数を使用してカラースキームを選択します(この関数は〜/.vimrcのSetColorScheme関数の後に配置する必要があります)。

call SetColorScheme()

ここで停止することもできますが、Vimインスタンスが実行されていてTmuxウィンドウで別名の1つを使用してスキームを変更すると、VimはSetColorScheme関数を自動的に再実行しません。

tmuxに切り替えてvimを開きます。

Vimが再び焦点を合わせるたびに、autocmdを使用してカラースキームを確認してリセットできます。残念ながら、これは端末のVimでは機能しません。しかし、幸いなことにこの問題を解決するプラグインがあります:

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

プラグインを使用するには、~/.tmux.confに次の行が必要です(またはすでにtmux-sensibleプラグインがインストールされています)。

set -g focus-events on

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

autocmd FocusGained * :call SetColorScheme()

これは、Tmuxウィンドウからvimに戻るたびに、Vimのカラースキームが自動的に更新されることを意味します。

明るいテーマ

VimにTmux THEME変数を継続的に確認させるのは簡単ですが、私は夜に明るい場所から暗い場所に切り替えるので(たとえば、1日に1回)、Vimにそのような作業のためにバックグラウンドで100万回の確認をしたくありません。まれな現象:

最後に、両方のカラースキームで表示されるようにコマンドプロンプトの色を変更することにしました。私の~/.bashrcには、太字のフォントで紫を指定するために35メートルを入力しました。この数字が色を指定する方法は私に神秘的で、ちょうど検索しました。

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

おすすめ記事