Usando ansicon para colorir o gato com pygementize para git bash no Windows 7

  • Depois que vi este protip de @zonetti, eu queria alguma cor na minha concha também.

  • A captura de tela abaixo é o resultado de uma pequena escavação para fazê-lo funcionar no Windows 7 no Git Bash 🙂

Cenário

É claro que essa dica não funciona imediatamente com o Windows 7 porque não oferece suporte a códigos de cores Unicode para fazê-lo funcionar continue lendo

$ git clone git://github.com/adoxa/ansicon.git && cd ansicon

-se você baixou o ansicon.zip do GitHub, descompacte o ansicon para a raiz do seu diretório ~.

em seguida, abra um terminal pressionando win + rpara abrir a caixa de diálogo Executar e, cmdem seguida, para abrir uma janela cmd.

navegue até o diretório onde você acabou de descompactar o ansicon com

$ cd /path/to/where/you/unzipped/ansicon
  • agora, se você baixou os arquivos ou usou git clone, podemos retomar juntos.

– daqui em seu shell ou tipo de janela cmd

$ ansicon -i

** o -isinalizador diz ao ansicon para instalar **

isso instalará o ansicon para todos os shells cmd e seus processos pais.

se você quiser desinstalar a qualquer momento, basta abrir uma janela ou shell cmd e

$ cd /path/to/where/you/unzipped/ansicon && ansicon -u

** onde o sinalizador diz para desinstalar **-u

-agora a melhor parte. Git Bash não funciona com ansicon imediatamente, então se você digitar no shell git bash

$pygmentize filename

você recebe de volta um monte de códigos de cores Unicode. Confira a imagem abaixo. Feio.

Cenário

  • então, se você usar o Console2, eu recomendo fortemente que você faça, faça uma nova guia com isso como o comando de guia

para uso em conchanon-login

C:\Windows\System32\cmd.exe /K "ansicon -p && bash"

para loginuso em concha

C:\Windows\System32\cmd.exe /K "ansicon -p && bash --login -i"
  • isso abre uma cmdaba no Console 2, em seguida, usa a chave para passar os seguintes argumentos do interruptor diz ter todos os processos pai usar ansicon e ao fogo até o bash junto ao ./Kansicon -p -pansiconbash cmd.exe

-Os últimos passos são abrir / criar um arquivo chamado na raiz do seu diretório. e coloque o seguinte alias dentro.bashrc

alias ccat='pygmentize -O style=monokai -f terminal -g'
source c
:/path/to/your/git-prompt.sh

export PS1='\[\033[01;32m\]\u\[\033[01;34m\] \w\[\033[31m\]$(__git_ps1 " (%s)")\[\033[01;34m\]$\[\033[00m\] '
  • você deve baixar o git-prompt.sh do repositório git no github, apenas copie e cole o gist em um arquivo nomeado na raiz do seu diretório e vincule-o adequadamente no comando acima.git-prompt.shsource

ou apenas use curlassim

$ curl -L -O https://github.com/git/git/raw/master/contrib/completion/git-prompt.sh
  • Se você alterar o /blob/no esquema de url do github para /raw/como no curlcomando acima , poderá baixar os arquivos diretamente do github.

  • O GitHub diz que você pode baixar todos os tipos de arquivos como este, exceto arquivos binários. Ele ainda funciona para arquivos binários de até 10 MB. Depois de 10mb vai dar um erro dizendo .blob is too big

** Esteja ciente de que eles não terão nenhum gitdado associado a eles se você baixá-los usando o método acima. **

e você terá no diretório em que está atualmentegit-prompt.sh

aqui está o arquivo se você quiser copiá-lo de baixo

