是否可以使用 vi 编辑模式获取 mksh 中多行命令的工作历史记录?

是否可以使用 vi 编辑模式获取 mksh 中多行命令的工作历史记录?

在我的 Debian 系统上,我一直使用它pdksh作为我的交互式 shell。最初,命令行历史行为与我在 AIX 和 Solaris 等平台上成长过程中的行为类似。

最近,由于pdkshDebian 上现在由 实现mksh,命令行历史记录不再像我的手指期望的那样工作。我试图弄清楚我是否可以配置mksh做我想做的事情,或者我是否必须找到另一个习惯用法(或另一个shell)。

ksh我在 vi 编辑模式下使用(set -o viFCEDIT=vi)。很多时候,我会在命令提示符处立即编写简短的多行命令,即

daystrom:/home/pronovic> for i in 1 2 3
> do
>    print $i
> done
1
2
3

这些在 中按预期工作mksh。然而,命令行历史记录却没有。

在我熟悉的所有 kshell 实现中(之前),该脚本将作为单个条目保留在历史记录中。这样,我就可以击球ESC-k并回到队伍的前面for。到达那里后,我可以再次就地编辑脚本,或者我可以点击ESC-vvi.

在 中mksh,我的脚本中的每一行(行fordo行、print行等)最终都会作为我的历史记录中的一个单独条目。所以,ESC-k只是带我去排队doneESC-k再次带我去print排队,等等。

我正在寻找一种配置方法mksh,因此ESC-k将我带到脚本的开头,以便我可以执行它或再次编辑它。但是,我还没有找到一种方法来做到这一点。

我发现的唯一讨论是格马内,这意味着^O可以以某种方式使用。然而,我不清楚这是如何相关的——或者也许它只是在 vi 编辑模式下不相关。

有可能使这项工作成功吗?

答案1

mksh这里的维护者;-)虽然这不是通常的“支持论坛”......

在 mksh 中,交互式编辑(不是 ESC+v (vi) / ^Xe (emacs))都仅限于单行,历史记录也是如此,因为它在内部由换行符终止。一直如此,即使在 pdksh 中也是如此。

显然,Debian 中的 pdksh 已以某种方式进行了修补,我看到它^J内嵌了换行符。这是我不知道的 Debian 特定修改。 (我不使用 vi 编辑模式,所以我依靠用户请求东西并偶尔发送补丁;到目前为止,没有人站出来维护它,所以目前它有点孤立,但它足够流行我'我正在考虑重写整个edit.c代码以统一两种模式的代码,从而摆脱维护问题。)

^O仅限 emacs 模式。但也许我们可以让它在 vi 模式下工作......

回答您的直接问题:不,目前在 mksh 中不可能。但我可以看看 Debian 做了什么,并尝试弄清楚我们是否可以接受它。

编辑2015-07-05

我看了一下 pdksh;这实际上是“简单”历史的一个功能,不可能简单地(没有双关语)克隆“复杂”历史,与许多其他操作系统不同,pdksh 的前 Debian 包装只是决定不启用该功能。

我今天完全重新实现了该功能,延迟了实际历史记录的写入,直到命令完全编译为止,这意味着您可能会在罕见的错误情况下丢失一些历史记录条目(我检查过,语法错误不属于该类别),但多行输入现在可以在 Emacs 和 Vi 模式下按需要工作,包括ESC v/^Xe和历史存储/加载。

相关内容