node
改变了 CTRL-C 的含义,通过取消其中断字符 VINTR
(通常为 CTRL-C),以避免它会收到的中断信号。
启动后,rlwrap
一直处于睡眠状态,直到您的终端或伪终端(例如 node
使用的 pty
)发生了某些事情。这个“某些事情”可以是您按下的键,也可以是 node
的输出。
每次发生这种情况时,rlwrap
将复制 node
终端设置(包括 VINTR
)到自己的 tty。
但是,如果 node
只更改了其终端设置,则仅此操作不会唤醒 rlwrap
,因此它将在自己的 tty 上保留旧设置。透明度将被破坏:当您按下 CTRL-C 时,rlwrap
仍将将其解释为 SIGINT
,而 node
将理解为 .break
命令。
有一种特殊的、非常晦涩的 pty
模式(EXTPROC),它允许 pty 主机(rlwrap
)通过从从属的终端设置中唤醒,但这是非常不可移植的。因此,自版本 0.41 以来,rlwrap
具有更不优雅的 --polling
选项,使其每 40 毫秒唤醒一次并复制从属的终端设置。
从版本 0.43 开始,rlwrap
可以直接转发特殊按键,即使在 readline 模式下也可以通过将这样的按键绑定到 ~/.inputrc
中的 rlwrap-direct-keypress
来实现:
$if node
"\C-c": rlwrap-direct-keypress
$endif
然而,当node
本身使用readline时(尝试使用NODE_NO_READLINE=1 node
,然后输入CTRL-C),它只有在使用CTRL+C时才会得到特殊对待。
在这种情况下(即命令执行自己的行编辑时),必须将rlwrap
强制进入readline模式:
$ rlwrap --always-readline node
这个方法有一个不幸和不可避免的缺点,就是每当一个命令要求单个按键(继续?Y/N
),你需要多按一次Enter。
然后还有上述所述的问题:“如果终端的中断字符没有改变,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
简而言之:
inputc
中添加"\C-c": rlwrap-direct-keypress
rlwrap --polling --always-readline
rlwrap-direct-keypress
但没有成功。 - Andrewrlwrap
有一些新选项可能会有所帮助 - 我已相应地编辑了我的答案。 - Hans Lubrlwrap --polling --always-readline -z node_complete ./myrepl.js
仍然无法正常运行ctrl-c。 - Andrew