在RLWrap中处理EOF

时间:2019-05-03 07:56:04

标签: exit eof rlwrap

我正在使用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始终保持在读取行模式,而忽略了Dyalog逐字符读取输入字符的尝试。

2 个答案:

答案 0 :(得分: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 以安全保存。从那里开始,剩下的就是代码。

答案 1 :(得分:0)

假设一个“裸体”dyalog通过正常退出来响应CTRL+D,您可以通过添加使rlwrap直接将此键传递给dyalog ~/.inputrc 的下几行:

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

您可能(也可能不)必须发出

 $ stty eof undef

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