bash:長い行マークが混乱しています。

bash:長い行マークが混乱しています。

Ubuntu 16.04でGNU bashバージョン4.4.0(1)を使用しています。

bashに長い行を入力すると、表示が複雑になります。

たとえば、私が次のように ~/test/test/test/test/test/test/test入力したとします。echo "The quick brown fox jumps over the lazy doggo"ここに画像の説明を入力してください。 大丈夫です。私はラップアラウンドディスプレイを好み、二重コードなしで行うことができます。

問題は、バックスペースを3回押して二重引用符を1回追加して文を変更すると、次のように表示されることです。 ここに画像の説明を入力してください。

最後にo"エラーが表示されます。 Enterを押して確認します。 ここに画像の説明を入力してください。

dog代わりに、必要な文章が印刷されているのがわかります。doggoしかし、何らかの理由で、緑色で印刷されています。

ターミナルウィンドウを数回拡大および縮小すると、これらすべてがさらに悪化します。その後、端末の内容がランダムにコピーされ、端末全体に接続されます。 ここに画像の説明を入力してください。 (長く黒いボックスは、プロンプトの内容をランダムにリンクしたものです。)

~/.bashrcただ、私がたとえこのすべてが関連しているかもしれないと思いますcp /etc/skel/.bashrc ~/。とにかく、ここにあります:

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

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 -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

~/.bashrc を削除すると、次のような結果が表示されます。 (echo "This is a really long sentence, even long than a sentence containing all letters of the alphabet"より短いプロンプトを補うためにこのコマンドを使用します。)

まず、すべてが大丈夫です。 ここに画像の説明を入力してください。

いくつかの単語を削除した後、行の最後に残りの内容が表示されます。 ここに画像の説明を入力してください。

バックスペースキーを押し続けると、プロンプトの一部を削除することもできます。 ここに画像の説明を入力してください。

Enterキーを押してコマンドの最後をに変更した後、サイズを変更すると[...], ev"一般的な混乱が発生しました。 ここに画像の説明を入力してください。

答え1

あなたのヒントには色(および他の印刷できないコンテンツ)が含まれています。

\[\]Bashでは、プロンプトの長さを計算するときにこれらの部分をで囲み、bashにこの部分を無視するように指示できます。

前任者:

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"

2番目の周囲の\[各部分は、\]色を変更したときにディスプレイに表示される文字を追加しないため、プロンプトで文字位置を計算するときに計算しないでください。

\[PS1を修正した場合は、目に見える文字を入れないでください\]。その場合は除外してください。

shopt -q -s checkwinsizeもう1つ:サイズ変更時に端末のサイズが更新されることを確認したい場合があります。

そして、現在入力されているコマンドラインの終わりだけを表示する設定を使用しているようです(kshが実行するのと似ています... bashを使用していますか?)。これを変更するには、どのオプションがあるかを見てみましょう。しかし、まだわかりません。

編集する

チャット中、次のことについても議論しました。

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

しかし、結局効果があるようだったのは ~/.inputrc を削除することでした。 (彼はそうしました。間違った内容が含まれる可能性がありますが、その内容が何であるかわからず、削除するように求められませんでした^^ただ名前を変更してください。)

答え2

@OlivierDulacの助け~/.bashrcを借りて、およびを変更してこの問題を解決しました~/.inputrc

~/.bashrc現在使用している場合:

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

色を生成するために \033 を \e に変更しました。もともとPS1でこうしても直せないので何か他の問題があるようですが疲れすぎて探すことができませんね。私は(多くのアドバイスにもかかわらず、PS1を作成するときに使用したezprompt.netにもかかわらず)印刷されていない文字を使用または含めないこと\[を信じています。\]実際、実際にこれを使用すると、すべてが再び台無しになります。

~/.inputrc、前も食べたことがありますよ

#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

\1今を削除しましたが、\2

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

繰り返しますが、これは私が他の場所で推奨したものとは反対です。それはおそらく比較的新しいバージョンのbashを使っているからでしょうか? ( set show-mode-in-prompt onbash4.4 afaik のみ)

答え3

端末設定(端末の種類)は正しいですか?私のUbuntu Linuxホストでは、私の端末タイプは「ansi」です。 (この情報はecho $ TERMコマンドを実行して取得できます。)端末の種類は、使用している画面(コンソール)と一致する必要があります。端末の種類が間違っていると、端末/コンソールが端末のエスケープコード(カーソル制御など)を認識しないため、画面出力が歪むことがあります。他の標準端末タイプには、「vt100」および「vt220」が含まれる。

答え4

変化

TERM=xterm-256color

到着

TERM=xterm

関連情報