shell - manjaro - ZSH autocompleta el nombre del comando
zsh themes linux (1)
Cuando comienzo a hacer la tabulación automática de un comando, guarda lo que escribí inicialmente junto a él y el comando no se puede leer. En el siguiente ejemplo, escribí ''git che'' y presioné la pestaña. Una vez que selecciono ''pagar'', el símbolo del sistema se convierte en ''git che git checkout''. El comando todavía funciona y en mi historial almacena ''git checkout''. Pero es bastante molesto visualmente. ¿Hay alguna forma de cambiar este comportamiento? Intenté esto en 2 emuladores de terminal diferentes, así que puedo confirmar su ZSH y no el emulador. Gracias
EDITAR:
echo $ ZSH_VERSION
4.3.10
No parece suceder con zsh -f. Aunque es difícil de decir ya que el único autocompletado que funciona es directorios. Estoy usando ''oh-my-zsh'' con este tema personalizado:
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%}''
SOLUCIÓN:
NOTA: stackoverflow no me deja responder mi propia pregunta, ya que la pregunté en las últimas 8 horas. No tengo ganas de esperar.
Así que lo descubrí. Resulta que no estaba escapando correctamente los códigos de color ANSI (creo). En todas partes tenía $ reset_color en mi variable PROMPT, lo cambié a% {$ reset_color%} y lo arreglaba.
Así que lo descubrí. Resulta que no estaba escapando correctamente los códigos de color ANSI (creo). En todas partes tenía $ reset_color en mi variable PROMPT, lo cambié a% {$ reset_color%} y lo arreglaba.
Solo descubrí este enlace esta noche, después de jugar con mi mensaje; siempre me he preguntado por qué los ejemplos de ZSH parecen tan innecesariamente complejos.
Cuando configure los colores en su solicitud de zsh
, debe escapar de las cosas con %{ [...] %}
, de modo que "el shell sepa que no hay salida de estas secuencias y el cursor no se haya movido".
Si no escapa de esto, el shell cree que su cursor se ha movido (aunque no lo haya hecho). Esto conduce a mensajes desordenados, y efectos visuales bastante molestos cuando usas tab-completion, etc.
Aquí hay algunas capturas de pantalla sin escapar de la secuencia de solicitud de reset-color
( PR_NO_COLOUR="%{$terminfo[sgr0]%}"
, en mi configuración de indicaciones). Como podemos ver, el cursor comienza en el lugar equivocado:
Debería estar aquí:
Y después de intentar completar las pestañas sin escaparse, el mensaje se confunde sobre dónde está el texto y dónde debe colocarse el cursor:
(El cursor debe colocarse al final del directorio, no a la mitad).
Entonces, las secuencias rápidas se ven así:
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
porque todo tiene que escaparse bien dentro de %{...%}
pares.