Вопрос или проблема
Я использую byobu на 24.10, и наблюдаю очень странное поведение при использовании ctrl-P для отображения предыдущей команды, когда (1) предыдущая команда переносится на следующую строку, и (2) прошедшее время является частью подсказки.
Когда я это делаю, место, где я вижу курсор, и место, куда текст вставляется в редактируемую команду, различаются.
Например: у меня есть
[0.009s] me@machine:/tmp/a_directory_with_oh_such_a_very_long_name_five_boxing_wizards_jumped_quickly_4747474747363221987426874623948762387645239807423087$ ls file-1-with-a-long-name-
rurioewrewuioewrioweuoiwuepweoiurpoiuewr
-rw-rw-r-- 1 me me 0 Dec 7 06:59 file-1-with-a-long-name-rurioewrewuioewrioweuoiwuepweoiurpoiuewr
me@machine:/tmp/a_directory_with_oh_such_a_very_long_name_five_boxing_wizards_jumped_quickly_4747474747363221987426874623948762387645239807423087$
Обратите внимание, что команда переносится после name-
в строке, где я запускаю ls
.
Теперь я хочу отредактировать эту команду и изменить что-то не в самом конце — скажем, мне нужно добавить флаг после команды. Я использую ctrl-P, затем ctrl-A, и теперь я вижу:
[0.009s] me@machine:/tmp/a_directory_with_oh_such_a_very_long_name_five_boxing_wizards_jumped_quickly_4747474747363221987426874623948762387645239807423087$ ls file-1-with-a-long-name-rurioewrewuioewrioweuoiwuepweoiurpoiuewr
-rw-rw-r-- 1 me me 0 Dec 7 06:59 file-1-with-a-long-name-
rurioewrewuioewrioweuoiwuepweoiurpoiuewr
me@machine:/tmp/a_directory_with_oh_such_a_very_long_name_five_boxing_wizards_jumped_quickly_4747474747363221987426874623948762387645239807423087$ 423087$ ls file-1-with-a-long-name-
rurioewrewuioewrioweuoiwuepweoiurpoiuewr
Посмотрите на последнюю строку: она показывает часть подсказки $
дважды:
...9807423087$ 423087$ ls file-1-with-a-long...`
Она повторяет часть “423087”. Более того, курсор находится на первом $
. Если я двигаюсь вперед так, чтобы курсор оказался после ls
, и редактирую, а затем нажимаю Enter, я вижу:
me@machine:/tmp/a_directory_with_oh_such_a_very_long_name_five_boxing_wizards_jumped_quickly_4747474747363221987426874623948762387645239807423087$ 423087$ ls -h ith-a-long-name-rurio
ewreurioewrewuioewrioweuoiwuepweoiurpoiuewr
ls: cannot access 'file-1-w-h': No such file or directory
ls: cannot access 'ith-a-long-name-rurioewrewuioewrioweuoiwuepweoiurpoiuewr': No such file or directory
Я попытался добавить -h
, но оболочка восприняла это как часть имени файла. То, что отображается, и то, что отправляется в оболочку, различаются.
Что вызывает это поведение, и как я могу это исправить? Это какая-то ошибка tmux? Связано ли это с странной вещью с прошедшим временем слева?
Это как-то связано с особыми подсказками PS0 и PS1 byobu. Если я запущу byobu-disable-prompt
, я получу свою обычную подсказку bash, и все работает как ожидалось.
Таким образом, это кажется ошибкой в $PS1
этой подсказки, которая для меня выглядит следующим образом:
[0.011s] me@machine:~$ echo $PS1
\[\e[38;5;202m\]$(byobu_prompt_status)\[\e[00m\]$(byobu_prompt_runtime) \[\e[38;5;245m\]\u\[\e[00m\]@\[\e[38;5;172m\]\h\[\e[00m\]:\[\e[38;5;5m\]\w\[\e[00m\]$(byobu_prompt_symbol)
Что-то с управляющими последовательностями работает неправильно. Я не знаю что; если я погружусь глубже в эту тему, я окажусь в расплавленном железе ядра земли…
Просто отключение подсказки с помощью byobu-disable-prompt
для меня вполне достаточно.
та же проблема. Возможное решение для получения чистой строки команды — редактировать строку в самом ее конце (иногда это очищает лишние части) или попробовать подняться на одну строку выше и затем спуститься обратно на одну строку. Надеюсь, автор(ы) скоро это исправят!
Ответ или решение
Проблема странного поведения предыдущей команды в Byobu при использовании комбинации клавиш Ctrl-P
, что описано вами, действительно может вызывать дискомфорт при работе в терминале, особенно когда это связано с отображением времени выполнения и многострочным выводом. Давайте подробно разберем основные элементы вашей ситуации и возможные решения.
Контекст проблемы
Ваша проблема заключается в том, что при вызове предыдущей команды с помощью Ctrl-P
происходит несоответствие между позицией курсора и фактическим местом вставки текста в команде. Это обуславливается спецификой настройки промпта, который используется в Byobu, и, скорее всего, связано с кодами escape, управляющими цветом и отображением текста.
Причины возникновения проблемы
-
Строка состояния и кодирование цветов: Ваш текущий сырой формат
$PS1
включает escape-последовательности, которые изменяют цвет текста и могут приводить к путанице в позиционировании курсора. При использовании многострочных команд длина строки на экране не соответствует фактической длине команды, учитывающей эти escape-последовательности. -
Многострочный вывод: Когда ваша команда выводится на несколько строк (например, из-за длинного имени файла), это может дополнительно усугубить проблему, так как текст, который вы видите, не соответствует фактической строке команды, как это интерпретирует оболочка.
-
Отображение времени выполнения: Ваша строка имеет особый вид с отображенным временем выполнения, что также может влиять на форматирование вывода и позиционирование курсора.
Возможные решения
-
Отключение специального промпта: Как вы уже заметили, отключение специального промпта с помощью команды
byobu-disable-prompt
позволяет вернуть стандартный Bash-промпт, что упростит ввод команд. Это может служить временным решением, если работа должна быть выполнена быстро и без ошибок. -
Настройка
$PS1
: Например, вы можете попробовать изменить последовательности escape таким образом, чтобы аккуратно визуализировать цвета, либо временно убрать их, чтобы устранить путаницу с курсором. Версия вашего$PS1
могла бы выглядеть следующим образом:PS1="\u@\h:\w$ "
-
Обновление Byobu и оболочки: Убедитесь, что у вас установлены последние обновления Byobu и используемой оболочки (например, Bash). Иногда проблемы могут быть вызваны устаревшими версиями программного обеспечения, которые были исправлены в более новых релизах.
-
Использование альтернативных методов редактирования: Если вы сталкиваетесь с этой проблемой, попробуйте перемещаться к концу строки перед редактированием команды. Кроме того, как было упомянуто, использование клавиши
Up
для возврата к предыдущей команде может иногда помочь «очистить» строку дисплея.
Заключение
Кратко подводя итог, основная причина вашего затруднения в Byobu заключается в конфликте между визуализацией вашего промпта и фактическим текстом команды, причем это наложение рендеринга возможно из-за escape-последовательностей. Предложенные решения могут помочь вам устранить текущие неудобства, однако обратите внимание на совместимость используемых параметров до окончательной настройки. Мы надеемся, что разработчики Byobu обратят внимание на этот вопрос и внесут необходимые исправления для улучшения пользовательского опыта.