bash: exibição confusa para linhas longas

3

Estou usando o GNU bash, versão 4.4.0 (1) no Ubuntu 16.04.

Quando eu insiro linhas longas no meu bash, sua exibição está desarrumada.

Por exemplo, supondo que eu esteja em ~/test/test/test/test/test/test/test e insira echo "The quick brown fox jumps over the lazy doggo" , é assim: Issoémeiocaminhocerto,mesmoqueeuprefiraummonitorembrulhadoeeupoderiafazersemaduplicaçãodalinha.

Oproblemaéqueagoraeucorrijoafrasepressionandobackspacetrêsvezesmaisaspasduplasumavez,atelaéassim:

Oo" no final é um erro de exibição, conforme confirmado pressionando enter:

Vocêpodeverqueafrasedesejadacomdogemvezdedoggoéimpressa.Eleéimpressoemverde,porqualquermotivo.

Tudoissosetornaaindapiorquandoeuagoraamplioeencolhoajaneladoterminalalgumasvezes.Oconteúdodoterminaléentãocopiadoaleatoriamenteeconcatenadoemtodooterminal: (Aslongascaixaspretassãoconcatenaçõesaleatóriasdoconteúdodomeuprompt.)

Euachoquetudoissopodeestarrelacionadoao~/.bashrc,mesmoqueeutenhafeitocp/etc/skel/.bashrc~/.Enfim,aquiestá:

#~/.bashrc:executedbybash(1)fornon-loginshells.#see/usr/share/doc/bash/examples/startup-files(inthepackagebash-doc)#forexamples#Ifnotrunninginteractively,don'tdoanythingcase$-in*i*);;*)return;;esac#don'tputduplicatelinesorlinesstartingwithspaceinthehistory.#Seebash(1)formoreoptionsHISTCONTROL=ignoreboth#appendtothehistoryfile,don'toverwriteitshopt-shistappend#forsettinghistorylengthseeHISTSIZEandHISTFILESIZEinbash(1)HISTSIZE=1000HISTFILESIZE=2000#checkthewindowsizeaftereachcommandand,ifnecessary,#updatethevaluesofLINESandCOLUMNS.shopt-scheckwinsize#Ifset,thepattern"**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Ao remover o ~ / .bashrc, recebo o seguinte: (Estou usando o comando echo "This is a really long sentence, even long than a sentence containing all letters of the alphabet" para compensar o prompt mais curto)

Primeiro, tudo está bem:

Apósexcluiralgumaspalavras,receboalgumassobrasnofinaldalinha:

Alémdisso,seeucontinuarpressionandoobackspace,possoatéexcluirpartesdoprompt:

ApóspressionarEnter(ecorrigirofinaldocomandopara[...],ev" ), e ao redimensionar, recebo a confusão usual:

    
por Bananach 29.08.2017 / 10:24

3 respostas

2

Seu prompt contém cores (e talvez outras não imprimíveis).

No bash, você pode cercar as partes com \[ e \] para informar o bash a ignorar essas partes para calcular o tamanho do prompt.

Ex:

PS1="\e[33mthis is green\e[0m this is normal"
# should be done as:
PS1="\[\e[33m\]this is green\[\e[0m\] this is normal"

O segundo tem \[ e \] em torno de cada parte que, embora altere a cor, não adiciona nenhum caractere visível na exibição, portanto, não deve ser contado ao calcular o posicionamento de caracteres no prompt.

Se você modificou o PS1, não coloque os caracteres visíveis \[ e \] . Se você fez, leve-os para fora deles.

Outra coisa: você pode querer fazer shopt -q -s checkwinsize para garantir que o tamanho do terminal seja atualizado quando for redimensionado.

E você parece estar usando uma configuração que mostra apenas o final da linha de comando atualmente inserida (semelhante ao que o ksh faz ... você tem certeza que usa o bash?): Eu vou olhar em qual opção pode mudar isso , mas eu não sei ainda.

editar

No bate-papo, também falamos:

set -o emacs  #he was in vi mode
set -o posix  #he was in posix=no mode

mas no final parece que o que deu certo foi se livrar de ~ / .inputrc (o que ele fez, pode ter contido algo errado mas eu não sei o que estava nele, nem pedi para deletá-lo ^^ apenas renomeá-lo (ou consertar seu conteúdo) teria ajudado ...)

    
por 29.08.2017 / 16:42
0

A configuração do terminal (tipo de terminal) está correta? No meu host linux do ubuntu, meu tipo de terminal é 'ansi'. (você pode obter isso emitindo o comando: echo $ TERM). O tipo de terminal deve corresponder à tela (console) que você está usando. Às vezes, se o tipo de terminal estiver incorreto, os códigos de escape termimétricos (controle de cursor, por exemplo) não são reconhecidos pelo terminal / console, portanto, a saída da tela fica confusa. Outro tipo de terminal standaard é "vt100", "vt220".

    
por 29.08.2017 / 12:14
0

Eu resolvi isso com a ajuda de @OlivierDulac, fazendo alterações em ~/.bashrc e ~/.inputrc .

Em ~/.bashrc agora uso:

PS1='\e[01;32m\u:\e[01;34m\w\e[0m\$ '

Observe que substituímos \ 033 por \ e para criar cores. Fazer isso sozinho com o PS1 original não resolveu, então há algo mais errado nisso, mas eu estava cansado demais para rastreá-lo. Eu acredito que é o fato de que eu (ao contrário de muitas recomendações, e ao contrário do ezprompt.net, que usei para criar o PS1) NÃO use \[ e \] para incluir caracteres não impressos. De fato, se eu usar essas coisas tudo fica bagunçado de novo.

Em ~/.inputrc , eu já tinha

#These lines make the vi mode visible by switching from a block cursor to a line cursor.
set show-mode-in-prompt on
[...]
set vi-cmd-mode-string \e[1 q
set vi-ins-mode-string \e[5 q

Eu simplesmente removo os e , ou seja, agora tenho

set editing-mode vi
[...]
set show-mode-in-prompt on
set vi-cmd-mode-string \e[1 q
set vi-ins-mode-string \e[5 q

Novamente, isso é contrário ao que eu recomendei em outro lugar. Talvez seja porque estou usando uma festa relativamente nova? ( set show-mode-in-prompt on só funciona para bash4.4 afaik)

    
por 29.08.2017 / 18:41