Это могло бы быть нечетной проблемой, но я хотел бы переопределить поведение ls
когда в каталоге мерзавца.
Я хочу извлечь некоторую различную статистику из последней фиксации и добавить ее к нижней части ls
. Когда в корне проекта мерзавца, я хочу сделать определенную подсказку как это:
app/
test/
.gitignore
test.py
run.py
README.md
+ 11 lines
- 3 lines
Last commit: "add a new test for deployment" (Oct 14, 2014)
Когда глубже, чем корень, я захочу создать подсказку как это (скажите меня cd'd test/
и затем используйте ls
команда):
test/
├── __init__.py
├── test_deploy.py
└── test_add_user.py (+3 lines since last commit)
Бонусные очки: цветной зеленый/красный для плюс/минус строки и хорошее универсальное переключение вкладок на информации о мерзавце.
Как это может быть достигнуто?
Во-первых, для создания пользовательского ls
, самый легкий путь состоит в том, чтобы продолжиться следующим образом:
$HOME/bin
Добавить $HOME/bin
к Вашему PATH
. Чтобы сделать это, откройте файл ~/.bashrc
в Вашем любимом текстовом редакторе, и добавляют следующую строку в конец:
export PATH=$HOME/bin:$PATH
Обратите внимание, что важно, чтобы Вы предварительно ожидали $HOME/bin
к Вашему PATH
, так, чтобы исполняемые файлы там имели приоритет по другим исполняемым файлам с тем же именем вдоль Вашего PATH
(такой как, в Вашем случае, ls
команда)
$HOME/bin/ls
с содержанием, которое я отправлю ниже.chmod 755 $HOME/bin/ls
.Во-вторых, Ваше новое $HOME/bin/ls
должен вести себя как так: Это проверяет, является ли текущий каталог репозиторием мерзавца, и
/bin/ls
исполняемый файл.Я быстро взломал такой сценарий вместе для Вас. Это ни в коем случае не прекрасно, но это должно быть достаточно близко к тому, что Вы хотите, и можно легко проложить себе путь оттуда.:-)
#!/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.*/\1/;') 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.*/\1/;') 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.*/\1/;') 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.*/\1/;') lines since last commit)\e[0m"
fi
echo
done
fi
Примечание: вывод приятно окрашен, хотя ясно это не покажет здесь.
$ 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