bash: pantalla desorderada para largas queues

Estoy usando GNU bash, versión 4.4.0 (1) en Ubuntu 16.04.

Cuando ingreso líneas largas en mi bash, su pantalla está en mal estado.

Por ejemplo, asumiendo que estoy en ~/test/test/test/test/test/test/test e ingreso echo "The quick brown fox jumps over the lazy doggo" se ve así: enter image description here Esto está a medio path, aunque preferiría una pantalla envolvente y podría hacerlo sin doblar la línea.

El problema es cuando ahora corrijo la oración presionando el button de retroceso tres veces más comillas dobles una vez, la pantalla se ve así: enter image description here

El o" al final es un error de visualización, como se confirmó al presionar enter: enter image description here

Puede ver que se imprime la oración deseada con dog lugar de doggo . Sin embargo, está impreso en verde, por el motivo que sea.

Todo esto empeora cuando agrando y encojo la window del terminal unas cuantas veces. El contenido del terminal luego se copy random y se concatena a través de la terminal: enter image description here (Los cuadros negros largos son concatenaciones aleatorias de los contenidos de mi post).

Me imagino que todo esto podría estar relacionado con ~/.bashrc , aunque solo hice cp /etc/skel/.bashrc ~/ . De todos modos, aquí está:

 # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options HISTCONTROL=ignoreboth # append to the history file, don't overwrite it shopt -s histappend # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 HISTFILESIZE=2000 # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize # If set, the pattern "**" 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 colonetworking 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)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[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 # colonetworking 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 

Al eliminar ~ / .bashrc, obtengo lo siguiente: (Estoy usando el command echo "This is a really long sentence, even long than a sentence containing all letters of the alphabet" para compensar el aviso más corto)

Primero, todo está bien: enter image description here

Al eliminar algunas palabras, obtengo algunas sobras al final de la línea: enter image description here

Además, si sigo presionando el button de retroceso, incluso puedo borrar partes del aviso: enter image description here

Después de presionar enter (y fijar el final del command en [...], ev" ), y al cambiar el tamaño, obtengo el desorder habitual: enter image description here

Solutions Collecting From Web of "bash: pantalla desorderada para largas queues"

¿Su configuration de terminal (tipo de terminal) es correcta? En mi host ubuntu linux mi tipo de terminal es 'ansi'. (puede getlo emitiendo el command: echo $ TERM). El tipo de terminal tiene que coincidir con la pantalla (console) que está utilizando. A veces, si el tipo de terminal es incorrecto, el terminal / console no reconoce los códigos de escape térmicos (control del cursor, por ejemplo), por lo que la salida de la pantalla está en mal estado. Otros types de terminales estándar son "vt100", "vt220".

Su post contiene colors (y tal vez otros no imprimibles).

En bash, puede rodear las partes con \[ y \] para decirle a bash que ignore esas partes para calcular la longitud del aviso.

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" 

El segundo tiene \[ y \] alnetworkingedor de cada parte que, al cambiar el color, no agrega ningún carácter visible en la pantalla, por lo tanto, no debe contarse al calcular la location de los caracteres en el post.

Si modificó PS1, asegúrese de no poner dentro de \[ y \] caracteres visibles. Si lo hiciste, sácalos fuera de esos.

Otra cosa: es posible que desee shopt -q -s checkwinsize para asegurarse de que el tamaño del terminal se actualice al cambiar el tamaño.

Y parece que está usando una configuration que muestra solo el final de la línea de command actualmente ingresada (similar a lo que hace ksh … ¿está seguro de que usa bash?): Voy a ver qué opción puede cambiar esto, pero aún no lo sé

editar

En el chat también discutimos:

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

pero al final parece que lo que funcionó fue deshacerse de ~ / .inputrc (lo que hizo, pudo haber contenido algo incorrecto pero no sé qué contenía, ni le pedí que lo borrara ^^ simplemente lo renombrara) (o arreglando su contenido) habría ayudado …)

Lo resolví con la ayuda de @OlivierDulac, haciendo cambios a ~/.bashrc y a ~/.inputrc .

En ~/.bashrc ahora uso:

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

Tenga en count que reemplacé \ 033 por \ e para crear colors. Hacer esto solo con la PS1 original no lo solucionó, por lo que hay algo más que no funciona, pero estaba demasiado cansado para rastrearlo. Creo que es el hecho de que yo (contrariamente a muchas recomendaciones, y al contrario de ezprompt.net, que utilicé para crear la PS1) NO use \[ y \] para encerrar caracteres no impresos. De hecho, si los uso, todo se vuelve a echar a perder.

En ~/.inputrc , anteriormente tenía

 #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 \1\e[1 q\2 set vi-ins-mode-string \1\e[5 q\2 

Simplemente elimino el \1 y \2 , es decir, ahora tengo

 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 

De nuevo, esto es contrario a lo que me recomendaron en otro lugar. Tal vez es porque estoy usando un bash relativamente nuevo? ( set show-mode-in-prompt on solo funciona para bash4.4 afaik)