zsh中預編譯的命令列輸入

zsh中預編譯的命令列輸入

我最近設定了一台 ubuntu 12.04 64 位元機器。我用多路復用器有許多打開的窗口,它們都使用桀騁作為外殼,其中一些通過chroot使用與正常環境相同的主資料夾的環境。

在shell 中執行隨機命令一段時間後(各種類型,但主要是檔案操作、vi、在chroot 環境內和沒有chroot 環境的建置/make 命令),每個shell 開始立即顯示一些來自過去歷史記錄的預編譯命令,這是我需要的在我可以輸入任何內容或搜尋我以前的歷史記錄之前,例如使用 Ctrl-Q 刪除它。

額外令人煩惱的事實是,如果我錯誤地鍵入了預編譯命令前的任何字符,然後刪除該行並鍵入我自己的命令,在下一個提示符處我也會得到這些額外的字符。然後,修改後的輸入會不斷成長,而不會出現在 zsh 歷史檔案中。

如果我刪除 .zsh_history 文件,或建立新的 shell,問題會在很短的時間內解決,然後在不久之後(使用 shell 幾分鐘)就會不可避免地再次困擾我。

這是一段時間後我的提示符號的範例,剛從我之前的命令返回到 shell:

[10:59:14] user:Build git:(master*) $ schroot -c full32 -- antls -l

請注意,提示符顯然應該以 $ 結尾,接下來是ant我在之前使用 Ctrl-Q 刪除該行之前錯誤輸入的一些垃圾。

對於上下文,我正在使用哦我的zsh傑夫加賽德主題和快速插入。對於 chroot 我正在使用施魯特具有以下配置:

[precise-full32]
description=Full 32bits dev environment
aliases=full32
type=directory
directory=/opt/chroot/full32
users=user
root-groups=root
personality=linux
preserve-environment=true

我束手無策,找不到這裡或其他地方描述的任何類似問題。關於什麼可能導致這種惱人的行為有任何線索嗎?

答案1

我想您正在使用 emacs 鍵盤映射(通過d'oh-my-zsh或一些自訂配置)...請檢查

$ bindkey | grep '\^Q'
"^Q" push-line

然後...該push-line小部件正是為了您所描述的煩人的目的而設計的:我輸入了一個很長的命令 - 但我忘記了一些步驟...所以我push-line通過啟動CTRL-Q,我得到一個新的提示,使其良好並且在那之後我取回之前輸入的(但尚未執行的)命令:

$ `cp /something/foo/bar to/another/long/path`  # to/another/long/path does not exist
[CTRL-Q]
$ mkdir to/another/long/path
[ENTER]
$ `cp /something/foo/bar to/another/long/path`  # appears again and I can execute it via [ENTER] without retyping

所以,長話短說:

使用CTRL-U預設綁定kill-whole-line或重新定義(CTRL-Q如果您習慣了該快捷方式):

$ bindkey '^Q' kill-whole-line

相關內容