Странное поведение цвета 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
.