mirror of
https://github.com/VicoShrt/shrtrun.git
synced 2025-10-27 00:23:47 +00:00
Initial Commit
This commit is contained in:
parent
0482c02065
commit
d5ae9aff98
31
README.md
Normal file
31
README.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# shrtrun
|
||||||
|
|
||||||
|
**shrtrun** is a lightweight shell-based launcher utility that lets you execute commands or trigger custom actions (like searches) using a prefix system. It uses `rofi` for user input and supports configurable settings via a simple `.conf` file.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✨ Features
|
||||||
|
|
||||||
|
- Run arbitrary shell commands
|
||||||
|
- Google and YouTube search with prefix commands
|
||||||
|
- Configurable browser and search engines
|
||||||
|
- Uses `rofi` as the input interface
|
||||||
|
- Minimal logging for debugging
|
||||||
|
- Notification support (via `notify-send`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📦 Requirements
|
||||||
|
|
||||||
|
Make sure the following dependencies are installed:
|
||||||
|
|
||||||
|
- `bash` (default on most systems)
|
||||||
|
- `rofi` – for the graphical input menu
|
||||||
|
- `xdg-open` – to open URLs with the default browser
|
||||||
|
- `notify-send` (optional) – for desktop notifications
|
||||||
|
|
||||||
|
**Install on Debian/Ubuntu:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install rofi xdg-utils libnotify-bin
|
||||||
119
launcher.sh
Normal file
119
launcher.sh
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
CONFIG_DIR="$HOME/.config/shrtrun"
|
||||||
|
CONFIG_FILE="$CONFIG_DIR/config.conf"
|
||||||
|
|
||||||
|
# Create config directory if it doesn't exist
|
||||||
|
mkdir -p "$CONFIG_DIR"
|
||||||
|
|
||||||
|
# Create default config if it doesn't exist
|
||||||
|
if [ ! -f "$CONFIG_FILE" ]; then
|
||||||
|
cat > "$CONFIG_FILE" << EOF
|
||||||
|
# Quick Launcher Configuration
|
||||||
|
log_file: /logs/shrtrun.log
|
||||||
|
browser: firefox
|
||||||
|
search_engine: https://duckduckgo.com/?q=
|
||||||
|
youtube_search: https://www.youtube.com/results?search_query=
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Function to read config values
|
||||||
|
get_config_value() {
|
||||||
|
key=$1
|
||||||
|
default=$2
|
||||||
|
# Use awk for more reliable parsing with : as delimiter
|
||||||
|
value=$(awk -F': ' -v key="$key" '$1 == key {print $2}' "$CONFIG_FILE")
|
||||||
|
if [ -z "$value" ]; then
|
||||||
|
echo "$default"
|
||||||
|
else
|
||||||
|
echo "$value"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get configuration values
|
||||||
|
BROWSER=$(get_config_value "browser" "firefox")
|
||||||
|
SEARCH_ENGINE=$(get_config_value "search_engine" "https://duckduckgo.com/?q=")
|
||||||
|
YOUTUBE_SEARCH=$(get_config_value "youtube_search" "https://www.youtube.com/results?search_query=")
|
||||||
|
LOG_FILE=$(get_config_value "log_file" "/.logs/shrtrun.log")
|
||||||
|
|
||||||
|
# Check if log file exists
|
||||||
|
if [ ! -f "$LOG_FILE" ]; then
|
||||||
|
touch "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Function to show notifications
|
||||||
|
show_notification() {
|
||||||
|
title="$1"
|
||||||
|
message="$2"
|
||||||
|
|
||||||
|
if command -v notify-send &> /dev/null; then
|
||||||
|
notify-send "$title" "$message"
|
||||||
|
else
|
||||||
|
echo "$title: $message" >> "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get user input from rofi
|
||||||
|
USER_INPUT=$(rofi -dmenu -p "Run:")
|
||||||
|
|
||||||
|
# Exit if user didn't enter anything
|
||||||
|
if [ -z "$USER_INPUT" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Log the input
|
||||||
|
echo "$(date): User input: '$USER_INPUT'" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Source the environment
|
||||||
|
source "$HOME/.profile" 2>/dev/null
|
||||||
|
source "$HOME/.bashrc" 2>/dev/null
|
||||||
|
source "$HOME/.bashrc_aliases" 2>/dev/null
|
||||||
|
|
||||||
|
# Check for command
|
||||||
|
if [[ "$USER_INPUT" == \!* ]]; then
|
||||||
|
# Extract command type and query
|
||||||
|
CMD_TYPE="${USER_INPUT:1:1}"
|
||||||
|
QUERY="${USER_INPUT:2}"
|
||||||
|
|
||||||
|
case "$CMD_TYPE" in
|
||||||
|
g)
|
||||||
|
# Format the search URL
|
||||||
|
SEARCH_URL="${SEARCH_ENGINE}${QUERY// /+}"
|
||||||
|
echo "$(date): Opening search URL: $SEARCH_URL" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Try multiple methods to open the browser
|
||||||
|
if command -v "$BROWSER" &> /dev/null; then
|
||||||
|
"$BROWSER" "$SEARCH_URL" &
|
||||||
|
elif command -v xdg-open &> /dev/null; then
|
||||||
|
xdg-open "$SEARCH_URL" &
|
||||||
|
else
|
||||||
|
# Try common browsers
|
||||||
|
for browser in firefox google-chrome chromium-browser brave-browser; do
|
||||||
|
if command -v "$browser" &> /dev/null; then
|
||||||
|
"$browser" "$SEARCH_URL" &
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
disown
|
||||||
|
;;
|
||||||
|
y)
|
||||||
|
# YouTube search
|
||||||
|
YOUTUBE_URL="${YOUTUBE_SEARCH}${QUERY// /+}"
|
||||||
|
echo "$(date): Opening YouTube search: $YOUTUBE_URL" >> "$LOG_FILE"
|
||||||
|
xdg-open "$YOUTUBE_URL" &>/dev/null &
|
||||||
|
disown
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
show_notification "Unknown Command" "The command '$CMD_TYPE' is not recognized"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
# Execute regular command
|
||||||
|
echo "$(date): Executing command: $USER_INPUT" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Execute in background and disown
|
||||||
|
eval "$USER_INPUT" &>/dev/null &
|
||||||
|
disown
|
||||||
|
fi
|
||||||
Loading…
x
Reference in New Issue
Block a user