Странное поведение цвета vim на экране с 256 цветами - PullRequest
44 голосов
/ 22 июля 2011

Я пытался заставить подсветку синтаксиса (с 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 для отображения всех цветов я обнаружил, что, возможно, это проблема самого экрана, и он не имеет ничего общего с vim.

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

Редактировать:

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

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

Цвета хороши снаружи screen (но все еще в putty).

Редактировать:

Три года спустя после того, как я спросилНа этот вопрос сегодня я увидел похожую проблему.Проблема в том, что vim может отображать 256 цветов за пределами screen, а screen может отображать 256 цветов с помощью тестового сценария, но 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.

Ответы [ 3 ]

86 голосов
/ 03 августа 2011

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

Установите 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

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

15 голосов
/ 09 мая 2013

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

1 голос
/ 25 июля 2018

В последней версии экрана (v4.99.0) нет необходимости использовать term screen-256color в вашем .screenrc.Даже без этой настройки цвет vim на внутреннем и внешнем экранах одинаков.

Примечание 1. Я протестировал эту функцию на Mac OS High Sierra 10.13.4 и Ubuntu 16.04.

Oneможно получить последнюю версию экрана, используя git clone https://git.savannah.gnu.org/git/screen.git.

Примечание 2: В отличие от некоторых предыдущих версий, при настройке этой версии экрана нет необходимости использовать --enable-colors256 параметр

Примечание 3: Вам необходимоиметь поддержку PAM для этой конфигурации, чтобы быть успешным.В Ubuntu вы можете использовать sudo apt-get install libpam0g-dev

Примечание 4. Вам потребуется sudo доступ к Ubuntu при выполнении make install, так как на этом шаге используется chown.

...