2011-10-31 40 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%}%% " 

,因爲一切都已經被內%{...%}對很好地逃過一劫。