OSDN Git Service

instantupdate auto repairs repos
[instantos/instantOS.git] / programs / quickmenu
1 #!/bin/bash
2
3 # a menu of customized quick shortcuts
4
5 if ! [ -e ~/.config/instantos/quickmenu ]; then
6     mkdir -p ~/.config/instantos/quickmenu
7 fi
8
9 cd ~/.config/instantos/quickmenu || exit 1
10
11 pickscript() {
12     unset CHOICE
13     while [ -z "$CHOICE" ]; do
14         if [ -z "$(ls)" ]; then
15             CHOICE="$(echo 'edit menu
16 close' | instantmenu -bw 4 -C -l 15 -w -1)"
17
18         else
19             CHOICE="$(ls -p | sed -e '$aedit menu\nclose' | instantmenu -bw 4 -C -l 15 -w -1)"
20         fi
21         if [ -e "$CHOICE" ]; then
22             if [ -d "$CHOICE" ]; then
23                 cd "$CHOICE" || exit 1
24                 unset CHOICE
25             else
26                 realpath "$CHOICE"
27             fi
28         else
29             if grep -Eiq '^(close|edit)' <<<"$CHOICE"; then
30                 echo "$CHOICE"
31                 pwd >/tmp/quickpath
32             else
33                 return 1
34             fi
35         fi
36     done
37 }
38
39 # create a new script with the given arguments
40 chooseaddmode() {
41     ADDCHOICE="$(echo 'enter command
42 edit script
43 options
44 cancel' | imenu -l)"
45
46     if [ -z "$1" ]; then
47         echo "#!/bin/bash
48 " | tee "$SCRIPTNAME"
49     fi
50
51     case "$ADDCHOICE" in
52     enter*)
53         COMMAND="$(imenu -i 'enter command')"
54         echo "$COMMAND" >>"$SCRIPTNAME"
55         ;;
56     edit*)
57         echo "editing script"
58         echo "# instantOS quickmenu script" >>"$SCRIPTNAME"
59         st -e nvim -c ":e $(realpath "$SCRIPTNAME")"
60         ;;
61     options)
62         echo "#!/bin/bash" >"$SCRIPTNAME"
63         ADDTEMPLATE="$(echo 'run in terminal
64 enable argument dialog' | imenu -b)"
65         if grep -q 'terminal' <<<"$ADDTEMPLATE"; then
66             echo "enabling terminal"
67             echo '#instantosterm' >>"$SCRIPTNAME"
68         fi
69
70         if grep -q 'argument' <<<"$ADDTEMPLATE"; then
71             echo "enabling argument"
72             echo '#instantosarg' >>"$SCRIPTNAME"
73         fi
74         chooseaddmode no
75         ;;
76     cancel)
77         [ -e "$SCRIPTNAME" ] && rm "$SCRIPTNAME"
78         exit
79         ;;
80     esac
81 }
82
83 addmenu() {
84     cd "$(cat /tmp/quickpath)" || exit 1
85     ADDCHOICE="$(echo 'add entry
86 edit entry
87 remove entry
88 rename entry
89 new category' | instantmenu -bw 4 -C -l 7 -w -1)"
90     if [ -z "$ADDCHOICE" ]; then
91         echo "no addchoice"
92         exit
93     fi
94     case "$ADDCHOICE" in
95     remove*)
96         echo "removing entry"
97         REMOVECHOICE="$(ls -p | instantmenu -bw 4 -C -l 7 -w -1)"
98         if [ -d "$REMOVECHOICE" ] && [ -n "$(ls "$REMOVECHOICE/")" ]; then
99             imenu -m "category is not empty"
100             exit
101         elif ! [ -e "$REMOVECHOICE" ]; then
102             imenu -m "selection $REMOVECHOICE invalid"
103         fi
104
105         if imenu -c "remove $REMOVECHOICE"; then
106             if [ -d "$REMOVECHOICE" ]; then
107                 rm -rf "$REMOVECHOICE"
108             else
109                 rm "$REMOVECHOICE"
110             fi
111         fi
112
113         ;;
114     new*)
115         CATEGORYNAME="$(imenu -i 'enter category name')"
116         [ -n "$CATEGORYNAME" ] && mkdir "$CATEGORYNAME"
117         ;;
118     add*)
119         echo "adding new entry"
120         SCRIPTNAME="$(imenu -i 'enter name')"
121
122         if [ -e "$SCRIPTNAME" ]; then
123             imenu -m "script $SCRIPTNAME already existing"
124             exit
125         fi
126
127         if [ -z "$SCRIPTNAME" ]
128         then
129             exit
130         fi
131
132         touch "$SCRIPTNAME" || {
133             imenu -m "invalid script name"
134             exit
135         }
136         chooseaddmode
137         ;;
138     edit*)
139         echo "editing existing entry"
140         EDITCHOICE="$(ls -p | instantmenu -bw 4 -C -l 7 -w -1)"
141         [ -z "$EDITCHOICE" ] && exit
142         if [ -d "$EDITCHOICE" ]; then
143             imenu -m "selection is not a script"
144             exit
145         elif ! [ -e "$EDITCHOICE" ]; then
146             imenu -m "selection $EDITCHOICE invalid"
147             exit
148         fi
149         st -e nvim -c ":e $(realpath "$EDITCHOICE")"
150         ;;
151     rename*)
152         echo "renaming entry"
153         EDITCHOICE="$(ls -p | instantmenu -bw 4 -C -l 7 -w -1)"
154         [ -z "$EDITCHOICE" ] && exit
155
156         if ! [ -e "$EDITCHOICE" ]; then
157             imenu -m "$EDITCHOICE does not exist"
158         fi
159
160         NEWNAME="$(imenu -i 'enter new name')"
161         [ -z "$NEWNAME" ] && exit
162         mv "$EDITCHOICE" "$NEWNAME"
163
164         ;;
165     esac
166 }
167
168 QUICKCHOICE="$(pickscript)"
169 echo "$QUICKCHOICE"
170
171 if [ -z "$QUICKCHOICE" ]; then
172     exit
173 fi
174
175 case "$QUICKCHOICE" in
176 close)
177     exit
178     ;;
179 "edit menu")
180     echo "editing menu"
181     addmenu
182     ;;
183 *)
184     if ! [ -e "$QUICKCHOICE" ]; then
185         echo ""
186         echo "choice $QUICKCHOICE not found"
187         exit
188     fi
189
190     if grep -q "^#instantosarg" "$QUICKCHOICE"; then
191         QUICKARGS="$(imenu -i options)"
192         [ -z "$QUICKARGS" ] && exit
193     fi
194
195     if grep -q "^#instantosterm" "$QUICKCHOICE"; then
196         chmod +x "$QUICKCHOICE"
197         st -e bash -c "$QUICKCHOICE $QUICKARGS"
198     else
199         bash "$QUICKCHOICE" "$QUICKARGS"
200     fi
201
202     ;;
203 esac