Pesquisa inversa na CLI: saída desabilitada depois [duplicada]

5

Veja minha edição abaixo, isso não é totalmente uma cópia de Shell prompt customização e comportamento cmd

Minha função reverse-search na CLI está quebrada e não sei como corrigi-la de volta ...

Quando eu clico em ctrl + r e procuro um comando que eu fiz antes, ache ele e pressione a tecla de seta para a direita para usá-lo, a saída está quebrada. Aqui está um exemplo:

# I reverse-searched the word "test" then pressed right arrow
yoshiji@x1carbon:~/path/to/git/folder (master) $ch)'test': rake test
#                                              ^^^^^^^^^^ weird output
#                                                     ^ cursor right there

Ele também "desloca" meu cursor para uma posição diferente. Se eu pressionar enter, o comando direito é executado ( rake test neste caso), então significa que o texto exibido não é o mesmo que o que é realmente executado.

Eu sei que isso provavelmente está relacionado ao meu PS1 export no meu ~/.bashrc , então aqui estão as últimas linhas deste arquivo:

# Git branch in prompt.
git_branch() {
  branch=$(__git_ps1 2> /dev/null)
  if [ "$branch" = " (master)" ]; then
     echo -e "3[33m${branch}3[00m" # yellow
  elif [ "$branch" = "" ]; then
     echo -e "3[90m (no git)3[00m" # red
  else
     echo -e "3[32m${branch}3[00m" # green
  fi
}
PS1='\u@\h:\w$(git_branch) \$ '

Isso é algo que escrevi para exibir o ramo git em laranja (se master branch) ou então em verde (ou no git em cinza).

Vocês têm alguma ideia do que está causando esse comportamento estranho?

Editar: Este é um problema diferente do possível duplicar da maneira que estou usando echo -e "some string" para retornar uma string com cor + nome da ramificação git da função git_branch() . Usar echo -e não escapa dos caracteres \[ e \] (tente você mesmo em sua CLI: echo -e "\[3[33m\]test" ).

Idealmente, gostaria de manter essas cores condicionais com base na presença & nome (cinza se não houver ramo, laranja se mestre, mais verde).

    
por MrYoshiji 11.05.2018 / 17:07

2 respostas

7

Embrulhe as sequências de cor na linha de leitura como segue:

echo -e "
echo -e "%pre%13[33m%pre%2${branch}%pre%13[00m%pre%2" # yellow
echo -e "%pre%13[90m%pre%2 (no git)%pre%13[00m%pre%2" # red
echo -e "%pre%13[32m%pre%2${branch}%pre%13[00m%pre%2" # green
13[33m%pre%2${branch}%pre%13[00m%pre%2" # yellow echo -e "%pre%13[90m%pre%2 (no git)%pre%13[00m%pre%2" # red echo -e "%pre%13[32m%pre%2${branch}%pre%13[00m%pre%2" # green

As saídas de linha de leitura são \[21 no início de uma seqüência de não impressão e \] no final. Estes são equivalentes a %code% e %code% , respectivamente, na string PS1.

Fonte: resposta do archemiro em bash prompt e ecoando cores dentro de uma função - Stack Overflow

Esta é minha resposta de outra pergunta com o código alterado.

    
por wjandrea 11.05.2018 / 19:02
3

Quando você coloca códigos de cor em seu prompt, você precisa adicionar marcadores extras para informar ao terminal que você tem caracteres invisíveis no prompt

Alterar

 echo -e "3[33m${branch}3[00m" # yellow

para

 echo -e "\[3[33m\]${branch}\[3[00m\]" # yellow
 # .......^^........^^.........^^........^^

e assim por diante

Consulte Como controlar o prompt no manual da festança.

    
por glenn jackman 11.05.2018 / 17:26