【问题标题】:Can rlwrap use a wrapped command's own TAB completion?rlwrap 可以使用包装命令自己的 TAB 完成吗?
【发布时间】:2012-03-01 22:15:56
【问题描述】:

我想将 rlwrap 与自定义 erlang repl 一起使用。

如果我将它作为“rlwrap -a myrepl”运行,它会完美运行。

问题是 myrepl 有内置的制表符补全,会被 rlwrap 践踏。

我想让 rlwrap 释放 TAB 键

【问题讨论】:

  • 什么是 myrepl?这是 erlang 问题还是 perl/rlwrap 问题?
  • 对我来说,使用 rlwrap 的好处大于 Erlang 自动完成的价值。我无法让它们一起工作,所以我使用“rlwrap erl -oldshell”。

标签: autocomplete erlang read-eval-print-loop


【解决方案1】:

你不能同时使用rlwrap的行编辑/历史和你repl的TAB补全。

rlwrap 为没有它的命令提供行编辑、历史记录和(非常简单的)补全功能。像 TAB 补全这样花哨的命令不应该需要 rlwrap 来进行行编辑,不是吗?

-a (--always-readline) 选项是一种相当粗略的方法,可以替换 rlwrap 的行编辑行为来代替您的命令。它主要用于具有非常简单的行编辑器的命令,没有例如命令历史

如果您想使用-a 选项,因为您更喜欢rlwrap 的花哨(如持久历史记录或彩色提示)而不是命令(如TAB 完成),请继续,但不可能选择一些喜欢一个,保留一些其他的。

这是程序(及其用户)为避免使用 readline 库和随附的 GPL 许可证而必须支付的(小)价格。

汉斯(rlwrap作者)


编辑(2017 年 4 月):

在许多情况下,可以使用filter 来恢复完成。有关此示例,请参阅 A node shell based on readline

【讨论】:

  • Erlang shell 具有 TAB 补全功能,但在其他几个方面缺乏。会话之间没有历史记录,有限的行编辑功能等。
  • @Hans 您是否看到任何原因,如果我更改 rlwrap 的源并从特殊键中删除 TAB,或者可能将其重新连接到其他键,我不会让它工作?还没来得及尝试,但我正在利用你回复我的帖子。
  • @Gabriel:从“特殊键”中删除 TAB 是不够的,这只会给你一个死 TAB 键。真正需要做的是 TAB 清除底层命令的输入缓冲区,将当前的 readline 输入缓冲区传递给它,定位它的光标,然后传递 TAB,解析结果输出(包括光标移动命令),最后填充 readline 输入缓冲区并相应地设置 rl_point。所有这些步骤都很困难且容易出错;尤其是命令输出的解析需要 rlwrap 包含一个虚拟终端模拟器。
  • @HansLub 感谢您的澄清。我会将其标记为已解决。会投票给你,但我还没有足够的声誉。
  • 耻辱,我想使用 rlwrap 将 vim 绑定到 elixir repl。我想我会在 emacs 中使用它。感谢您的简明解释。
【解决方案2】:

Rlwrap 很可爱。但在 Erlang 中,它只提供持久的历史记录,同时打破 erl 的制表符补全。

根本问题是 Erlang 的 erl REPL 已经过时了,而且没有遵循正常的 *nix 约定。此外,他们拒绝修复它,因为害怕随机的、不高兴的系统管理员无法接受任何更改。再多的 rlwrap “duct-tape” hack 都无法修复糟糕的 UX REPL。

像 pry/ipython/etc 这样从头开始编写 REPL 会更好(尽管工作量要大得多)。可配置颜色、选项卡完成、持久历史记录、分页、CLI 观察者、插件等。

Rlwrap 在带有原始 shell 的程序上大放异彩。

【讨论】:

  • 我认为您对“随机的、脾气暴躁的系统管理员”过于苛刻,并且高估了使用出色的 readline 库的难度。那些老旧的 REPL 的主要原因是 readlines GPL 许可证:使用 readline 意味着你的程序必须是 GPL。看看这个 25 年前的 email exchange - 可能是 GPL 执行的首批案例之一,其中 readline 发挥了关键作用。
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 2021-05-08
  • 2021-08-02
  • 2016-04-20
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多