是否可以使用 vi 編輯模式在 mksh 中獲取多行命令的工作歷史記錄?
在我的 Debian 系統上,我一直使用
pdksh
它作為我的互動式 shell。最初,命令行歷史行為類似於我在 AIX 和 Solaris 等平台上長大的行為。最近,由於
pdksh
在 Debian 上現在由 實現mksh
,命令行歷史不再像我期望的那樣工作。我想弄清楚我是否可以配置mksh
做我想做的事,或者我是否必須找到另一個成語(或另一個外殼)。我
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
行、ESC-k
只是帶我去done
排隊,ESC-k
再次帶我去我正在尋找一種配置方法,
mksh
因此ESC-k
將我帶到腳本的開頭,以便我可以執行它或再次編輯它。但是,我還沒有找到一種方法來做到這一點。我發現的唯一討論是關於gmane,這意味著
^O
可以以某種方式使用。但是,我不清楚這有什麼關係——或者可能只是在 vi 編輯模式下不相關。有可能完成這項工作嗎?
mksh
這裡的維護者 ;-) 雖然這不是通常的“支持論壇”……在 mksh 中,兩種互動式編輯(不是 ESC+v (vi) / ^Xe (emacs))都僅限於單行,就像歷史一樣,因為它在內部由換行符終止。一直如此,即使在 pdksh 中也是如此。
顯然,Debian 中的 pdksh 以某種方式進行了修補,我看到它
^J
內嵌了換行符。這是我不知道的特定於 Debian 的修改。(我不使用vi編輯模式,所以靠使用者請求東西,偶爾發個更新檔;目前還沒有人站出來維護,所以現在有點孤兒,不過已經夠流行了m考慮重寫整個ofedit.c
以統一兩種模式的程式碼,以擺脫維護問題。)
^O
僅是emacs模式。但也許我們可以讓它在 vi 模式下工作……回答您的直接問題:不,目前在 mksh 中是不可能的。但我可以看看 Debian 做了什麼,並試圖弄清楚我們是否可以接受它。
編輯 2015-07-05
我看了一下pdksh;這實際上是“簡單”歷史的一個特性,不可能在“複雜”歷史中簡單(沒有雙關語)複製,與許多其他作業系統不同,pdksh 的前 Debian 打包只是決定不啟用它。
我今天完全重新實現了該功能,延遲實際的歷史寫入直到命令完全編譯,這意味著您可能會在罕見的錯誤情況下失去一些歷史條目(我檢查過,語法錯誤不屬於該類別)但是多行輸入現在可以在 Emacs 和 Vi 模式下正常工作,包括
ESC v
/^Xe
和歷史儲存/載入。