Zsh tab завершение дублирования имени команды
Я работаю на 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. Однако я не понимаю данное решение и даже не уверен, применимо ли оно к моей установке?
5 ответов
Проблема может возникнуть из-за неуместного %{
%}
скобки, которые сообщают zsh, что текст внутри имеет нулевую ширину. Единственное, что должно быть заключено в них, это escape-последовательности, которые меняют цвет или жирность текста. Если вы используете новый zsh (>=4.3.{Неизвестная версия}), я бы даже предложил использовать %F{color}...%f
, %K{color}...%k
, %B...%b
вместо %{${fg[green]}%}
или что у вас там.
Проблема с ними состоит в том, что нет способа запросить терминал с вопросом типа "Эй, я вывел некоторый текст. Где сейчас курсор? "И zsh сам должен вычислить длину своего запроса. Когда вы наберете какой-нибудь текст и попросите zsh завершить, zsh скажет терминал, чтобы переместить курсор в определенное место, и введите там готовую cmdline. С неуместным %{%}
скобки это конкретное местоположение неверно.
Этот эффект также может быть воспроизведен, если вы используете какой-либо из причудливых символов UTF-8, таких как стрелка, символ "git branch" и так далее.
Просто удалите эти символы из приглашения, и дублирование не произойдет.
Также добавляем
экспорт LC_ALL=en_US.UTF-8
экспорт LANG=en_US.UTF-8
~/.profile может помочь
Если вы используете iTerm на Mac, обязательно отметьте "Автоматически устанавливать переменные локали" в настройках своего профиля. Я отключил его для SSH-соединения, и это привело к той же ошибке, и я исправил ее, оставив этот параметр включенным.
Это старый поток, но я столкнулся с подобной проблемой в моей настройке zsh с конфигурацией oh-my-zsh.
настройка export LC_ALL=en_US.UTF-8
исправил проблему.
Многие ответы во многих местах предполагают export LC_ALL=en_US.UTF-8
решение. Однако это не сработало для меня. У меня по-прежнему была эта проблема с использованием oh-my-zsh как в Arch linux, так и в PopOS.
Единственное решение, которое сработало для меня, - это предложение romkatv по проблеме в репозитории github oh-my-zsh.
Оказывается, по крайней мере, в моем случае, проблема с дублированием автозаполнения могла появиться только в том случае, если где-то в строке был не-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]%}%{%G➜%} :%{$fg_bold[red]%}%{%G➜%} )"
и это
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}%{%G✗%}"
это то, что наконец решило проблему для меня.
Итак, все, что вам нужно сделать, это сделать копию файла темы, который вы хотите использовать, и отредактировать все символы, отличные от ASCII, как показано выше, и, надеюсь, вы никогда больше не увидите проблему дублирования.
Мое решение сделать так, чтобы и локальный, и ssh работали, это что-то вроде сочетания ответов @Marc's и @neotohin:
- Задавать
export LANG=en_US.UTF-8
(просто раскомментируйте эту часть в шаблоне.zshrc; экспортLC_ALL
, как в ответе @neotohin, а неLANG
может тоже сработает, я не пробовал) - Снимите флажок "Задавать переменные среды локали при запуске" в разделе "Дополнительно" профиля терминала (причина: этот параметр устанавливает
LC_CTYPE=UTF-8
вместоen_US.UTF-8
, который тормозит локаль для меня в SSH)