2

Я использую пользовательский PS1 для отображения более релевантной информации в моем терминале, например, если я нахожусь в каталоге git и если он чистый или нуждается в фиксации изменений. Однако иногда, когда я перемещаюсь по командам, часть строки терминала исчезает:

@ ~/tests/testing [tests] > grunt
# up arrow, down arrow
@ ~/tests/testing [t

По существу, ests] > обрезаются, и у меня остается только [t .

Есть ли какая-то конкретная причина, по которой часть линии обрезается с помощью этой конфигурации PS1?

Вот дополнительная информация:

Мой TERM env var - xterm-256color . Вот мой .bash_profile:

red='\033[0;31m'
yellow='\033[0;32m'
orange='\033[0;33m'
blue='\033[0;34m'
pink='\033[0;35m'
NC='\033[0m'

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      echo -en " [${orange}init${NC}]"
      return
    fi

    echo -n " ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      echo -en "${red}"
    else
      echo -en "${blue}"
    fi
    echo -en "$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

export PS1="@ \w\[\$(stuff)\]\[\$(tput sgr0)\] > "

2 ответа2

2

Предложение @ i_am_root поставить \[ и \] внутри определения red и т. п. является хорошим. Однако, согласно этому, bash обрабатывает только \[ и \] в PS1 , а не в тексте, включенном в PS1 помощью $() . Поэтому используйте \001 и \002 (или \x01 и \x02) внутри red и т. П. Вместо \[ и \] .

Примечание. Согласно этому ответу в кодах \001 и \002 должны быть только escape-коды. Текст, который будет виден пользователю, должен находиться за пределами \001 и \002 чтобы bash знал, что он занимает место на экране, и может это учитывать при перерисовке.

1

Цветовые коды Bash, экранирующие символы, назначения и тому подобное быстро запутываются.

Попробуйте этот пример кода, который заменяет команды echo , добавляя переменную PS1 .

red='\[\033[0;31m\]'
yellow='\[\033[0;32m\]'
orange='\[\033[0;33m\]'
blue='\[\033[0;34m\]'
pink='\[\033[0;35m\]'
NC='\[\033[0m\]'

export PS1="@ \w"

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      PS1="${PS1} [${orange}init${NC}]"
      return
    fi

    PS1="$PS1 ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      PS1="${PS1}${red}"
    else
      PS1="${PS1}${blue}"
    fi
    PS1="${PS1}$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

stuff
PS1="${PS1}$(tput sgr0) > "

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .