Поддержка 256 цветов для vim background в tmux

98

при использовании vim в tmux я вижу, что включена поддержка 256 цветов. с $ tput цветами

Однако изменение схемы цветов в vim в tmux изменит схему цветов для каждой строки, но не для всего фона. смотреть скриншотвведите описание изображения здесь

Вот фрагмент моего файла .vimrc, например. Моя оригинальная цветовая схема соляризована и затем после запуска: colorscheme molokai вы видите, что происходит.

Информация

  • гном-терминал
  • удар

в моем ~ / .tmux.conf

    set -g default-terminal "screen-256color"

в моем ~ / .vimrc

    set t_Co=256

в моем ~ / .bashrc

# ryan
export TERM="xterm-256color"
# ryan
alias tmux="tmux -2"

в моем ~ / .profile

# ryan 256 color support
if [ -e /usr/share/terminfo/x/xterm-256color ]; then
    export TERM='xterm-256color'
  else
    export TERM='xterm-color'
  fi

Любые идеи, как я могу получить полное изменение цвета в Vim? Все ли мои фрагменты из файлов выглядят хорошо?

winchendonsprings
источник
Что произойдет, если вы нажмете control-l в обычном режиме или выполните команду ": redraw"?
Гептит
@ Hepite ничего не происходит, изменение цвета в каждой строке, как на скриншоте
winchendonsprings

Ответы:

75

Судя по вашим .bashrc и .profile, оболочки внутри tmux переопределяют параметр 'default-terminal' в вашей конфигурации tmux. Что-то вроде этого:

  • tmux создает новую оболочку с TERM=screen-256color
  • .bashrc / .profile запустить, установить TERM=xterm-256color
  • vim работает, пытается использовать неверный TERM для tmux

Вы можете проверить это, запустив

echo $TERM

в свежей оболочке tmux.

Tmux довольно требователен к правильной настройке терминала. Если вы можете, установите значение термина в конфигурации терминала gnome, а не в вашем .bashrc. В противном случае, окружите эти настройки проверкой TERM «screen» или «screen-256color» и не сбрасывайте их в этом случае.

Tmux ДЕЙСТВИТЕЛЬНО хочет, чтобы терминал был установлен screenилиscreen-256color

Блуа
источник
5
Ну, вы исправили это. Я просто закомментировал что-то в моих файлах .bashrc и .profile, которые касались установки цвета на 256. Перезапущенный tmux и vim работает с правильным фоном и 256 включенными цветами. Можете ли вы сказать мне, где находится файл конфигурации терминала gnome? Также, когда вы говорите, что tmux хочет, чтобы для терминала было установлено значение 'scfeen-256color, вы хотите сказать, что он есть в моем файле tmux.conf? Спасибо
Winchendonsprings
У меня нет машины с gnome-терминалом, которую можно было бы проверить, но настройки должны быть где-то в графическом интерфейсе, возможно, в «настройках профиля» или что-то в этом роде.
кровавый
5
Кроме того, да, пусть tmux делает свое дело с порожденными им оболочками. Оставьте set -g default-terminal "screen-256color"строку в вашем Tmux Conf.
кровавый
2
Все вышеперечисленное - это то, что я делал после (убедившись, что TERM правильно установлен и не переопределен в tmux), и ТОГДА мне пришлось использовать tmux -2, чтобы загрузить tmux.
фантомный кит
Попробуй if [[ $TERM == xterm ]]; then TERM=xterm-256color; fi, у меня это сработало.
асимметричный
59

Как объяснялось здесь , отключите фоновое стирание цвета (BCE), очистив параметр t_utтерминала (запустите :set t_ut=в Vim, а затем нажмите Control+, Lчтобы обновить дисплей терминала), чтобы цветовые схемы работали правильно, когда Vim используется внутри экранов tmux и GNU.

