Vim 如何猜测 xterm 上的背景颜色? [英] How does Vim guess background color on xterm?

查看:36
本文介绍了Vim 如何猜测 xterm 上的背景颜色?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Vim 能够正确猜测 Xterm 的背景颜色,以便将其内部选项 bg 设置为 darkwhite根据终端的一个.当 TERM 设置为 xterm{,-color,>-256color} 或 linux 但没有其他像 tmuxscreen.

Vim has the ability to correctly guess the background color of an Xterm in order to set its internal option bg to either dark or white according to the terminal's one. Vim is able to do that correctly only when TERM is set to either xterm{,-color,-256color} or linux but no others like tmux or screen.

Vim 是如何猜测的?

How does Vim to guess that?

我发现大多数人在他们的 .vimrc<中强制将 background 选项设置为 darklight/代码>文件;但我想要一种与 Vim 相同的猜测方式,独立于终端是 xtermtmuxscreen.

I've found that most people forces setting up the background option to either dark or light in their .vimrc file; but I'd like a way to guess the same way Vim does, independently of the terminal being xterm, tmux, screen.

推荐答案

默认设置在 Vim 源代码(用 C 编程语言编写)中定义(硬编码).自 6.1.136 版以来,有一个修复程序可以在带有linux"TERM 的 Vim 的 GUI 变体中不使用dark",这有助于我找到实际代码:

The default setting is defined (hard-coded) in Vim source code (written in the C programming language). There was a fix to not use "dark" in GUI variants of Vim with "linux" TERM since version 6.1.136, and it helps me to find actual code:

http://ftp.twaren.net/vim/patches/6.1.136

Patch 6.1.136
Problem:    When $TERM is "linux" the default for 'background' is "dark", even
        though the GUI uses a light background. (Hugh Allen)
Solution:   Don't mark the option as set when defaulting to "dark" for the
        linux console.  Also reset 'background' to "light" when the GUI
        has a light background.
Files:      src/option.c

逻辑在这里,默认值:https://fossies.org/dox/vim-7.4/option_8c_source.html#l00566

  563     {"background",  "bg",   P_STRING|P_VI_DEF|P_RCLR,
  564                 (char_u *)&p_bg, PV_NONE,
  565                 {
  566 #if (defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI)
  567                 (char_u *)"dark",
  568 #else
  569                 (char_u *)"light",
  570 #endif

检测终端背景:https://fossies.org/dox/vim-7.4/option_8c_source.html#l03754

 3725     /* For DOS console the default is always black. */
 3726 #if !((defined(MSDOS) || defined(OS2) || defined(WIN3264)) && !defined(FEAT_GUI))
 3727     /*
 3728      * If 'background' wasn't set by the user, try guessing the value,
 3729      * depending on the terminal name.  Only need to check for terminals
 3730      * with a dark background, that can handle color.
 3731      */
 3732     idx = findoption((char_u *)"bg");
 3733     if (idx >= 0 && !(options[idx].flags & P_WAS_SET)
 3734                          && *term_bg_default() == 'd')
 3735     {
 3736     set_string_option_direct(NULL, idx, (char_u *)"dark", OPT_FREE, 0);
 3737     /* don't mark it as set, when starting the GUI it may be
 3738      * changed again */
 3739     options[idx].flags &= ~P_WAS_SET;
 3740     }
 3741 #endif
 3754 /*
 3755  * Return "dark" or "light" depending on the kind of terminal.
 3756  * This is just guessing!  Recognized are:
 3757  * "linux"      Linux console
 3758  * "screen.linux"   Linux console with screen
 3759  * "cygwin"     Cygwin shell
 3760  * "putty"      Putty program
 3761  * We also check the COLORFGBG environment variable, which is set by
 3762  * rxvt and derivatives. This variable contains either two or three
 3763  * values separated by semicolons; we want the last value in either
 3764  * case. If this value is 0-6 or 8, our background is dark.
 3765  */
 3766     static char_u *
 3767 term_bg_default()
 3768 {
 3769 #if defined(MSDOS) || defined(OS2) || defined(WIN3264)
 3770     /* DOS console nearly always black */
 3771     return (char_u *)"dark";
 3772 #else
 3773     char_u  *p;
 3774
 3775     if (STRCMP(T_NAME, "linux") == 0
 3776         || STRCMP(T_NAME, "screen.linux") == 0
 3777         || STRCMP(T_NAME, "cygwin") == 0
 3778         || STRCMP(T_NAME, "putty") == 0
 3779         || ((p = mch_getenv((char_u *)"COLORFGBG")) != NULL
 3780         && (p = vim_strrchr(p, ';')) != NULL
 3781         && ((p[1] >= '0' && p[1] <= '6') || p[1] == '8')
 3782         && p[2] == NUL))
 3783     return (char_u *)"dark";
 3784     return (char_u *)"light";
 3785 #endif
 3786 }

界面修复:

 4044 gui_bg_default()
 4045 {
 4046     if (gui_get_lightness(gui.back_pixel) < 127)
 4047     return (char_u *)"dark";
 4048     return (char_u *)"light";
 4049 }

更新:对于 vim-7.4.1689 (debian/ubuntu),我使用调试信息重建了 Vim 包(-O2 -g 默认选项;在剥离并打包到 deb 之前)并运行 TERM=xterm gdb --args vim-7.4.1689/src/vim-basic/vim -ewatch p_bg.p_bg 的第一个变化是由 term_bg_default()light,第二个是从 ... main: may_req_termresponse()(如果定义了 FEAT_TERMRESPONSE) -> vpeekc_nomap -> vpeekc -> vgetorpeek -> check_termcode -> set_option_value("bg",..) -> set_string_option.

UPDATE: For vim-7.4.1689 (debian/ubuntu) I rebuilt Vim package with debugging info (-O2 -g default option; before strip and pack into deb) and ran TERM=xterm gdb --args vim-7.4.1689/src/vim-basic/vim -e with watch p_bg. First change of p_bg was by term_bg_default() to light, and second is from ... main: may_req_termresponse() (if FEAT_TERMRESPONSE was defined) -> vpeekc_nomap -> vpeekc -> vgetorpeek -> check_termcode -> set_option_value("bg",..) -> set_string_option.

https://github.com/vim/vim/blob/54c10ccf9274880e83093a99690e7bfa9a2d2fa8/src/term.c

第 3302 行 - may_req_bg_color() 颜色,在 starttermcap() 之后从 main.c 调用/日志消息start termcap";我添加了请求的预处理定义:

Line 3302 - may_req_bg_color() color, called from main.c just after starttermcap() / log message "start termcap"; I added preprocessed definition of the request:

/*
 * Similar to requesting the version string: Request the terminal background
 * color when it is the right moment.
 */
    void
may_req_bg_color(void)
...

    {(int)KS_RBG,   "\033]11;?\007",

    {(int)KS_RBG,   "[RBG]"},

第 4286 行 - 处理来自 termcap 请求的响应:

Line 4286 - handle response from termcap request:

check_termcode( ....

    /* Check for background color response from the terminal:
     *
     *       {lead}11;rgb:{rrrr}/{gggg}/{bbbb}{tail}
     *
     * {lead} can be <Esc>] or OSC
     * {tail} can be '\007', <Esc>\ or STERM.
     *
     * Consume any code that starts with "{lead}11;", it's also
     * possible that "rgba" is following.
     */

        if (i - j >= 21 && STRNCMP(tp + j + 3, "rgb:", 4) == 0
            && tp[j + 11] == '/' && tp[j + 16] == '/'
            && !option_was_set((char_u *)"bg"))
        {/* 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);
            reset_option_was_set((char_u *)"bg");

由 7.4.757 补丁添加 http://ftp.vim.org/vim/patches/7.4/7.4.757

Added by 7.4.757 patch http://ftp.vim.org/vim/patches/7.4/7.4.757

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)
Files:      src/main.c, src/term.c, src/term.h, src/proto/term.pro

#define T_RBG   (term_str(KS_RBG))  /* request background RGB */

您的 tmux/screen 可能无法实现[RBG]"请求;通过在 xterm 和 tmux 中运行并比较输出来检查:

Your tmux/screen may not implement '[RBG]' request; check by running in xterm and in tmux and compare outputs:

echo -e '\033]11;?\007'

<小时>

您可以定义 COLORFGBG(并且在 Neovim 中有关于它的错误:https://github.com/neovim/neovim/issues/2764)gnome-terminal 有错误报告可以设置它https://bugzilla.gnome.org/show_bug.cgi?id=733423


You may define COLORFGBG (and there were bugs about it in neovim: https://github.com/neovim/neovim/issues/2764) There is bug report for gnome-terminal to set it https://bugzilla.gnome.org/show_bug.cgi?id=733423

各种终端,包括 urxvt 和 konsole,设置环境变量COLORFGBG"以允许应用程序检测前景色和背景色.各种程序,例如 Vim,使用它来确定是否使用最适合浅色或深色背景的配色方案.请考虑在 gnome-terminal 中设置此变量.

Various terminals, including urxvt and konsole, set an environment variable "COLORFGBG" to allow applications to detect the foreground and background colors. Various programs, such as Vim, use this to determine whether to use a color scheme that works best on a light or dark background. Please consider setting this variable in gnome-terminal as well.

Egmont 在 bug 中有一些选项 https://bugzilla.gnome.org/show_bug.cgi?id=733423 使用 .bashrc 设置 COLORFGBG.

Egmont has some option in the bug https://bugzilla.gnome.org/show_bug.cgi?id=733423 to set COLORFGBG with .bashrc.

你可以在你的vimrc"(~/.vimrc) 中更改它,或者通过更改 /usr/share/vim/vimrc 或在你的操作系统上全局更改它vim 源代码通过重新编译自定义版本或通过向 Vim 作者报告错误/向他们发送补丁来在 Vim 源代码中.

You may change this in your "vimrc" (~/.vimrc), or globally on your OS by changing /usr/share/vim/vimrc or in vim sources by recompiling custom version or in Vim sources by reporting a bug to Vim authors / sending them patches.

文档bg" 描述了部分逻辑并给出vimrc 的解决方案:

The documentation of "bg" describes part of logic and gives solutions for vimrc:

当使用以下命令将 'background' 设置为默认值时:

When setting 'background' to the default value with:

  :set background&

Vim 会猜测这个值.在 GUI 中,这应该可以正常工作,在其他情况下,Vim 可能无法猜测正确的值.

Vim will guess the value. In the GUI this should work correctly, in other cases Vim might not be able to guess the right value.

启动 GUI 时,'background' 的默认值为光".当 .gvimrc 中没有设置该值时,Vim 检测到背景实际上很暗,'background' 设置为暗".....

When starting the GUI, the default value for 'background' will be "light". When the value is not set in the .gvimrc, and Vim detects that the background is actually quite dark, 'background' is set to "dark". ....

通常这个选项会在 .vimrc 文件中设置.可能取决于终端名称.示例:

Normally this option would be set in the .vimrc file. Possibly depending on the terminal name. Example:

      :if &term == "pcterm"
        :  set background=dark
        :endif

设置此选项后,高亮组的默认设置将改变.要使用其他设置,请在之后放置:highlight"命令'background' 选项的设置.

When this option is set, the default settings for the highlight groups will change. To use other settings, place ":highlight" commands AFTER the setting of the 'background' option.

这篇关于Vim 如何猜测 xterm 上的背景颜色?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