Я могу выделить текущую быструю строку в zsh?

Терминалы VT100 (который все современные эмуляторы терминала эмулируют в некоторой степени) поддерживали много проблематичных команд, но современные эмуляторы или дистрибутивы отключают более проблематичные и менее полезные. Вот неисчерпывающий список потенциально опасных escape-последовательностей (не включая тех, которые просто делают дисплей нечитабельным в некотором роде):

  • Произвольный файл журнала управляет в rxvt и Eterm, о котором сообщает H.D. Moore. Это действительно главные ошибки, к счастью, долго исправляемые.
  • Команда ответа, также известная как Состояние Терминала Возврата, вызванное ENQ (Ctrl+E). Это вставляет текст в терминал, как будто пользователь ввел его. Однако этот текст не находится под контролем взломщика: это - собственное имя терминала, обычно что-то как xterm или screen. В моей системе (Debian сжимают), xterm возвращает пустую строку по умолчанию (этим управляют answerbackString ресурс).
  • Отправить команды Атрибутов устройств, ESC [ c и друзья. Терминал отвечает ESC [ … c (где может содержать только цифры и знаки пунктуации ASCII). Это - способ запросить некоторые терминальные возможности, главным образом устаревшие, но возможно используемые старыми приложениями. Снова, ответ терминала неотличим от ввода данных пользователем, но он не находится под контролем взломщика. Управляющая последовательность могла бы быть похожей на функциональную клавишу, но только если у пользователя есть необычная конфигурация (ни одна из обычных настроек, с которыми я встретился, имеет допустимую escape-последовательность функциональной клавиши, это - префикс терминального ответа).
  • Различные функции управления устройствами (Escape DCS, начинаясь ESC P).
    • Я не знаю то, какой вред может быть причинен через DECUDK (установите пользовательские ключи) на типичном эмуляторе терминала.
    • DECRQSS (Запросите Строку состояния), еще одна команда, к которой терминал отвечает escape-последовательностью, на этот раз начинаясь \eP; это может быть проблематично с тех пор \eP допустимый ключ (Alt+Shift+P).
    • Xterm имеет две более экспериментальных функции: ESC P + p … и ESC P + q …, получить и установить строки termcap. Из описания это могло бы использоваться, по крайней мере, для изменения эффекта функциональных клавиш.
  • Несколько команд отчета о состоянии: ESC [ … n (Отчет о состоянии устройства). Терминал отвечает escape-последовательностью. Большинство этих escape-последовательностей не соответствует escape-последовательностям функциональной клавиши. Каждый выглядит проблематичным: отчет ESC [ 6 n имеет форму ESC [ x ; y R где x и y последовательности цифры, и это могло быть похожим на F3 с некоторыми модификаторами.
  • Команды управления окном ESC [ … t.
    • Некоторые из них позволяют xterm окну быть измененным, представленным в виде значка, и т.д., который разрушителен.
    • Некоторые из них заставляют терминал отвечать любым escape-последовательность. Большинство этих escape-последовательностей смотрит низкий риск, однако существует две опасных команды: ответы на ESC [ 2 0 t и ESC [ 2 1 t включайте маркировку и заголовок значка окна терминала соответственно, и взломщик может выбрать их.
    • По крайней мере, под Debian сжимают, xterm игнорирует эти команды по умолчанию; им можно включить путем установки allowWindowOps ресурс, или выборочно через disallowedWindowOps ресурс. Терминал Gnome в соответствии с Ubuntu 10.04 реализует даже ответы заголовка по умолчанию. Я не проверил другие терминалы или версии.
  • Команды для установки терминального заголовка или имени значка. Под xterm и большинством других X терминалами, они ESC ] digit ; title ESC \. Под Экраном escape-последовательность ESC k title ESC \. Я нахожу, что озабоченность по поводу этих команд переоценила. В то время как они действительно позволяют некоторую сумму вреда, любая веб-страница имеет ту же проблему. Действие на оконное только на его заголовке а не на его классе сродни открытию файла, имя которого было дано Вам недоверяемой стороной или не заключением в кавычки переменного расширения в сценарии оболочки, или ласка бешеной собаки на носу — не жалуется, укушены ли Вы.

Я нахожу ответ Лака лицемерным. Это, чувствует, что это или пытается свалить вину, или в режиме нациста безопасности (любая проблема безопасности, подлинная или нет, выравнивает по ширине баллотирование функции).

Мудрость терминальных Escape ответа в целом была подвергнута сомнению равномерно, но тем не менее ни одна из главных программ эмуляции терминала не сочла целесообразным отбрасывать эти последовательности, вероятно, в дезинформированной попытке совместимости без дольше используемого 1970'es технология. (…)
Вместо того, чтобы обвинить любого и все программы, который пишет файлы журнала, было бы намного более продуктивно, с точки зрения безопасности, заставить программы эмуляции терминала прекращать делать глупые вещи и таким образом фиксировать это и другие проблемы безопасности раз и навсегда.

Многие ответы являются полезными функциями: приложение действительно должно знать вещи как позиция курсора и размер окна. Установка заголовка окна также очень полезна. Было бы возможно положиться полностью на ioctl призывы к ним, однако это потребовало бы, чтобы дополнительный код и утилиты сделали их ioctl вызовы и транссъели их в текст стиля Unix, передающий дескрипторы файлов. Изменение этих интерфейсов теперь было бы большой работой для небольшого преимущества.

Текстовые файлы, как предполагается, не содержат непечатаемые символы, такие как управляющие символы. Файлы журнала, как обычно ожидают, будут текстовыми файлами. Файлы журнала не должны содержать управляющие символы.

Если Вы волнуетесь, что файл мог бы содержать escape-последовательности, открыть его в редакторе или просмотреть его с less без -r или -R опция или представление это через cat -v.

8
01.05.2011, 00:16
3 ответа

Попробуйте установку RPROMPT к пробелам. Количество пробелов должно быть терминальной шириной (минус # и другие символы.)

1
27.01.2020, 20:13
  • 1
    , можно ли указать точную команду? –  kirill_igum 29.05.2012, 02:09

Можно сделать что-либо, что Вы хотите с быстрой строкой* - проблематичный аспект заставляет ее отменять ее позже. Я предполагаю, что Вы не хотите каждую строку, которая когда-либо имела подсказку на отображенном в Ваших цветах hilight.

Почти было бы легче удалить строку позже, но затем у Вас нет своей команды. Возможно, удалите подсказку, затем повторяют команду (с псевдоподсказкой как $). У Вас могла быть подсказка, начинаются с курсора ANSI, сохраняют последовательность ESC [s, затем в a precmd восстановите его ESC [u и очистите все после курсора ESC [0J, затем повторите команду (я не вспоминаю, как получить команду изнутри precmd).

*Это - неполный ответ, я не знаю, как сделать его hilight команда в другом цвете фона.

1
27.01.2020, 20:13

Если я изменяюсь grey кому: white, Ваш пример на самом деле работает на меня.

Какой терминал Вы используете? Возможно, это обрабатывает стирание цвета фона по-другому?

Вот некоторые альтернативы попытке:

Дайте всей быстрой строке серый фон:

setopt promptsubst
preexec() {
    tput sgr0
}
PS1="$(tput setab 7)# "

(должен совпасть с Вашим примером, но другим способом записать это.)

Распечатайте строку перед подсказкой:

precmd() {
    tput smul
    for ((n=0; n<COLUMNS; n++)) { printf " "; }
    printf "\n"
}
preexec() {
    tput sgr0
}

(Если Вы изменяетесь "\n" кому: "\r", это должно подчеркнуть текущую строку, но это, кажется, не работает. Я предполагаю, что zsh стирает текущую строку при печати подсказки, которая является тем, что приводит меня к первому решению.)

Сделайте команды (т.е. все, что Вы вводите), полужирный:

setopt promptsubst
preexec() {
    tput sgr0
}
PS1="# $(tput bold)"
1
27.01.2020, 20:13

Теги

Похожие вопросы