adblog

Barevný terminál v Mac OS 10.6.x s podporou stavu git repozitáře

Vytvořeno:
Aktualizováno:
Kategorie: Hacking
screenshot

Pokud pracujete často s terminálem, určitě mnohé z Vás napadne, že by terminál mohl být přívětivější nebo barevnější, jako například v Linuxu. Protože i Mac je *nixový systém, lze využít stejné postupy jako pro linux. Stejně tak používáte-li například msysgit pro Windows, budete chtít dosáhnout identifikace stavu repozitáře i v terminálu OS X, pokud pracujete na obou platformách. Jak tedy na to?

Barevný terminál

K barevnému terminálu existuje v OS X několik cest. První, kde si vystačíme s konfigurací terminálu a druhá, kde využijeme produkty třetích stran. Zde popíšu první, čistší přístup. Máte-li zájem o druhý způsob, odkáži Vás na článek Customising Colours in Leopard Terminal .

Pro úpravu terminálu pro uživatele musíme vytvořit soubor .profile nebo .bash_profile v domovské složce uživatele (pokud už neexistuje). Např.

vim ~/.profile

Pro prvotní oživení barev vložíme do souboru příkaz

export CLICOLOR=1

Pokud chceme mít výstup ještě barevnější, lze přidat řádek

export LSCOLORS=ExFxCxDxBxegedabagacad

kde si nadefinujeme, jak má který typ souboru či adresáře být barevný. Více k tomuto např. zde. Osobně tuto druhou variantu nepoužívám, nepotřebuji ji.

Tímto jsme obarvili terminál. Mně ale nevyhovuje uspořádání automaticky vkládaného textu a proto upravím dle článku Prompt magic soubor s konfigurací z původního v souboru neuvedeného původní v souboru neuvedené

PS1="\h:\w \u$ PS2= > "

takto:

PS1='\[\e[1;31;40m\]\u \[\e[0m\]at \[\e[36;40m\]\h \[\e[0m\]in \[\e[1;32;40m\]\w\[\e[0m\]\n$ '
PS2=" > "

čímž dostanu tvar “uživatel na stroji v adresáři” a zároveň dle ANSI barev obarvím dle potřeb plus zalomím značku pro vstup na další řádek. Pokud chcete zvolit jiné barvy nebo jiný formát, vše s vysvětlením parametrů je popsáno v onom článku Prompt magic .

Uvedeným nastavením získáte barevné nastavení jako v úvodním obrázku na prvních dvou řádcích.

Terminál s Git repozitářem

Pro podporu zobrazení stavu repozitáře je třeba stáhnout ze stránky Customizing terminal’s PS1 with Git status and current branch soubor git-completion.bash, který obsahuje skript, který nám zajistí identifikace stavu repozitáře. V souladu s článkem je třeba vložit do konfigurace terminálu řádky

source ~/.git-completion.bash
export GIT_PS1_SHOWDIRTYSTATE=true # '*' for unstaged changes, '+' for staged
export GIT_PS1_SHOWSTASHSTATE=true # '$' if smth is stashed
export GIT_PS1_SHOWUNTRACKEDFILES=true # '%' if un-tracked files

a stažený soubor přesunout do domovské složky jako .git-completion.bash. Tyto řádky musíme vložit před definici PS1 a PS2, neboť i ty musíme upravit, abychom získali popis repozitáře. Do PS1 musíme přidat řetězec

$(__git_ps1 " (%s)")

takže výsledný soubor .profile může vypadat například takto:

#git status
source ~/.git-completion.bash
export GIT_PS1_SHOWDIRTYSTATE=true # '*' for unstaged changes, '+' for staged
export GIT_PS1_SHOWSTASHSTATE=true # '$' if smth is stashed
export GIT_PS1_SHOWUNTRACKEDFILES=true # '%' if un-tracked files
#promenne shellu
PS1='\[\e[1;31;40m\]\u \[\e[0m\]at \[\e[36;40m\]\h \[\e[0m\]in \[\e[1;32;40m\]\w$(__git_ps1 " (%s)")\[\e[0m\]\n$ '
PS2=" > "
#ostatni
export CLICOLOR=1

Výsledkem je obrázek ze začátku článku.

Motivací pro mě ke změně byla stránka pro úpravu terminálu s verzovacím systémem hg (rtuťákem) hg-prompt.

EDIT 2020:

Moje současná konfigurace .profile k březnu 2020 pro bash shell:

# git to shell
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='\[\e[1;31;49m\]\u \[\e[0m\]at \[\e[36;49m\]\h \[\e[0m\]in \[\e[1;32;49m\]\w\[\e[1;33;49m\]$(parse_git_branch)\[\e[0m\]\n$ '
PS2=" > "

#aliases
alias ll="ls -l"
alias lla="ls -al"
alias la="ls -a"

# locale
export LC_CTYPE=cs_CZ.UTF-8
export LC_ALL=cs_CZ.UTF-8

#others
export CLICOLOR=1

a pro .bash_profile:

#shell variables with git
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
PS1='\[\e[1;31;49m\]\u \[\e[0m\]at \[\e[36;49m\]\h \[\e[0m\]in \[\e[1;32;49m\]\w\[\e[1;33;49m\]$(parse_git_branch)\[\e[0m\]\n$ '
PS2=" > "

#aliases
alias ll="ls -l"
alias lla="ls -al"
alias la="ls -a"

# locale
export LC_CTYPE=cs_CZ.UTF-8
export LC_ALL=cs_CZ.UTF-8

#others
export CLICOLOR=1

#brew user-installed binaries
export PATH-/usr/local/bin:$PATH
#load .bashrc if it exists
test -f ~/.bashrc && source ~/.bashrc

Další způsob úpravy pro zobrazování změn v repozitáři je Informative git prompt for bash, který zobrazuje změny v repozitáři odlišně:

  • (master↑3|✚1): ve větvi master, před vzdálenou větví o 3 revize, 1 soubor změně ale není připraven k zapsání
  • (status|●2): ve větvi status, 2 soubory připraveny k zapsání
  • (master|✚7…): ve větvi master, 7 souborů změněno, některé soubory nesledovány
  • (master|✖2✚3): ve větvi master, 2 konflikty, 3 soubory změněny
  • (master|⚑2): ve větvi master, 2 soubory odloženy
  • (experimental↓2↑3|✔): ve větvi experimental; vaše větev se odlišuje 3 revizemi, vzdálená 2 revizemi, repozitář je jinak beze změn
  • (:70c2952|✔): na žádné větvi; rodičovská revize má hash 70c2952; repozitář je jinak beze změn