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:

  1. Задавать export LANG=en_US.UTF-8 (просто раскомментируйте эту часть в шаблоне.zshrc; экспорт LC_ALL, как в ответе @neotohin, а не LANG может тоже сработает, я не пробовал)
  2. Снимите флажок "Задавать переменные среды локали при запуске" в разделе "Дополнительно" профиля терминала (причина: этот параметр устанавливает LC_CTYPE=UTF-8 вместо en_US.UTF-8, который тормозит локаль для меня в SSH)
Другие вопросы по тегам