【问题标题】:ZSH auto-complete screws up command nameZSH 自动完成功能搞砸了命令名称
【发布时间】:2011-10-31 17:40:30
【问题描述】:

当我开始对命令进行制表符自动完成时,它会保留我最初键入的内容,并且命令变得不可读。在下面的示例中,我输入了“git che”并点击了 tab。一旦我选择“checkout”,命令提示符就会变成“git che git checkout”。该命令仍然有效,并且在我的历史记录中它存储“git checkout”。但它在视觉上很烦人。有没有办法改变这种行为。我在 2 个不同的终端仿真器中尝试了这个,所以我可以确认它的 ZSH 而不是仿真器。谢谢

Screenshot

编辑:

回显 $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%}'

解决方案:

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

所以我想通了。事实证明我没有正确地转义 ANSI 颜色代码(我认为)。我的 PROMPT 变量中到处都有 $reset_color,我将其更改为 %{$reset_color%} 并修复了它。

【问题讨论】:

  • 你的 zsh 版本是多少(echo $ZSH_VERSION)?如果你运行zsh -f,你会看到同样的效果吗?如果没有,请发布您的 zsh 配置文件的内容(~/.zshrc 和您自定义的任何其他内容)。

标签: shell autocomplete zsh zshrc


【解决方案1】:

所以我想通了。事实证明我没有正确地转义 ANSI 颜色代码(我认为)。我的 PROMPT 变量中到处都有 $reset_color,我将其更改为 %{$reset_color%} 并修复它。

我今晚才发现this link,在弄乱了我的提示之后 - 我一直想知道为什么 ZSH 提示示例看起来如此不必要的复杂。

当您在zsh 提示符中设置颜色时,您应该使用%{ [...] %} 进行转义,以便“shell 知道这些序列没有输出并且光标没有移动”。

如果您对此进行转义,shell 会认为您的光标已经移动(即使它没有移动)。当您使用制表符补全等时,这会导致提示混乱,以及相当烦人的视觉效果。

这是一些屏幕截图没有转义reset-color提示序列(PR_NO_COLOUR="%{$terminfo[sgr0]%}",在我的提示设置中)。如我们所见,光标从错误的位置开始:

应该在这里:

在不转义的情况下尝试tab-completion之后,提示对文本在哪里以及光标应该放在哪里感到困惑:

(光标应该放在目录的末尾,而不是中途)。

所以提示序列如下所示:

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

因为必须在 %{...%} 对内很好地转义所有内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多