Автозаполнение ZSH изменяет имя команды

#shell #autocomplete #zsh #zshrc

#оболочка #автозаполнение #zsh #zshrc

Вопрос:

Когда я начинаю выполнять автозаполнение вкладки команды, она сохраняет то, что я изначально ввел рядом с ней, и команда становится нечитаемой. В приведенном ниже примере я набрал «git che» и нажал tab. Как только я выбираю «оформить заказ», командная строка становится «git che git checkout». Команда все еще работает, и в моей истории она хранит «git checkout». Но это довольно раздражает визуально. Есть ли способ изменить это поведение. Я пробовал это в 2 разных эмуляторах терминала, поэтому я могу подтвердить его ZSH, а не эмулятор. Спасибо

Скриншот

Редактировать:

echo $ZSH_VERSION
4.3.10

Похоже, этого не происходит с zsh -f. Хотя это трудно сказать, поскольку единственное автозаполнение, которое работает, — это каталоги. Я использую ‘oh-my-zsh’ с этой пользовательской темой:

 autoload -U add-zsh-hook
add-zsh-hook chpwd do_ls_on_chdir

function do_ls_on_chdir() {
    ls; 
}

function dirStack(){
OUT='';
NUM=1;
for X in $(dirs | cut -d ' ' -f2-10); do
    OUT="$OUT$1%B$NUM:%b$1$X ";
    (( NUM=NUM 1 ))
done
echo $OUT;
 

}

 ZSH_THEME_GIT_PROMPT_ADDED=""
ZSH_THEME_GIT_PROMPT_MODIFIED=""
ZSH_THEME_GIT_PROMPT_DELETED=""
ZSH_THEME_GIT_PROMPT_RENAMED=""
ZSH_THEME_GIT_PROMPT_UNMERGED=""
ZSH_THEME_GIT_PROMPT_UNTRACKED=""

ZSH_THEME_GIT_PROMPT_AHEAD="%{$fg_bold[yellow]%}↑"
ZSH_THEME_GIT_PROMPT_PREFIX=""
ZSH_THEME_GIT_PROMPT_SUFFIX=""
ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg_bold[red]%}✗"
ZSH_THEME_GIT_PROMPT_CLEAN=" %{$fg_bold[green]%}✔"

local user_color='blue'
local back="${BG[237]}"
test $UID -eq 0 amp;amp; user_color='red'

PROMPT='$(dirStack $back)
$back%B%!%b$back %{$fg_bold[$user_color]%}%~%{$reset_color%}'
'$back $(git_prompt_status)%{$reset_color%}'
'$back%{$fg_bold[magenta]%}$(git_prompt_info)%{$reset_color%}'
'$back$(git_prompt_ahead)$reset_color'
'$back%(!.#.>)$reset_color '

PROMPT2='%{$fg[red]%}%_ %{$reset_color%}'
PROMPT3='%{$fg[red]%}... %{$reset_color%}'
RPROMPT='%(?..%{$fg_bold[red]%}exit %?%{$reset_color%})'
' %{$FG[186]%}(%D %*)%{$reset_color%}'
 

РЕШЕНИЕ:

ПРИМЕЧАНИЕ: stackoverflow не позволит мне ответить на мой собственный вопрос, поскольку я задавал его в течение последних 8 часов. Мне не хочется ждать.

Итак, я понял это. Оказывается, я неправильно избегал цветовых кодов ANSI (я думаю). Везде, где у меня был $reset_color в моей командной переменной, я изменил это на%{$reset_color%}, и это исправило.

Комментарии:

1. Какова ваша версия zsh ( echo $ZSH_VERSION )? Вы видите тот же эффект при запуске zsh -f ? Если нет, опубликуйте содержимое ваших файлов конфигурации zsh ( ~/.zshrc и любых других, которые вы настроили).

Ответ №1:

Итак, я понял это. Оказывается, я неправильно избегал цветовых кодов ANSI (я думаю). Везде, где у меня был $reset_color в моей командной переменной, я изменил это на%{$reset_color%}, и это исправило.

Я обнаружил эту ссылку только сегодня вечером, после того, как возился с моей подсказкой — я всегда задавался вопросом, почему примеры подсказок ZSH кажутся такими излишне сложными.

Когда вы настраиваете цвета в своем zsh приглашении, вы должны избегать действий с %{ [...] %} помощью, чтобы «оболочка знала, что из этих последовательностей нет вывода, и курсор не перемещался».

Если вы не избежите этого, оболочка считает, что ваш курсор переместился (хотя это не так). Это приводит к перепутанным подсказкам и довольно раздражающим визуальным эффектам при использовании табуляции и т. Д.

Вот несколько скриншотов без экранирования последовательности reset-color подсказок ( PR_NO_COLOUR="%{$terminfo[sgr0]%}" в моих настройках подсказок). Как мы видим, курсор запускается не в том месте:

Курсор запускается не в том месте

Это должно быть здесь:

Правильно установленный курсор

И после попытки завершения табуляции без экранирования в приглашении все запутано в том, где находится текст и где должен быть размещен курсор:

Курсор находится в середине слова

(Курсор должен быть помещен в конец каталога, а не на полпути).

Итак, последовательности подсказок выглядят следующим образом:

 PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
 

потому что все должно быть хорошо экранировано внутри %{...%} пар.

Комментарии:

1. См. Документацию, объясняющую %{ amp; %} zsh.sourceforge.net/Doc/Release /…

2. Да, вам нужно не только экранировать $reset_color , но и все коды управления цветом: %{$fg[...]%}