automate/020_zsh_quickstart.sh

399 lines
13 KiB
Bash
Executable File

#!/usr/bin/env bash
set -x
## Completions for Debian 9.0 - may be included in zgen
#
#sudo bash -c "cat > /etc/apt/sources.list.d/shells:zsh-users:zsh-completions.list" << 'EOF'
#deb http://download.opensuse.org/repositories/shells:/zsh-users:/zsh-completions/Debian_9.0/ /
#EOF
#
#wget -qO - https://download.opensuse.org/repositories/shells:zsh-users:zsh-completions/Debian_9.0/Release.key | sudo apt-key add -
#
#sudo apt update
#sudo apt install zsh-completions
sudo apt install -y zsh nodejs zsh-theme-powerlevel9k git fonts-powerline powerline
# compaudit
# There are insecure directories: /usr/local/share/zsh/site-functions
# compaudit | xargs chmod g-w
# compaudit 2>&1 | sed -n '1d; p'
mkdir -p /usr/local/share/zsh/site-functions
chmod g-w /usr/local/share/zsh/site-functions
#DEST=$HOME
DEST=${1:-/etc/skel}
HOME="${DEST}"
ALIAS_DIR=".zshrc.d"
cd "${DEST}" || exit
chsh -s "$(which zsh)" "${USER}"
# Install zgenom plugin manager and zsh quickstart to get a default setup for zsh
# .zgen-setup pulls zgenom automatically and puts it in .zqs-zgenom, plugins in .zgenom
git clone http://github.com/unixorn/zsh-quickstart-kit "${DEST}"/zsh-quickstart-kit
ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zshrc "${DEST}"/.zshrc
ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zsh_functions "${DEST}"/.zsh_functions
ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zsh_aliases "${DEST}"/.zsh_aliases
ln -rsf "${DEST}"/zsh-quickstart-kit/zsh/.zgen-setup "${DEST}"/.zgen-setup
#ln -rsf ~/zsh-quickstart-kit/zsh/.zsh_completions ~/.zsh_completions
mkdir -p "${DEST}"/"${ALIAS_DIR}"
touch "${DEST}"/.zshrc
echo "setopt PROMPT_SUBST" >> "${DEST}"/.zshrc
echo "NVIM_PYTHON_LOG_FILE=/var/tmp/nvim_python.log" >> "${DEST}"/"${ALIAS_DIR}"/008_nvim.zsh
echo "NVIM_PYTHON_LOG_LEVEL=DEBUG" >> "${DEST}"/"${ALIAS_DIR}"/008_nvim.zsh
touch /var/tmp/nvim_python.log
# fix path error in .zshrc
#sed -i 's|pushd $(dirname "${HOME}/$(readlink "${DEST}"/.zshrc)")|pushd $(dirname "$(readlink "${DEST}"/.zshrc)")|' "${DEST}"/zsh-quickstart-kit/zsh/.zshrc
# debians locate db locate
# sed -i 's,^\(export LOCATE_PATH=\).*,\1'/var/lib/mlocate/mlocate.db',' "${DEST}"/.zshrc
echo "export LOCATE_PATH=/var/lib/mlocate/mlocate.db" > "${DEST}"/"${ALIAS_DIR}"/005_locatedb.zsh
# add plugins to the load-starter-plugin-list() function in ~/.zgen-setup ~/zsh-quickstart-kit/zsh/.zgen-setup
# FIXED: create a file named .zgen-local-plugins and add your zgenom load commands there.
# Don't forget to run `zgenom save` at the end of your .zgen-local-plugins file.
# Warning: .zgen-local-plugins REPLACES the starter list setup, it doesn't add to it.
# Comment out default docker plugin and replace with omz docker and compose plugins
sed -i -e "s|zgenom load srijanshetty/docker-zsh|# zgenom load srijanshetty/docker-zsh|" "${DEST}"/zsh-quickstart-kit/zsh/.zgen-setup
#sed -i '/\# zgenom load srijanshetty\/docker-zsh/a\ \ zgenom load ohmyzsh plugins\/docker\n\ \ zgenom load ohmyzsh plugins\/docker-compose' "${DEST}"/zsh-quickstart-kit/zsh/.zgen-setup
# zsh quickstart created this file if missing expecting fzf to be installed in ${HOME}
# we have it installed via apt so the executables are in the path and the key-bindings
# and completitions are in examples fom the package.
cat > "${DEST}/.fzf.zsh" << 'EOF'
# Setup fzf
# ---------
#if [[ ! "$PATH" == *${HOME}/.vim/bundle/fzf/bin/* ]]; then
# export PATH="$PATH:${HOME}/.vim/bundle/fzf/bin"
#fi
# auto-completion
# ---------------
[[ $- == *i* ]] && source "/usr/share/doc/fzf/examples/completion.zsh" 2> /dev/null
# Key bindings
# ------------
source "/usr/share/doc/fzf/examples/key-bindings.zsh"
EOF
# The contents of the starter plugin function with changes above, pulling from upstream git with now not squash local changes.
cat > "${DEST}"/.zgen-local-plugins << 'EOF'
echo "creating a zgen save"
ZGEN_LOADED=()
ZGEN_COMPLETIONS=()
# Load ohmyzsh base
zgenom ohmyzsh
# zman fzf to quickly find and browse Zsh manuals
zgenom load mattmc3/zman
# .zgen-local-plugins is sourced during startup *instead* of running .zgen-setup load-starter-plugin-list function,
# so make sure to include everything from this function that you want to keep.
# If zsh-syntax-highlighting is bundled after zsh-history-substring-search,
# they break, so get the order right.
zgenom load zsh-users/zsh-syntax-highlighting
zgenom load zsh-users/zsh-history-substring-search
# Set keystrokes for substring searching
zmodload zsh/terminfo
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down
# Tab complete rakefile targets
#zgenom load unixorn/rake-completion.zshplugin
# Automatically run zgen update and zgen selfupdate every 7 days
#zgenom load unixorn/autoupdate-zgen
zgenom load unixorn/jpb.zshplugin
# Colorize the things if you have grc installed. Well, some of the
# things, anyway.
zgenom load unixorn/warhol.plugin.zsh
# OS X helpers
zgenom load unixorn/tumult.plugin.zsh
# Warn you when you run a command that you've got an alias for
zgenom load djui/alias-tips
# Add my collection of git helper scripts
zgenom load unixorn/git-extra-commands
# Add my bitbucket git helpers plugin
zgenom load unixorn/bitbucket-git-helpers.plugin.zsh
# A collection of scripts that might be useful to sysadmins
zgenom load skx/sysadmin-util
# Adds aliases to open your current repo & branch on github.
zgenom load peterhurford/git-it-on.zsh
# Tom Limoncelli's tooling for storing private information (keys, etc)
# in a repository securely by encrypting them with gnupg
zgenom load StackExchange/blackbox
# Load some ohmyzsh plugins
zgenom ohmyzsh plugins/aws
#zgenom ohmyzsh plugins/chruby
zgenom ohmyzsh plugins/colored-man-pages
zgenom ohmyzsh plugins/git
zgenom ohmyzsh plugins/github
zgenom ohmyzsh plugins/golang
zgenom ohmyzsh plugins/pip
zgenom ohmyzsh plugins/python
zgenom ohmyzsh plugins/rsync
zgenom ohmyzsh plugins/tmux
zgenom ohmyzsh plugins/screen
zgenom ohmyzsh plugins/ssh-agent
zgenom ohmyzsh plugins/sudo
zgenom ohmyzsh plugins/vagrant
if [ $(uname -a | grep -ci Darwin) = 1 ]; then
# Load OSX-specific plugins
zgenom ohmyzsh plugins/brew
zgenom ohmyzsh plugins/osx
fi
# A set of shell functions to make it easy to install small apps and
# utilities distributed with pip.
zgenom load sharat87/pip-app
zgenom load chrissicool/zsh-256color
# Load more completion files for zsh from the zsh-lovers github repo
#zgenom load zsh-users/zsh-completions src
# aggregates zsh completions from: zsh-users/zsh-completions, zchee/zsh-completions,
# nilsonholger/osx-zsh-completions and various other custom or third-party sources.
zgenom load clarketm/zsh-completions
# Docker completion
# zgenom load srijanshetty/docker-zsh
#zgenom load akarzim/zsh-docker-aliases
zgenom load robbyrussell/oh-my-zsh plugins/docker
zgenom load robbyrussell/oh-my-zsh plugins/docker-compose
# Load me last
GENCOMPL_FPATH=$HOME/.zsh/complete
GENCOMPL_PY=python3
# Very cool plugin that generates zsh completion functions for commands
# if they have getopt-style help text. It doesn't generate them on the fly,
# you'll have to explicitly generate a completion, but it's still quite cool.
zgenom load RobSis/zsh-completion-generator
# Add Fish-like autosuggestions to your ZSH
zgenom load zsh-users/zsh-autosuggestions
# IDE-like type-ahead completion for Zsh, asynchronous/non-blocking
#zgenom load marlonrichert/zsh-autocomplete
# k is a zsh script / plugin to make directory listings more readable,
# adding a bit of color and some git status information on files and directories
zgenom load rimraf/k
# Bullet train prompt setup
#zgenom load caiogondim/bullet-train-ohmyzsh-theme bullet-train
zgenom load robbyrussell/oh-my-zsh themes/agnoster
## Load Prezto
# zgen prezto
## Load prezto plugins
# zgen prezto <modulename> <option> <value(s)>
# zgen prezto <modulename>
## prezto options
# zgen prezto editor key-bindings 'emacs'
# zgen prezto prompt theme 'sorin'
## prezto and modules
#zgen prezto
# zgen prezto git
# zgen prezto command-not-found
# zgen prezto syntax-highlighting
## plugins
# zgenom load/path/to/super-secret-private-plugin
# Save it all to init script
zgenom save
EOF
# example .d file use unset to prevent update
#echo '# Use unset 'QUICKSTART_KIT_REFRESH_IN_DAYS' to disable.' > ~/"${ALIAS_DIR}"/001_quickstart-refresh.zsh
echo 'zgenom autoupdate' > "${DEST}"/"${ALIAS_DIR}"/001_zgenom-refresh.zsh
# sed -i 's,^\(export LOCATE_PATH=\).*,\1'/var/lib/mlocate/mlocate.db',' ~/.zshrc
# Use powerline-daemon to speedup the prompt.
echo 'powerline-daemon -q' > "${DEST}"/"${ALIAS_DIR}"/006_powerline-daemon.zsh
sed -i 's,^\(CHARMAP=\).*,\1'\"UTF-8\"',' /etc/default/console-setup
# set theme for zsh
cat > "${DEST}"/"${ALIAS_DIR}"/002_theme.zsh << 'EOF'
# https://zshthem.es/browse-zsh-themes/
ZSH_THEME="agnoster" # powerline based theme
#ZSH_THEME="3den"
#ZSH_THEME="Pure"
EOF
cat > "${DEST}"/"${ALIAS_DIR}"/001_vi-mode.sh << 'EOF'
# Set vi mode
bindkey -v
bindkey '^R' history-incremental-search-backward
EOF
#git clone http://github.com/bhilburn/powerlevel9k.git "${DEST}"/.zgen/robbyrussell/ohmyzsh-master/themes/powerlevel9k
## add a separate zsh aliases directory
ALIAS_DIR=.zsh_aliases.d
cat <<EOF | sudo tee -a "${DEST}"/.zshrc >/dev/null
# Make it easy to append your own aliases
# loading all files from "${ALIAS_DIR}" directory
mkdir -p ~/"${ALIAS_DIR}"
if [ -n "$(ls ~/"${ALIAS_DIR}")" ]; then
for dotfile in ~/"${ALIAS_DIR}"/*
do
if [ -r "${dotfile}" ]; then
source "${dotfile}"
fi
done
fi
EOF
# alias python version
mkdir -p "${DEST}"/"${ALIAS_DIR}"
# tell bash to check the next word after the alias (i.e sudo) by adding a space to the end of the alias value.
echo "# tell bash to check the next word after the alias (i.e sudo) by adding a space to the end of the alias value." > "${DEST}"/"${ALIAS_DIR}"/002_sudo.zsh
echo 'alias sudo="sudo "' >> "${DEST}"/"${ALIAS_DIR}"/002_sudo.zsh
cat > "${DEST}"/"${ALIAS_DIR}"/003-py_aliases.zsh << 'EOF'
_py_version() {
PY_VERSIONS=(2 3)
LINE=(${(s: :)history[$HISTCMD]})
COMMAND=${LINE[1]}
ARGS=${(j: :)LINE[2,-1]}
while (( 1 )) {
read -s -k1 VERSION"?$COMMAND [${PY_VERSIONS[1]}]: "
if [[ $VERSION == $'\n' ]]; then
VERSION=${PY_VERSIONS[1]}
break
elif (( ${PY_VERSIONS[(I)$VERSION]} )); then
echo $VERSION
break
fi
echo "$VERSION is not supported (${(j:, :)PY_VERSIONS})"
}
if [[ -x $(which $COMMAND$VERSION) ]]; then
COMMAND=$COMMAND$VERSION
else
COMMAND="python$VERSION $(which -a $COMMAND | grep -v aliased | head -n 1)"
fi
eval $COMMAND $ARGS
}
# versioned python commands
alias python="_py_version"
alias pip="_py_version"
alias pydoc="_py_version"
alias idle="_py_version"
alias ipython="_py_version"
alias jupyter="_py_version"
EOF
mkdir -p "${DEST}"/"${ALIAS_DIR}"/
cat > "${DEST}"/"${ALIAS_DIR}"/003_transfer.zsh <<'EOF'
#
# Defines transfer alias and provides easy command line file and folder sharing.
#
# Authors:
# Remco Verhoef <remco@dutchcoders.io>
#
curl --version 2>&1 > /dev/null
if [ $? -ne 0 ]; then
echo "Could not find curl."
return 1
fi
transfer() {
# check arguments
if [ $# -eq 0 ];
then
echo -e "No arguments specified.\n\nUsage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"
return 1
fi
# get temporarily filename, output is written to this file show progress can be showed
tmpfile=$( mktemp -t transferXXX )
# upload stdin or file
file=$1
if tty -s;
then
basefile=$(basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
if [ ! -e $file ];
then
echo "File $file doesn't exists."
return 1
fi
if [ -d $file ];
then
# zip directory and transfer
zipfile=$( mktemp -t transferXXX.zip )
cd $(dirname $file) && zip -r -q - $(basename $file) >> $zipfile
curl --progress-bar --upload-file "$zipfile" "https://transfer.sh/$basefile.zip" >> $tmpfile
rm -f $zipfile
else
# transfer file
curl --progress-bar --upload-file "$file" "https://transfer.sh/$basefile" >> $tmpfile
fi
else
# transfer pipe
curl --progress-bar --upload-file "-" "https://transfer.sh/$file" >> $tmpfile
fi
# cat output link
cat $tmpfile
# log file link
APPLICATION="${0##*/}"
RIGHTNOW="$(date)"
EXPIRES="$(date -d "+14 days")"
echo -e "$(cat "$tmpfile") - uploaded $RIGHTNOW - expires $EXPIRES\n" >> ~/$APPLICATION.log
echo "\n\nSee ~/$APPLICATION.log for all transfers.\n"
# cleanup
rm -f $tmpfile
}
EOF
chown -R root.root /usr/local/share/zsh/site-functions
chmod -R 755 /usr/local/share/zsh/site-functions