Завершение дублирования команды Zsh
Я работаю на OS X Mountain Lion и запускаю включенную оболочку ZSH (4.3.11) с установленным Oh-My-ZSH сверху.
При использовании дополнения табуляции такими командами, как homebrew, когда ZSH перечисляет доступные команды, это также дублирует команду. Например:
$ brew {tab}
приведет к:
$ brew brew
[list of homebrew commands]
Я не уверен, что является причиной этой ошибки, так как при изменении размера окна терминала первый экземпляр имени команды исчезает.
Если я нажму клавишу Backspace при отображении дубликатов, я смогу удалить только второй экземпляр команды, zsh не позволит мне вернуться назад. Кроме того, если я удаляю дубликат с помощью backspace, zsh будет действовать так, как если бы не было введенной команды вообще.
Мой .zshrc вместе со всеми моими другими файлами .configuration можно найти на https://github.com/daviesjamie/dotfiles
ОБНОВЛЕНИЕ: Я нашел этот пост о ком-то, у кого такая же проблема в Ubuntu. Однако я не понимаю данное решение и даже не уверен, применимо ли оно к моей установке?
Ответы
Ответ 1
Проблема может возникнуть из-за неулокальных скобок %{
%}
, которые указывают zsh, что текст внутри имеет нулевую ширину. Единственное, что должно быть заключено в них, - это escape-последовательности, которые изменяют цвет или смелость текста. Если вы используете новую zsh ( >= 4.3. {Unknown version}), я бы даже предложил использовать %F{color}...%f
, %K{color}...%k
, %B...%b
вместо %{${fg[green]}%}
или то, что у вас там.
Проблема с ними заключается в том, что нет никакого способа запросить терминал с вопросом вроде "Эй, я вывел какой-то текст. Где теперь курсор?" и zsh должен самостоятельно вычислить длину его подсказки. Когда вы вводите текст и запрашиваете zsh, чтобы завершить zsh, скажем, что терминал переместит курсор в определенное место и введите завершенную cmdline. При неправильных скобках %{%}
это конкретное местоположение неверно.
Ответ 2
Этот эффект также может быть воспроизведен, если вы используете любой символ причудливый символ UTF-8, как стрелка, символ git branch > и т.д.
Просто удалите эти символы из приглашения, и дублирование не произойдет.
Также добавление
export LC_ALL = ru_US.UTF-8
export LANG = en_US.UTF-8
to ~/.profile может помочь
Ответ 3
Если вы используете iTerm на Mac, обязательно проверьте "Установить языковые переменные автоматически" в настройках вашего профиля. Я отключил его для подключения к SSH, и это привело к той же ошибке, и я исправил ее, оставив эту опцию.
Ответ 4
Это старый поток, но я столкнулся с аналогичной проблемой в моей настройке zsh с конфигурацией oh-my-zsh.
Настройка export LC_ALL=en_US.UTF-8
исправила проблему.
Ответ 5
Мое решение сделать как локальную, так и работу ssh - это что-то вроде комбинации ответов @Marc и @neotohin:
- Установите
export LANG=en_US.UTF-8
(просто раскомментируйте, что часть в шаблоне .zshrc; экспорт LC_ALL
, как и в @neotohin ответе, вместо LANG
также может работать, я не пытался)
- Снимите флажок "Установите переменные среды локали при запуске" в разделе "Расширенный" в разделе "Терминал" (причина: эта настройка устанавливает
LC_CTYPE=UTF-8
вместо en_US.UTF-8
), что тормозит локаль для меня в ssh )
Ответ 6
Многие ответы во многих местах предлагают решение export LC_ALL=en_US.UTF-8
. Это, однако, не работает для меня. Я продолжал сталкиваться с этой проблемой, используя oh-my-zsh как в Arch Linux, так и в PopOS.
Единственное решение, которое сработало для меня, было это предложение romkatv по вопросу о репозитории oh-my-zsh github.
Оказывается, по крайней мере, в моем случае, проблема дублирования при автозаполнении возникла бы только в том случае, если где-то в строке был символ, отличный от ASCII (например, смайлик). И ZSH неправильно предположил бы, что этот не-ASCII символ должен занимать 2 символьных пробела вместо 1.
Таким образом, решение, которое работало, состояло в том, чтобы открыть файл .zsh-theme
для любой используемой вами темы, найти все не-ASCII-символы и использовать %{%G%}
, чтобы сказать ZSH использовать только одну ширину символа для этого символа
Например, стандартная тема oh-my-zsh robbyrussel
содержит 2 не-ASCII символа. Символ "➜" в приглашении
PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
и символ '✗' в приглашении для каталогов git
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗"
Использование %{%G<character>%}
вокруг двух не-ASCII символов, как это
PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}%{%G➜%} )"
и это
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}%{%G✗%}"
это то, что, наконец, решило проблему для меня.
Поэтому все, что вам нужно сделать, - это скопировать файл темы, который вы хотите использовать, и отредактировать все символы, не входящие в ASCII, как показано выше, и, надеюсь, вы больше никогда не увидите проблему дублирования.