Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将rlwrap与Node.js REPL一起使用,Node';将如何使用;。中断';(Ctrl-C)不能被rlwrap解释为SIGINT?_Node.js_Read Eval Print Loop_Sigint_Rlwrap - Fatal编程技术网

将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