# bash/zsh git prompt support
#
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
# Distributed under the GNU General Public License, version 2.0.
#
# This script allows you to see the current branch in your prompt.
#
# To enable:
#
# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
# 2) Add the following line to your .bashrc/.zshrc:
# source ~/.git-prompt.sh
# 3a) Change your PS1 to call __git_ps1 as
# command-substitution:
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
# the optional argument will be used as format string.
# 3b) Alternatively, if you are using bash, __git_ps1 can be
# used for PROMPT_COMMAND with two parameters, <pre> and
# <post>, which are strings you would put in $PS1 before
# and after the status string generated by the git-prompt
# machinery. e.g.
# PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
# will show username, at-sign, host, colon, cwd, then
# various status string, followed by dollar and SP, as
# your prompt.
# Optionally, you can supply a third argument with a printf
# format string to finetune the output of the branch status
#
# The argument to __git_ps1 will be displayed only if you are currently
# in a git repository. The %s token will be the name of the current
# branch.
#
# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
# unstaged (*) and staged (+) changes will be shown next to the branch
# name. You can configure this per-repository with the
# bash.showDirtyState variable, which defaults to true once
# GIT_PS1_SHOWDIRTYSTATE is enabled.
#
# You can also see if currently something is stashed, by setting
# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
# then a '$' will be shown next to the branch name.
#
# If you would like to see if there're untracked files, then you can set
# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
# files, then a '%' will be shown next to the branch name. You can
# configure this per-repository with the bash.showUntrackedFiles
# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is
# enabled.
#
# If you would like to see the difference between HEAD and its upstream,
# set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates you are behind, ">"
# indicates you are ahead, "<>" indicates you have diverged and "="
# indicates that there is no difference. You can further control
# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
# of values:
#
# verbose show number of commits ahead/behind (+/-) upstream
# legacy don't use the '--count' option available in recent
# versions of git-rev-list
# git always compare HEAD to @{upstream}
# svn always compare HEAD to your SVN upstream
#
# By default, __git_ps1 will compare HEAD to your SVN upstream if it can
# find one, or @{upstream} otherwise. Once you have set
# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
# setting the bash.showUpstream config variable.
#
# If you would like to see more information about the identity of
# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
# to one of these values:
#
# contains relative to newer annotated tag (v1.6.3.2~35)
# branch relative to newer tag or branch (master~4)
# describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
# default exactly matching tag
#
# If you would like a colored hint about the current dirty state, set
# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
# the colored output of "git status -sb".

# __gitdir accepts 0 or 1 arguments (i.e., location)
# returns location of .git repo
__gitdir
()
{
# Note: this function is duplicated in git-completion.bash
# When updating it, make sure you update the other one to match.
if [ -z "${1-}" ]; then
if [ -n "${__git_dir-}" ]; then
echo
"$__git_dir"
elif [ -n "${GIT_DIR-}" ]; then
test
-d "${GIT_DIR-}" || return 1
echo
"$GIT_DIR"
elif [ -d .git ]; then
echo
.git
else
git rev
-parse --git-dir 2>/dev/null
fi
elif [ -d "$1/.git" ]; then
echo
"$1/.git"
else
echo
"$1"
fi
}

