Странное поведение цвета vim внутри экрана с 256 цветами

Я пытался выделить подсветку синтаксиса (с 256 цветами) vim внутри screen, которая работает внутри gterm.

Вначале он работает отлично. То, что я подразумеваю под "в начале", после того, как я запустил screen и введите vim, цвета выглядят прекрасно, и на самом деле имеется 256 цветов.

Но через некоторое время (я не знаю точно, как долго) цвета автоматически возвращаются к внешнему виду, как будто есть только 8 (или 16?) цветов.

Например, после того, как это уже произошло, если я введу команду

hi Comment ctermfg=68

внутри vim, комментарии кажутся "чистыми" зелеными; однако, если я открою другой внешний экран vim (в том же терминале), то с той же командой комментарии выглядят как "желтоватый" зеленый цвет.

Ниже перечислены мои настройки .screenrc, относящиеся к цвету:

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

После запуска python script, чтобы отобразить все цвета, я обнаружил, что, возможно, это проблема самого экрана и не имеет ничего общего с vim.

Что я сделал, внутри сеанса screen с проблемами, этот script дает 256 цветов, но многие из них на самом деле одинаковы; однако, когда я запускаю новый сеанс сеанса с той же конфигурацией, этот script дает 256 цветов, которые отличаются друг от друга.

Edit:

Вчера вечером я подключился к своему компьютеру Linux (который находится в моем офисе, и он всегда включен) с помощью putty, а затем открыл сеанс screen с несколькими окнами в нем. Цвета правильные прошлой ночью. Затем, прежде чем я заснул, отключил сеанс screen и закрыл putty.

Теперь, когда я снова присоединяю этот сеанс screen в putty, крах цветов: они выглядят так, как будто есть только 8 цветов.

Цвета находятся вне screen (но все еще в putty).

Edit:

Спустя три года после того, как я задал этот вопрос, сегодня я увидел подобную проблему. Проблема в том, что vim может отображать 256 цветов вне screen, а screen может отображать 256 цветов с тестом script, но vim не может отображать какой-либо цвет (может отображаться только черно-белый) внутри screen. Как примечание для себя, вот файл .screenrc, который я использую

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

Решение проблемы уже упоминалось в принятом ответе, а именно: мне нужно включить

export TERM=xterm-256color

в .bashrc.

Ответ 1

Краткий ответ

Установите TERM в xterm-256color в .bashrc и поместите term screen-256color в .screenrc.

Длинный ответ

Вот почему это ломается: gnome-terminal, screen, tmux, bash, putty и vim все были написаны, чтобы разумно обрабатывать 256 цветов, но вам нужно правильно настроить вещи в кратчайшие возможные сроки. Использование termcapinfo в вашем .screenrc на самом деле является решением для ленточных конвейеров!

Если ваш TERM установлен правильно, он будет сигнализировать bash о том, что вы находитесь в режиме с 256 цветами, что означает, что он будет играть хорошо, а экран будет в 256-цветном режиме.

Итак, в .bashrc, export TERM=xterm-256color. [1]

В .screenrc используйте screen-256color для TERM вместо xterm-256color и удалите остальную часть трещины!

В конфигурации PuTTy используйте putty-256color.

Вы можете загрузить файлы записи termcap и поместить их в ~/.terminfo/s и ~/.terminfo/p, если по умолчанию у вас их нет.


Сноска

[1] Настройка TERM на xterm-256color в вашем .bashrc может быть немного самонадеянным, особенно если вы используете один и тот же .bashrc на нескольких машинах. Я нашел следующий сниппет достаточно эффективным:

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

alias ssh - это защитная мера, которая мешает нам пытаться открыть 256-цветной терминал на удаленной машине, которая не обязательно поддерживает его. Основной блок - другая половина уравнения; он проверяет, существует ли соответствующая запись terminfo, и устанавливает ли она ее.

Ответ 2

Макс имеет отличный ответ, но на самом деле мне пришлось переустановить экран с ./configure --enable-colors256, чтобы установить config.h файл #define COLORS256 1, который был а не по умолчанию на моей машине. Затем я обнаружил, что другие настройки не нужны, пока я не установил, что мой TERM установлен на xterm-256color.