2011-10-31 82 views
6

当我开始执行一个命令的tab自动完成时,它会保持我在它旁边初始键入的内容,并且命令变得不可读。在下面的例子中,我输入'git che'并点击标签。一旦我选择'checkout',命令提示符就会变成'git che git checkout'。该命令仍然有效,并在我的历史中存储'git checkout'。但它的视觉非常恼人。无论如何改变这种行为。我在2种不同的终端模拟器中试过,所以我可以确认它的ZSH而不是模拟器。由于ZSH自动完成拧紧命令名称

Screenshot

编辑:

回声$ ZSH_VERSION
4.3.10

它似乎与zsh的-f发生。虽然很难说,因为唯一的自动完成工作是目录。我使用的是 '哦,我的-的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%}' 

SOLUTION:

注:计算器不会让我回答我的问题,因为我问它在过去的8个小时内。我不想等待。

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

+0

什么是您的zsh版本('echo $ ZSH_VERSION')?如果你运行'zsh -f',你会看到同样的效果吗?如果没有,发布你的zsh配置文件的内容('〜/ .zshrc'和你自定义的其他文件)。 – Gilles

回答

6

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

我才发现this link今晚,我的提示搞乱之后 - 我一直在想,为什么提示ZSH例子似乎很不必要的复杂性。

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

如果你不要转义这个,shell认为你的光标已经移动(尽管它没有)。这导致搞砸了提示,而且相当恼人的视觉效果,当您使用Tab补齐等

下面是一些截图没有逃避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%}%% " 

,因为一切都已经被内%{...%}对很好地逃过一劫。