6

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

截屏

编辑:

回声 $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%} 并修复了它。

4

1 回答 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%}%% "

%{...%}因为所有东西都必须在对内很好地逃脱。

于 2012-05-17T21:56:07.967 回答