aboutsummaryrefslogtreecommitdiff
path: root/.config/zsh
diff options
context:
space:
mode:
Diffstat (limited to '.config/zsh')
-rw-r--r--.config/zsh/.zshrc557
1 files changed, 9 insertions, 548 deletions
diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc
index 8393597..348f876 100644
--- a/.config/zsh/.zshrc
+++ b/.config/zsh/.zshrc
@@ -6,6 +6,10 @@
# ███████╗███████║██║ ██║██║ ██║╚██████╗
# ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝
+for zsh_source in "$HOME"/.config/zsh/lib/*.zsh; do
+ source $zsh_source
+done
+
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
@@ -23,558 +27,15 @@ fi
# Enable various options
setopt interactive_comments beep extendedglob nomatch notify completeinword prompt_subst
-########## Vi mode ##########
-bindkey -v
-bindkey -M viins '^?' backward-delete-char
-bindkey -M viins '^[[3~' delete-char
-bindkey -M vicmd '^[[3~' delete-char
-bindkey -v '^?' backward-delete-char
-bindkey -r '\e/'
-bindkey -s jk '\e'
-bindkey "^W" backward-kill-word
-bindkey "^H" backward-delete-char # Control-h also deletes the previous char
-bindkey "^U" backward-kill-line
-bindkey "^[j" history-search-forward # or you can bind it to the down key "^[[B"
-bindkey "^[k" history-search-backward # or you can bind it to Up key "^[[A"
-
-# Define the 'autosuggest-execute' and 'autosuggest-accept' ZLE widgets
-autoload -Uz autosuggest-execute autosuggest-accept
-zle -N autosuggest-execute
-zle -N autosuggest-accept
-bindkey '^X' autosuggest-execute
-bindkey '^Y' autosuggest-accept
-
-# Edit line in vim with alt-e
-autoload edit-command-line; zle -N edit-command-line
-bindkey '^e' edit-command-line
-bindkey '^[e' edit-command-line # alt + e
-
-# Allow CTRL+D to exit zsh with partial command line (non empty line)
-exit_zsh() { exit }
-zle -N exit_zsh
-bindkey '^D' exit_zsh
-
-# Auto-completion
-autoload -Uz compinit
-if [[ -n ${ZDOTDIR}/.zcompdump(#qN.mh+24) ]]; then
- compinit;
-else
- compinit -C;
-fi;
-
-# Accept completion with <tab> or Ctrl+i and go to next/previous suggestions with Vi like keys: Ctrl+n/p
-zmodload -i zsh/complist
-accept-and-complete-next-history() {
- zle expand-or-complete-prefix
-}
-
-zle -N accept-and-complete-next-history
-bindkey -M menuselect '^i' accept-and-complete-next-history
-bindkey '^n' expand-or-complete
-bindkey '^p' reverse-menu-complete
-zstyle ':completion:*' menu select=1
-
# Some other useful functionalities
-setopt autocd # Automatically cd into typed directory.
-stty intr '^q' # free Ctrl+C for copy use Ctrl+q instead
-stty lnext '^-' # free Ctrl+V for paste use ^- instead
-stty stop undef # Disable ctrl-s to freeze terminal.
+setopt autocd # Automatically cd into typed directory.
+setopt AUTO_PUSHD # More history for cd and use "cd -TAB"
+stty intr '^q' # free Ctrl+C for copy use Ctrl+q instead
+stty lnext '^-' # free Ctrl+V for paste use ^- instead
+stty stop undef # Disable ctrl-s to freeze terminal.
stty start undef
#unsetopt BEEP
-# More history for cd and use "cd -TAB"
-setopt AUTO_PUSHD # pushes the old directory onto the stack
-zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'
-
-
-########## Prompt(s) ##########
-
-# Enable colors
-autoload -U colors && colors
-
-# Prompt with Vi insert-mode/normal-mode and blinking '$', note blinking '$' only works on some terminals.
-terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
-git_branch_test_color() {
- local ref=$(git symbolic-ref --short HEAD 2> /dev/null)
- if [ -n "${ref}" ]; then
- if [ -n "$(git status --porcelain)" ]; then
- local gitstatuscolor='%F{196}'
- else
- local gitstatuscolor='%F{82}'
- fi
- echo "${gitstatuscolor}${ref}"
- else
- echo ""
- fi
-}
-
-# Job indicator
-jobs_status_indicator() {
- local jobs_output
- declare -p jobs_output >/dev/null 2>&1
- if [[ $? -eq 0 ]]; then
- unset jobs_output
- fi
- jobs_output=$(jobs -s)
- if [[ -n "$jobs_output" ]]; then
- local jobs_count=$(echo "$jobs_output" | wc -l)
- echo "jobs: ${jobs_count}"
- fi
-}
-
-remote_indicator() {
- if [[ -n "$SSH_CONNECTION" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
- echo 'ssh '
- else
- echo ''
- fi
-}
-
-# Version control (git)
-autoload -Uz add-zsh-hook vcs_info
-zstyle ':vcs_info:*' stagedstr ' +%F{15}staged%f'
-zstyle ':vcs_info:*' unstagedstr ' -%F{15}unstaged%f'
-zstyle ':vcs_info:*' check-for-changes true
-zstyle ':vcs_info:*' actionformats '%F{5}%F{2}%b%F{3}|%F{1}%a%F{5}%f '
-zstyle ':vcs_info:*' formats '%F{208} '$'\uE0A0'' %f$(git_branch_test_color)%f%F{76}%c%F{3}%u%f '
-zstyle ':vcs_info:git*+set-message:*' hooks git-untracked
-zstyle ':vcs_info:*' enable git
-+vi-git-untracked() {
- if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \
- [[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then
- hook_com[unstaged]+='%F{196} !%f%F{15}untracked%f'
- fi
-}
-
-# Prompt
-function insert-mode() {
- echo "-- INSERT --"
-}
-
-function normal-mode() {
- echo "-- NORMAL --"
-}
-
-function my_precmd () {
- vcs_info
- PS1="%{┌─[%F{145}%n%f] %F{39}%0~%f%} ${vcs_info_msg_0_} \$(remote_indicator)\$(jobs_status_indicator)
- %{%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}"
-}
-
-add-zsh-hook precmd my_precmd
-
-function set-prompt() {
- if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then
- echo -ne '\e[1 q'
- VI_MODE=$(normal-mode)
- elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then
- echo -ne '\e[5 q'
- VI_MODE=$(insert-mode)
- fi
- PS1="%{┌─[%F{145}%n%f] %F{39}%0~%f%} ${vcs_info_msg_0_} \$(remote_indicator)\$(jobs_status_indicator)
- %{%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}"
-}
-
-function update-mode-file() {
- set-prompt
- local current_mode=$(cat ~/.vi-mode)
- local new_mode="$VI_MODE"
- if [[ "$new_mode" != "$current_mode" ]]; then
- echo "$new_mode" >| ~/.vi-mode
- fi
- if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then
- tmux refresh-client -S
- fi
-}
-
-function check-nvim-running() {
- if pgrep -x "nvim" > /dev/null; then
- VI_MODE=""
- update-mode-file
- if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then
- tmux refresh-client -S
- fi
- else
- if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then
- VI_MODE=$(normal-mode)
- elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then
- VI_MODE=$(insert-mode)
- fi
- update-mode-file
- if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then
- tmux refresh-client -S
- fi
- fi
-}
-
-function zle-line-init() {
- zle reset-prompt
- case "${KEYMAP}" in
- vicmd)
- echo -ne '\e[1 q'
- ;;
- main|viins|*)
- echo -ne '\e[5 q'
- ;;
- esac
-}
-
-function zle-keymap-select() {
- update-mode-file
- zle reset-prompt
- case "${KEYMAP}" in
- vicmd)
- echo -ne '\e[1 q'
- ;;
- main|viins|*)
- echo -ne '\e[5 q'
- ;;
- esac
-}
-
-preexec () { print -rn -- $terminfo[el]; echo -ne '\e[5 q' ; }
-
-zle -N zle-line-init
-zle -N zle-keymap-select
-
-TRAPWINCH() { # Trap the WINCH signal to update the mode file on window size changes
- update-mode-file
-}
-
-#function nvim-listener() {
-# local prev_nvim_status="inactive"
-# local nvim_pid=""
-# while true; do
-# local current_nvim_pid=$(pgrep -x "nvim")
-# if [[ -n "$current_nvim_pid" && "$current_nvim_pid" != "$nvim_pid" ]]; then
-# # Neovim started
-# prev_nvim_status="active"
-# nvim_pid="$current_nvim_pid"
-# VI_MODE="" # Clear VI_MODE to show Neovim mode
-# update-mode-file
-# if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then
-# tmux refresh-client -S
-# fi
-# elif [[ -z "$current_nvim_pid" && "$prev_nvim_status" == "active" ]]; then
-# # Neovim stopped
-# prev_nvim_status="inactive"
-# nvim_pid=""
-# if [[ ${KEYMAP} == vicmd || ${KEYMAP} == vi-cmd-mode ]]; then
-# VI_MODE=$(normal-mode)
-# elif [[ ${KEYMAP} == main || ${KEYMAP} == viins || ${KEYMAP} == '' ]]; then
-# VI_MODE=$(insert-mode)
-# fi
-# update-mode-file
-# if command -v tmux &>/dev/null && [[ -n "$TMUX" ]]; then
-# tmux refresh-client -S
-# fi
-# fi
-# done
-#}
-
-# Start Neovim listener in the background
-#nvim-listener &!
-set-prompt
-
-RPROMPT='%(?..[%F{196}%?%f] )'
-
-
-########## Useful Commands/Alias ##########
-
-# Define alias for nvim/vim (fallback to vim)
-if command -v nvim > /dev/null; then
- alias vi='nvim'
-else
- alias vi='vim'
-fi
-
-# Confirmation #
-alias mv='mv -i'
-alias cp='cp -i'
-alias ln='ln -i'
-alias rm='rm -i'
-
-alias ls='ls --color=auto --group-directories-first'
-alias lsd="lsd --group-directories-first"
-alias grep='grep --colour=auto'
-alias egrep='egrep --colour=auto'
-alias fgrep='fgrep --colour=auto'
-
-# List upto last 10 visited directories using "d" and quickly cd into any specific one
-alias d="dirs -v | head -10"
-
-# Using just a number from "0" to "9"
-alias 0="cd +0"
-alias 1="cd +1"
-alias 2="cd +2"
-alias 3="cd +3"
-alias 4="cd +4"
-alias 5="cd +5"
-alias 6="cd +6"
-alias 7="cd +7"
-alias 8="cd +8"
-alias 9="cd +9"
-
-alias sc="systemctl"
-alias jc="journalctl xe"
-alias suspend='systemctl suspend && betterlockscreen --lock dimblur' # Suspend(sleep) and lock screen if using systemctl
-alias hibernate='systemctl hibernate' # Hibernate
-alias lock='DISPLAY=:0 xautolock -locknow' # Lock my workstation screen from my phone
-alias oports="sudo lsof -i -P -n | grep -i 'listen'" # List open ports
-alias trash_restore='gio trash --restore "$(gio trash --list | fzf | cut -f 1)"'
-alias keyname="xev | sed -n 's/[ ]*state.* \([^ ]*\)).*/\1/p'"
-alias wget=wget --hsts-file="$XDG_CACHE_HOME/wget-hsts" # wget does not support environment variables
-
-alias pp='getlast 2>&1 |&tee -a output.txt'
-alias -g cap='2>&1 | tee -a output.txt' # Print output of a command NOTE: Must be used in conjunction but no need for "|" symbol
-#alias stashrebase='git stash save && git fetch && git rebase origin main && git stash apply'
-#alias cfg-stash='config stash save && config fetch && config rebase origin main && config stash apply'
-
-# Time aliases
-alias ber='TZ=Europe/Berlin date'
-alias nyc='TZ=America/New_York date'
-alias sfo='TZ=America/Los_Angeles date'
-alias utc='TZ=Etc/UTC date'
-
-### Dotfiles
-alias config='git --git-dir=$HOME/.cfg --work-tree=$HOME'
-cfg_files=$(config ls-tree --name-only -r HEAD)
-export CFG_FILES="$cfg_files"
-
-# Set bare dotfiles repository git environment variables dynamically
-function set_git_env_vars() {
- # Check if the current command is a package manager command
- if [[ "${(%)${(z)history[1]}}" =~ ^(pacman|yay|apt|dnf|brew|npm|pip|gem|go|cargo) ]]; then
- return
- fi
- local git_dir="$(git rev-parse --git-dir -C . 2>/dev/null)"
- if [[ -n "$git_dir" ]]; then
- local is_bare="$(git -C "$git_dir" rev-parse --is-bare-repository 2>/dev/null)"
- if [[ "$is_bare" == "true" ]]; then
- export GIT_DIR="$HOME/.cfg"
- export GIT_WORK_TREE=$(realpath $(eval echo ~))
- else
- unset GIT_DIR
- unset GIT_WORK_TREE
- fi
- else
- local root_dir="$(git rev-parse --show-toplevel 2>/dev/null)"
- if [[ -n "$root_dir" ]]; then
- unset GIT_DIR
- export GIT_WORK_TREE="$root_dir"
- else
- export GIT_DIR="$HOME/.cfg"
- export GIT_WORK_TREE=$(realpath $(eval echo ~))
- fi
- fi
-}
-
-# Define an auto_cd hook to automatically update Git environment variables
-function chpwd() {
- set_git_env_vars
-}
-# Call the function to set Git environment variables when the shell starts up
-set_git_env_vars
-
-
-function gsp() {
- # Config file for subtrees
- #
- # Format:
- # <prefix>;<remote address>;<remote branch>
- # # Lines starting with '#' will be ignored
- GIT_SUBTREE_FILE="$PWD/.gitsubtrees"
-
- if [ ! -f "$GIT_SUBTREE_FILE" ]; then
- echo "Nothing to do - file <$GIT_SUBTREE_FILE> does not exist."
- return
- fi
-
- if ! command -v config &> /dev/null; then
- echo "Error: 'config' command not found. Make sure it's available in your PATH."
- return
- fi
-
- OLD_IFS=$IFS
- IFS=$'\n'
- for LINE in $(cat "$GIT_SUBTREE_FILE"); do
-
- # Skip lines starting with '#'.
- if [[ $LINE = \#* ]]; then
- continue
- fi
-
- # Parse the current line.
- PREFIX=$(echo "$LINE" | cut -d';' -f 1)
- REMOTE=$(echo "$LINE" | cut -d';' -f 2)
- BRANCH=$(echo "$LINE" | cut -d';' -f 3)
-
- # Pull from the remote.
- echo "Executing: git subtree pull --prefix=$PREFIX $REMOTE $BRANCH"
- if git subtree pull --prefix="$PREFIX" "$REMOTE" "$BRANCH"; then
- echo "Subtree pull successful for $PREFIX."
- else
- echo "Error: Subtree pull failed for $PREFIX."
- fi
- done
-
- IFS=$OLD_IFS
-}
-
-# Print previous command into a file
-getlast () {
- fc -nl $((HISTCMD - 1))
-}
-
-# Enter directory and list contents
-cd() {
- if [ -n "$1" ]; then
- builtin cd "$@" && ls -pvA --color=auto --group-directories-first
- else
- builtin cd ~ && ls -pvA --color=auto --group-directories-first
- fi
-}
-
-# cd using "up n" as a command up as many directories, example "up 3"
-up() {
- # default parameter to 1 if non provided
- declare -i d=${@:-1}
- # ensure given parameter is non-negative. Print error and return if it is
- (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
- # remove last d directories from pwd, append "/" in case result is empty
- cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
-}
-
-# cd into $XDG_CONFIG_HOME/$1 directory
-c() {
- local root=${XDG_CONFIG_HOME:-~/.config}
- local dname="$root/$1"
- if [[ ! -d "$dname" ]]; then
- return
- fi
- cd "$dname"
-}
-
-# Make and cd into directory and any parent directories
-mkcd () {
- if [[ -z "$1" ]]; then
- echo "Usage: mkcd <dir>" 1>&2
- return 1
- fi
- mkdir -p "$1"
- cd "$1"
-}
-
-# Back up a file. Usage "backupthis <filename>"
-backupthis() {
- cp -riv $1 ${1}-$(date +%Y%m%d%H%M).backup;
-}
-
-# Let FZF use ripgrep by default
-if type rg &> /dev/null; then
- export FZF_DEFAULT_COMMAND='rg --files'
- export FZF_DEFAULT_OPTS='-m --height 50% --border'
-fi
-
-# Spawn a clone of current terminal
-putstate () {
- declare +x >~/environment.tmp
- declare -x >>~/environment.tmp
- echo cd "$PWD" >>~/environment.tmp
-}
-
-getstate () {
- . ~/environment.tmp
-}
-
-# use ctrl-z to toggle in and out of bg
-function toggle_fg_bg() {
- if [[ $#BUFFER -eq 0 ]]; then
- BUFFER="fg"
- zle accept-line
- else
- BUFFER=""
- zle clear-screen
- fi
-}
-zle -N toggle_fg_bg
-bindkey '^Z' toggle_fg_bg
-
-# Tmux layout
-openSession () {
- tmux split-window -h -t
- tmux split-window -v -t
- tmux resize-pane -U 5
-}
-
-# Allow nnn filemanager to cd on quit
-nnn() {
- declare -x +g NNN_TMPFILE=$(mktemp --tmpdir $0.XXXX)
- trap "rm -f $NNN_TMPFILE" EXIT
- =nnn $@
- [ -s $NNN_TMPFILE ] && source $NNN_TMPFILE
-}
-
-# Extract with one command
-extract () {
- if [ -f $1 ] ; then
- case $1 in
- *.tar.bz2) tar xjf $1 ;;
- *.tar.gz) tar xzf $1 ;;
- *.bz2) bunzip2 $1 ;;
- *.rar) rar x $1 ;;
- *.gz) gunzip $1 ;;
- *.tar) tar xf $1 ;;
- *.tbz2) tar xjf $1 ;;
- *.tgz) tar xzf $1 ;;
- *.zip) unzip $1 ;;
- *.Z) uncompress $1 ;;
- *.7z) 7z x $1 ;;
- *) echo "'$1' cannot be extracted via extract()" ;;
- esac
- else
- echo "'$1' is not a valid file"
- fi
-}
-
-# Kubernetes
-# kubernetes aliases
-if command -v kubectl > /dev/null; then
- replaceNS() { kubectl config view --minify --flatten --context=$(kubectl config current-context) | yq ".contexts[0].context.namespace=\"$1\"" ; }
- alias kks='KUBECONFIG=<(replaceNS "kube-system") kubectl'
- alias kam='KUBECONFIG=<(replaceNS "authzed-monitoring") kubectl'
- alias kas='KUBECONFIG=<(replaceNS "authzed-system") kubectl'
- alias kar='KUBECONFIG=<(replaceNS "authzed-region") kubectl'
- alias kt='KUBECONFIG=<(replaceNS "tenant") kubectl'
-
- if command -v kubectl-krew > /dev/null; then
- path=($XDG_CONFIG_HOME/krew/bin $path)
- fi
-
- rmfinalizers() {
- kubectl get deployment "$1" -o json | jq '.metadata.finalizers = null' | kubectl apply -f -
- }
-fi
-
-# Alias for android-studio
-alias android-studio='/opt/android-studio/bin/studio.sh'
-
-# NVM
-#nvm() {
-# local green_color
-# green_color=$(tput setaf 2)
-# local reset_color
-# reset_color=$(tput sgr0)
-# echo -e "${green_color}nvm${reset_color} $@"
-#}
-if [ -s "$NVM_DIR/nvm.sh" ]; then
- nvm_cmds=(nvm node npm yarn)
- for cmd in "${nvm_cmds[@]}"; do
- alias "$cmd"="unalias ${nvm_cmds[*]} && unset nvm_cmds && . $NVM_DIR/nvm.sh && $cmd"
- done
-fi
-
-
########## Source Plugins, should be last ##########
#source /usr/share/nvm/init-nvm.sh