我正在使用zsh、tmux 和 vim,我想知道如何仅使用一个命令在终端、vim、vim-airline 和 tmux 状态行之间切换日光暗/亮。
我已经找到了一种方法,可以使用 Vim 中的单个命令在 iTerm2、tmux 和 Vim 的明暗之间同时切换 Solarized:
在 iTerm2 的首选项中设置两个配置文件,一个使用 Solarized Dark 配色方案,一个使用 Solarized Light 配色方案。颜色预设在这里非常有用,因为它们包括 Solarized 的两个版本。
为每个配置文件添加一个键盘快捷键以切换到另一个(暗切换为亮,亮切换为暗)。我对两者使用了相同的快捷方式,所以它只是在它们之间切换。如果需要,您可以使用不同的快捷方式,您只需要对后面的步骤进行一些小的修改。
如果您不熟悉字形,那就是Control- Option- Shift- s。随意选择不同的东西,但请记住它,我们稍后会用到它。我在这里只显示 Solarized Dark,但不要忘记为两个配置文件设置它。
给自己一些 tmux 配色方案。我在 Github 上使用了这个存储库中的那些。我将其在您的计算机上的位置称为~/tmux-colors-solarized.
通过您的首选方法为 Vim安装Solarized。由于我们已将 16 种 ANSI 颜色设置为 iTerm2 配置文件中的 Solarized 值,因此我们可以使用标准的 Solarized 配色方案,而不是降级的 256 色版本。
添加一个函数到您的.vimrc,以及可选的命令:
function! Solar_swap()
if &background ==? 'dark'
set background=light
execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf'))
else
set background=dark
execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf'))
endif
silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}'
endfunction
command! SolarSwap call Solar_swap()
Run Code Online (Sandbox Code Playgroud)
逐行...ish解释:
function! Solar_swap()
Run Code Online (Sandbox Code Playgroud)
定义一个不带参数的function命名。在上月底,如果你最终采购的原因,它静静地替代同名的已有的功能,方便试。Solar_swap()!function.vimrc
if &background ==? 'dark'
Run Code Online (Sandbox Code Playgroud)
简单检查 Vim 的背景当前是否为深色。==?进行不区分大小写的比较。的&使用的设定(例如是需要background在表达)。
set background=light
Run Code Online (Sandbox Code Playgroud)
只需将 Vim 的背景设置为浅色即可。
execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-light.conf'))
Run Code Online (Sandbox Code Playgroud)
execute以下字符串作为 Ex (ie :) 命令。silent让我们不必return每次都按下。!运行外部(对 Vim)命令,在本例中为tmux source-file [path]。将.扩展的转义路径连接到命令字符串的其余部分。
else
set background=dark
execute "silent !tmux source-file " . shellescape(expand('~/tmux-colors-solarized/tmuxcolors-dark.conf'))
endif
Run Code Online (Sandbox Code Playgroud)
这个块基本上只是上面几行的明暗版本。
silent !osascript -e 'tell app "System Events" to keystroke "s" using {shift down, option down, control down}'
Run Code Online (Sandbox Code Playgroud)
silent !和以前一样。osascript将为我们运行一些 AppleScript。-e表示将以下参数作为脚本的一行执行。我们正在运行的一行是将第 2 步中的键盘快捷键发送到活动应用程序,就操作系统而言,它应该是 iTerm2。1您可能需要修改该行以适合您选择的快捷方式。请注意,如果您有两个不同的快捷方式来切换 iTerm2,您需要将此行向上移动到if的分支中,并更改击键以匹配。
endfunction
command! SolarSwap call Solar_swap()
Run Code Online (Sandbox Code Playgroud)
最后,我们关闭函数并定义一个command被SolarSwap调用的函数,它调用我们刚刚创建的函数。!静默替换任何现有的同名命令。
现在,从 Vim 中运行:SolarSwap,Vim、tmux 和 iTerm2 都应该在 Solarized Light 和 Dark 之间切换。当然,您可以向您添加映射.vimrc以使切换更加容易。
1 iTerm2 确实有自己的适当 AppleScript API,但是,我找不到任何直接更改当前选项卡配置文件的方法。只是使用指定的配置文件创建新选项卡、窗口或拆分的方法,或者获取当前会话配置文件的(只读)名称。因此,设置键盘快捷键并使用它们切换配置文件的迂回路径。
我自己也在为这个问题而苦苦挣扎。我已经找到了一个不完美的、hacky 的半解决方案,但从我收集到的情况来看,驯服终端颜色并不是一个小问题。
\n\n我发现 tmux 和 vim 都借用了终端配色方案中定义的 16 种 ANSI 颜色值(黑色、红色、绿色、黄色、蓝色、品红色、青色、白色以及所有它们的 \xe2\x80\x98bright \xe2\x80\x99 变体)。如果在你的轻终端配色方案中,你颠倒了 ANSI 黑白的定义(即将黑色/亮黑色设置为亮背景色,将白色/亮白色设置为暗前景色),tmux 和 vim 也会效仿。只要您仅使用单一配色方案的浅色/深色变体,它就应该可以正常工作。
\n\n\n\n正如你在这张截图中看到的,它并不完美(前面是终端,后面是 MacVim \xe2\x80\x94 请注意航空公司文本的差异,以及中间附近难以辨认的黑色块,这是应该是深色背景上的浅色文本),但它可以完成 99% 的工作,而无需触及任何 vim/tmux/vim-airline 设置。
\n\n\n