# stores the divergence from upstream in $p
# used by GIT_PS1_SHOWUPSTREAM
__git_ps1_show_upstream
()
{
local key value
local svn_remote svn_url_pattern count n
local upstream=git legacy="" verbose=""

svn_remote
=()
# get some config options from git-config
local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
while read -r key value; do
case "$key" in
bash
.showupstream)
GIT_PS1_SHOWUPSTREAM
="$value"
if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
p
=""
return
fi
;;
svn
-remote.*.url)
svn_remote
[ $((${#svn_remote[@]} + 1)) ]="$value"
svn_url_pattern
+="\\|$value"
upstream
=svn+git # default upstream is SVN if available, else git
;;
esac
done <<< "$output"

# parse configuration values
for option in ${GIT_PS1_SHOWUPSTREAM}; do
case "$option" in
git
|svn) upstream="$option" ;;
verbose
) verbose=1 ;;
legacy
) legacy=1 ;;
esac
done

# Find our upstream
case "$upstream" in
git
) upstream="@{upstream}" ;;
svn
*)
# get the upstream from the "git-svn-id: ..." in a commit message
# (git-svn uses essentially the same procedure internally)
local svn_upstream=($(git log --first-parent -1 \
--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
if [[ 0 -ne ${#svn_upstream[@]} ]]; then
svn_upstream
=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
svn_upstream
=${svn_upstream%@*}
local n_stop="${#svn_remote[@]}"
for ((n=1; n <= n_stop; n++)); do
svn_upstream
=${svn_upstream#${svn_remote[$n]}}
done

if [[ -z "$svn_upstream" ]]; then
# default branch name for checkouts with no layout:
upstream
=${GIT_SVN_ID:-git-svn}
else
upstream
=${svn_upstream#/}
fi
elif [[ "svn+git" = "$upstream" ]]; then
upstream
="@{upstream}"
fi
;;
esac

# Find how many commits we are ahead/behind our upstream
if [[ -z "$legacy" ]]; then
count
="$(git rev-list --count --left-right \
"
$upstream"...HEAD 2>/dev/null)"
else
# produce equivalent output to --count for older versions of git
local commits
if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
then
local commit behind=0 ahead=0
for commit in $commits
do
case "$commit" in
"<"*) ((behind++)) ;;
*) ((ahead++)) ;;
esac
done
count
="$behind $ahead"
else
count
=""
fi
fi

# calculate the result
if [[ -z "$verbose" ]]; then
case "$count" in
"") # no upstream
p
="" ;;
"0 0") # equal to upstream
p
="=" ;;
"0 "*) # ahead of upstream
p
=">" ;;
*" 0") # behind upstream
p
="<" ;;
*) # diverged from upstream
p
="<>" ;;
esac
else
case "$count" in
"") # no upstream
p
="" ;;
"0 0") # equal to upstream
p
=" u=" ;;
"0 "*) # ahead of upstream
p
=" u+${count#0 }" ;;
*" 0") # behind upstream
p
=" u-${count% 0}" ;;
*) # diverged from upstream
p
=" u+${count#* }-${count% *}" ;;
esac
fi

}


# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
# when called from PS1 using command substitution
# in this mode it prints text to add to bash PS1 prompt (includes branch name)
#
# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc)
# in that case it _sets_ PS1. The arguments are parts of a PS1 string.
# when two arguments are given, the first is prepended and the second appended
# to the state string when assigned to PS1.
# The optional third parameter will be used as printf format string to further
# customize the output of the git-status string.
# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true
__git_ps1
()
{
local pcmode=no
local detached=no
local ps1pc_start='\u@\h:\w '
local ps1pc_end='\$ '
local printf_format=' (%s)'

case "$#" in
2|3) pcmode=yes
ps1pc_start
="$1"
ps1pc_end
="$2"
printf_format
="${3:-$printf_format}"
;;
0|1) printf_format="${1:-$printf_format}"
;;
*) return
;;
esac

local g="$(__gitdir)"
if [ -z "$g" ]; then
if [ $pcmode = yes ]; then
#In PC mode PS1 always needs to be set
PS1
="$ps1pc_start$ps1pc_end"
fi
else
local r=""
local b=""
if [ -f "$g/rebase-merge/interactive" ]; then
r
="|REBASE-i"
b
="$(cat "$g/rebase-merge/head-name")"
elif [ -d "$g/rebase-merge" ]; then
r
="|REBASE-m"
b
="$(cat "$g/rebase-merge/head-name")"
else
if [ -d "$g/rebase-apply" ]; then
if [ -f "$g/rebase-apply/rebasing" ]; then
r
="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r
="|AM"
else
r
="|AM/REBASE"
fi
elif [ -f "$g/MERGE_HEAD" ]; then
r
="|MERGING"
elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
r
="|CHERRY-PICKING"
elif [ -f "$g/BISECT_LOG" ]; then
r
="|BISECTING"
fi

b
="$(git symbolic-ref HEAD 2>/dev/null)" || {
detached
=yes
b
="$(
case "
${GIT_PS1_DESCRIBE_STYLE-}" in
(contains)

git describe --contains HEAD ;;

(branch)

git describe --contains --all HEAD ;;

(describe)

git describe HEAD ;;

(* | default)

git describe --tags --exact-match HEAD ;;

esac 2>/dev/null)"
||

b
="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
b
="unknown"
b
="($b)"
}
fi

local w=""
local i=""
local s=""
local u=""
local c=""
local p=""

if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
c
="BARE:"
else
b
="GIT_DIR!"
fi
elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
if <