用一个命令在 Vim 和 Tmux 中切换浅色和深色模式?

用一个命令在 Vim 和 Tmux 中切换浅色和深色模式?

我希望能够使用一个命令在整个 tmux 会话中更改我的背景颜色模式...我有一个 shell 功能bgl并将bgd背景/颜色方案设置为浅色和深色,以及类似的vim键绑定。

当我有一堆打开的窗格时,将每个窗格切换到不同的颜色模式变得很乏味。

是否可以编写一个脚本来tmux send-keys向每个窗格发送适当的命令(就像如果运行 vim,我们就必须escape这样做<leader>bgd<enter>)?如果是这样......(亲爱的上帝)......你能帮我一些方向吗?

答案1

我从这个答案中提取了我的博客

通过一个命令在 Vim 和 Tmux 中切换浅色和深色模式

我遇到了和你完全相同的问题,并且我有以下设置:

从 Tmux 窗格:

1a) 别名 'ol' 将 Vim 和 Tmux 切换到轻模式。

1b) 别名 'od' 将 Vim 和 Tmux 切换到深色模式。

来自维姆:

2 ) 'Leader-o' 在浅色和深色配色方案之间切换 Vim 和 Tmux。

黑暗主题

浅色主题

它的工作方式是我定义一个 Tmux 环境变量来跟踪我们是否有浅色或深色配色方案。每当我切换时,无论是从 Vim 还是 Tmux 窗格,变量都会更新。现有和新的 Tmux 窗格以及 Vim 的现有和新实例将检查此变量并遵循该方案。

代码实现

第 1 步:从 Tmux 窗格内切换颜色

出于本指南的目的,我假设我的各种点文件位于我的主目录中。实际上,我将它们全部保存在一个 git 存储库中,并带有来自主目录的符号链接,以允许我保持跨计算机的工作环境同步,如上所述这个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 中有两个别名来执行此操作。我记得它们是 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 中,我定义了两个函数,第一个函数处理 Tmux THEME 变量的更新并切换 Tmux 颜色,第二个函数设置 Vim 的颜色。

我们通过对 Tmux 的系统调用来读取 Tmux THEME 变量。这将返回 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 以粗体字体指定紫色。这些数字如何指定颜色对我来说很神秘,所以我只是用谷歌搜索了一下:

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

相关内容