2015-07-01 4 views
2

Я искал несколько ответов здесь и через Google, но я все еще не уверен, что происходит с моей подсказкой.Проблемы с заменой ZSH

Согласно документации, я прочитал, что это должно работать

setopt prompt_subst 
autoload -U colors && colors 
PROMPT="%{[00m[38;5;245m%}test %D%{[00m%}" 

Моя подсказка заключается в следующем, однако:

[00m[38;5;245mtest 15-07-01[00m 

Обратите внимание, что расширение дата на самом деле работал, поэтому приглашение замена за работой. На страницах руководства ZSH для быстрого расширения указано, что %{...%} следует рассматривать как исходный код выхода, но это, похоже, не происходит. Передача этой строки в print -P также приводит к выходу выше. Я нашел примеры запросов в Интернете для ZSH, которые также, похоже, указывают на то, что приведенный выше синтаксис должен работать. См. this для одного примера: массивы $ FG и $ FX заполняются кодами побега и определены here. Я пробовал этот пример напрямую, объединив оба файла выше, добавив setopt prompt_subst в начало, чтобы убедиться, что он установлен, затем поиск его и подсказка - беспорядок escape-кодов.

следующие работы

setopt prompt_subst 
autoload -U colors && colors 
PROMPT=$'%{\e[00m\e[38;5;245m%}test %D%{\e[00m%}' 

я получаю ожидаемый результат test 15-07-01 в правильный цвет.

Я тестировал это на ZSH 5.0.5 в OSX Yosimite, 5.0.7 от MacPorts и 4.3.17 на Debian, с теми же результатами. Я знаю, что я представил правильное решение моей проблемы здесь с рабочим примером, но мне интересно, почему первый синтаксис не работает, как кажется.

+0

Здесь нет проблем; если в документации, которую вы читаете, отсутствует символ escape, это неправильно. Коды ANSI, которые инструктируют терминал переключать цвета, начинаются с 'ESC [', а не только ''. – chepner

+1

Обратите внимание, что проще использовать встроенные экраны для изменения цвета, чем для обработки необработанных контрольных последовательностей. 'prompt ="% F {245} test% D% f "' – chepner

+1

Вы можете предположить, что '% {...%}' предоставляет escape-символ для начала каждой последовательности; то, что он на самом деле делает, просто инструктирует оболочку, что содержимое фигурных скобок занимает нулевое пространство на выходе, поэтому можно вычислить правильную длину экрана на экране. – chepner

ответ

0

Я думаю, что все это связано с бесконечной и многолетней проблемой побега. Стоит напомнить себе, что ускользает, кратко: escape-символ является индикатором для компьютера, что следующее следует не выводить буквально.

Итак, есть 2 миновать проблемы с: PROMPT="%{[00m[38;5;245m%}test %D%{[00m%}"

  1. Во-первых, управляющие последовательности цвета (например; [00m) все должны начинаться с символа управления, как так \e[00m. Возможно, вы также видели его как ^[00m и \003[00m. То, что я подозреваю, произошло, это одна из разновидностей, которая постигла общую судьбу непреднамеренного утечки либо копией/вставкой автора, либо фреймом структуры веб-сайта, будь то где-то в базе данных, рендеринг HTTP или JS-анализ. Управляющий символ (т. Е. ^, \e или \003), как вы, наверное, знаете, не имеет буквального представления, скажем, если вы нажмете его на клавиатуре. Вот почему веб-стек может решить не отображать ничего, если видит его в строке. Итак, давайте исправим это сейчас:

    PROMPT="%{\e[00m\e[38;5;245m%}test %D%{\e[00m%}"

  2. Это действительно красиво перетекает в следующий выпуск побеге. Несколько смешно \e[ на самом деле представляет собой ESC, поэтому он сам по себе является маркером escape-последовательности, который, в свою очередь, экранирован \. Это рифф на старом \\\\\\\\\\ вид шутки.Теперь важно, мы должны быть ясно, о разнице между спасательным выражений для терминала и строковых подстановок строки в псевдокоде:

    PROMPT="%{terminal colour stuff%}test %D%{terminal colour stuff%}"

    Теперь то, что я подозреваю, что происходит, хотя я не могу найти документацию, чтобы доказать это, заключается в том, что после того, как ZSH выполнил свои подстановки, или даже во время процесса подстановки, все литералы, независимо от значений escape, продвигаются до реальных символов¹. Чтобы еще дальше фарс, эта акция, скорее всего, будет выполнена, избежав всех символов побега. Например, если вы действительно хотите напечатать '\ e' в командной строке, вы должны сделать echo "\\\e". Таким образом, чтобы преодолеть этот вопрос, мы просто должны убедиться, что «терминал цветной материал» экранирующие последовательности получить оценку до того назначаются на PROMPT и что может быть сделано просто с $'' рисунком, например, так:

    PROMPT=$'%{\e[00m\e[38;5;245m%}test %D%{\e[00m%}'

    Обратите внимание, что $'' имеет того же рода, как и $()${}, за исключением того, что его единственная функция заключается в интерпретации управляющих последовательностей.

[1] Мое подозрение на это основано на том, что вы можете сделать что-то вроде следующего:

PROMPT='$(date)'

где $(date) служит той же цели, как %D , напечатав в реальном времени версию даты для каждого нового приглашения на экран. Что демонстрируют эти конкретные примеры, так это то, что переменную PROMPT действительно следует рассматривать как хранилище для мини-скрипта, а не строку (хотя, по общему признанию, существует перекрытие между двумя концепциями и, следовательно, путаница стеблей). Поэтому в качестве скрипта строка первая оценена и затем печатается. Я не смотрел на код рендеринга ZSH, но я предполагаю, что такая оценка выиграет от использования нативного использования escape-последовательностей. Например, что делать, если вы хотите передать escape-последовательность в качестве аргумента в команду (команда, которая запускается для каждого приглашения) в приглашении? Например, следующая функционально идентична рассмотренной выше строке:

PROMPT='%{$(print "\e[00m\e[38;5;245m")%}test $(date)%{$(print "\e[00m")%}'

побег последовательности сохраняются в буквальном смысле и только интерпретируется в момент каждого оперативного рендеринга.

 Смежные вопросы

  • Нет связанных вопросов^_^