Linux 使用别名更改 vimrc 主题颜色

Linux 使用别名更改 vimrc 主题颜色

我最近开始在 Oracle VM VirtualBox 4.3.6 上运行 Ubuntu 12.04,我真的很喜欢它。我设法安装了 Solarized 主题,并使用sigurdga 的 gnome-terminal-colors-solarized使终端颜色与 vim 兼容。

最近我发现在某些情况下我喜欢深色主题,而在其他情况下我喜欢浅色主题,因此我在 sigurdga 的仓库中创建了一个别名来运行 ./solarized 可执行文件。但是,我注意到我必须手动更改 和 之间的 .vimrc值set background = light。我想知道我是否可以为我的命令创建别名,以便在切换终端颜色时切换 .vimrc 中的背景值?lightdarksolarize

或者,如果您认为我的设置很糟糕,请告诉我如何改进它!

提前致谢!

答案1

我并不是说你的设置很糟糕,但我会向你展示我的做法,以防它有用(这与我发布的相同这里):

我实现了一种方法,只需一个简单的快捷方式(输入 Vim 或 Tmux)即可在 Vim 和 Tmux 中一次性切换浅色到深色配色方案。虽然我使用的是 Bash 而不是 Zsh,但希望它能对某些人有所帮助。我没有显示图像的代表,但我有所有内容都在此处的博客文章中。

就我而言,我可以做以下任一操作:

从 Tmux 窗格:
1a) 别名“ol”将 Vim 和 Tmux 都切换到亮模式。1b
) 别名“od”将 Vim 和 Tmux 都切换到暗模式。

来自 Vim:
2)'Leader-o' 在 Vim 和 Tmux 之间切换明暗配色方案。

黑暗的例子
轻量示例

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

代码实现

步骤 1:从 Tmux 窗格切换

首先,我已将 ~/.bashrc 配置为自动启动 Tmux 并尝试连接到名为“main”的会话,如果不存在则创建它。我发现这对我来说很有效,但您可能需要修改此步骤。

启动 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 文件的开头,我首先获取一个包含我选择的深色的辅助 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 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 窗格中使用我们的一个别名更改方案,Vim 不会自动重新运行 SetColorScheme 函数。

在 tmux 中切换,vim 已经打开

每当 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 变量可能很容易,但我只在晚上从亮切换到暗(即每天一次),所以我不想让 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

答案2

删除你的显式设置~/.vimrc,而是在别名定义中将其传递给 Vim,例如:

$ alias darkvim='vim --cmd "set background=dark"'

可以通过设置变量(--cmd "let g:myvar = '...'")并在 中对其进行评估来完成类似的自定义.vimrc

相关内容