为什么默认 vim 的背景选项在 gnome-terminal 和 gnu-screen 中 运行 时不同?

Why is the default vim's background option is differrent when run in gnome-terminal and gnu-screen?

我正在使用 Ubuntu 16.04 LTS,安装了 vim 7.4 和屏幕。我的问题是为什么当我在默认 ubuntu 终端中打开 vim 时 background 选项是 dark 而在 gnu-screen 中打开它时它是 light。 在这些终端中打开时,您可以看到语法突出显示的细微差别。

它是从哪里获得这些值的?

让 vim 猜测背景值都给出 light。 (即 :set bg& bg?

我已经深入研究了 vim 文件,但没有发现任何嫌疑人。

也许它位于 vim 的配置文件中,但我还没有发现,或者是否有另一种机制可以在 vim 中设置默认背景选项?


总结

$ vim
:set bg?
  background=dark
:set bg&
:set bg?
  background=light
:q
$ screen
$ vim
:set bg?
  background=light   ???
:set bg&
:set bg?
  background=light

来自:help 'background'

[...]
For MS-DOS, Windows and OS/2 the default is "dark".
For other systems "dark" is used when 'term' is "linux",
"screen.linux", "cygwin" or "putty", or $COLORFGBG suggests a dark
background.  Otherwise the default is "light".
[...]

vim 使用 xterm 指令集中的转义序列询问背景颜色是什么,您可以在 block in term.c 开头的注释

中看到
    /* Check for background color response from the terminal:
     *
     *       {lead}11;rgb:{rrrr}/{gggg}/{bbbb}{tail}
     *
     * {lead} can be <Esc>] or OSC
     * {tail} can be '[=10=]7', <Esc>\ or STERM.

最终生成一些代码(我建议重写...):

            {/* TODO: don't set option when already the right value */
                LOG_TR("Received RBG");
                rbg_status = RBG_GOT;
                set_option_value((char_u *)"bg", 0L, (char_u *)(
                    (3 * '6' < tp[j+7] + tp[j+12] + tp[j+17])
                     ? "light" : "dark"), 0);

mid-2015 中添加:

commit b5c3265521749fda81ae4b052de35a0d1209cf50                                 
Author: Bram Moolenaar <Bram@vim.org>                                           
Date:   Thu Jun 25 17:03:36 2015 +0200                                          

    patch 7.4.757                                                               
    Problem:    Cannot detect the background color of a terminal.               
    Solution:   Add T_RBG to request the background color if possible. (Lubomir 
                Rintel)

xterm patch #94(1999 年 3 月)添加了查询颜色的控制序列:

extend dynamic colors control sequences to allow users to determine the colors and font which are currently active.

VTE 的开发人员在 2014 年初复制了该功能(参见 #567444)。

但是 GNU screen 无法识别序列(或其响应),因此不允许它通过。

顺便说一下,vim 可以通过不止一种方式做到这一点。我检查了它与 strace.

一起使用的方法