Last active 1 month ago

Revision a9b21ac21c385f9403631d3aa2f5c92ff6f867bb

aliasctl Raw
1#!/usr/bin/env bash
2# Автор: Федя Серафиев
3# Сайт / Проект: https://urocibg.eu
4# Версия: 2.0
5# Лиценз: Open Source
6# Платформа: Linux/Unix (Bash)
7
8ALIASES_FILE="$HOME/.fedya_aliases"
9EDITOR_CMD="${EDITOR:-nano}"
10
11# Модерна цветна палитра
12C_RESET=$'\033[0m'
13C_BOLD=$'\033[1m'
14C_DIM=$'\033[2m'
15
16# Основни цветове
17C_PRIMARY=$'\033[38;5;81m' # Светло синьо
18C_SUCCESS=$'\033[38;5;82m' # Зелено
19C_WARNING=$'\033[38;5;214m' # Оранжево
20C_ERROR=$'\033[38;5;196m' # Червено
21C_INFO=$'\033[38;5;147m' # Лавандула
22
23# Акцентни цветове
24C_TITLE=$'\033[38;5;213m' # Розово-лилаво
25C_KEY=$'\033[38;5;226m' # Жълто
26C_VAL=$'\033[38;5;153m' # Светло синьо
27C_BORDER=$'\033[38;5;240m' # Сиво
28
29# Box drawing символи
30BOX_TL="╭"
31BOX_TR="╮"
32BOX_BL="╰"
33BOX_BR="╯"
34BOX_H="─"
35BOX_V="│"
36BOX_VR="├"
37BOX_VL="┤"
38
39ensure_file() {
40 [ -f "$ALIASES_FILE" ] || touch "$ALIASES_FILE"
41}
42
43print_header() {
44 local width=70
45 clear
46 echo
47 printf "%b" "${C_PRIMARY}${C_BOLD}"
48 printf "%s%${width}s%s\n" "$BOX_TL" "" "$BOX_TR" | tr ' ' "$BOX_H"
49 printf "%s%-${width}s%s\n" "$BOX_V" " 🎨 ALIASCTL - Мениджърът на Федя за Bash Алиаси" "$BOX_V"
50 printf "%s%${width}s%s\n" "$BOX_BL" "" "$BOX_BR" | tr ' ' "$BOX_H"
51 printf "%b\n" "${C_RESET}"
52}
53
54print_box() {
55 local text="$1"
56 local color="$2"
57 local width=70
58 printf "%b%s%b\n" "${color}" "$text" "${C_RESET}"
59}
60
61list_aliases() {
62 ensure_file
63 print_header
64
65 local count=$(grep -c '^alias ' "$ALIASES_FILE" 2>/dev/null || echo 0)
66
67 printf "%b%s %s%b\n" "${C_INFO}${C_BOLD}" "📦 Общо алиаси:" "$count" "${C_RESET}"
68 printf "%b%s%b\n\n" "${C_DIM}" "Файл: $ALIASES_FILE" "${C_RESET}"
69
70 if [ "$count" -eq 0 ]; then
71 printf "%b%s%b\n\n" "${C_WARNING}" " ⚠️ Няма дефинирани алиаси" "${C_RESET}"
72 else
73 printf "%b%-20s %s%b\n" "${C_BORDER}${C_DIM}" "Име" "Команда" "${C_RESET}"
74 printf "%b%s%b\n" "${C_BORDER}" "$(printf '%.0s─' {1..70})" "${C_RESET}"
75
76 grep '^alias ' "$ALIASES_FILE" 2>/dev/null \
77 | sed 's/^alias //' \
78 | while IFS= read -r line; do
79 name="${line%%=*}"
80 cmd="${line#*=}"
81 cmd="${cmd#\'}"
82 cmd="${cmd%\'}"
83
84 # Ограничаване на дължината за по-добра визия
85 if [ ${#cmd} -gt 45 ]; then
86 cmd="${cmd:0:42}..."
87 fi
88
89 printf " %b%-18s%b → %b%s%b\n" \
90 "$C_KEY" "$name" "$C_RESET" "$C_VAL" "$cmd" "$C_RESET"
91 done
92 echo
93 fi
94}
95
96add_alias() {
97 ensure_file
98 print_header
99
100 printf "%b%s%b\n\n" "${C_SUCCESS}${C_BOLD}" "➕ Добавяне на нов алиас" "${C_RESET}"
101
102 printf "%b%s%b" "${C_INFO}" "Име на алиаса: " "${C_RESET}"
103 read -r name
104
105 # Проверка за празно име
106 if [ -z "$name" ]; then
107 printf "\n%b%s%b\n" "${C_ERROR}" "❌ Името не може да бъде празно!" "${C_RESET}"
108 sleep 2
109 return
110 fi
111
112 # Проверка дали съществува
113 if grep -q "^alias $name=" "$ALIASES_FILE" 2>/dev/null; then
114 printf "\n%b%s%b\n" "${C_ERROR}" "❌ Алиас '$name' вече съществува!" "${C_RESET}"
115 sleep 2
116 return
117 fi
118
119 printf "%b%s%b" "${C_INFO}" "Команда: " "${C_RESET}"
120 read -r cmd
121
122 if [ -z "$cmd" ]; then
123 printf "\n%b%s%b\n" "${C_ERROR}" "❌ Командата не може да бъде празна!" "${C_RESET}"
124 sleep 2
125 return
126 fi
127
128 printf "alias %s='%s'\n" "$name" "$cmd" >> "$ALIASES_FILE"
129 printf "\n%b%s%b %b%s%b\n" "${C_SUCCESS}${C_BOLD}" "✅ Успешно добавен:" "${C_RESET}" "${C_KEY}" "$name" "${C_RESET}"
130 sleep 2
131}
132
133remove_alias() {
134 ensure_file
135 print_header
136
137 printf "%b%s%b\n\n" "${C_WARNING}${C_BOLD}" "🗑️ Премахване на алиас" "${C_RESET}"
138
139 local count=$(grep -c '^alias ' "$ALIASES_FILE" 2>/dev/null || echo 0)
140 if [ "$count" -eq 0 ]; then
141 printf "%b%s%b\n" "${C_WARNING}" "⚠️ Няма алиаси за премахване" "${C_RESET}"
142 sleep 2
143 return
144 fi
145
146 printf "%b%s%b" "${C_INFO}" "Име на алиаса за премахване: " "${C_RESET}"
147 read -r name
148
149 if [ -z "$name" ]; then
150 printf "\n%b%s%b\n" "${C_ERROR}" "❌ Не е въведено име!" "${C_RESET}"
151 sleep 2
152 return
153 fi
154
155 if grep -q "^alias $name=" "$ALIASES_FILE" 2>/dev/null; then
156 sed -i "/^alias $name=/d" "$ALIASES_FILE"
157 printf "\n%b%s%b %b%s%b\n" "${C_SUCCESS}${C_BOLD}" "✅ Премахнат:" "${C_RESET}" "${C_KEY}" "$name" "${C_RESET}"
158 else
159 printf "\n%b%s%b\n" "${C_ERROR}" "❌ Алиас '$name' не съществува!" "${C_RESET}"
160 fi
161 sleep 2
162}
163
164edit_aliases() {
165 ensure_file
166 "$EDITOR_CMD" "$ALIASES_FILE"
167}
168
169fzf_menu() {
170 if ! command -v fzf >/dev/null; then
171 print_header
172 printf "%b%s%b\n" "${C_ERROR}" "❌ fzf не е инсталиран!" "${C_RESET}"
173 printf "%b%s%b\n" "${C_INFO}" "Инсталирай с: sudo dnf install fzf" "${C_RESET}"
174 sleep 3
175 return
176 fi
177
178 ensure_file
179 local selected=$(grep '^alias ' "$ALIASES_FILE" 2>/dev/null \
180 | sed 's/^alias //' \
181 | fzf --height=40% --border --prompt="🔍 Търсене: " \
182 --color="fg:#d0d0d0,bg:#1e1e1e,hl:#5fd7ff" \
183 --color="fg+:#ffffff,bg+:#2e2e2e,hl+:#ffaf00" \
184 --color="info:#af87ff,prompt:#5fd7ff,pointer:#ff87d7" \
185 --color="marker:#87ff00,spinner:#ff87d7,header:#87afaf")
186
187 if [ -n "$selected" ]; then
188 print_header
189 printf "%b%s%b\n\n" "${C_SUCCESS}" "Избран алиас:" "${C_RESET}"
190 printf "%b%s%b\n" "${C_VAL}" "$selected" "${C_RESET}"
191 echo
192 read -rp "Натисни Enter за продължаване..."
193 fi
194}
195
196show_help() {
197 print_header
198
199 printf "%b%s%b\n\n" "${C_INFO}${C_BOLD}" "📖 Помощна информация" "${C_RESET}"
200
201 printf "%b%s%b\n" "${C_PRIMARY}" "Файл с алиаси:" "${C_RESET}"
202 printf " %b%s%b\n\n" "${C_VAL}" "$ALIASES_FILE" "${C_RESET}"
203
204 printf "%b%s%b\n" "${C_PRIMARY}" "Редактор:" "${C_RESET}"
205 printf " %b%s%b\n\n" "${C_VAL}" "$EDITOR_CMD" "${C_RESET}"
206
207 printf "%b%s%b\n" "${C_PRIMARY}" "За да заредиш алиасите:" "${C_RESET}"
208 printf " %b%s%b\n" "${C_VAL}" "source $ALIASES_FILE" "${C_RESET}"
209 printf " или добави в %b~/.bashrc%b:\n" "${C_VAL}" "${C_RESET}"
210 printf " %b%s%b\n\n" "${C_VAL}" "[ -f $ALIASES_FILE ] && source $ALIASES_FILE" "${C_RESET}"
211
212
213 # Добавяне на линк към сайта
214 printf "%b%s%b\n" "${C_PRIMARY}" "Посети сайта ми за още полезни неща:" "${C_RESET}"
215 printf " %b%s%b\n\n" "${C_VAL}" "https://urocibg.eu/" "${C_RESET}"
216
217 read -rp "Натисни Enter за продължаване..."
218}
219
220main_menu() {
221 print_header
222
223 printf "%b%s%b\n" "${C_BORDER}${C_DIM}" "Избери опция:" "${C_RESET}"
224 echo
225
226 printf " %b[1]%b 📋 Преглед на всички алиаси\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
227 printf " %b[2]%b ➕ Добавяне на нов алиас\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
228 printf " %b[3]%b 🗑️ Премахване на алиас\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
229 printf " %b[4]%b ✏️ Редактиране на файла\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
230 printf " %b[5]%b 🔍 FZF интерактивен преглед\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
231 printf " %b[6]%b 📖 Помощ\n" "${C_KEY}${C_BOLD}" "${C_RESET}"
232 echo
233 printf " %b[q]%b 🚪 Изход\n" "${C_ERROR}${C_BOLD}" "${C_RESET}"
234 echo
235
236 printf "%b%s%b " "${C_PRIMARY}" "➤" "${C_RESET}"
237 read -r choice
238
239 case "$choice" in
240 1) list_aliases; read -rp "Натисни Enter за продължаване...";;
241 2) add_alias;;
242 3) remove_alias;;
243 4) edit_aliases;;
244 5) fzf_menu;;
245 6) show_help;;
246 q|Q)
247 clear
248 printf "\n%b%s%b\n\n" "${C_SUCCESS}${C_BOLD}" "👋 Довиждане!" "${C_RESET}"
249 exit 0
250 ;;
251 *)
252 printf "\n%b%s%b\n" "${C_ERROR}" "❌ Невалидна опция!" "${C_RESET}"
253 sleep 1
254 ;;
255 esac
256}
257
258# Главен цикъл
259while true; do
260 main_menu
261done