Bash: условный перевод строки в PS1 прерывает typeahead

Я предлагаю вам использовать этот txt2re для создания regex, которые соответствуют тому, что вы хотите.

Для вас скрипт:

for f in $float_numbers ; do
    if [[ $f =~ ^[+-]?[0-9]+\.?[0-9]*$ ]]; then
        echo "****f is $f ****"
    fi
done

Rexeplanation:

^       # Match start of string
[-+]?   # Match a leading + or - (optional)
[0-9]+  # Match one or more digit
\.?     # Match a literal . (optional, escaped)
[0-9]*  # Match zero or more digits
$       # Match the end of the string

И это сценарий perl, сгенерированный предыдущим сайтом, который соответствует плавающим числам

#!/usr/bin/perl

# URL that generated this code:
# http://txt2re.com/index.php3?s=100.3&1

$txt='100.3';

$re1='([+-]?\\d*\\.\\d+)';  # Float 1

$re=$re1;
if ($txt =~ m/$re/is)
{
    $float1=$1;
    print "($float1) \n";
}

#-----
# Paste the code into a new perl file. Then in Unix:
# $ perl x.pl 
#-----

2
21.09.2017, 01:05
1 ответ

У меня такой динамический текст подсказки, и нет проблем с опережающим вводом. Но вместо того, чтобы встраивать подстановку процесса непосредственно в PS1, я использую PROMPT_COMMANDдля вызова методов настройки. Они создают соответствующий динамический текст, который сохраняется в переменных, а затем эти переменные встраиваются в PS1.

Попробуй так...

export ps1_head_text

build_prompt() {
  export PS1="\${ps1_head_text}..."
}

ps1_head() {
  if (( $(cursor_col) > 1 )); then
    ps1_head_text=$'\n'╭-
  else
    ps1_head_text=╭-
  fi
}

export PROMPT_COMMAND=ps1_head

Я сделал это именно так, потому что у меня были проблемы с подстановкой процессов (, хотя я не помню, было ли это опережение ввода или какая-то другая проблема ).

Редактировать:Теперь, когда я думаю об этом, у вас могут быть проблемы с синхронизацией... если PROMPT_COMMANDвызывается во время, которое препятствует правильному чтению позиции курсора. Если это произойдет, вы, вероятно, находитесь в лодке «использовать zsh». Но попробуйте.


Обновление:Согласно комментарию от dave _thompson _085 чтение ответа на создание escape-последовательности (для печати позиции курсора )может конфликтовать с опережающим вводом.

Это имеет смысл, так как чтение происходит в той же оболочке, где вводится текст с опережением. Так что, если вы не сделаете это в той же оболочке? Помогает ли окружить его скобками, чтобы поместить его в подоболочку? Как насчет перенаправления ответа терминала (, например. в файл или канал или что-то еще )и читать оттуда?

Похоже, есть способ решить эту проблему, поэтому я швыряю кое-что об стену, чтобы посмотреть, что прилипнет.

1
27.01.2020, 22:18

Теги

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