Ваша проблема связана с неработающим preexec
: вы неправильно цитируете командную строку, когда печатаете ее для включения в заголовок окна.
В опубликованном вами .zshrc
, который вы не используете (не делайте этого! Всегда копируйте и вставляйте точное содержимое файла и команды, которые вы использовали), я вижу:
a=${(V)1//\%/\%\%}
a=$(print -Pn "%40>...>$a" | tr -d "\n")
print -Pn "\ek$a:$3\e\\"
print -P
вызывает быстрое расширение. Вы включаете команду в аргумент. Вы защищаете символы %
в команде, удваивая их, но этого недостаточно. Очевидно, у вас включена опция prompt_subst
, поэтому print -P
вызывает в командной строке конструкцию $(…)
, которая определяет выполняемую функцию:
python -c "import $1; print $1.__file__"
где $1
- командная строка (определение функции: pywhere { … }
).
Вместо того, чтобы пытаться разобрать командную строку, распечатайте ее буквально. Это также исправит другие ошибки: помимо того, что вы не учли prompt_subst
, вы удвоили %
знаков, но должны были бы увеличить их в четыре раза, так как вы выполняете быстрое расширение дважды, и вы также расширяете последовательности \
в два раза.
function title() {
a=${(q)1} # show control characters as escape sequences
if [[ $#a -gt 40 ]]; then a=$a[1,37]...; fi
case $TERM in
screen)
print -Pn "\ek"; print -r -- $a; print -Pn ":$3\e\\";;
xterm*|rxvt)
print -Pn "\e]2;$2 | "; print -r -- $a; print -Pn ":$3\a";;
esac
}