Лучший способ прочитать строку ввода пользователя в Zsh? (например, с zle?)

11

Zsh readпочему-то повторяет ^M, а не принимает их как <Enter>нажатия клавиш. (Если -dустановлено, то они распознаются как <Enter>'s, но все еще отражаются.) Он также не поддерживает основы, такие как клавиша возврата.

Я могу обойти это путем взлома / бега bash,

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

но мне интересно, есть ли более чистый путь.

Николас Тунг
источник
Не zshудается подтвердить при новой установке 4.3.10; % read aотлично работает здесь.
user1686
Это использует iterm на OS X; readработает на машинах Linux.
Николас Тунг

Ответы:

19

Для удобного ввода строки текста под zsh используйте vared. Использование varedвместо readвызывает zle , что эквивалентно передаче -eв bash для вызова readline.

vared -p 'What would you like to do?: ' -c tmp

Поведение, которое вы описываете с помощью plain, readпохоже на неправильно настроенный терминал, а не на проблему с оболочкой. Запустите, stty -aчтобы показать настройки вашего терминала, и убедитесь, что eolон установлен ^Mи eraseнастроен на то, что Backspaceотправляет ваш ключ. В зависимости от операционной системы и того, как она настроена и на терминале, Backspaceотправляет либо ^Hили ^?. Настройка backspace обычно происходит неправильно из-за некоторого файла конфигурации, который пытается установить его вручную, поэтому первое, что вы должны сделать, это отследить и удалить любую такую ​​неправильную конфигурацию. Если вы не нашли ничего, просмотрите настройки вашего эмулятора терминала, чтобы убедиться, что он не установлен в какой-либо исторический режим совместимости. Если ничего не помогает, добавьте что-то вроде этого в свой ~/.zshrc:

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi
Жиль "ТАК - перестань быть злым"
источник
1
vared -p 'Что бы вы хотели сделать ?:' -c tmp
zzapper
Так круто! Не знал о varedвстроенном. Оказывается, zshzleсправочная страница определенно стоит хотя бы пролистать.
ratijas