-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproject-mod
71 lines (62 loc) · 1.7 KB
/
project-mod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# {{{ bashrc
# 1. define base directory of projects
# PROJECT_BASE='<DIR>'
#
# 2. load library and initialize project environment
# source /usr/share/bash-project-mod/project-mod && __init_project
#
# NOTE: to override default project (otherwise read from ~/.default_project)
# PROJECT='<default project>'
# }}}
#{{{ lib
function __check_dmenu {
[ -n "$DISPLAY" ] && command -V rofi &>/dev/null && return || return 1
}
# __init_project [project]
function __init_project {
PROJECT_BASE="${PROJECT_BASE:-/home/`id -n --user`/}"
[ -n "$*" ] && [ -d "$PROJECT_BASE/$*" ] && PROJECT="$*"
if [[ -z "$PROJECT" ]]; then
[[ -r ~/.default_project ]] && PROJECT="`cat ~/.default_project`" || return
fi
}
function chproject {
local _arg
local -a _dirs
case "$1" in
"--set-default")
echo "$PROJECT" > ~/.default_project; return ;;
"--read-config")
[ -n "$PROJECT" ] && cat "$PROJECT_BASE/$PROJECT/".p.conf 2>/dev/null; return ;;
--*) return 1 ;;
esac
if [ -n "$*" ]; then
_arg="${*%%/*}"
else
for f in "$PROJECT_BASE"/*; do
[ -d "$f" ] && _dirs+=("$f")
done
[ -z "$_dirs" ] && return 1 || _dirs="${_dirs[@]#"$PROJECT_BASE"/}"
if __check_dmenu; then
_arg=$(printf '%s\n' $_dirs | rofi -dmenu -i -p Project 2>/dev/null)
elif command -v fzf &>/dev/null; then
_arg=`printf "%s\n" $_dirs | fzf`
else
select _arg in $_dirs; do break; done
fi
fi
[ -n "$_arg" ] && __init_project "$_arg"
}
function lsp {
if [ -n "$PROJECT" ] && [ -e "$PROJECT_BASE/$PROJECT$@" ]; then
local _arg="$PROJECT_BASE/$PROJECT$@"
[ -L "$_arg" ] && local _arg=`readlink -f "$_arg"`
echo "$_arg"
fi
}
function cdp {
local _arg=`lsp "$@"`
[ -n "$_arg" ] && [ -d "$_arg" ] && cd "$_arg"
}
#}}}
# vim:ft=sh:fdm=marker