同步 Vim 和 Terminal 的背景色

之前在 终端中的 Vim 显示方形的光标 中设置了 termguicolors 后,再选个 colorscheme,终端边缘 padding 部分颜色刺眼地不匹配。
边框显示了终端的背景色,和Vim主题背景色不匹配
就像这张图,边框显示了终端的背景色,和 Vim 主题背景色不匹配。

很早之前在使用 iTerm2 时就处理过一次,现在在 Windows Terminal 上又来了。以前用的都是 Vim default 主题,它似乎没有调整过背景色,这次选择了自带背景色的主题就触发了。

我知道的有至少两个原因

  1. 终端尺寸没有按块贴合,snap to block grid。有的终端模拟器允许像浏览器窗口一样,随意调整窗口尺寸。窗口尺寸非整数,变成 80.5 row x 119.8 col,那小数点部分只能展示为空白。
    好在 Windows Terminal 里没这个问题。
  2. 设置了背景不透明度,同时开启了窗口边框间距。不透明度更重要,间距因为有个滚动条,一定会存在。这是我本次的原因,为了好看的亚克力背景,不透明度调整到 75%。关闭不透明度就好了。

同步终端应用和系统的亮色暗色模式

另一个就是主题色,也就是 set background 要和终端匹配,这个目前都没有很好的办法。因为系统主题 应用主题 终端配色 == 应用配色这套等式,每个环境都可以自由选择。

我的做法是在 Powershell 启动时检测环境,注入到 Session 环境变量和用户级环境变量,应用程序读取这个变量做判断

Microsoft.PowerShell_profile.ps1
# 检测当前 Windows 系统是否处于浅色模式
$themeRegistryPath = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize"
$env:AppUseLightTheme = ( Get-ItemProperty -Path $themeRegistryPath -ErrorAction SilentlyContinue ).AppsUseLightTheme ?? 0
[Environment]::SetEnvironmentVariable('AppUseLightTheme', $env:AppUseLightTheme, 'User')
.vimrc
set termguicolors
colorscheme catppuccin
if $AppUseLightTheme == '1'
    set background=light
endif