From 715b2b7d3e217da1d296797a1c7e3c9132b1c6c9 Mon Sep 17 00:00:00 2001 From: Jonathan Hodgson Date: Wed, 11 Mar 2020 11:30:54 +0000 Subject: [PATCH] Lots of zsh changes --- shells/zsh/STOW/.zprofile | 2 +- shells/zsh/STOW/.zshrc | 175 ++++---- shells/zsh/STOW/.zshrc.old | 131 ++++++ shells/zsh/includes/aliases.zsh | 1 - shells/zsh/includes/auto-notify.zsh | 6 + shells/zsh/includes/autoSuggest.zsh | 2 + shells/zsh/includes/colors.zsh | 373 ++++++++++++++++++ shells/zsh/includes/completion.zsh | 18 +- shells/zsh/includes/focus.zsh | 22 ++ shells/zsh/includes/fzf.zsh | 9 +- shells/zsh/includes/globals.zsh | 1 - shells/zsh/includes/keybindings.zsh | 59 +++ shells/zsh/includes/promptconfig.zsh | 174 ++++++-- .../{rangercd.zsh => rangercd.zsh.tmp} | 0 .../{shortcuts.zsh => shortcuts.zsh.tmp} | 0 15 files changed, 816 insertions(+), 157 deletions(-) create mode 100644 shells/zsh/STOW/.zshrc.old create mode 100644 shells/zsh/includes/auto-notify.zsh create mode 100644 shells/zsh/includes/autoSuggest.zsh create mode 100755 shells/zsh/includes/colors.zsh create mode 100644 shells/zsh/includes/focus.zsh delete mode 100644 shells/zsh/includes/globals.zsh create mode 100644 shells/zsh/includes/keybindings.zsh rename shells/zsh/includes/{rangercd.zsh => rangercd.zsh.tmp} (100%) rename shells/zsh/includes/{shortcuts.zsh => shortcuts.zsh.tmp} (100%) diff --git a/shells/zsh/STOW/.zprofile b/shells/zsh/STOW/.zprofile index 9faf6534..e21d9c32 100644 --- a/shells/zsh/STOW/.zprofile +++ b/shells/zsh/STOW/.zprofile @@ -1,2 +1,2 @@ -source ~/.dotfiles/shells/shared/profile +source ~/.dotfiles/shells/shared/environmentVariables diff --git a/shells/zsh/STOW/.zshrc b/shells/zsh/STOW/.zshrc index 43ffc438..5a80ad01 100644 --- a/shells/zsh/STOW/.zshrc +++ b/shells/zsh/STOW/.zshrc @@ -1,97 +1,52 @@ -# If you come from bash you might have to change your $PATH. -# export PATH=$HOME/bin:/usr/local/bin:$PATH - -# Path to your oh-my-zsh installation. -export ZSH=$HOME/.dotfiles/shells/zsh/oh-my-zsh-core - - -# Set name of the theme to load. Optionally, if you set this to "random" -# it'll load a random theme each time that oh-my-zsh is loaded. -# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes -ZSH_THEME="powerlevel9k/powerlevel9k" - -# Uncomment the following line to use case-sensitive completion. -# CASE_SENSITIVE="true" - -# Uncomment the following line to use hyphen-insensitive completion. Case -# sensitive completion must be off. _ and - will be interchangeable. -# HYPHEN_INSENSITIVE="true" - -# Uncomment the following line to disable bi-weekly auto-update checks. -# DISABLE_AUTO_UPDATE="true" - -# Uncomment the following line to change how often to auto-update (in days). -# export UPDATE_ZSH_DAYS=13 - -# Uncomment the following line to disable colors in ls. -# DISABLE_LS_COLORS="true" - -# Uncomment the following line to disable auto-setting terminal title. -# DISABLE_AUTO_TITLE="true" - -# Uncomment the following line to enable command auto-correction. -# ENABLE_CORRECTION="true" - -# Uncomment the following line to display red dots whilst waiting for completion. -# COMPLETION_WAITING_DOTS="true" - -# Uncomment the following line if you want to disable marking untracked files -# under VCS as dirty. This makes repository status check for large repositories -# much, much faster. -# DISABLE_UNTRACKED_FILES_DIRTY="true" - -# Uncomment the following line if you want to change the command execution time -# stamp shown in the history command output. -# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" -# HIST_STAMPS="dd.mm.yyyy" - -# Would you like to use another custom folder than $ZSH/custom? -ZSH_CUSTOM=$HOME/.dotfiles/shells/zsh/oh-my-zsh-custom - - -# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) -# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/ -# Example format: plugins=(rails git textmate ruby lighthouse) -# Add wisely, as too many plugins slow down shell startup. -plugins=(git zsh-better-npm-completion zsh-autosuggestions) - - -source $ZSH/oh-my-zsh.sh - -# User configuration - -# export MANPATH="/usr/local/man:$MANPATH" - -# You may need to manually set your language environment -# export LANG=en_US.UTF-8 - -# Preferred editor for local and remote sessions -# if [[ -n $SSH_CONNECTION ]]; then -# export EDITOR='vim' -# else -# export EDITOR='mvim' -# fi - -# Compilation flags -# export ARCHFLAGS="-arch x86_64" +# Make colours work +# +autoload -U colors && colors + +# Make sure we are using vi mode +bindkey -v + +# History in cache directory: +setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. +setopt SHARE_HISTORY # Share history between all sessions. +setopt HIST_IGNORE_SPACE +HISTSIZE=10000 +SAVEHIST=10000 +HISTFILE=~/.cache/zsh/history + +export KEYTIMEOUT=25 + +# Change cursor shape for different vi modes. (thanks Luke Smith: https://github.com/LukeSmithxyz/voidrice/) +function zle-keymap-select { + if [[ ${KEYMAP} == vicmd ]] || + [[ $1 = 'block' ]]; then + echo -ne '\e[1 q' + + elif [[ ${KEYMAP} == main ]] || + [[ ${KEYMAP} == viins ]] || + [[ ${KEYMAP} = '' ]] || + [[ $1 = 'beam' ]]; then + echo -ne '\e[5 q' + fi +} +zle -N zle-keymap-select +# +zle-line-init() { + zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere) + echo -ne '\e[5 q' +} +zle -N zle-line-init -# ssh -# export SSH_KEY_PATH="~/.ssh/rsa_id" +# Use beam shape cursor on startup. +echo -ne '\e[5 q' +# Use beam shape cursor for each new prompt. +preexec() { echo -ne '\e[5 q' ;} -# Set personal aliases, overriding those provided by oh-my-zsh libs, -# plugins, and themes. Aliases can be placed here, though oh-my-zsh -# users are encouraged to define aliases within the ZSH_CUSTOM folder. -# For a full list of active aliases, run `alias`. -# -# Example aliases -# alias zshconfig="mate ~/.zshrc" -# alias ohmyzsh="mate ~/.oh-my-zsh" +bindkey -v '^?' backward-delete-char -source ~/.dotfiles/shells/zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh if [ ! -n "$SSH_CLIENT" ] && [ ! -n "$SSH_TTY" ]; then - if [ -L $HOME/.dotfiles/shells/zsh/current-color-scheme ]; then - source $HOME/.dotfiles/shells/zsh/current-color-scheme + if [ -L $DOTFILES/shells/zsh/current-color-scheme ]; then + source $DOTFILES/shells/zsh/current-color-scheme fi fi @@ -99,24 +54,30 @@ TRAPWINCH(){ zle && {zle reset-prompt; zle -R} } -#if [ -f ~/.current-folder ] && [ ! $TMUX ]; then -# \cd "$(cat ~/.current-folder)" -#fi - -#[ -z "$TMUX" ] && { exec tmux new-session && exit;} -#if [[ ! $TERM =~ screen ]]; then -# exec tmux -#fi -# - -local current="$(project current --path)" -if [ -n "$current" ]; then - local script="/usr/bin/script" - if [[ ! "$(ps -ocommand -p $PPID | grep -v 'COMMAND' | cut -d' ' -f1 )" == "$script" ]]; then - mkdir "$current/shell-logs" - /usr/bin/script -f "$current/shell-logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log" +setopt autocd + +# I use initial command in my folder-shell script +# This is normally empty, but might be lf or ranger if I want to open it +# THis is almost always a curses app so I don't want to try and record the terminal +if [ -n "$initialCommand" ]; then + echo "Running $initialCommand" + $initialCommand && exit +else + local current="$(project current --path)" + if [ -n "$current" ]; then + local script="/usr/bin/script" + if [[ ! "$(ps -ocommand -p $PPID | grep -v 'COMMAND' | cut -d' ' -f1 )" == "$script" ]]; then + mkdir "$current/shell-logs" 2> /dev/null + /usr/bin/script -f "$current/shell-logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log" + fi fi fi -#clear -#tldr --linux -r +export ZSH_FOLDER="$DOTFILES/shells/zsh/" +# Include my config files +for file in "$ZSH_FOLDER/includes/"*".zsh"; do + source "$file" +done + +# Load zsh-syntax-highlighting; should be last. +source $HOME/.dotfiles/shells/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 2> /dev/null diff --git a/shells/zsh/STOW/.zshrc.old b/shells/zsh/STOW/.zshrc.old new file mode 100644 index 00000000..d105909d --- /dev/null +++ b/shells/zsh/STOW/.zshrc.old @@ -0,0 +1,131 @@ +# If you come from bash you might have to change your $PATH. +# export PATH=$HOME/bin:/usr/local/bin:$PATH + +# Path to your oh-my-zsh installation. +#export ZSH=$HOME/.dotfiles/shells/zsh/oh-my-zsh-core + + +# Set name of the theme to load. Optionally, if you set this to "random" +# it'll load a random theme each time that oh-my-zsh is loaded. +# See https://github.com/robbyrussell/oh-my-zsh/wiki/Themes +#ZSH_THEME="powerlevel9k/powerlevel9k" + +# Uncomment the following line to use case-sensitive completion. +# CASE_SENSITIVE="true" + +# Uncomment the following line to use hyphen-insensitive completion. Case +# sensitive completion must be off. _ and - will be interchangeable. +# HYPHEN_INSENSITIVE="true" + +# Uncomment the following line to disable bi-weekly auto-update checks. +# DISABLE_AUTO_UPDATE="true" + +# Uncomment the following line to change how often to auto-update (in days). +# export UPDATE_ZSH_DAYS=13 + +# Uncomment the following line to disable colors in ls. +# DISABLE_LS_COLORS="true" + +# Uncomment the following line to disable auto-setting terminal title. +# DISABLE_AUTO_TITLE="true" + +# Uncomment the following line to enable command auto-correction. +# ENABLE_CORRECTION="true" + +# Uncomment the following line to display red dots whilst waiting for completion. +# COMPLETION_WAITING_DOTS="true" + +# Uncomment the following line if you want to disable marking untracked files +# under VCS as dirty. This makes repository status check for large repositories +# much, much faster. +# DISABLE_UNTRACKED_FILES_DIRTY="true" + +# Uncomment the following line if you want to change the command execution time +# stamp shown in the history command output. +# The optional three formats: "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" +# HIST_STAMPS="dd.mm.yyyy" + +# Would you like to use another custom folder than $ZSH/custom? +#ZSH_CUSTOM=$HOME/.dotfiles/shells/zsh/oh-my-zsh-custom + + +# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) +# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/ +# Example format: plugins=(rails git textmate ruby lighthouse) +# Add wisely, as too many plugins slow down shell startup. +#plugins=(git zsh-better-npm-completion zsh-autosuggestions) + + +source $ZSH/oh-my-zsh.sh + +# User configuration + +# export MANPATH="/usr/local/man:$MANPATH" + +# You may need to manually set your language environment +# export LANG=en_US.UTF-8 + +# Preferred editor for local and remote sessions +# if [[ -n $SSH_CONNECTION ]]; then +# export EDITOR='vim' +# else +# export EDITOR='mvim' +# fi + +# Compilation flags +# export ARCHFLAGS="-arch x86_64" + +# ssh +# export SSH_KEY_PATH="~/.ssh/rsa_id" + +# Set personal aliases, overriding those provided by oh-my-zsh libs, +# plugins, and themes. Aliases can be placed here, though oh-my-zsh +# users are encouraged to define aliases within the ZSH_CUSTOM folder. +# For a full list of active aliases, run `alias`. +# +# Example aliases +# alias zshconfig="mate ~/.zshrc" +# alias ohmyzsh="mate ~/.oh-my-zsh" + +source ~/.dotfiles/shells/zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh + +if [ ! -n "$SSH_CLIENT" ] && [ ! -n "$SSH_TTY" ]; then + if [ -L $HOME/.dotfiles/shells/zsh/current-color-scheme ]; then + source $HOME/.dotfiles/shells/zsh/current-color-scheme + fi +fi + +TRAPWINCH(){ + zle && {zle reset-prompt; zle -R} +} + +#if [ -f ~/.current-folder ] && [ ! $TMUX ]; then +# \cd "$(cat ~/.current-folder)" +#fi + +#[ -z "$TMUX" ] && { exec tmux new-session && exit;} +#if [[ ! $TERM =~ screen ]]; then +# exec tmux +#fi +# + +# I use initial command in my folder-shell script +# This is normally empty, but might be lf or ranger if I want to open it +# THis is almost always a curses app so I don't want to try and record the terminal +if [ -n "$initialCommand" ]; then + echo "Running $initialCommand" + $initialCommand && exit +else + local current="$(project current --path)" + if [ -n "$current" ]; then + local script="/usr/bin/script" + if [[ ! "$(ps -ocommand -p $PPID | grep -v 'COMMAND' | cut -d' ' -f1 )" == "$script" ]]; then + mkdir "$current/shell-logs" + /usr/bin/script -f "$current/shell-logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log" + fi + fi +fi + + +#clear +#tldr --linux -r diff --git a/shells/zsh/includes/aliases.zsh b/shells/zsh/includes/aliases.zsh index 93e7b7cb..b04e5f19 100644 --- a/shells/zsh/includes/aliases.zsh +++ b/shells/zsh/includes/aliases.zsh @@ -21,4 +21,3 @@ alias -s gitignore=$EDITOR alias -s json=$EDITOR -#unalias gf diff --git a/shells/zsh/includes/auto-notify.zsh b/shells/zsh/includes/auto-notify.zsh new file mode 100644 index 00000000..f5c09ad7 --- /dev/null +++ b/shells/zsh/includes/auto-notify.zsh @@ -0,0 +1,6 @@ +source "$ZSH_FOLDER/plugins/zsh-auto-notify/auto-notify.plugin.zsh" +export AUTO_NOTIFY_THRESHOLD=5 +export AUTO_NOTIFY_TITLE="Hey! %command has just finished" +export AUTO_NOTIFY_BODY="It completed in %elapsed seconds with exit code %exit_code" +AUTO_NOTIFY_IGNORE+=("bat" "zathura" "libreoffice" "lf") +disable_auto_notify diff --git a/shells/zsh/includes/autoSuggest.zsh b/shells/zsh/includes/autoSuggest.zsh new file mode 100644 index 00000000..5fa0e608 --- /dev/null +++ b/shells/zsh/includes/autoSuggest.zsh @@ -0,0 +1,2 @@ +ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=8' +source "$ZSH_FOLDER/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" diff --git a/shells/zsh/includes/colors.zsh b/shells/zsh/includes/colors.zsh new file mode 100755 index 00000000..17999903 --- /dev/null +++ b/shells/zsh/includes/colors.zsh @@ -0,0 +1,373 @@ +# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 +################################################################ +# Color functions +# This file holds some color-functions for +# the powerlevel9k-ZSH-theme +# https://github.com/bhilburn/powerlevel9k +# Modified my jh +################################################################ + +typeset -gAh __JH_COLORS +# https://jonasjacek.github.io/colors/ +# use color names by default to allow dark/light themes to adjust colors based on names +__JH_COLORS=( + black 000 + red 001 + green 002 + yellow 003 + blue 004 + magenta 005 + cyan 006 + white 007 + grey 008 + maroon 009 + lime 010 + olive 011 + navy 012 + fuchsia 013 + purple 013 + aqua 014 + teal 014 + silver 015 + grey0 016 + navyblue 017 + darkblue 018 + blue3 019 + blue3 020 + blue1 021 + darkgreen 022 + deepskyblue4 023 + deepskyblue4 024 + deepskyblue4 025 + dodgerblue3 026 + dodgerblue2 027 + green4 028 + springgreen4 029 + turquoise4 030 + deepskyblue3 031 + deepskyblue3 032 + dodgerblue1 033 + green3 034 + springgreen3 035 + darkcyan 036 + lightseagreen 037 + deepskyblue2 038 + deepskyblue1 039 + green3 040 + springgreen3 041 + springgreen2 042 + cyan3 043 + darkturquoise 044 + turquoise2 045 + green1 046 + springgreen2 047 + springgreen1 048 + mediumspringgreen 049 + cyan2 050 + cyan1 051 + darkred 052 + deeppink4 053 + purple4 054 + purple4 055 + purple3 056 + blueviolet 057 + orange4 058 + grey37 059 + mediumpurple4 060 + slateblue3 061 + slateblue3 062 + royalblue1 063 + chartreuse4 064 + darkseagreen4 065 + paleturquoise4 066 + steelblue 067 + steelblue3 068 + cornflowerblue 069 + chartreuse3 070 + darkseagreen4 071 + cadetblue 072 + cadetblue 073 + skyblue3 074 + steelblue1 075 + chartreuse3 076 + palegreen3 077 + seagreen3 078 + aquamarine3 079 + mediumturquoise 080 + steelblue1 081 + chartreuse2 082 + seagreen2 083 + seagreen1 084 + seagreen1 085 + aquamarine1 086 + darkslategray2 087 + darkred 088 + deeppink4 089 + darkmagenta 090 + darkmagenta 091 + darkviolet 092 + purple 093 + orange4 094 + lightpink4 095 + plum4 096 + mediumpurple3 097 + mediumpurple3 098 + slateblue1 099 + yellow4 100 + wheat4 101 + grey53 102 + lightslategrey 103 + mediumpurple 104 + lightslateblue 105 + yellow4 106 + darkolivegreen3 107 + darkseagreen 108 + lightskyblue3 109 + lightskyblue3 110 + skyblue2 111 + chartreuse2 112 + darkolivegreen3 113 + palegreen3 114 + darkseagreen3 115 + darkslategray3 116 + skyblue1 117 + chartreuse1 118 + lightgreen 119 + lightgreen 120 + palegreen1 121 + aquamarine1 122 + darkslategray1 123 + red3 124 + deeppink4 125 + mediumvioletred 126 + magenta3 127 + darkviolet 128 + purple 129 + darkorange3 130 + indianred 131 + hotpink3 132 + mediumorchid3 133 + mediumorchid 134 + mediumpurple2 135 + darkgoldenrod 136 + lightsalmon3 137 + rosybrown 138 + grey63 139 + mediumpurple2 140 + mediumpurple1 141 + gold3 142 + darkkhaki 143 + navajowhite3 144 + grey69 145 + lightsteelblue3 146 + lightsteelblue 147 + yellow3 148 + darkolivegreen3 149 + darkseagreen3 150 + darkseagreen2 151 + lightcyan3 152 + lightskyblue1 153 + greenyellow 154 + darkolivegreen2 155 + palegreen1 156 + darkseagreen2 157 + darkseagreen1 158 + paleturquoise1 159 + red3 160 + deeppink3 161 + deeppink3 162 + magenta3 163 + magenta3 164 + magenta2 165 + darkorange3 166 + indianred 167 + hotpink3 168 + hotpink2 169 + orchid 170 + mediumorchid1 171 + orange3 172 + lightsalmon3 173 + lightpink3 174 + pink3 175 + plum3 176 + violet 177 + gold3 178 + lightgoldenrod3 179 + tan 180 + mistyrose3 181 + thistle3 182 + plum2 183 + yellow3 184 + khaki3 185 + lightgoldenrod2 186 + lightyellow3 187 + grey84 188 + lightsteelblue1 189 + yellow2 190 + darkolivegreen1 191 + darkolivegreen1 192 + darkseagreen1 193 + honeydew2 194 + lightcyan1 195 + red1 196 + deeppink2 197 + deeppink1 198 + deeppink1 199 + magenta2 200 + magenta1 201 + orangered1 202 + indianred1 203 + indianred1 204 + hotpink 205 + hotpink 206 + mediumorchid1 207 + darkorange 208 + salmon1 209 + lightcoral 210 + palevioletred1 211 + orchid2 212 + orchid1 213 + orange1 214 + sandybrown 215 + lightsalmon1 216 + lightpink1 217 + pink1 218 + plum1 219 + gold1 220 + lightgoldenrod2 221 + lightgoldenrod2 222 + navajowhite1 223 + mistyrose1 224 + thistle1 225 + yellow1 226 + lightgoldenrod1 227 + khaki1 228 + wheat1 229 + cornsilk1 230 + grey100 231 + grey3 232 + grey7 233 + grey11 234 + grey15 235 + grey19 236 + grey23 237 + grey27 238 + grey30 239 + grey35 240 + grey39 241 + grey42 242 + grey46 243 + grey50 244 + grey54 245 + grey58 246 + grey62 247 + grey66 248 + grey70 249 + grey74 250 + grey78 251 + grey82 252 + grey85 253 + grey89 254 + grey93 255 +) + +function termColors() { + + local term_colors + + if which tput &>/dev/null; then + term_colors=$(tput colors) + else + term_colors=$(echotc Co) + fi + if (( ! $? && ${term_colors:-0} < 256 )); then + print -P "%F{red}WARNING!%f Your terminal appears to support fewer than 256 colors!" + print -P "If your terminal supports 256 colors, please export the appropriate environment variable" + print -P "_before_ loading this theme in your \~\/.zshrc. In most terminal emulators, putting" + print -P "%F{blue}export TERM=\"xterm-256color\"%f at the top of your \~\/.zshrc is sufficient." + fi +} + +# get the proper color code if it does not exist as a name. +function getColor() { + # If Color is not numerical, try to get the color code. + if [[ "$1" != <-> ]]; then + 1=$(getColorCode $1) + fi + echo -n "$1" +} + +# empty paramenter resets (stops) background color +function backgroundColor() { + echo -n "%K{$(getColor $1)}" +} + +# empty paramenter resets (stops) foreground color +function foregroundColor() { + echo -n "%F{$(getColor $1)}" +} + +function focusBackgroundColor() { + if [ "$HASFOCUS" = "true" ]; then + backgroundColor "$@" + fi +} +function focusForegroundColor() { + if [ "$HASFOCUS" = "true" ]; then + foregroundColor "$@" + fi +} + +# Get numerical color codes. That way we translate ANSI codes +# into ZSH-Style color codes. +function getColorCode() { + # Early exit: Check if given value is already numerical + if [[ "$1" == <-> ]]; then + # Pad color with zeroes + echo -n "${(l:3::0:)1}" + return + fi + + local colorName="${1}" + # Check if value is none with any case. + if [[ "${(L)colorName}" == "none" ]]; then + echo -n 'none' + elif [[ "${colorName}" == "foreground" ]]; then + # for testing purposes in terminal + # call via `getColorCode foreground` + for i in "${(k@)__JH_COLORS}"; do + print -P "$(foregroundColor $i)$(getColor $i) - $i%f" + done + elif [[ "${colorName}" == "background" ]]; then + # call via `getColorCode background` + for i in "${(k@)__JH_COLORS}"; do + print -P "$(backgroundColor $i)$(getColor $i) - $i%k" + done + else + # Strip eventual "bg-" prefixes + colorName=${colorName#bg-} + # Strip eventual "fg-" prefixes + colorName=${colorName#fg-} + # Strip eventual "br" prefixes ("bright" colors) + colorName=${colorName#br} + echo -n $__JH_COLORS[$colorName] + fi +} + +# Check if two colors are equal, even if one is specified as ANSI code. +function isSameColor() { + if [[ "$1" == "NONE" || "$2" == "NONE" ]]; then + return 1 + fi + + local color1=$(getColorCode "$1") + local color2=$(getColorCode "$2") + + return $(( color1 != color2 )) +} + +function resetColor(){ + backgroundColor none + foregroundColor white + echo -n "%{$reset_color%}" +} diff --git a/shells/zsh/includes/completion.zsh b/shells/zsh/includes/completion.zsh index dffc5715..cca4f716 100644 --- a/shells/zsh/includes/completion.zsh +++ b/shells/zsh/includes/completion.zsh @@ -1,3 +1,18 @@ +# Make completion work +autoload -U compinit +zstyle ':completion:*' menu select +# Auto complete with case insenstivity +zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' +zmodload zsh/complist +compinit +# +# Use vim keys in tab complete menu: (thanks Luke Smith: https://github.com/LukeSmithxyz/voidrice/) +bindkey -M menuselect 'h' vi-backward-char +bindkey -M menuselect 'k' vi-up-line-or-history +bindkey -M menuselect 'l' vi-forward-char +bindkey -M menuselect 'j' vi-down-line-or-history +bindkey -v '^?' backward-delete-char + compdef sshrc=ssh autoload bashcompinit @@ -21,6 +36,7 @@ _wp_complete() { } complete -o nospace -F _wp_complete wp +# Include hidden files in autocomplete: _comp_options+=(globdots) -fpath+="$(dirname $0)/completion" +#source "$ZSH_FOLDER/plugins/fzf-tab/fzf-tab.zsh" diff --git a/shells/zsh/includes/focus.zsh b/shells/zsh/includes/focus.zsh new file mode 100644 index 00000000..1ece4a1e --- /dev/null +++ b/shells/zsh/includes/focus.zsh @@ -0,0 +1,22 @@ +#Gain focus + +gain_focus(){ + export HASFOCUS="true" + set_prompts + zle reset-prompt +} +zle -N gain_focus + +loose_focus(){ + export HASFOCUS="false" + set_prompts + zle reset-prompt +} +zle -N loose_focus + + +# This makes sc (and maybe other terminals?) send escape codes to the shell when focus is gained / lost +printf '\033[?1004h' +bindkey '\033[I' gain_focus # Gain Focus +bindkey '\033[O' loose_focus # Loose Focus +HASFOCUS="true" diff --git a/shells/zsh/includes/fzf.zsh b/shells/zsh/includes/fzf.zsh index 1111a9df..deae6374 100644 --- a/shells/zsh/includes/fzf.zsh +++ b/shells/zsh/includes/fzf.zsh @@ -1,9 +1,10 @@ # this rg command will get a list of files that are not in gitignore or similar export FZF_DEFAULT_COMMAND="fd --type f --hidden --follow --exclude .git --exclude .PlayOnLinux --exclude \"PlayOnLinux\'s virtual drives\"" -export FZF_DEFAULT_OPTS="--preview '[[ \$(file -L --mime {}) =~ binary ]] && echo {} is a binary file || ( bat --style=numbers --color=always {} || cat {}) 2> /dev/null | head -500'" -export FZF_CTRL_R_OPTS="--no-preview" +export FZF_DEFAULT_OPTS="--reverse --height 40%" +export FZF_CTRL_R_OPTS="" # this is the argument completeion optionm, use the same command export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND" +export FZF_CTRL_T_OPTS="$FZF_DEFAULT_OPTS --preview \"bat --style=numbers --color=always {}\"" if [ -e /usr/share/fzf/key-bindings.zsh ]; then source /usr/share/fzf/key-bindings.zsh source /usr/share/fzf/completion.zsh @@ -127,7 +128,7 @@ jhswap(){ # I want my tab complete to be based on "current" word I am typing sometimes, before the command custom_tabcomplete(){ local tokens cmd prefix trigger tail fzf matches lbuf d_cmds - export FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS --reverse --height 40%" + FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS --reverse --height 40%" setopt localoptions noshwordsplit noksh_arrays noposixbuiltins if [ -n "$RBUFFER" ]; then @@ -188,6 +189,4 @@ jhswap(){ zle -N custom_tabcomplete bindkey '^I' custom_tabcomplete - - fi diff --git a/shells/zsh/includes/globals.zsh b/shells/zsh/includes/globals.zsh deleted file mode 100644 index 730d8bc1..00000000 --- a/shells/zsh/includes/globals.zsh +++ /dev/null @@ -1 +0,0 @@ -ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=8' diff --git a/shells/zsh/includes/keybindings.zsh b/shells/zsh/includes/keybindings.zsh new file mode 100644 index 00000000..18073521 --- /dev/null +++ b/shells/zsh/includes/keybindings.zsh @@ -0,0 +1,59 @@ +# create a zkbd compatible hash; +# to add other keys to this hash, see: man 5 terminfo +typeset -g -A key + +key[Home]="${terminfo[khome]}" +key[End]="${terminfo[kend]}" +key[Insert]="${terminfo[kich1]}" +key[Backspace]="${terminfo[kbs]}" +key[Delete]="${terminfo[kdch1]}" +key[Up]="${terminfo[kcuu1]}" +key[Down]="${terminfo[kcud1]}" +key[Left]="${terminfo[kcub1]}" +key[Right]="${terminfo[kcuf1]}" +key[PageUp]="${terminfo[kpp]}" +key[PageDown]="${terminfo[knp]}" +key[ShiftTab]="${terminfo[kcbt]}" + +# setup key accordingly +[[ -n "${key[Home]}" ]] && bindkey -- "${key[Home]}" beginning-of-line +[[ -n "${key[End]}" ]] && bindkey -- "${key[End]}" end-of-line +[[ -n "${key[Insert]}" ]] && bindkey -- "${key[Insert]}" overwrite-mode +[[ -n "${key[Backspace]}" ]] && bindkey -- "${key[Backspace]}" backward-delete-char +[[ -n "${key[Delete]}" ]] && bindkey -- "${key[Delete]}" delete-char +[[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-history +[[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-history +[[ -n "${key[Left]}" ]] && bindkey -- "${key[Left]}" backward-char +[[ -n "${key[Right]}" ]] && bindkey -- "${key[Right]}" forward-char +[[ -n "${key[PageUp]}" ]] && bindkey -- "${key[PageUp]}" beginning-of-buffer-or-history +[[ -n "${key[PageDown]}" ]] && bindkey -- "${key[PageDown]}" end-of-buffer-or-history +[[ -n "${key[ShiftTab]}" ]] && bindkey -- "${key[ShiftTab]}" reverse-menu-complete + +# Finally, make sure the terminal is in application mode, when zle is +# active. Only then are the values from $terminfo valid. +if (( ${+terminfo[smkx]} && ${+terminfo[rmkx]} )); then + autoload -Uz add-zle-hook-widget + function zle_application_mode_start { echoti smkx } + function zle_application_mode_stop { echoti rmkx } + add-zle-hook-widget -Uz zle-line-init zle_application_mode_start + add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop +fi + +autoload -Uz up-line-or-beginning-search down-line-or-beginning-search +zle -N up-line-or-beginning-search +zle -N down-line-or-beginning-search + +[[ -n "${key[Up]}" ]] && bindkey -- "${key[Up]}" up-line-or-beginning-search +[[ -n "${key[Down]}" ]] && bindkey -- "${key[Down]}" down-line-or-beginning-search + + +# By default, Ctrl+d will not close your shell if the command line is filled, this fixes it: +exit_zsh() { exit } +zle -N exit_zsh +bindkey '^D' exit_zsh + +autoload -U edit-command-line +zle -N edit-command-line +bindkey '\C-x\C-e' edit-command-line + +bindkey -M viins jj vi-cmd-mode diff --git a/shells/zsh/includes/promptconfig.zsh b/shells/zsh/includes/promptconfig.zsh index e84c2f1e..2b06ce71 100644 --- a/shells/zsh/includes/promptconfig.zsh +++ b/shells/zsh/includes/promptconfig.zsh @@ -1,7 +1,11 @@ # This is the config I use for Powerlevel9k + +#source "$HOME/.dotfiles/shells/zsh/plugins/powerlevel9k/powerlevel9k.zsh-theme" + + # Custom dir command -function my_dir(){ +prompt_dir(){ homeIcon="" wpPluginsIcon=".p." wpThemesIcon=".t." @@ -72,38 +76,21 @@ function my_dir(){ current_path=$(echo $current_path | sed -r -e "s/$seperator\$//g") echo $current_path - -} -POWERLEVEL9K_CUSTOM_DIR="my_dir" -if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then - POWERLEVEL9K_CUSTOM_DIR_BACKGROUND="green" - POWERLEVEL9K_CUSTOM_DIR_FOREGROUND="black" -else - POWERLEVEL9K_CUSTOM_DIR_BACKGROUND="blue" - POWERLEVEL9K_CUSTOM_DIR_FOREGROUND="black" -fi - -# POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR="\ue0c0" -# POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR="\ue0c2" - -function Capslock(){ - x=$(xset -q | grep Caps) 2> /dev/null || exit 0 - x=${x:22:1} - if [[ $x == "n" ]]; then - - echo "" + if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then + echo "green" + else + echo "blue" fi -} -POWERLEVEL9K_CUSTOM_CAPS="Capslock" -POWERLEVEL9K_CUSTOM_CAPS_BACKGROUND="red" -POWERLEVEL9K_CUSTOM_CAPS_FOREGROUND="white" + echo "black" +} function prompt_project() { - local segment_content state icon + # Prints the current project and a recording symbol if appropriate local parent_process="$(ps -ocommand -p $PPID | grep -v 'COMMAND' | cut -d' ' -f1)" local current_project_full="$(project current --path)" local current_project_name="$(project current)" + local background="" if [[ "$parent_process" == "/usr/bin/script" ]]; then segment_content="辶" fi @@ -112,29 +99,134 @@ function prompt_project() { segment_content="${segment_content}$current_project_name" # If in the current project if echo "$PWD" | grep -q "$current_project_full"; then - state="INSIDE" + background="green" elif echo "$PWD" | grep -q "$HOME/Projects/"; then - state="WRONG" + background="red" else - state="OUTSIDE" + background="yellow" fi fi - if [ -n "$segment_content" ]; then - "$1_prompt_segment" "${0}_${state}" "$2" $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$segment_content" "$icon" + echo "$state$segment_content" + echo "$background" + echo "black" +} + +prompt_git(){ + local branch="$(git branch --show-current 2> /dev/null)" + local color="green" + local ret="" + if [ -n "branch" ]; then + ret="$branch" + local repoTopLevel="$(command git rev-parse --show-toplevel 2> /dev/null)" + local untrackedFiles=$(command git ls-files --others --exclude-standard "${repoTopLevel}" 2> /dev/null) + local staged=$(command git diff --staged --name-only 2> /dev/null) + + if [ -n "$untrackedFiles" ]; then + ret="$ret " + color="orange1" + fi + if [ -n "$staged" ]; then + ret="$ret " + color="orange1" + fi + fi + echo "$ret" + echo "$color" } +prompt_last_exit_code() { + local LAST_EXIT_CODE="$1" + if [[ $LAST_EXIT_CODE -ne 0 ]]; then + local EXIT_CODE_PROMPT=' ' + EXIT_CODE_PROMPT+="%{$fg[red]%}-%{$reset_color%}" + EXIT_CODE_PROMPT+="%{$fg_bold[red]%}$LAST_EXIT_CODE%{$reset_color%}" + EXIT_CODE_PROMPT+="%{$fg[red]%}-%{$reset_color%}" + echo "$EXIT_CODE_PROMPT" + fi +} -POWERLEVEL9K_PROJECT_DEFAULT_FOREGROUND="black" -POWERLEVEL9K_PROJECT_WRONG_BACKGROUND="red" -POWERLEVEL9K_PROJECT_OUTSIDE_BACKGROUND="yellow" -POWERLEVEL9K_PROJECT_INSIDE_BACKGROUND="green" +# Draws a seperator +# Takes 2 arguments, from color then to color +# If only 1 given, assumes it is the last +seperator(){ + local from="$1" + local to="$2" + local sep="" + if [ -z "$to" ]; then + resetColor + else + focusBackgroundColor "$to" + fi + focusForegroundColor "$from" + echo -n "$sep" + resetColor +} -# Left Prompt -if [[ "$(basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //'))" != "$(echo $USER)" ]]; then - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(project custom_dir vcs custom_caps) -fi +draw_segment(){ + # Echoes a segment + # $1 is the command to be run to print the segment + # $2 is the color of the last segment (if empty, no seperator is added) + # Returns segment on line 1 + # returns background color on line 2 + local output="$($1)" + local contents="$(echo "$output" | sed -n '1p')" + local previousBackground="$2" + local background="" + local foreground="" + local ret="" + if [ -n "$contents" ]; then + background="$(echo "$output" | sed -n '2p')" + foreground="$(echo "$output" | sed -n '3p')" + if [ -n "$previousBackground" ]; then + ret=" $(seperator $previousBackground $background)" + fi + ret="$ret$(focusBackgroundColor $background) $(focusForegroundColor $foreground)$contents" + echo "$ret" + echo "$background" + fi +} +set_prompts(){ + # Get the return status of the previous command + local RETVAL=$? + + #Set background to nothing at the start of the prompt + local background="" + local foreground="" + + #Set the prompt to an empty string + PROMPT="" + + ###### Each segment printed here + + # Project + segment="$(draw_segment "prompt_project" "$background")" + if [ -n "$(echo "$segment" | sed -n '1p')" ];then + PROMPT="$PROMPT$(echo "$segment" | sed -n '1p')" + background="$(echo "$segment" | sed -n '2p')" + fi + + # Directory + segment="$(draw_segment "prompt_dir" "$background")" + if [ -n "$(echo "$segment" | sed -n '1p')" ];then + PROMPT="$PROMPT$(echo "$segment" | sed -n '1p')" + background="$(echo "$segment" | sed -n '2p')" + fi + + # Git + segment="$(draw_segment "prompt_git" "$background")" + if [ -n "$(echo "$segment" | sed -n '1p')" ];then + PROMPT="$PROMPT$(echo "$segment" | sed -n '1p')" + background="$(echo "$segment" | sed -n '2p')" + fi + + PROMPT="$PROMPT $(seperator "$background")$(resetColor)" + +#$(resetColor) + RPROMPT="$(resetColor)$(prompt_last_exit_code "$RETVAL")$(resetColor)" +} +zle -N set_prompts +autoload -U add-zsh-hook +add-zsh-hook precmd set_prompts -# Right Prompt -POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator) diff --git a/shells/zsh/includes/rangercd.zsh b/shells/zsh/includes/rangercd.zsh.tmp similarity index 100% rename from shells/zsh/includes/rangercd.zsh rename to shells/zsh/includes/rangercd.zsh.tmp diff --git a/shells/zsh/includes/shortcuts.zsh b/shells/zsh/includes/shortcuts.zsh.tmp similarity index 100% rename from shells/zsh/includes/shortcuts.zsh rename to shells/zsh/includes/shortcuts.zsh.tmp