zsh 中预编译的命令行输入

zsh 中预编译的命令行输入

我最近安装了一台 Ubuntu 12.04 64 位机器。我使用tmux有许多打开的窗口,它们都使用作为外壳,其中一些通过chroot使用与正常环境相同的主文件夹的环境。

在 shell 中执行随机命令一段时间后(所有类型,但主要是文件操作、vi、在 chroot 环境内外构建/制作命令),每个 shell 都会立即开始显示一些来自过去历史记录的预编译命令,我需要删除这些命令,例如使用 Ctrl-Q,然后才能输入任何内容或搜索我以前的历史记录。

更令人恼火的是,如果我错误地输入了预编译命令前面的任何字符,然后删除该行并输入我自己的命令,那么在下一个提示符下,我也会出现这些多余的字符。然后,这个修改后的输入会不断增长,而不会出现在 zsh 历史文件中。

如果我删除 .zsh_history 文件或创建一个新的 shell,问题会在很短的时间内得到解决,然后在短暂的时间后(使用 shell 几分钟后)不可避免地再次困扰我。

这是一段时间之后我的提示符的示例,刚刚从上一个命令返回到 shell:

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

请注意,提示符显然应该以 $ 结束,接下来ant是一些我在之前使用 Ctrl-Q 删除该行之前错误输入的垃圾。

为了便于理解,我使用哦我的天啊乔夫加赛德主题和gitfast插件。对于 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

相关内容