initial
This commit is contained in:
parent
18ecc8a783
commit
8eb1d396aa
6 changed files with 301 additions and 2 deletions
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
cache/
|
||||
log/
|
||||
|
||||
plugins/
|
||||
installed_plugins
|
||||
64
README.md
64
README.md
|
|
@ -1,3 +1,65 @@
|
|||
# rock
|
||||
# 🎸 Rock 🤘
|
||||
|
||||
A minimal zsh plugin manager.
|
||||
|
||||
Inspired by:
|
||||
zcomet - https://github.com/agkozak/zcomet
|
||||
zap - https://github.com/zap-zsh/zap
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
sh <(curl -s https://git.lucasf.dev/public/rock/raw/branch/master/install.sh)
|
||||
```
|
||||
|
||||
## Basic plugins
|
||||
|
||||
Add the following to your `.zshrc`
|
||||
|
||||
```sh
|
||||
# Basic Options for zsh configuration.
|
||||
plug "https://git.lucasf.dev/public/zsh-basics.git"
|
||||
|
||||
plug "zsh-users/zsh-autosuggestions"
|
||||
plug "zsh-users/zsh-syntax-highlighting"
|
||||
|
||||
# A simple prompt theme
|
||||
plug "https://git.lucasf.dev/public/zsh-prompt.git"
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
- To update plugins or Rock itself:
|
||||
|
||||
```sh
|
||||
rock --update
|
||||
```
|
||||
|
||||
- To cleanup plugins you are no longer using:
|
||||
|
||||
```sh
|
||||
rock --clean
|
||||
```
|
||||
|
||||
- To uninstall Rock:
|
||||
|
||||
```sh
|
||||
rock --remove
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
By default the manager will try to source plugins that the file name is the same as the repository, with the following extensions:
|
||||
|
||||
- `.plugin.zsh`
|
||||
- `.zsh`
|
||||
- `.zsh-theme`
|
||||
|
||||
|
||||
To add some plugin that are named different from the repo name, you need to pass the file name as a parameter as in the example below:
|
||||
|
||||
```sh
|
||||
plug "spaceship-prompt/spaceship-prompt" spaceship.zsh
|
||||
```
|
||||
|
||||
|
|
|
|||
8
completion/_rock
Normal file
8
completion/_rock
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#compdef rock
|
||||
|
||||
_arguments -C -s \
|
||||
"(-)"{-h,--help}"[Show help information]" \
|
||||
"(-)"{-v,--version}"[Show version information]" \
|
||||
"(-)"{-u,--update}"[Update plugins]" \
|
||||
"(-)"{-c,--clean}"[Remove unused plugins]" \
|
||||
"(-)"{-r,--remove}"[Uninstall rock]" \
|
||||
8
help
Normal file
8
help
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
🎸 rock [options]
|
||||
|
||||
OPTIONS:
|
||||
-h, --help help
|
||||
-v, --version version
|
||||
-u, --update update plugin(s)
|
||||
-c, --clean clean plugin(s)
|
||||
-r, --remove uninstall rock
|
||||
27
install.sh
Normal file
27
install.sh
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/sh
|
||||
|
||||
main() {
|
||||
local ROCKDIR="$HOME/.local/share/rock"
|
||||
local ZSHRC="$HOME/.zshrc"
|
||||
local CMD='[[ -f "$HOME/.local/share/rock/rock.zsh" ]] && source "$HOME/.local/share/rock/rock.zsh"'
|
||||
|
||||
git clone https://git.lucasf.dev/public/rock "$ROCKDIR" > /dev/null 2>&1
|
||||
if [[ ! -d "$ROCKDIR/plugins" ]]; then
|
||||
mkdir -p "$ROCKDIR/plugins"
|
||||
fi
|
||||
if [[ -n "$ZDOTDIR" ]] && [[ -f "$ZDOTDIR/.zshrc" ]]; then
|
||||
ZSHRC="$ZDOTDIR/.zshrc"
|
||||
fi
|
||||
if [[ ! -f $ZSHRC || $(cat $ZSHRC | wc -l) = 0 ]];then
|
||||
echo $CMD > $ZSHRC
|
||||
else
|
||||
if ! grep -q '[[ -f "$HOME/.local/share/rock/rock.zsh" ]] && source "$HOME/.local/share/rock/rock.zsh"' $ZSHRC; then
|
||||
sed -i '1 i[[ -f "$HOME/.local/share/rock/rock.zsh" ]] && source "$HOME/.local/share/rock/rock.zsh"' $ZSHRC
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
if [[ $? -eq 0 ]];then echo "🎸 You Rock Yeah!! 🤘"; fi
|
||||
|
||||
# vim: ft=zsh:ts=4:sts=4:sw=4
|
||||
189
rock.zsh
Normal file
189
rock.zsh
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
#!/bin/sh
|
||||
# Rock Zsh Plugin Manager - inspired by zcomet & zap
|
||||
# shellcheck disable=SC1090
|
||||
|
||||
export ROCK_DIR="$HOME/.local/share/rock"
|
||||
export ROCK_PLUGIN_DIR="$ROCK_DIR/plugins"
|
||||
export ROCK_ACTIVE_PLUGINS="$ROCK_DIR/installed_plugins"
|
||||
export ROCK_ZSHRC="$ZDOTDIR/.zshrc"
|
||||
export ZSH_CACHE_DIR="$ROCK_DIR/cache/"
|
||||
plugin_name=""
|
||||
|
||||
if [ -z "$ZDOTDIR" ]; then
|
||||
export ROCK_ZSHRC="$HOME/.zshrc" # ~/.zshrc
|
||||
fi
|
||||
|
||||
fpath=("$ROCK_DIR/completion" $fpath)
|
||||
autoload -Uz add-zsh-hook \
|
||||
_rock_{help,version,update,clean,remove}
|
||||
|
||||
rm -rf "$ROCK_ACTIVE_PLUGINS"
|
||||
|
||||
_try_source() {
|
||||
[[ -f "$1" ]] && source "$1"
|
||||
}
|
||||
|
||||
_get_plugin_name() {
|
||||
plugin_name=$(echo "$1" | awk -F / '{print $NF}')
|
||||
plugin_name="${plugin_name/.git/}"
|
||||
}
|
||||
|
||||
_try_pull() {
|
||||
echo "♪ $1"
|
||||
git pull > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then echo "Failed to update $1" && return 1; fi
|
||||
echo -e "\e[1A\e[K🎶 $1"
|
||||
}
|
||||
|
||||
_rock_help() {
|
||||
cat "$ROCK_DIR/help"
|
||||
}
|
||||
|
||||
_rock_version() {
|
||||
echo "🎸 Rock Version $(cat "$ROCK_DIR/.git/packed-refs" | grep tags | tail -1 | awk -F / '{print $NF}')"
|
||||
}
|
||||
|
||||
_rock_update() {
|
||||
local plugins=""
|
||||
if [[ -f "$ROCK_ACTIVE_PLUGINS" ]];then
|
||||
plugins=$(cat "$ROCK_ACTIVE_PLUGINS" | awk 'BEGIN { FS = "\n" } { print " " int((NR)) echo " ♪ " $1 }')
|
||||
fi
|
||||
echo "🎼 Please select an option to update \n"
|
||||
echo -e " 0 🎸 Rock"
|
||||
echo "$plugins \n"
|
||||
echo -n "🎼 Plugin Number(s) | (a) All Plugins | (0) 🎸 update Rock: "
|
||||
read plugin
|
||||
pwd=$(pwd)
|
||||
echo ""
|
||||
if [[ $plugin == "a" ]]; then
|
||||
cd "$ROCK_PLUGIN_DIR"
|
||||
for plug in *; do
|
||||
cd $plug
|
||||
_try_pull $plug
|
||||
cd "$ROCK_PLUGIN_DIR"
|
||||
done
|
||||
cd $pwd > /dev/null 2>&1
|
||||
elif [[ $plugin == "0" ]]; then
|
||||
cd "$ROCK_DIR"
|
||||
_try_pull 'rock'
|
||||
cd $pwd
|
||||
else
|
||||
selected_number=($(echo $plugin | awk -F '[[:space:]]' '{print $0}'))
|
||||
sorted=($(printf '%s\n' "${selected_number[@]}"|sort -u))
|
||||
for item in $sorted;do
|
||||
for plug in $plugins; do
|
||||
selected=$(echo $plug | grep -E "^ ${item##*( )}" | awk -F / '{print $NF}')
|
||||
selected="${selected/.git/}"
|
||||
if [[ -n $selected ]]; then
|
||||
if [[ -d "$ROCK_PLUGIN_DIR/$selected" ]];then
|
||||
cd "$ROCK_PLUGIN_DIR/$selected"
|
||||
_try_pull $selected
|
||||
cd - > /dev/null 2>&1
|
||||
fi
|
||||
else
|
||||
echo "📣 ${item##*( )} is not a valid option!"
|
||||
fi
|
||||
done
|
||||
done
|
||||
fi
|
||||
if [[ $ROCK_CLEAN_ON_UPDATE == true ]]; then
|
||||
_rock_clean
|
||||
fi
|
||||
}
|
||||
|
||||
_rock_clean() {
|
||||
unused_plugins=()
|
||||
for i in "$ROCK_PLUGIN_DIR"/*; do
|
||||
local plugin_name=$(basename "$i")
|
||||
if ! grep -q "$plugin_name" "$ROCK_ACTIVE_PLUGINS"; then
|
||||
unused_plugins+=("$plugin_name")
|
||||
fi
|
||||
done
|
||||
if [ ${#unused_plugins[@]} -eq 0 ]; then
|
||||
echo "📣 Nothing to clean"
|
||||
else
|
||||
for p in ${unused_plugins[@]}; do
|
||||
echo -n "Remove: $p? (n/y): "
|
||||
read answer
|
||||
if [[ $answer == "y" || $answer == "Y" ]]; then
|
||||
rm -rf "$ROCK_PLUGIN_DIR/$p"
|
||||
echo "removed: $p"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
_rock_remove() {
|
||||
echo -n "🔇 Removing Rock, are you sure? (n/y):"
|
||||
read answer
|
||||
if [[ $answer == "y" || $answer == "Y" ]];then
|
||||
cd "$HOME"
|
||||
rm -rf "$ROCK_DIR"
|
||||
if [[ -f $ROCK_ZSHRC ]];then
|
||||
sed -i '/source "$HOME\/.local\/share\/rock\/rock.zsh"/d' $ROCK_ZSHRC
|
||||
sed -i '/^plug /d' $ROCK_ZSHRC
|
||||
source $ROCK_ZSHRC
|
||||
fi
|
||||
echo "👋 Bye Bye"
|
||||
else
|
||||
echo "Great choice! 🎵🎧🎭 🎶"
|
||||
fi
|
||||
}
|
||||
|
||||
plug() {
|
||||
local plugin="$1"
|
||||
if [[ -f "$plugin" ]];then
|
||||
_try_source $plugin
|
||||
else
|
||||
local full_plugin_name="$1"
|
||||
_get_plugin_name $plugin
|
||||
local plugin_nick=$(echo $* | awk -F "[[:space:]]" '/.zsh$/{print $NF}')
|
||||
local plugin_dir="$ROCK_PLUGIN_DIR/$plugin_name"
|
||||
if [[ ! -d "$plugin_dir" ]];then
|
||||
echo "♪ $plugin_name"
|
||||
git clone $plugin --depth 1 "$plugin_dir" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
git clone "https://github.com/$plugin.git" --depth 1 "$plugin_dir" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then echo "Failed to clone $plugin_name" && return 1; fi
|
||||
fi
|
||||
if [ -n "$git_ref" ]; then
|
||||
git -C "$plugin_dir" checkout "$git_ref" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then echo "Failed to checkout $git_ref" && return 1; fi
|
||||
fi
|
||||
echo -e "\e[1A\e[K🎶 $plugin_name"
|
||||
fi
|
||||
_try_source "$plugin_dir/$plugin_name.plugin.zsh"
|
||||
_try_source "$plugin_dir/$plugin_name.zsh"
|
||||
_try_source "$plugin_dir/$plugin_name.zsh-theme"
|
||||
if [[ -n "$plugin_nick" ]];then _try_source "$plugin_dir/$plugin_nick"; fi
|
||||
fi
|
||||
if [[ -n $full_plugin_name ]]; then
|
||||
echo "$full_plugin_name" >> "$ROCK_DIR/installed_plugins"
|
||||
fi
|
||||
}
|
||||
|
||||
typeset -A opts
|
||||
opts=(
|
||||
-h "_rock_help"
|
||||
--help "_rock_help"
|
||||
-u "_rock_update"
|
||||
--update "_rock_update"
|
||||
-c "_rock_clean"
|
||||
--clean "_rock_clean"
|
||||
-v "_rock_version"
|
||||
--version "_rock_version"
|
||||
-r "_rock_remove"
|
||||
--remove "_rock_remove"
|
||||
)
|
||||
|
||||
rock() {
|
||||
emulate -L zsh
|
||||
if [[ -z "$opts[$1]" ]]; then
|
||||
_rock_help
|
||||
return 1
|
||||
fi
|
||||
opt="${opts[$1]}"
|
||||
$opt
|
||||
}
|
||||
|
||||
# vim: ft=bash sw=4 ts=4 et
|
||||
Loading…
Add table
Add a link
Reference in a new issue