在我的 Debian 系统上,我一直使用它pdksh
作为我的交互式 shell。最初,命令行历史行为与我在 AIX 和 Solaris 等平台上成长过程中的行为类似。
最近,由于pdksh
Debian 上现在由 实现mksh
,命令行历史记录不再像我的手指期望的那样工作。我试图弄清楚我是否可以配置mksh
做我想做的事情,或者我是否必须找到另一个习惯用法(或另一个shell)。
ksh
我在 vi 编辑模式下使用(set -o vi
和FCEDIT=vi
)。很多时候,我会在命令提示符处立即编写简短的多行命令,即
daystrom:/home/pronovic> for i in 1 2 3
> do
> print $i
> done
1
2
3
这些在 中按预期工作mksh
。然而,命令行历史记录却没有。
在我熟悉的所有 kshell 实现中(之前),该脚本将作为单个条目保留在历史记录中。这样,我就可以击球ESC-k
并回到队伍的前面for
。到达那里后,我可以再次就地编辑脚本,或者我可以点击ESC-v
在vi
.
在 中mksh
,我的脚本中的每一行(行for
、do
行、print
行等)最终都会作为我的历史记录中的一个单独条目。所以,ESC-k
只是带我去排队done
,ESC-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
和历史存储/加载。