Scheduled Maintenance: We are aware of an issue with Google, AOL, and Yahoo services as email providers which are blocking new registrations. We are trying to fix the issue and we have several internal and external support tickets in process to resolve the issue. Please see: viewtopic.php?t=158230

 

 

 

Bash @ XTerm: Cursor enters prompt on jumps

Linux Kernel, Network, and Services configuration.
Post Reply
Message
Author
lukmi
Posts: 2
Joined: 2017-09-16 18:03

Bash @ XTerm: Cursor enters prompt on jumps

#1 Post by lukmi »

I am using Bash on XTerm. Sadly, using jumps such as Alt+B, Alt+F, Ctrl+A, and Ctrl+E frequently causes the cursor to cross the boundary to the command prompt. It has the effect as if the text itself has moved but the characters remain unaltered on the terminal. Weird things happen when I now type. (See https://www.dropbox.com/sh/swlrjq083hwx ... nhz7a?dl=0)

These are my configs:

~/.bashrc (AFAIK, I only changed the part about $PS1)

Code: Select all

# ~/.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 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

# Is specified in global bashrc (/etc/bash.bashrc)
# 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

# 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 -l'
#alias la='ls -A'
#alias l='ls -CF'

# 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
/etc/bash.bashrc

Code: Select all

# System-wide .bashrc file for interactive bash(1) shells.

# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# 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, overwrite the one in /etc/profile)
# PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
if [ "$(id -u)" -eq "0" ]
then
        PS1='\[\e[91m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
else
        PS1='\[\e[92m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
fi

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
#    ;;
#*)
#    ;;
#esac

# enable bash completion in interactive shells
#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

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi
~/.bash_profile

Code: Select all

if [ -z "$DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ]
then
        exec startx
fi
~/.Xresources

Code: Select all

xterm*background: black
xterm*foreground: white
xterm*cursorColor: white
xterm.vt100.metaSendsEscape: true
xterm.vt100.locale: true
!XTerm.vt100.faceName: DejaVu Sans Mono:size=8:antialias=true
xterm*scrollBar: false
Help is appreciated as this is very annoying and hinders my work flow.

lukmi
Posts: 2
Joined: 2017-09-16 18:03

Re: Bash @ XTerm: Cursor enters prompt on jumps

#2 Post by lukmi »

Solution:
In /etc/bash.bashrc, (usually ~/.bashrc, but not for me) change

Code: Select all

if [ "$(id -u)" -eq "0" ]
then
        PS1='\[\e[91m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
else
        PS1='\[\e[92m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
fi
to

Code: Select all

if [ "$(id -u)" -eq "0" ]
then
        PS1='\[\e[91m\]${debian_chroot:+($debian_chroot)}\u@\h\[\e[0m\]:\w\$ '
else
        PS1='\[\e[92m\]${debian_chroot:+($debian_chroot)}\u@\h\[\e[0m\]:\w\$ '
fi
How I retrieved the solution:

Tinkering around this morning, I found that when I change the part about

Code: Select all

if [ "$(id -u)" -eq "0" ]
then
        PS1='\[\e[91m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
else
        PS1='\[\e[92m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
fi
in my /etc/bash.bashrc to

Code: Select all

if [ "$(id -u)" -eq "0" ]
then
        #PS1='\[\e[91m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
        PS1='>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
else
        #PS1='\[\e[92m${debian_chroot:+($debian_chroot)}\u@\h\e[0m\]:\w\$ '
        PS1='>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>'
fi
it works again.
Hence, the issue must lie in my $PS1.
Remembering that earlier, I had to enclose the colors escape sequences with square brackets so that the line wraps when it hits the right border of the window. But I enclosed both sequences with one pair of brackets. I tried being generous and giving each sequence it's own pair of brackets and it worked.

The moral of this story is to be generous. :D

User avatar
debiman
Posts: 3063
Joined: 2013-03-12 07:18

Re: Bash @ XTerm: Cursor enters prompt on jumps

#3 Post by debiman »

everything in PS1 that is not actually printed on screen must be enclosed in

Code: Select all

\[  . . .  \]
i might be simplifying, but in essence that's it.
of course, further reading might be required, and the more elaborate your prompt becomes the easier sth like this happens.

also many of the readymades floating around the web are BROKEN in that respect!

i speak from experience.

my current prompt has been failsafe so far:

Code: Select all

if [[ ${EUID} == 0 ]] ; then
	color=1 # red
else
	color=2 # green
fi
if [ "$TERM" != "linux" ]; then
	PS1="\[$(tput setaf $color)\]\[$(tput rev)\]  \[$(tput sgr0)\]\[$(tput setaf 5)\]\${?#0}\[$(tput setaf $color)\] \u@\h \w\[$(tput sgr0)\]\n\[$(tput rev)\]  \[$(tput sgr0)\] "
else
	# adding \t = time to tty prompt
	PS1="\[$(tput setaf $color)\]\[$(tput rev)\]  \[$(tput sgr0)\]\[$(tput setaf 5)\]\${?#0}\[$(tput setaf $color)\] \t \u@\h \w\[$(tput sgr0)\]\n\[$(tput rev)\]  \[$(tput sgr0)\] "
fi
unset color


Post Reply