sunaku
источник
7
это единственное, что наконец-то сработало для меня!
Oz123
3
Я закончил тем, что добавил set t_ut=в свой vimrc, что устраняет необходимость использовать команду вручную, и нет необходимости использовать <kbd> Control </ kbd> + <kbd> L </ kbd>, так как сеанс начинается с отключенной BCE.
erran
Это важно при использовании PuTTY. Все комбинации TERM терпят неудачу, когда у схемы цветов есть фон. Отличное дополнение к теме.
Ботимер
Это работает, однако, когда это решение применяется, копирование и вставка с помощью мыши также копирует и вставляет конечные строки пробелов (если они выделены.)
конский волос
17

Я нашел лучший способ в этом посте . Вы можете создать псевдоним tmux, tmux -2который заставит tmux предположить, что оболочка использует терминал с 256 цветами.

Boogy
источник
4

Вот что у меня сработало в #Ubuntu и #Mac:

# File: ~/.bashrc (Ubuntu), ~/.bash_profile (Mac)
# for VIM and TMUC
if [ "$TERM" = "xterm" ]; then
  export TERM=xterm-256color
fi
alias tmux='tmux -2'  # for 256color
alias tmux='tmux -u'  # to get rid of unicode rendering problem

Перезагрузить настройки:

$ source ~ / .bashrc # Ubuntu

$ source ~ / .bash_profile # Mac

Настройте .bashrc для Mac (как он используется в tmux)

# File: ~/.bashrc (Mac)
source ~/.bash_profile

Установите параметр «терминал по умолчанию» в ~ / .tmux.conf.

# File: ~/.tmux.conf
set -g default-terminal "screen-256color"  # Mac and Ubuntu
Munish
источник
1

Быстрое решение заключается в запуске следующего в терминале.

export TERM=xterm-color

Вы можете добавить его в свой ~/.bash_profileили другой профиль, чтобы всегда устанавливать на старте.

Питер Дитц
источник
Спасибо! Это было все, что мне нужно было добавить, .zshrcчтобы визуальный режим был действительно видимым.
danmcardle
1

У меня была очень похожая проблема для gnome-terminal + tmux + vim, но она была распространена и на конкретную проблему комбинации клавиш:. Мне пришлось объединить несколько вещей вместе. Прежде всего мне нужно было настроить мой .tmux.conf в:

# Ensure terminal starts with its own colour scheme (helps Vim/Neovim themes to not break)
set -g default-terminal "xterm-256color"
# set -g default-terminal "screen-256color" # no S-Fx keys ;-(
# and ensure the key-codes are xterm alike
set -g xterm-keys on

Тогда в .vimrc:

if $COLORTERM == 'gnome-terminal'
      set t_Co=256
endif
set t_ut=

И это сделало работу для ключей и фона.

P4C
источник
1

Если вы по-прежнему сталкиваетесь с проблемами: я заметил, что vim возвращается к использованию параметра t_Co=8в tmux, даже если $TERMон установлен в screen-256color. Мой обходной путь - этот фрагмент в vimrc:

if exists("$TMUX")
        set t_Co=256
        set notermguicolors
else
        set termguicolors
endif

$TMUXПеременная заполняется только , если внутри tmux сессии. В этом случае я разрешаю vim использовать 256 цветов. Обратите внимание, что я также отключил termguicolors, так как tmux не поддерживает истинные цвета.

lgalke
источник
0

Просто сейчас столкнулся с такой же проблемой. Основываясь на ответе Блоя и текущем содержании моего ~ / .profile (фактически, он такой же, как у winchendonsprings ), я решил свою проблему следующим образом:

~/.profile:

if [[ -z $TMUX ]]; then
    if [ -e /usr/share/terminfo/x/xterm+256color ]; then # may be xterm-256 depending on your distro
        export TERM='xterm-256color'
    else
        export TERM='xterm'
    fi
else
    if [ -e /usr/share/terminfo/s/screen-256color ]; then
        export TERM='screen-256color'
    else
        export TERM='screen'
    fi
fi

Логика проста: если мы не находимся внутри сессии tmux, тогда используем xterm (цветной или нет). В противном случае то же самое для экрана.

Может быть, это слишком многословно, но у вас есть идея.

evilguc
источник