ZSH自动完成拧紧命令名称

时间:2011-10-31 17:40:30

标签: shell autocomplete zsh zshrc

当我开始执行命令的选项卡自动完成时,它会保留我最初键入的内容并且命令变得不可读。在下面的示例中,我输入了'git che'并点击了标签。一旦我选择'checkout',命令提示符就会变成'git che git checkout'。该命令仍然有效,在我的历史中它存储'git checkout'。但它在视觉上很烦人。无论如何都要改变这种行为。我在2个不同的终端仿真器中尝试了这个,所以我可以确认它的ZSH而不是模拟器。感谢

Screenshot

编辑:

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%}'

解决方案:

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

所以我明白了。事实证明我没有正确地逃避ANSI颜色代码(我认为)。在我的PROMPT变量中,每个地方都有$ reset_color,我将其更改为%{$ reset_color%}并修复了它。

1 个答案:

答案 0 :(得分:8)

  

所以我明白了。事实证明我没有正确地逃避ANSI颜色代码(我认为)。在我的PROMPT变量中,每个地方都有$ reset_color,我将其更改为%{$ reset_color%}并修复了它。

我今晚才发现this link,在弄乱我的提示后 - 我总是想知道为什么 ZSH提示示例似乎是如此不必要的复杂。

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

如果转义此操作,则shell认为您的光标已移动(即使它没有)。当你使用制表符完成等时,这会导致混乱的提示,而且会产生恼人的视觉效果。

以下是一些截图没有在我的提示设置中转义reset-color提示序列(PR_NO_COLOUR="%{$terminfo[sgr0]%}")。我们可以看到,光标在错误的位置开始:

Cursor starts in the wrong place

它应该在这里:

Correctly-placed cursor

在没有转义的情况下尝试制表符完成后,提示会对文本的位置以及光标所在的位置感到困惑:

Cursor is in the middle of the word

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

因此提示序列如下所示:

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

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