在 MIT Scheme 的 REPL 中有没有快速退出调试器的方法?
Is there a fast way to exit the debugger in MIT Scheme's REPL?
假设我尝试在 MIT Scheme 的 REPL 中使用一个未定义的变量:
1 ]=> blablabla
;Unbound variable: blablabla
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify a value to use instead of blablabla.
; (RESTART 2) => Define blablabla to a given value.
; (RESTART 1) => Return to read-eval-print level 1.
2 error>
这会自动将我带入调试器。要退出调试器,我必须键入 (restart 1)
。是否有另一种方法不涉及为退出调试器而键入 11 个字符?这三个选项都涉及输入 11 个字符,这有点傻。
根据 MIT Scheme 用户手册中关于 interrupting the REPL 的部分:
- C-c C-c
- C-g
Abort whatever Scheme evaluation is currently running and return to the top-level REPL. If no evaluation is running, this is equivalent to evaluating (cmdl-interrupt/abort-top-level)
所以有两种方法可以快速退出调试器:
CtrlcCtrlc — 不幸的是,当使用带有 rlwrap 的 MIT Scheme 时(即 rlwrap mit-scheme
),这种方法是不合适的。在调试器中,rlwrap
以某种方式导致第二个 Ctrlc 被忽略。
Ctrlg — 这与 rlwrap 配合使用效果很好,并且需要比上面更少的按键。
根据 Flux 的回答,按 CTRLC 两次可以使用 mit-scheme
,但 不行 当它在 rlwrap
内运行时
为了使 rlwrap
对于 CTRLC 和 CTRL 更加“透明” G
- 使用
-W
(--polling
)选项:rlwrap -W
会让rlwrap
每40毫秒唤醒一次,以检查客户端是否改变了它的终端设置(在你的情况,它 interrupt character)
- 在你的
.inputrc
中添加几行:
$if mit-scheme
"\C-c" rlwrap-direct-keypress
"\C-g" rlwrap-direct-keypress
$endif
这些行将告诉 rlwrap
(当包装 mit-scheme
时)传递 CTRLC 和 CTRLG 即使在行编辑的中间。
通过这两项调整,我无法再区分 rlwrapped 和 unwrapped 之间的中断行为 mit-scheme
-W
需要 rlwrap
>= 0.41,rlwrap-direct-keypress
>= 0.43
要获得更深入的解释 为什么 这行得通(以及为什么需要选项和 .inputrc
条目)请参阅 this rlwrap issue 上的 [=70] =].
假设我尝试在 MIT Scheme 的 REPL 中使用一个未定义的变量:
1 ]=> blablabla
;Unbound variable: blablabla
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify a value to use instead of blablabla.
; (RESTART 2) => Define blablabla to a given value.
; (RESTART 1) => Return to read-eval-print level 1.
2 error>
这会自动将我带入调试器。要退出调试器,我必须键入 (restart 1)
。是否有另一种方法不涉及为退出调试器而键入 11 个字符?这三个选项都涉及输入 11 个字符,这有点傻。
根据 MIT Scheme 用户手册中关于 interrupting the REPL 的部分:
- C-c C-c
- C-g
Abort whatever Scheme evaluation is currently running and return to the top-level REPL. If no evaluation is running, this is equivalent to evaluating
(cmdl-interrupt/abort-top-level)
所以有两种方法可以快速退出调试器:
CtrlcCtrlc — 不幸的是,当使用带有 rlwrap 的 MIT Scheme 时(即
rlwrap mit-scheme
),这种方法是不合适的。在调试器中,rlwrap
以某种方式导致第二个 Ctrlc 被忽略。Ctrlg — 这与 rlwrap 配合使用效果很好,并且需要比上面更少的按键。
根据 Flux 的回答,按 CTRLC 两次可以使用 mit-scheme
,但 不行 当它在 rlwrap
为了使 rlwrap
对于 CTRLC 和 CTRL 更加“透明” G
- 使用
-W
(--polling
)选项:rlwrap -W
会让rlwrap
每40毫秒唤醒一次,以检查客户端是否改变了它的终端设置(在你的情况,它 interrupt character) - 在你的
.inputrc
中添加几行:
$if mit-scheme
"\C-c" rlwrap-direct-keypress
"\C-g" rlwrap-direct-keypress
$endif
这些行将告诉 rlwrap
(当包装 mit-scheme
时)传递 CTRLC 和 CTRLG 即使在行编辑的中间。
通过这两项调整,我无法再区分 rlwrapped 和 unwrapped 之间的中断行为 mit-scheme
-W
需要 rlwrap
>= 0.41,rlwrap-direct-keypress
>= 0.43
要获得更深入的解释 为什么 这行得通(以及为什么需要选项和 .inputrc
条目)请参阅 this rlwrap issue 上的 [=70] =].