прочитать 1 или несколько строк в bash - заставить его работать при вставке (в дополнение к вводу вручную)

Я прочитал несколько ответов с разной степенью сложности. Большинство из них работают хорошо, когда вводятся вручную.

Например: https://stackoverflow.com/a/20913871/1841533 .

Вот мой пример кода, очень близкий к тому, что был в этом ответе:

_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do 
  theanswer="${theanswer}${more}"
done

Это также отлично работает, когда я набираю ответ вручную, то есть: символ за символом ...

Но если я вставлю строку ( или несколько): он повторяет "оставшийся буфер" после чтения каждого символа ... делает отображение беспорядочным.

Я еще не нашел способа скрыть это, сохранив нормальное эхо на экране. (т. е. при вводе или вставке я все равно хочу видеть, что набрано / вставлено)

Краткий пример: Вот (хорошее) приглашение, когда я набираю вручную «abcd», символ за символом:

answer: abcd

Но если я предоставить "abcd", вставив его за один раз с помощью мыши, это нарушит эхо, повторяя после чтения каждого символа весь оставшийся буфер:

answer: abcdbcdcdd

tl / dr: фрагмент отлично работает при вводе символа за символом, но отображает оставшийся буфер чтения после чтения каждого символа вставленной записи.

0
23.05.2017, 15:39
1 ответ

Возможно, я нашел обходной путь ... Но я также надеюсь, что кто-то выдаст что-нибудь получше.

Исправленный код: я скрываю нормальное эхо, и я повторяю его сам после каждого чтения:

stty_orig=`stty -g`  ### added this
stty -echo           ### added this
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
printf "$theanswer" >&2 ;  ### added this
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
  printf "$more" >&2 ;  ### added this
  theanswer="${theanswer}${more}"
done

stty $stty_orig  ### added this

Кажется, до сих пор я делал все, что мне нужно ... Но мне не нравится печатать в stderr таким образом ... (возможно лучше распечатать вместо этого / dev / tty?)

edit : большой недостаток: трудно также обрабатывать "backspaces" или dels: если человек вводит 1 или несколько строк текста хочет что-то изменить, довольно сложно интерпретировать корректирующие ключи ... Лучше всего иметь строку чтения, разрешающую 1 или несколько строк ввода ... (может быть, в Perl она есть?)

0
28.01.2020, 04:50

Теги

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