在 Vim 和 Tmux 中使用一個命令在明暗模式之間切換?
我希望能夠使用一個命令在整個 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 函式:
每當 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