You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							186 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
	
	
							186 lines
						
					
					
						
							3.6 KiB
						
					
					
				#!/bin/sh | 
						|
 | 
						|
# Vim plugin manager | 
						|
# Depends: git | 
						|
 | 
						|
#---- | 
						|
BASE="$XDG_CONFIG_HOME/vim/pack" | 
						|
#---- | 
						|
DIR="$BASE/plugins" | 
						|
LIST="$BASE/list" | 
						|
START="$DIR/start" | 
						|
OPT="$DIR/opt" | 
						|
 | 
						|
help() { | 
						|
	B=$(tput bold) | 
						|
	U=$(tput smul) | 
						|
	N=$(tput sgr0) | 
						|
 | 
						|
	cat << EOF | 
						|
${B}NAME${N} | 
						|
	vimplugin.sh - vim plugin manager | 
						|
 | 
						|
${B}SYNOPSIS${N} | 
						|
	${B}vimplugin.sh${N} [${U}OPTION${N}] [${U}COMMAND${N}] [<${U}ARG${N}>...] | 
						|
 | 
						|
${B}OPTIONS${N} | 
						|
	${B}-h${N}	Display usage message and exit. | 
						|
 | 
						|
${B}COMMANDS${N} | 
						|
	${B}init${N} | 
						|
		Creates all the required directories/files. | 
						|
 | 
						|
	${B}install${N} ${U}URL${N} <${U}LOCATION${N}> | 
						|
		Install a new plugin from a valid GitHub ${U}URL${N}. | 
						|
		Store this plugin in <${U}LOCATION${N}> (start/opt), default to start. | 
						|
 | 
						|
	${B}list${N} <${U}NUMBER${N}> | 
						|
		Print all the installed plugins. | 
						|
		If <${U}NUMBER${N}> is provided, print only the plugin in that position. | 
						|
 | 
						|
	${B}remove${N} | 
						|
		Remove plugin, pick from selection menu. | 
						|
 | 
						|
	${B}update${N} | 
						|
		Install/update all plugins stored in the config file. | 
						|
EOF | 
						|
} | 
						|
 | 
						|
# Exit if no option is provided | 
						|
[ "$#" -eq 0 ] && help && exit 1 | 
						|
 | 
						|
SCRIPT="$(basename "$0")" | 
						|
 | 
						|
# Option handling | 
						|
while getopts ':h?' opt; do | 
						|
	case $opt in | 
						|
		h) | 
						|
			help | 
						|
			exit 0 | 
						|
			;; | 
						|
		\?) | 
						|
			echo "$SCRIPT: invalid option '$OPTARG'" | 
						|
			echo "Try '$SCRIPT -h' for more information." | 
						|
			exit 1 | 
						|
			;; | 
						|
	esac | 
						|
done | 
						|
 | 
						|
init() { | 
						|
	sudo mkdir -p "$START" | 
						|
	sudo mkdir -p "$OPT" | 
						|
	sudo touch "$LIST" | 
						|
	if [ ! -s "$LIST" ]; then | 
						|
		# Append to empty file | 
						|
		sudo sh -c 'echo "start:" >> '"$LIST" | 
						|
		sudo sh -c 'echo "opt:" >> '"$LIST" | 
						|
	fi | 
						|
} | 
						|
 | 
						|
