我正在使用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逐字符读取输入字符的尝试。答案 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
)