在我的Debian系统上,我一直使用pdksh作为我的交互式shell。最初,命令行历史行为类似于我在AIX和Solaris等平台上长大的行为。
最近,由于Debian上的pdksh现在由mksh实现,命令行历史不再像我手指所期望的那样工作了。我试图弄清楚我是否可以配置mksh来做我想做的事情,或者我是否需要找到另一个成语(或者另一个shell)。
我在vi-编辑模式下使用ksh (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编辑模式下,这可能与此无关。
有可能让这件事成功吗?
发布于 2015-05-01 05:56:59
这里的mksh维护者;-)虽然这不是通常的“支持论坛”…
在mksh中,这两个交互编辑(但不是ESC+v (vi) / ^Xe (emacs) )仅限于单行,历史也是如此,因为它在内部被换行符终止。即使在pdksh也是如此。
显然,Debian中的pdksh是以某种方式修补的,我看到它有^J换行符。这是一个特定于Debian的修改,我没有意识到。(我不使用vi编辑模式,所以我依赖用户请求东西,偶尔也会发送补丁;到目前为止,还没有人站出来维护它,所以目前它有点孤立无援,但我考虑重写整个edit.c以统一这两种模式的代码,以解决维护问题。)
^O仅为emacs模式。但是也许我们可以让它在vi模式…中工作。
要回答你的直接问题:不,目前在mksh是不可能的。但我可以看看Debian做了什么,并试图找出我们是否可以接受它。
我看了pdksh;这实际上是“简单”历史的一个特性,它不可能简单地(没有双关意)在“复杂”历史中克隆,而以前的pdksh Debian打包决定不启用它,不像许多其他OSes。
我今天已经完全重新实现了这个特性,将实际的历史记录写入推迟到命令完全编译之后,这意味着在罕见的错误条件下可能会丢失一些历史记录条目(我检查过了,语法错误不属于该类别),但是多行输入现在在Emacs和Vi模式中可以正常工作,包括ESC v / ^Xe和历史存储/加载。
https://unix.stackexchange.com/questions/199766
复制相似问题