同步 Vim 和 Terminal 的背景色
之前在 终端中的 Vim 显示方形的光标 中设置了 termguicolors 后,再选个 colorscheme,终端边缘 padding 部分颜色刺眼地不匹配。

就像这张图,边框显示了终端的背景色,和 Vim 主题背景色不匹配。
- How make Vim fill Terminal window - Stack Overflow
- Windows terminal akward border · 议题 #14889 · microsoft/terminal
很早之前在使用 iTerm2 时就处理过一次,现在在 Windows Terminal 上又来了。以前用的都是 Vim default 主题,它似乎没有调整过背景色,这次选择了自带背景色的主题就触发了。
我知道的有至少两个原因
- 终端尺寸没有按块贴合,snap to block grid。有的终端模拟器允许像浏览器窗口一样,随意调整窗口尺寸。窗口尺寸非整数,变成 80.5 row x 119.8 col,那小数点部分只能展示为空白。
好在 Windows Terminal 里没这个问题。 - 设置了背景不透明度,同时开启了窗口边框间距。不透明度更重要,间距因为有个滚动条,一定会存在。这是我本次的原因,为了好看的亚克力背景,不透明度调整到 75%。关闭不透明度就好了。
同步终端应用和系统的亮色暗色模式
另一个就是主题色,也就是 set background 要和终端匹配,这个目前都没有很好的办法。因为系统主题 应用主题 终端配色 == 应用配色这套等式,每个环境都可以自由选择。
我的做法是在 Powershell 启动时检测环境,注入到 Session 环境变量和用户级环境变量,应用程序读取这个变量做判断
# 检测当前 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')set termguicolors
colorscheme catppuccin
if $AppUseLightTheme == '1'
set background=light
endif