install() { | 
						|
	# Check if correct git URL | 
						|
	if [ -z "$(echo "$1" | sed -nr \ | 
						|
		's/^https:\/\/github\.com\/(.*\/.*).git$/\1/p')" ]; then | 
						|
		echo "$SCRIPT: url invalid: $1" | 
						|
	else | 
						|
		# cd to correct directory if called from the CLI | 
						|
		if [ -z "$2" ]; then | 
						|
			# Default is directory 'start' | 
						|
			cd "$START" || exit | 
						|
		elif [ "$2" = "start" ]; then | 
						|
			cd "$START" || exit | 
						|
		elif [ "$2" = "opt" ]; then | 
						|
			cd "$OPT" || exit | 
						|
		fi | 
						|
 | 
						|
		REPO="$(basename "$1" .git)" | 
						|
		if [ -d "$REPO" ]; then | 
						|
			cd "$REPO" || exit | 
						|
			sudo git pull --force 1> /dev/null | 
						|
			cd ".." | 
						|
			echo "Updated: $REPO" | 
						|
		else | 
						|
			sudo git clone "$1" 2> /dev/null | 
						|
 | 
						|
			# Add git URL to config file | 
						|
			if [ -z "$2" ]; then | 
						|
				# Append before 'opt:' | 
						|
				sudo sed -i '/opt:/ i '"$1" "$LIST" | 
						|
			elif [ "$2" = "start"  ]; then | 
						|
				# Append before 'opt:' | 
						|
				sudo sed -i '/opt:/ i '"$1" "$LIST" | 
						|
			elif [ "$2" = "opt" ]; then | 
						|
				# Append at the end of the file | 
						|
				sudo sed -i '$ a '"$1" "$LIST" | 
						|
			fi | 
						|
 | 
						|
			echo "Installed: $REPO" | 
						|
		fi | 
						|
	fi | 
						|
} | 
						|
 | 
						|
list() { | 
						|
	if [ -z "$1" ]; then | 
						|
		echo "Listing all installed plugins.." | 
						|
	fi | 
						|
 | 
						|
	PLUGIN="$(find "$DIR" -mindepth 2 -maxdepth 2 \ | 
						|
		| sort | awk -F '/' '{ print $(NF-1)"/"$NF }')" | 
						|
	NUM=0 | 
						|
	for p in $PLUGIN; do | 
						|
		NUM=$((NUM + 1)) | 
						|
 | 
						|
		if [ -z "$1" ]; then | 
						|
			echo "$NUM) $p" | 
						|
		elif [ "$NUM" = "$1" ]; then | 
						|
			echo "$p" | 
						|
		fi | 
						|
	done | 
						|
} | 
						|
 | 
						|
remove() { | 
						|
	list | 
						|
	printf "Enter the number to remove: " | 
						|
	read -r OPTION | 
						|
 | 
						|
	if [ -z "$(echo "$OPTION" | sed -nr 's/^([0-9]+)$/\1/p')" ]; then | 
						|
		echo "Please select a number" | 
						|
	else | 
						|
		TO_REMOVE="$(list "$OPTION")" | 
						|
		if [ -n "$TO_REMOVE" ]; then | 
						|
			sudo rm -rf "$DIR/$TO_REMOVE" | 
						|
			sudo sed -i '/'"$(basename "$TO_REMOVE")"'\.git/d' "$LIST" | 
						|
			echo "Removed plugin: $TO_REMOVE" | 
						|
		fi | 
						|
	fi | 
						|
} | 
						|
 | 
						|
update() { | 
						|
	echo "Updating.." | 
						|
 | 
						|
	init | 
						|
 | 
						|
	cd "$START" || exit | 
						|
	while read -r l; do | 
						|
		if [ "$l" = "start:"  ]; then | 
						|
			cd "$START" || exit | 
						|
		elif [ "$l" = "opt:"  ]; then | 
						|
			cd "$OPT" || exit | 
						|
		else | 
						|
			install "$l" "script" | 
						|
		fi | 
						|
	done < "$LIST" | 
						|
} | 
						|
 | 
						|
# Command handling | 
						|
shift $((OPTIND - 1)) | 
						|
case "$1" in | 
						|
	init | install | list | remove | update) | 
						|
		"$@" | 
						|
		;; | 
						|
	*) | 
						|
		echo "$SCRIPT: invalid command '$1'" | 
						|
		echo "Try '$SCRIPT -h' for more information." | 
						|
		exit 1 | 
						|
		;; | 
						|
esac
 | 
						|
 |