【问题标题】:Haskell: GHCi treats Ctrl-Y like Ctrl-ZHaskell:GHCi 将 Ctrl-Y 视为 Ctrl-Z
【发布时间】:2017-09-19 01:39:52
【问题描述】:

根据 haskeline documentation,键入 CTRL+Y 应该会从 kill-ring 中弹出最近的条目(例如,我刚刚通过 CTRL+U)。相反,我发现它暂停了 REPL,就好像我输入了 CTRL+Z.

作为一种笨拙的解决方法,我发现键入 CTRL+V CTRL+Y 会弹出作为普通的 CTRL+Y 的杀戮环应该这样做。

这是一个已知的错误,还是其他原因?我可以修复它吗?我正在运行 GHC 版本 8.0.2。

不确定这是否重要,但我正在通过堆栈(例如 stack ghci)运行 GHCi,并且我正在 brew 安装堆栈 (macOS)。

【问题讨论】:

  • 我很确定 Stack 无关紧要,但您应该报告 GHC 版本。

标签: haskell ghci haskeline


【解决方案1】:

Mac OS 终端/tty 具有“dsusp”或“延迟挂起”键的概念,Ctrl-Y 是通常分配的键。在 tty 级别,当读取 CTRL+Y 时,它的行为有点像 CTRL+Z。不同之处在于 CTRL+Z 在输入时会导致立即挂起; CTRL+Y 在底层进程尝试读取字符并且 CTRL+Y 标记弹出时导致挂起在输入流中。

(CTRL+V 通常分配给“lnext”键,通过使下一个键为“literal”来跳过终端处理,这就是为什么 CTRL+V Ctrl+Y 有效。)

理想情况下,GHCi 会检查“dsusp”功能(例如,它在 Linux 上不存在)并在检测到它时将其禁用,但看起来它并没有这样做。

与此同时,您可以通过运行以下命令禁用“dsusp”键:

stty dsusp undef

在您启动 GHCi 之前。将其粘贴在您的“.bashrc”和/或“.profile”中是个好主意,因为该功能在很大程度上是无用的。

【讨论】:

  • 完美,谢谢!我很好奇为什么这从不妨碍 Bash 中的 Ctrl-Y 猛拉行为。我想当我已经在父 shell 中时,暂停当前作业没有意义?
  • 嗯,Bash 包含特定的代码来防止 Ctrl-Y(或 Ctrl-Z)对 shell 提示本身产生影响。如果它不这样做,Bash 将像任何其他进程一样暂停(并且可能会在没有准备好处理它的父进程的情况下冻结)。
  • 非常有意义。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2015-11-25
  • 2022-11-11
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多