gpt4 book ai didi

node.js - 将 rlwrap 与 Node.js REPL 结合使用, Node '.break' (Ctrl-C) 怎么可能不被 rlwrap 解释为 SIGINT?

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:42 28 4
gpt4 key购买 nike

在讨论如何 preserve command line history between sessions 之后,我定义了以下别名:

alias node='env NODE_NO_READLINE=1 rlwrap node'

它非常适合历史持久化,但现在,每次我执行 Ctrl-C 以发送 Node 的“.break”命令时,rlwrap 也会接受它,但作为 SIGINT:它会清除所有内容并自杀(如 its man page 中所述) ),因此迫使我重新启动 Node session (不得不记忆我的 var、funcs、require 等),而我只想'.break'...

有什么方法可以恢复经典 Node 行为?

  • Ctrl-C : 中断
  • 再次按 Ctrl-C(或在空白行):退出

最佳答案

避免 SIGINT

node 通过取消设置其 interrupt character VINTR 改变了 CTRL-C 的含义(通常是 CTRL-C)来避免它本来会得到的中断信号。

启动后,rlwrap 一直处于休眠状态,直到您的终端或例如使用的伪终端 (pty) 发生某些事情。 Node 。这个“东西”可以是你的按键,也可以是 node 的输出。

每次发生这种情况时,rlwrap 都会将 Node 的终端设置(包括VINTR)复制到它自己的 tty。

但是,如果 node 更改其终端设置,这本身不会唤醒 rlwrap,因此它将保持它自己的 tty 上的旧设置。然后透明度将被打破:当您按下 CTRL-C rlwrap 仍会将其解释为 SIGINT,而 node 会理解 .break 命令。

有一个特殊的、非常晦涩的pty模式(EXTPROC),它允许pty master(rlwrap)被slave在终端中的改变唤醒设置,但这非常不便携。这就是为什么自 0.41 版本以来,rlwrap 具有不太优雅的 --polling 选项,这使得它每 40 毫秒唤醒一次并复制从站的终端设置。

前进 CTRL-C

从 0.43 版本开始,rlwrap 可以通过绑定(bind)直接转发特殊键,即使在 readline 模式下也是如此~/.inputrcrlwrap-direct-keypress 的这样一个键:

$if node
"\C-c": rlwrap-direct-keypress
$endif

但是,node在其本身使用 readline 时给予 CTRL+C 特殊待遇(尝试 NODE_NO_READLINE=1 node 然后输入 CTRL-C) 看看我的意思)

在这种情况下(即当命令进行自己的行编辑时),必须强制 rlwrap 进入 readline 模式:

$ rlwrap --always-readline node

这有一个不幸且不可避免的缺点,即无论何时命令要求单keypresses (Continue? Y/N) 必须键入一个额外的输入

然后仍然是上面描述的问题:如果终端的中断字符没有改变,node 永远不会看到CTRL-C (但取而代之的是 SIGINT)

有两种解决方案。要么:

stty intr undef # disable interrupt character
rlwrap --always-readline node
stty intr '^c' # re-enable CTRL-C

或:

 rlwrap --polling --always-readline node # --polling means: continually wake up and wacth  node's interrupt character

总结

长话短说:

  • "\C-c": rlwrap-direct-keypress 添加到您的 inputc
  • 暂时取消设置终端的中断字符,或使用 rlwrap --polling --always-readline 如上所述
  • 尝试接受额外的单键输入

关于node.js - 将 rlwrap 与 Node.js REPL 结合使用, Node '.break' (Ctrl-C) 怎么可能不被 rlwrap 解释为 SIGINT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21863836/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com