ZSH自动完成功能导致命令名称出错。

6
当我开始使用命令的选项自动补全时,它会保留我最初输入的内容,并且命令变得难以阅读。在下面的示例中,我输入了“git che”并按Tab键。一旦我选择了“checkout”,命令提示符就变成了“git che git checkout”。该命令仍然有效,在我的历史记录中存储为“git checkout”。但是从视觉上看,这相当烦人。有没有办法改变这种行为?我在两个不同的终端仿真器中尝试过,所以我可以确认这是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 && 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%}'

解决方案:

注意:由于我在过去8小时内提出了问题,stackoverflow不会让我回答自己的问题。我不想等待。

所以我找到了解决方法。原来我没有正确转义ANSI颜色代码(我想)。在我的PROMPT变量中,无论我在哪里使用$reset_color,我将其更改为% {$reset_color%},问题就解决了。


你的zsh版本是什么(echo $ZSH_VERSION)?如果你运行zsh -f,是否看到相同的效果?如果没有,请发布您的zsh配置文件的内容(~/.zshrc和任何其他您自定义的文件)。 - Gilles 'SO- stop being evil'
1个回答

9
所以我找到了问题所在。原来我没有正确转义ANSI颜色代码(我想)。在我的PROMPT变量中,我将$reset_color处处改为%{$reset_color%},问题就解决了。
今晚我才发现了这个链接,之前一直想知道为什么ZSH提示符示例看起来那么复杂。
当您设置zsh提示符的颜色时,应该使用%{ [...] %}进行转义,以便“shell知道这些序列没有输出且光标未移动”。
如果您没有对其进行转义,shell会认为光标已经移动了(即使没有移动)。这会导致提示符混乱,并在使用制表符完成等操作时产生相当烦人的视觉效果。
以下是一些未转义reset-color提示序列的屏幕截图(在我的提示设置中为PR_NO_COLOUR="%{$terminfo[sgr0]%}")。我们可以看到,光标从错误的位置开始:
应该在这里:
尝试未转义的制表符完成后,提示符会混淆文本的位置和光标应放置的位置:
(光标应该放在目录的末尾,而不是中途)。
因此,提示序列看起来像这样:
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

因为所有的内容都必须在%{...%}对中进行良好的转义处理。


请查看文档以了解 %{%} 的含义 - http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Visual-effects - MikeB
是的,你不仅需要转义 $reset_color,而且所有颜色控制代码也需要转义:%{$fg[...]%} - KFL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接