Предварительно скомпилированный ввод командной строки в zsh

Предварительно скомпилированный ввод командной строки в zsh

Недавно я установил Ubuntu 12.04 64 бит. Я используюtmuxсо многими открытыми окнами, все они используютзшкак оболочка, некоторые из них черезchrootсреда, использующая ту же домашнюю папку, что и обычная среда.

После некоторого времени выполнения случайных команд в оболочках (всех видов, но в основном файловых операций, vi, команд build/make в среде chroot и без нее) каждая оболочка немедленно начинает показывать некоторые предварительно скомпилированные команды из прошлой истории, которые мне нужно удалить, например, с помощью Ctrl-Q, прежде чем я смогу что-либо набрать или выполнить поиск в предыдущей истории.

Дополнительным раздражающим фактом является то, что если я по ошибке введу какие-либо символы, предшествующие скомпилированной команде, а затем удалю строку и введу свою собственную команду, то в следующем приглашении я также получу эти дополнительные символы. Этот измененный ввод затем растет и растет, так и не появившись в файле истории zsh.

Если я удаляю файл .zsh_history или создаю новую оболочку, проблема решается на очень короткое время, а затем неумолимо возвращается, чтобы преследовать меня через короткое время (несколько минут использования оболочки).

Вот пример того, как выглядит мое приглашение через некоторое время после возвращения в оболочку из предыдущей команды:

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

Обратите внимание, что приглашение должно, очевидно, заканчиваться на $, а то, что следует далее, ant— это какой-то мусор, который я набрал по ошибке, прежде чем удалить строку с помощью Ctrl-Q в предыдущем случае.

Для контекста я используюо-мой-зшсджеффгарсайдтема игитфастплагин. Для 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

Связанный контент