web-dev-qa-db-fra.com

Comportement étrange de la couleur vim à l'intérieur de l'écran avec 256 couleurs

J'essayais de faire en sorte que la coloration syntaxique (avec 256 couleurs) de vim fonctionne dans screen, qui s'exécute dans gterm.

Cela fonctionne très bien au début. Ce que je veux dire par "au début" est, après avoir démarré screen, et entré vim, les couleurs semblent bien, et il y a vraiment 256 couleurs.

Mais après un certain temps (je ne sais pas exactement combien de temps) les couleurs reviennent automatiquement à une apparence comme s'il n'y avait que 8 (ou 16?) Couleurs.

Par exemple, après que cela s'est déjà produit, si j'entre la commande

hi Comment ctermfg=68

à l'intérieur de vim, les commentaires apparaissent en vert "pur"; cependant, si j'ouvre un autre écran extérieur vim (dans le même terminal), alors avec la même commande, les commentaires semblent être d'un vert "jaunâtre".

Voici mes paramètres .screenrc liés à la couleur:

attrcolor b ".I"
defbce "on"
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
term xterm-256color

Après avoir exécuté un script python pour afficher toutes les couleurs, je découvre que c'est peut-être un problème d'écran lui-même, et n'a rien à voir avec vim.

Ce que j'ai fait, c'est qu'à l'intérieur de la session screen avec des problèmes, ce script donne 256 couleurs, mais beaucoup d'entre elles sont en fait les mêmes; cependant, lorsque je démarre une nouvelle session d'écran avec la même configuration, ce script donne 256 couleurs distinctes les unes des autres.

Éditer:

Hier soir, je me suis connecté à mon ordinateur Linux (qui est dans mon bureau et il est toujours allumé) avec PuTTY, puis j'ai ouvert une session screen avec plusieurs fenêtres. Les couleurs sont correctes hier soir. Avant de m'endormir, j'ai détaché la session screen et fermé PuTTY.

Maintenant, le matin, lorsque j'attache à nouveau cette session screen dans PuTTY, les couleurs se brisent: elles apparaissent comme s'il n'y avait que 8 couleurs.

Les couleurs sont bien en dehors de screen (mais toujours dans PuTTY).

Éditer:

Trois ans plus tard, après avoir posé cette question, j'ai vu aujourd'hui un problème similaire. Le problème est que vim peut afficher 256 couleurs en dehors de screen et screen peut afficher 256 couleurs avec un script de test, mais vim ne peut pas en afficher couleur (ne peut afficher que le noir et blanc) à l'intérieur de screen. Juste pour me faire remarquer, voici le .screenrc fichier que j'utilise

hardstatus alwayslastline "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %Y-%m-%d %c"
Shell "bash"
startup_message off
vbell off
altscreen on
attrcolor b ".I"
defbce "on"
termcapinfo xterm* 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
term screen-256color

La solution au problème est déjà mentionnée dans la réponse acceptée, à savoir, je dois inclure

export TERM=xterm-256color

dans .bashrc.

46
FJDU

Réponse courte

Définissez TERM sur xterm-256color dans votre .bashrc, et met term screen-256color dans votre .screenrc.

Longue réponse

Voici pourquoi cela se casse: gnome-terminal, screen, tmux, bash, PuTTY et vim ont tous ont été écrits pour gérer intelligemment 256 couleurs, mais vous devez configurer les choses correctement le plus tôt possible. Utilisation de termcapinfo dans votre .screenrc est en fait une solution de ruban adhésif!

Si votre TERM est correctement défini, il signalera à bash que vous êtes en mode 256 couleurs, ce qui signifie qu'il jouera bien avec l'écran étant également en mode 256 couleurs.

Donc, dans votre .bashrc, export TERM=xterm-256color. [1]

Dans votre .screenrc, utilisation screen-256color pour TERM au lieu de xterm-256color, et supprimez le reste de la cruauté!

Dans votre configuration PuTTY, utilisez PuTTY-256color.

Vous pouvez télécharger les fichiers d'entrée termcap et les mettre dans ~/.terminfo/s et ~/.terminfo/p, si votre box n'en a pas par défaut.


notes de bas de page

[1] Définition de TERM sur xterm-256color dans votre .bashrc peut être un peu présomptueux, surtout si vous utilisez le même .bashrc sur plusieurs machines. J'ai trouvé l'extrait de code suivant assez efficace:

case "$TERM" in
*-256color)
    alias ssh='TERM=${TERM%-256color} ssh'
    ;;
*)
    POTENTIAL_TERM=${TERM}-256color
    POTENTIAL_TERMINFO=${TERM:0:1}/$POTENTIAL_TERM

    # better to check $(toe -a | awk '{print $1}') maybe?
    BOX_TERMINFO_DIR=/usr/share/terminfo
    [[ -f $BOX_TERMINFO_DIR/$POTENTIAL_TERMINFO ]] && \
        export TERM=$POTENTIAL_TERM

    HOME_TERMINFO_DIR=$HOME/.terminfo
    [[ -f $HOME_TERMINFO_DIR/$POTENTIAL_TERMINFO ]] && \
        export TERM=$POTENTIAL_TERM
    ;;
esac

Le alias de ssh est une mesure défensive pour nous empêcher d'essayer d'ouvrir un terminal 256 couleurs sur une machine distante qui ne le prend pas nécessairement en charge. Le bloc principal est l'autre moitié de l'équation; il vérifie si l'entrée terminfo correspondante existe et la définit si elle existe.

87
Max Cantor

Max a une excellente réponse, mais j'ai dû réinstaller écran avec ./configure --enable-colors256 pour vous assurer que le config.h le fichier avait #define COLORS256 1 set, ce qui n'était pas le cas par défaut sur ma machine. Ensuite, j'ai constaté que les autres paramètres n'étaient pas nécessaires tant que je m'assurais que mon TERM était réglé sur xterm-256color.

15
Nick Merrill

Dans la dernière version de screen (v4.99.0), il n'est pas nécessaire d'utiliser term screen-256color dans votre .screenrc. Même sans ce paramètre, la couleur vim à l'intérieur et à l'extérieur de l'écran est exactement la même.

Remarque 1: J'ai testé cette fonctionnalité sur Mac OS High Sierra 10.13.4 et Ubuntu 16.04.

On peut obtenir la dernière version d'écran en utilisant git clone https://git.savannah.gnu.org/git/screen.git.

Remarque 2: Contrairement à certaines des versions précédentes, alors que configuration cette version d'écran, il n'est pas nécessaire d'utiliser --enable-colors256 option

Remarque 3: Vous devez avoir le support PAM pour que cette configuration réussisse. Dans ubuntu, vous pouvez utiliser Sudo apt-get install libpam0g-dev

Remarque 4: Vous aurez besoin d'un accès Sudo sur Ubuntu tout en faisant make install car cette étape utilise chown.

1
Nikhil