Tmux

在 Vim 和 Tmux 中使用一個命令在明暗模式之間切換?

  • July 9, 2021

我希望能夠使用一個命令在整個 tmux 會話中更改我的背景顏色模式……我有一個 shell 函式bgl並將bgd背景/顏色方案設置為淺色和深色,以及類似的vim鍵綁定。

當我有一堆打開的窗格時,將每個窗格切換到不同的顏色模式變得很乏味。

是否可以編寫一個腳本tmux send-keys用於向每個窗格發送適當的命令(例如,如果執行 vim,我們必須這樣做escape<leader>bgd<enter>?如果是這樣……(親愛的上帝)……你能幫我找到一些方向嗎?

我從我的部落格中提取了這個答案

在 Vim 和 Tmux 中通過一個命令在明暗模式之間切換

我遇到了和你一樣的問題,我有以下設置:

從 Tmux 窗格:

1a) 別名 ‘ol’ 將 Vim 和 Tmux 都切換到 light 模式。

1b) 別名 ‘od’ 將 Vim 和 Tmux 都切換到暗模式。

來自 Vim:

2 ) ‘Leader-o’ 在淺色和深色方案之間切換 Vim 和 Tmux。

黑暗主題

輕主題

它的工作方式是我定義了一個 Tmux 環境變數來跟踪我們是否有淺色或深色配色方案。每當我切換時,無論是從 Vim 還是 Tmux 窗格,變數都會被更新。現有的和新的 Tmux 窗格以及現有的和新的 Vim 實例將檢查這個變數並遵循方案。

程式碼實現

第 1 步:在 Tmux 窗格內切換顏色

出於本指南的目的,我假設我的各種點文件都在我的主目錄中。實際上,我將它們全部保存在一個帶有來自主目錄的符號連結的 git 儲存庫中,以使我的工作環境保持跨機器同步,如本 git repo 中所述。

首先,我配置了我的 ~/.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 中有兩個別名來執行此操作。我記得它們是“開/亮”的 ol 和“關/暗”的 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 中,我定義了兩個函式,第一個處理 Tmux THEME 變數的更新並切換 Tmux 顏色,第二個設置 Vim 的顏色。

我們通過對 Tmux 的系統呼叫來讀取 Tmux THEME 變數。這將返回主題變數,以及一條消息說“按 ENTER 或鍵入命令繼續”。顯然我們只對變數感興趣。重要的是,由於我正在檢查與 ‘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 窗格中的一個別名更改方案,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 變數可能很容易,但我只在晚上從亮到暗切換(即每天一次),所以我不想讓 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

引用自:https://unix.stackexchange.com/questions/656854