Подтвердить что ты не робот

Завершение дублирования команды 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. Однако я не понимаю данное решение и даже не уверен, применимо ли оно к моей установке?

4b9b3361

Ответ 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, как показано выше, и, надеюсь, вы больше никогда не увидите проблему дублирования.