Haskell: GHCi обрабатывает Ctrl-Y как Ctrl-Z
В соответствии с документацией на haskeline, нажатие CTRL+Y должно привести к появлению самой последней записи из списка уничтожений (например, строки, которую я только что удалил с помощью CTRL+U). Я обнаружил, что вместо этого он приостанавливает REPL, как если бы я набрал CTRL+Z.
Как неуклюжий обходной путь, я обнаружил, что нажатие CTRL+V CTRL+Y появляется из списка уничтожений, как и обычные CTRL+Y.
Это известная ошибка или что-то еще в игре? Могу ли я это исправить? Я использую GHC версии 8.0.2.
Не уверен, что это важно, но я запускаю GHCi через стек (например, stack ghci
), и я завариваю установленный стек (macOS).
1 ответ
Терминалы Mac OS /ttys имеют концепцию клавиши "dsusp" или "отложенная приостановка", а Ctrl-Y - назначенная клавиша. На tty-уровне, когда читается CTRL+Y, он немного похож на CTRL+Z. Разница в том, что CTRL+Z вызывает немедленную приостановку при вводе; CTRL+Y вызывает приостановку, когда базовый процесс пытается прочитать символы и маркер CTRL+Y появляется во входном потоке.
(CTRL+V обычно назначается клавише "lnext", которая пропускает обработку терминала, делая следующий ключ "буквальным", именно поэтому CTRL+V Ctrl+Y работает.)
В идеале GHCi должен проверять функциональность "dsusp" (например, в Linux она не существует) и отключать ее, если она обнаружена, но, похоже, он этого не делает.
Тем временем вы можете отключить ключ "dsusp", выполнив:
stty dsusp undef
прежде чем запустить GHCi. Вставлять это в свои ".bashrc" и / или ".profile" - хорошая идея, поскольку функциональность в значительной степени бесполезна.