Primeiro, para criar um ls
personalizado, a maneira mais fácil é proceder da seguinte forma:
- Crie um diretório
$HOME/bin
-
Adicione
$HOME/bin
ao seuPATH
. Para fazer isso, abra o arquivo~/.bashrc
em seu editor de texto favorito e adicione a seguinte linha ao final:export PATH=$HOME/bin:$PATH
Note que é importante que você prefixe
$HOME/bin
ao seuPATH
, para que os executáveis nele tenham precedência sobre outros executáveis com o mesmo nome ao longo do seuPATH
(como , no seu caso, o comandols
) - Crie um arquivo
$HOME/bin/ls
com o conteúdo que vou postar abaixo. - Torne-o executável:
chmod 755 $HOME/bin/ls
. - Você provavelmente precisará reiniciar seu terminal.
Em segundo lugar, seu novo $HOME/bin/ls
deve se comportar da seguinte maneira: ele verifica se o diretório atual é um repositório git e
- se não, simplesmente delega ao executável normal
/bin/ls
. - se sim, ele cria a saída solicitada, dependendo se a pasta atual é a raiz do repositório git ou se é mais profunda.
Eu rapidamente copiei esse script para você. Não é de modo algum perfeito, mas deve ser bem próximo do que você quer, e você pode trabalhar facilmente a partir daí. : -)
#!/bin/bash
# determine if we're in a git repo, what the root dir is, and assign it to GIT_ROOT, all in one swoop
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
# if not in git repo, relay to normal ls
if (( $? )); then
/bin/ls "$@"
# if in git repo, are we in root dir?
elif [ "x$GIT_ROOT" = "x$PWD" ]; then
# first, normal ls with 1 file per line, also pass along other parameters
/bin/ls -1 "$@"
echo
# a few git stats
GIT_DIFF=$(git diff --stat | tail -1)
# any insertions?
echo $GIT_DIFF | grep insertion >/dev/null
if (( ! $? )); then
# bonus points: color in green
echo -e "\e[0;32m+ $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) insertion.*//;') lines\e[0m"
fi
# any deletions?
echo $GIT_DIFF | grep deletion >/dev/null
if (( ! $? )); then
# bonus points: color in red
echo -e "\e[0;31m- $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) deletion.*//;') lines\e[0m"
fi
# Finally, display last commit message and date
git log -1 --pretty='Last commit: "%s" (%ad)'
# otherwise, we're depper in a git repo
else
echo -e "\e[1;34m${PWD##*/}\e[0m"
IFS=$'\n'
for file in $(tree -C | tail -n +2 | head -n -2); do
filename=$(echo $file | cut -d" " -f 2-)
echo -n $file
# a few git stats
GIT_DIFF=$(git diff --stat "$(echo $filename | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")")
# any insertions?
echo $GIT_DIFF | grep insertion >/dev/null
if (( ! $? )); then
# bonus points: color in green
echo -ne " \e[0;32m(+ $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) insertion.*//;') lines since last commit)\e[0m"
fi
# any deletions?
echo $GIT_DIFF | grep deletion >/dev/null
if (( ! $? )); then
# bonus points: color in red
echo -ne " \e[0;31m(- $(echo $GIT_DIFF | sed 's/.*, \([[:digit:]]\+\) deletion.*//;') lines since last commit)\e[0m"
fi
echo
done
fi
Demo
Nota: a saída é bem colorida, embora claramente isso não apareça aqui.
$ ls
app
README.md
run.py
test
test.py
+ 11 lines
- 3 lines
Last commit: "add a new test for deployment" (Fri Nov 21 04:20:37 2014 +0100)
$ cd test/
$ ls
test
├── bla
├── __init__.py
├── test_add_user.py (+ 3 lines since last commit)
└── test_deploy.py