Вопрос или проблема
Я использую настраиваемую запись terminfo для tmux с 2020 года. Она выглядит следующим образом:
# Запись TERMINFO для tmux-256color, добавляющая escape-последовательности для курсивного текста.
#
# Установка:
#
# tic tmux-256color.terminfo
#
# Использование:
#
# export TERM=tmux-256color
#
tmux-256color|tmux с 256 цветами и курсивом,
use=screen-256color,
sitm=\E[3m, ritm=\E[23m,
smso=\E[7m, rmso=\E[27m,
Сегодня я скомпилировал ее, наверное, впервые за долгое время с помощью tic -x …
. Теперь, когда я запускаю оболочку в tmux, я получаю (дважды) сообщение об ошибке
"/Users/<me>/.terminfo/74/tmux-256color": поврежденные данные, найденные в convert_strings
которое я проследил до этого патча (также известного как ошибка, отчет, релиз)…
…но, похоже, все работает.
У меня открыта оболочка с предыдущей версии; сравнение старого infocmp -x
с новым выводом показывает (с некоторым контекстом)
*** /tmp/a 2024-10-09 18:26:49.000000000 -0400
--- /tmp/b 2024-10-09 18:26:53.000000000 -0400
***************
*** 1,7 ****
# Восстановлено via infocmp из файла: /Users/<me>/.terminfo/74/tmux-256color
tmux-256color|tmux с 256 цветами и курсивом,
! am, km, mir, msgr, xenl,
colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767,
acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
--- 1,7 ----
# Восстановлено via infocmp из файла: /Users/<me>/.terminfo/74/tmux-256color
tmux-256color|tmux с 256 цветами и курсивом,
! OTbs, OTpt, am, km, mir, msgr, xenl, , ,
colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767,
acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
Я не знаю, что такое OTbs, OTpt,
, и дополнительные запятые выглядят странно.
Теперь, если передать неправильный infocmp -x
в xxd
, то видно, что запятые содержат странные байты:
00000070: 7273 2061 6e64 2069 7461 6c69 632c 0a09 rs and italic,..
00000080: 4f54 6273 2c20 4f54 7074 2c20 616d 2c20 OTbs, OTpt, am,
00000090: 6b6d 2c20 6d69 722c 206d 7367 722c 2078 km, mir, msgr, x
000000a0: 656e 6c2c 201b 2842 2c20 2c0a 0963 6f6c enl, .(B, ,..col
В частности, .(B, ,
— это 201b 2842 2c20 2c…
.
Единственная другая запись terminfo для tmux-256color
, которую я имею на этой системе, — это запись из установленного через brew ncurses, версии 6.5, и file
говорит, что это 32-битная запись. Мой infocmp
не может ее прочитать, а копирование ее в ~/.terminfo/…
делает так, что и другие программы (например, Vim) перестают понимать информацию о терминале.
Запись screen-256color
основана на /usr/share/terminfo/73/screen-256color
(комментарий “GNU Screen с 256 цветами”), и она также показывает как странные байты, так и странные OTbs, OTpt,
в выводе infocmp -x
как в старых, так и в новых оболочках. Я не трогал этот файл, насколько мне известно.
Странно, но изменение строки set -g default-terminal
на screen-256color
и затем запуск нового сервера с tmux -L test new
показывает без ошибок. Тем не менее infocmp -x
по-прежнему показывает странные байты и OTbs, OTpt,
.
Мой эмулятор терминала — Alacritty 0.13.2, и я в настоящее время использую tmux 3.4. Операционная система — macOS 12.7.2.
Итог
Что пошло не так и как это исправить?
Ответ или решение
Судя по вашему описанию, проблема с ошибкой "corrupt data found in convert_strings" в tmux-256color
возникает из-за изменения в формате терминофайлов в результате патча. Похоже, что ваш пользовательский терминофайл становится несовместимым с текущей версией ncurses
, установленной на вашей системе.
Вот шаги, которые вы можете предпринять для решения проблемы:
-
Проверьте совместимость: Убедитесь, что ваш пользовательский терминофайл
tmux-256color.terminfo
соответствует ожиданиям текущей версииncurses
. Возможно, вам потребуется обновить его, чтобы исключить новые поля или параметры, которые могли быть добавлены в недавних версиях. -
Исправьте терминофайл: Возможно, вам нужно будет внести изменения в
tmux-256color.terminfo
. Можете попробовать удалить или заменить строки, которые вызывают конфликты или ошибки. Например, удаление нетрадиционных параметров (таких какOTbs
,OTpt
), если они становятся причины проблем. Например, ваш терминофайл может выглядеть как-то так:tmux-256color|tmux with 256 colors and italic, use=screen-256color, sitm=\E[3m, ritm=\E[23m, smso=\E[7m, rmso=\E[27m, am, km, mir, msgr, xenl, colors#256, cols#80, it#8, lines#24, ncv#3, pairs#32767, acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[J, cnorm=\E[34h\E[?25h, cr=^M,
-
Сгенерируйте новый терминофайл: После внесения изменений с помощью
tic -x
может потребоваться пересоздать ваш терминофайл. Пример команды:tic -x tmux-256color.terminfo
-
Очистите кеш терминалов: Если ваша система использует кеш для терминофайлов, возможно, вам придется очистить его или пересоздать его заново. Это можно сделать, удалив каталог, где он хранится. Например, для вашего пользователя:
rm -rf ~/.terminfo
-
Проверка после изменений: После выполнения этих шагов вы можете запустить
infocmp tmux-256color
и обратить внимание на вывод. Убедитесь, что он не содержит ошибок и лишних символов. -
Файлы терминалов из brew: Если вы продолжаете сталкиваться с конфликтами, убедитесь, что вы не имеете конфликтующих терминофайлов, поставляемых с
brew
. Вы можете попробовать удалить их или адаптировать, если они вызывают проблему.
Если эти шаги не помогут, вы можете рассмотреть возможность использования стандартного терминофайла без ваших модификаций, пока вы решаете проблему с совместимостью.
Если у вас есть дополнительные вопросы или нужны разъяснения по какому-либо из шагов, не стесняйтесь спрашивать!