Переведите функцию parse_git_branch в zsh от удара (для подсказки)

Я использую эту функцию в Bash

function parse_git_branch {
  git_status="$(git status 2> /dev/null)"
  pattern="^# On branch ([^${IFS}]*)"
  if [[ ! ${git_status}} =~ "working directory clean" ]]; then
    state="*"
  fi
  # add an else if or two here if you want to get more specific

  if [[ ${git_status} =~ ${pattern} ]]; then
    branch=${BASH_REMATCH[1]}
    echo "(${branch}${state})"
  fi
}

но я полон решимости использовать zsh. В то время как я могу использовать это отлично в качестве сценария оболочки (даже без хижины) в моем .zshrc, ошибка является ошибкой анализа на этой строке if [[ ! ${git_status}}...

Что я должен сделать, чтобы подготовить его к zshell?

Править: "Фактическая ошибка" я добираюсь, " parse error near } и это относится к строке со странным дважды }}, который работает над Bash.

Править: Вот заключительный код, только для забавы:

parse_git_branch() {
    git_status="$(git status 2> /dev/null)"
pattern="^# On branch ([^[:space:]]*)"
    if [[ ! ${git_status} =~ "working directory clean" ]]; then
        state="*"
    fi
    if [[ ${git_status} =~ ${pattern} ]]; then
      branch=${match[1]}
      echo "(${branch}${state})"
    fi
}

setopt PROMPT_SUBST
PROMPT='$PR_GREEN%n@$PR_GREEN%m%u$PR_NO_COLOR:$PR_BLUE%2c$PR_NO_COLOR%(!.#.$)'
RPROMPT='$PR_GREEN$(parse_git_branch)$PR_NO_COLOR'

Благодаря всем для Вашего терпения и справки.

Править: Лучший ответ имеет обученный нас всех: git status фарфор (UI). Хорошие сценарии против МЕРЗАВЦА, устанавливающего вертикально. Вот заключительная функция:

# The latest version of Chris' function below

PROMPT='$PR_GREEN%n@$PR_GREEN%m%u$PR_NO_COLOR:$PR_BLUE%2c$PR_NO_COLOR%(!.#.$)'
RPROMPT='$PR_GREEN$(parse_git_branch)$PR_NO_COLOR'

Обратите внимание, что только подсказка zsh-конкретна. В Bash это была бы Ваша подсказка плюс "\$(parse_git_branch)".

Это могло бы быть медленнее (больше вызовов МЕРЗАВЦУ, но это - эмпирический вопрос), но он не будет поврежден изменениями в МЕРЗАВЦЕ (они не изменяют инфраструктуру). И это очень важно для хорошего продвижения сценария.

7
задан 12 revs 22 May 2010 в 12:54
поделиться

6 ответов

Вам действительно следует использовать команды Git для извлечения нужной информации. Вывод «фарфоровых» команд (например, git status ) может со временем меняться, но поведение «сантехнических» команд гораздо более стабильно.

С фарфоровыми интерфейсами это также можно сделать без «bashisms» или «zshisms» (т. Е. Оператора сопоставления = ~ ):

parse_git_branch() {
    in_wd="$(git rev-parse --is-inside-work-tree 2>/dev/null)" || return
    test "$in_wd" = true || return
    state=''
    git update-index --refresh -q >/dev/null # avoid false positives with diff-index
    if git rev-parse --verify HEAD >/dev/null 2>&1; then
        git diff-index HEAD --quiet 2>/dev/null || state='*'
    else
        state='#'
    fi
    (
        d="$(git rev-parse --show-cdup)" &&
        cd "$d" &&
        test -z "$(git ls-files --others --exclude-standard .)"
    ) >/dev/null 2>&1 || state="${state}+"
    branch="$(git symbolic-ref HEAD 2>/dev/null)"
    test -z "$branch" && branch='<detached-HEAD>'
    echo "${branch#refs/heads/}${state}"
}

Интеграция вывода в приглашение по-прежнему зависит от оболочки ( т.е. экранировать или заключить в кавычки $ (для bash и zsh ) и установить PROMPT_SUBST (для zsh )).

5
ответ дан 6 December 2019 в 23:02
поделиться

Если вы получаете сообщение об ошибке не удалось скомпилировать регулярное выражение: недопустимая последовательность байтов , удалите NULL из IFS. (Замените $ {IFS} на $ {IFS // $ '\ 0' /} ).

1
ответ дан 6 December 2019 в 23:02
поделиться

Избавиться от лишних } ? $ {git_status}} должно быть $ {git_status} .


После удаления лишнего } единственная потенциальная проблема, которую я вижу, - это использование $ {BASH_REMATCH [1]} . Вы можете использовать это в zsh, но для этого необходимо включить эту опцию. Как показано в документации zsh по условным выражениям , вам нужно будет использовать что-то вроде

if [[ ${git_status} =~ ${pattern} ]]; then
  branch=${match[1]}
  echo "(${branch}${state})"
fi
2
ответ дан 6 December 2019 в 23:02
поделиться

Возможно, этот репозиторий zsh Git будет содержать тесты, которые могут дать вам некоторую подсказку:

0
ответ дан 6 December 2019 в 23:02
поделиться

Если вы не хотите изучать zsh, я бы посоветовал вам использовать другой язык, например Python, для такого рода разбора.

Посмотрите git status Python parser и zsh-git-prompt project на github, чтобы узнать, как получить красивую zsh подсказку для git.

1
ответ дан 6 December 2019 в 23:02
поделиться

Вы можете использовать массив match вместо $BASH_REMATCH. Также можно убрать лишнюю закрывающую фигурную скобку.

Не проверено:

function parse_git_branch {
  git_status="$(git status 2> /dev/null)"
  pattern="^# On branch ([^${IFS}]*)"
  if [[ ! ${git_status}\} =~ "working directory clean" ]]; then
    state="*"
  fi
  # add an else if or two here if you want to get more specific

  if [[ ${git_status} =~ ${pattern} ]]; then
    branch=${match[1]}
    echo "(${branch}${state})"
  fi
}

Попробуйте и посмотрите, поможет ли это.

2
ответ дан 6 December 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: