2016-07-10 21 views
1

Vim hat die Fähigkeit, die Hintergrundfarbe eines Xterm korrekt zu erraten, um seine interne Option bg entweder auf dark oder white zu setzen, entsprechend der Terminal-Nummer. Vim ist in der Lage das richtig nur zu tun, wenn TERM ist auf beiden xterm {, -color, -256color} oder linux aber keine andere wie tmux oder screen.Wie erraten Vim Hintergrundfarbe auf Xterm?

Wie kann Vim das erraten?

Ich habe festgestellt, dass die meisten Menschen Kräfte, um die background Option Einrichtung entweder dark oder light in ihrer .vimrc-Datei; aber ich möchte eine Möglichkeit haben, auf die gleiche Weise wie Vim zu erraten, unabhängig davon, ob das Terminal xterm, tmux, screen ist.

+0

Was ist Ihr Betriebssystem? Ist es debian/ubuntu? Die Einstellung kann in vim globalen RC-Skripten (in '/ usr/share/vim') oder in Quellen von vim oder in beiden definiert werden. Ich kann versuchen, aktuelle Ubuntu (16.04) vim Quellen zu überprüfen, es gibt Erwähnung in debian/changelog (Upstream - Patch) "6.1.136: Wenn $ TERM" linux "ist, ist der Standard für 'Hintergrund'" dunkel ", obwohl der GUI verwendet einen hellen Hintergrund "http://ftp.twaren.net/vim/patches/6.1.136 – osgx

Antwort

1

Die Standardeinstellung ist im vim-Quellcode (in c-Programmiersprache geschrieben) fest (codiert). Es war fix nicht "dunkel" in GUI-Varianten von VIM mit "linux" TERM seit Version 6.1.136 zu verwenden, und es hilft mir eigentlichen Code zu finden:

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 

Die Logik ist hier Standardwerte: 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 

Detect Terminal Hintergrund: 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 } 

GUI fix:

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 } 

UPDATE: Für vim-1689.07.04 (Debian/Ubuntu) Ich vim-Paket neu erstellt mit Informationen Debuggen (-O2 -g Standardoption; vor dem Streifen und packen in deb) und lief TERM=xterm gdb --args vim-7.4.1689/src/vim-basic/vim -e mit watch p_bg. Erster Wechsel von p_bg war von term_bg_default()-light, und zweitens ist von ... main: may_req_termresponse() (wenn FEAT_TERMRESPONSE definiert wurde) ->vpeekc_nomap ->vpeekc ->vgetorpeek ->check_termcode ->set_option_value("bg",..) ->set_string_option.

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

Linie 3.302-may_req_bg_color() Farbe, genannt von main.c kurz nach starttermcap()/log Meldung "termcap starten"; I hinzugefügt vorverarbeiteten Definition der Anfrage:

/* 
* 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]"}, 

Linie 4286 - hand Antwort von Termcap Anfrage

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"); 

von 7,4 zugegeben.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 */ 

Ihr tmux/Bildschirm kann nicht implementieren '[RBG] Anfrage; überprüfen, indem Sie in xterm und in tmux laufen und vergleichen Ausgänge:

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

Sie COLORFGBG definieren kann (und es gab Ungeziefer darüber in neovim: https://github.com/neovim/neovim/issues/2764) Es gibt Fehlerbericht für gnome-terminal es einrichten https://bugzilla.gnome.org/show_bug.cgi?id=733423

verschiedene Terminals, einschließlich urxvt und konsole, stellten eine Umgebungsvariable „COLORFGBG“ Anwendungen zu ermöglichen, die Vordergrund- und Hintergrundfarben zu erkennen. Verschiedene Programme, wie z. B. vim, verwenden dies, um zu bestimmen, ob ein Farbschema verwendet werden soll, das am besten auf hellem oder dunklem Hintergrund funktioniert. Bitte überlege, diese Variable auch in gnome-terminal zu setzen.

Egmont hat einige Option im Bug https://bugzilla.gnome.org/show_bug.cgi?id=733423 in Ihrem "vimrc" (~/.vimrc) oder global auf Ihrem O durch, indem ist /usr/share/vim/vimrc oder in vim Quellen COLORFGBG mit Bashrc

Sie ändern einstellen können Neu kompilieren der benutzerdefinierten Version oder in vim-Quellen, indem ein Fehler an Vim-Autoren gemeldet/Patches gesendet werden.

Die Dokumentation "bg" Teil der Logik beschreibt und gibt Lösungen für vimrc: http://vimdoc.sourceforge.net/htmldoc/options.html# 'bg'

Wenn mit 'Hintergrund' auf den Standardwert einstellen:

:set background& 

Vim wird den Wert erraten. In der GUI sollte dies korrekt funktionieren, in anderen Fällen kann Vim den richtigen Wert nicht erraten.

Beim Starten der GUI wird der Standardwert für 'background' "light" sein. Wenn der Wert nicht in .gvimrc eingestellt ist und Vim erkennt, dass der Hintergrund tatsächlich ziemlich dunkel ist, wird "background" auf "dark" gesetzt. ....

Normalerweise würde diese Option in der Datei .vimrc festgelegt werden. Möglicherweise abhängig vom Namen des Terminals. Beispiel:

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

Wenn diese Option eingestellt ist, ändern sich die Standardeinstellungen für die Lichtergruppen wird. Um andere Einstellungen zu verwenden, setzen Sie ":highlight" Befehle NACH die Einstellung der Option 'Hintergrund'.

+0

Und es gibt doc: http://vimdoc.sourceforge.net/htmldoc/options.html # 'bg' „Wenn es mit 'Hintergrund' auf den Standardwert einstellen: \t \t': Set Hintergrund & ' \t Vim ** wird ** den Wert erraten In der GUI sollte dies korrekt funktionieren, \t in anderen Fällen. * Vim kann den richtigen Wert nicht erraten *. " – osgx

+0

Vim Version 7.4; OS GNU/Linux Debian; COLORFGBG hat keinen Wert. Mein Terminal ist ROXTerm und hat TERM auf xterm-256color gesetzt, aber dieser Wert wird von Tmux zu tmux-256color überschrieben. Ich sehe im Quellcode, dass bg auf dunkel eingestellt ist, wenn TERM Linux, screen.linux, Cygwin oder Kitt ist. Ich sehe nicht den genauen Teil, in dem xterm berücksichtigt wird. Der Fall, den ich definieren möchte, ist, wenn TERM auf 'xterm' gesetzt ist und ROXTerm weiß bg, Vim setzt bg auf hell und wenn ROXTerm schwarz bg hat, setzt Vim bg auf dunkel; nicht abhängig vom TERM-Wert. Wenn TERM 'tmux-256color' ist, ist bg in Vim immer hell. – Baco

+0

Baco, ich überprüfte den Wert von "bg" Einstellung, wenn 'TERM = xterm' mit' vim -u keine -U keine 'und es ist "hell". Also, wenn "TERM = xterm" ist wurde durch Quellcode von vim auf Licht gesetzt, und dann durch einige vim Standard-Startskript auf "dunkel" zurückgesetzt. Immer noch nicht in der Lage, es zu finden oder zu finden, wie man alle von Skripten ausgeführten Befehle verfolgt. – osgx