2

我正在使用 RLWrap 来“驯服”一个非常好的 REPL,即 Dyalog APL,不幸的是,它起源于 Windows 领域,因此不符合 UNIX 约定。此外,作为一个封闭源代码的产品,它不能被修改为这样做。

我设法实现了我的大部分目标,但是Ctrl-D 仍然会导致它发出错误并继续运行,而我希望它能够像任何其他 REPL 一样优雅地退出。

我查看了 rlwrap 选项以及它的过滤器 API,以获取一种拦截来自用户的 EOF 并将其转换为自定义退出命令的方法,这就是)off我的情况,但我找不到这样做的方法.

我目前的别名:

alias dyalog='rlwrap -a -H ~/.dyalog_history /opt/mdyalog/17.0/64/unicode/dyalog -b -s'

相关选项是:

  • -s告诉 Dyalog 以简单的 REPL 模式启动,而不控制屏幕;
  • -a告诉 RLWrap 始终保持在 readline 模式,忽略 Dyalog 逐个字符读取输入的尝试。
4

2 回答 2

0

假设“裸体”通过优雅退出dyalog来响应CTRL+D,您可以rlwrap通过dyalog将接下来的几行添加到您的~/.inputrc

$if dyalog 
 "\C-d": rlwrap-direct-keypress
$endif

您可能(或可能不必)发布

 $ stty eof undef

事先在您使用的终端中(以防止CTRL+D关闭您的stdin

于 2021-01-25T22:21:11.440 回答
0

诀窍是从读取中捕获返回码。鉴于它的嵌套程度,我发现在主目录的隐藏文件中执行此操作最容易。

为了了解它是如何完全工作的,我包含了一个更大的代码块,但核心在该行中,其中包含“读取”。

sCommand=""
while [ ! "$sCommand" == "exit" ]
do

    sHistory=~/.promptHistory
    sCommand=$(rlwrap -H $sHistory sh -c 'read -p "> " REPLY && echo $REPLY'; echo $? > ~/.hold)

    if [[ "$(cat ~/.hold)" -eq 1 ]]; then sCommand="exit"; fi

    if [ "$sCommand" == "exit" ]; then return; fi # Bail out if the user asked for exit.

    case $sCommand in

        # All useful commands intercepted here.  Let 'exit' flow through.

    esac

done

神奇之处在于使用 $? 获取返回码?并将其放入 ~/.hold 以确保安全。从那里开始,剩下的只是代码。

于 2021-01-25T02:31:34.343 回答