将rlwrap与Node.js REPL一起使用,Node';将如何使用;。中断';(Ctrl-C)不能被rlwrap解释为SIGINT?
在讨论了如何使用后,我定义了以下别名:将rlwrap与Node.js REPL一起使用,Node';将如何使用;。中断';(Ctrl-C)不能被rlwrap解释为SIGINT?,node.js,read-eval-print-loop,sigint,rlwrap,Node.js,Read Eval Print Loop,Sigint,Rlwrap,在讨论了如何使用后,我定义了以下别名: alias node='env NODE_NO_READLINE=1 rlwrap node' 它对历史持久性非常有效,但现在,每次我使用Ctrl-C发送节点的“.break”命令时,rlwrap也会将其作为SIGINT:它会清除所有内容并自杀(如中所述),从而迫使我重新启动节点会话(必须调用我的var、funcs、requires等),而我只想“.break” 有没有办法恢复经典的节点行为 Ctrl-C:中断 再次按Ctrl-C键(或在空行上):退出
alias node='env NODE_NO_READLINE=1 rlwrap node'
它对历史持久性非常有效,但现在,每次我使用Ctrl-C发送节点的“.break”命令时,rlwrap也会将其作为SIGINT:它会清除所有内容并自杀(如中所述),从而迫使我重新启动节点会话(必须调用我的var、funcs、requires等),而我只想“.break”
有没有办法恢复经典的节点行为
- Ctrl-C:中断
- 再次按Ctrl-C键(或在空行上):退出
节点
通过取消设置其(通常为CTRL-C)来更改CTRL-C的含义,以避免它将获得的中断信号
启动后,rlwrap
一直处于休眠状态,直到在您的终端或由节点使用的伪终端(pty
)上发生某些事情。此“某物”可以是您的按键,也可以是节点的输出
每次发生这种情况时,rlwrap
将节点
s终端设置(包括VINTR
)复制到自己的tty
但是,如果节点
仅更改其终端设置,则其本身不会唤醒rlwrap
,从而将旧设置保留在其自身的tty上。透明度随后将被破坏:当您按下CTRL-C时,rlwrap
仍将其解释为SIGINT
,而节点
将理解.break
命令
有一种特殊的非常模糊的pty模式(),允许pty主机(rlwrap
)被从机在终端设置中的更改唤醒,但这种模式非常不可移植。这就是为什么自0.41版以来,rlwrap
有一个不那么优雅的--轮询
选项,使其每40毫秒唤醒一次,并复制从机的终端设置
正向CTRL-C
从0.43版开始,rlwrap
可以通过绑定直接转发特殊密钥,即使是在readline模式下
在~/.inputrc
中,这样一个指向rlwrap直接按键的按键
:
$if node
"\C-c": rlwrap-direct-keypress
$endif
但是,node
仅在使用readline时才对CTRL+C进行特殊处理(请尝试node\u NO\u readline=1 node
然后键入CTRL-C,以了解我的意思)
在这种情况下(即,当命令执行自己的行编辑时),必须强制rlwrap
进入readline模式:
$rlwrap--始终读取行节点
这有一个不幸且不可避免的缺点,即命令从不要求单个
按键(继续?是/否
)必须键入
额外进入
还有上面描述的问题:如果终端的中断字符没有改变,节点
将永远看不到CTRL-C(而是得到一个SIGINT
)
有两种解决办法。要么:
stty intr undef # disable interrupt character
rlwrap --always-readline node
stty intr '^c' # re-enable CTRL-C
或:
收尾
长话短说:
- 将
“\C-C”:rlwrap直接按键
添加到您的输入UTC
- 暂时取消终端的中断字符,或如上所述使用
rlwrap--polling--always readline
- 尝试使用单次按键的额外回车键
我尝试使用rlwrap直接按键
但没有成功。rlwrap
有一些新选项可能会有所帮助-我相应地编辑了我的答案。在这种配置下,按ctrl-c将^c打印到屏幕上,需要输入以更新屏幕。但这总比什么都没有好。我现在想知道如何使用node REPL脚本来实现这一点,而不仅仅是node REPL本身,正如您在这里的回答:即,rlwrap--polling--always readline-z node_complete./myrepl.js
仍然有ctrl-c中断。我无法重现这一点。您是否重置了终端?您是否可以使用--enable debug
配置选项构建rlwrap
,运行rlwrap--debug--polling--always readline node
,按CTRL-C几次,然后将生成的/tmp/rlwrap.debug
文件发送给我?(你可以在我的名片上找到我的地址
rlwrap --polling --always-readline node # --polling means: continually wake up and wacth node's interrupt character