From 1eae8271609db1f26d8a7ae9eda7c9dd6fef4a15 Mon Sep 17 00:00:00 2001 From: PowerUser64 Date: Wed, 6 Apr 2022 13:08:42 -0700 Subject: [PATCH] BIG UPDATE: zsh: moved lots of things out of the zshrc --- .config/shell/bin/calc | 6 +++ .config/shell/env | 40 ++++++++++++----- .config/shell/functions/mkcd | 13 ++++++ .zshrc | 83 ++++++++++++++---------------------- 4 files changed, 81 insertions(+), 61 deletions(-) create mode 100755 .config/shell/bin/calc create mode 100644 .config/shell/functions/mkcd diff --git a/.config/shell/bin/calc b/.config/shell/bin/calc new file mode 100755 index 0000000..6306c4a --- /dev/null +++ b/.config/shell/bin/calc @@ -0,0 +1,6 @@ +#!/bin/zsh +# Note: this is compatible with `sh`, but because +# `sh` does not handle floats, I'm choosing `zsh`. + +# Believe it or not, zsh makes for a fine calculator +echo $(($*)) diff --git a/.config/shell/env b/.config/shell/env index 598f80a..de2877e 100644 --- a/.config/shell/env +++ b/.config/shell/env @@ -1,7 +1,13 @@ +#!/bin/sh # Blake's environment variables # This file should be compatible with standard sh # shellcheck disable=SC2034 +export SHELL_CONFIG_DIR="${SHELL_CONFIG_DIR:-"${XDG_CONFIG_HOME:-$HOME/.config}/shell"}" +if ! [ -d "$SHELL_CONFIG_DIR" ]; then + echo "FATAL ERROR: \$SHELL_CONFIG_DIR is not set to a real directory: $SHELL_CONFIG_DIR" +fi + # Intelligently set $EDITOR if command -v nvim > /dev/null;then export EDITOR=nvim @@ -10,46 +16,60 @@ elif command -v vim > /dev/null;then elif command -v vi > /dev/null;then export EDITOR=vi fi - -export SHELL_CONFIG_DIR="${SHELL_CONFIG_DIR:-"${XDG_CONFIG_HOME:-$HOME/.config}/shell"}" -export PATH="$PATH:${XDG_DATA_HOME:-$HOME/.local}/bin:$SHELL_CONFIG_DIR/bin" export SYSTEMD_EDITOR="$EDITOR" + +export PATH="$PATH:${XDG_DATA_HOME:-$HOME/.local}/bin:$SHELL_CONFIG_DIR/bin" + + export LSCOLORS="Gxfxcxdxbxegedabagacad" + export ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/zsh" # Don't add extra space to the right side of the prompt export ZLE_RPROMPT_INDENT=0 export ZINIT_HOME_DIR="${XDG_DATA_HOME:-$HOME/.local}/share/zinit" + # Set documents directory (auto set to the repo the file ~/todo points to is in) # shellcheck disable=SC2155 -[ -h ~/todo ] && export DOCS_DIR="$(git -C "$(dirname "$(realpath ~/todo)" 2>&1)" rev-parse --show-toplevel | head -1)" +[ -h ~/todo ] && export DOCS_DIR="$(git -C "$(dirname "$(realpath ~/todo)" 2>&1)" rev-parse --show-toplevel | head -1)" || DOCS_DIR="$HOME/Documents/docs/" +## Working directory save settings (see things at bottom of zshrc) WORKING_DIR_SAVE_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/zsh/last-working-dir" # make the dir for the file if needed -! test -d "$(dirname "$WORKING_DIR_SAVE_FILE")" && mkdir -p "$(dirname "$WORKING_DIR_SAVE_FILE")" +test -d "$(dirname "$WORKING_DIR_SAVE_FILE")" || mkdir -p "$(dirname "$WORKING_DIR_SAVE_FILE")" -# Plugin setting >>> +# ZSH plugin settings >>> # ZSH Vi Mode export ZVM_VI_HIGHLIGHT_FOREGROUND=#BBC2CF export ZVM_VI_HIGHLIGHT_BACKGROUND=#515860 # ZVM_VI_HIGHLIGHT_EXTRASTYLE=bold,underline # bold and underline +# vim-mode cursor +# syntax: "[color] [blinking] [style]" see: https://github.com/softmoth/zsh-vim-mode#mode-in-prompt +export MODE_CURSOR_VIINS="blinking bar" +export MODE_CURSOR_REPLACE="steady bar" +export MODE_CURSOR_VICMD="steady block" +export MODE_CURSOR_SEARCH="blinking underline" +export MODE_CURSOR_VISUAL="steady block" +export MODE_CURSOR_VLINE="steady block" + # OMZ Completion export COMPLETION_WAITING_DOTS=true # Powerlevel 10k export POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD="${POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD:-true}" -export POWERLEVEL9K_INSTANT_PROMPT=quiet +export POWERLEVEL9K_INSTANT_PROMPT="${POWERLEVEL9K_INSTANT_PROMPT:-quiet}" +# TODO?: maybe add a bit of code to select a random theme if none is detected (make sure to disable instant prompt if this happens) export P10K_CONFIG_LOCATION="$SHELL_CONFIG_DIR/p10k/current" # <<< ########################################### ### Directory and file quick access ### ########################################### -SCD="$SHELL_CONFIG_DIR" -DD="/home/blake/Documents/docs/" +S="$SHELL_CONFIG_DIR" +DD="$DOCS_DIR" -# vim:fdm=marker:fmr=>>>,<<<:et:ft=sh:sw=3 +# vim:fdm=marker:fmr=>>>,<<<:et:ft=sh:sw=3:ts=3 diff --git a/.config/shell/functions/mkcd b/.config/shell/functions/mkcd new file mode 100644 index 0000000..00a2e7c --- /dev/null +++ b/.config/shell/functions/mkcd @@ -0,0 +1,13 @@ +#!/bin/sh + +# make a directory and cd into it +mkcd() { + mkdir -p "$1" || error "$0" $LINENO + cd "$1" || error "$0" $LINENO +} + +error() { + ERROR_CODE="$?" + >&2 echo "($1) An error occurred on line number $2" + return $ERROR_CODE +} diff --git a/.zshrc b/.zshrc index d9be272..62cc1c0 100644 --- a/.zshrc +++ b/.zshrc @@ -4,17 +4,20 @@ # shellcheck disable=SC1090,SC2296,SC1091,SC2154,SC2015 # Helper function to source files. -# Usage: careful_source "file" \ -# "Error message" \ -# $LINENO \ -# [optional: test to run (-f, -x, -e)] \ -# ["optional: operation (source, exec, command or nothing)"] \ +# Usage: +# careful_source "file" \ +# [optional: "Error message"] \ +# [optional: $LINENO] (use this if you have an error message) \ +# [optional: test to run] (-f, -x, -e) \ +# [optional: operation (source, exec, command or nothing)] \ careful_source() { if test "${4:--f}" "$1"; then ${5:-source} "$1" else - echo "$2" >&2 - echo "Line number: $3" >&2 + if test -n "${2+foo}"; then + echo -e "$2" >&2 + echo "Line number: $3" >&2 + fi fi } @@ -29,7 +32,7 @@ error() { echo -ne '\e[5 q' ### <<< -### Basic shell configuration >>> +### Generic shell configuration >>> ### Environment variables >>> # This has to go here because otherwise we don't know where the config files are :| @@ -39,12 +42,16 @@ export SHELL_CONFIG_DIR="${SHELL_CONFIG_DIR:-"${XDG_CONFIG_HOME:-$HOME/.config}/ ${SKIP_ENV:-false} || careful_source "$SHELL_CONFIG_DIR/env" \ "Error: could not locate env file. Things could be messed up. Check that \$SHELL_CONFIG_DIR/env exists." $LINENO +${SKIP_LOCAL_ENV:-false} || careful_source "$SHELL_CONFIG_DIR/local/env" \ + # <<< ### Aliases >>> # Source the alias file ${SKIP_ALIASES:-false} || careful_source "$SHELL_CONFIG_DIR/aliases" \ "Error: could not locate alias file. You may not have any aliases. Check that \$SHELL_CONFIG_DIR points to the right place." $LINENO +${SKIP_LOCAL_ALIASES:-false} || careful_source "$SHELL_CONFIG_DIR/local/aliases" + # <<< ### Functions >>> # Organization: functions that are really short should be put here, otherwise @@ -61,37 +68,17 @@ fnupdate() { source "$FN" done } -fnupdate - -# shellcheck disable=SC2016 -mkcd() { - mkdir -p "$1" || error $LINENO - cd "$1" || error $LINENO -} - -# believe it or not, zsh makes for a fine calculator -calc() { - echo $(($*)) -} +${SKIP_FUNCTIONS:-false} || fnupdate # <<< # <<< ### Apply breaking changes with the update script >>> -${SKIP_UPDATE:-false} || careful_source "$SHELL_CONFIG_DIR/updates" \ +${SKIP_UPDATES:-false} || careful_source "$SHELL_CONFIG_DIR/updates" \ "Error: failed to run update script" $LINENO -x "command" ### <<< + ### Plugins >>> -{ - # plugin config >>> - # vim-mode cursor - # syntax: "[color] [blinking] [style]" see: https://github.com/softmoth/zsh-vim-mode#mode-in-prompt - export MODE_CURSOR_VIINS="blinking bar" - export MODE_CURSOR_REPLACE="steady bar" - export MODE_CURSOR_VICMD="steady block" - export MODE_CURSOR_SEARCH="blinking underline" - export MODE_CURSOR_VISUAL="steady block" - export MODE_CURSOR_VLINE="steady block" - # <<< +${SKIP_PLUGINS:-false} || { # Load zinit >>> { # Install zinit if not installed @@ -143,37 +130,32 @@ ${SKIP_UPDATE:-false} || careful_source "$SHELL_CONFIG_DIR/updates" \ ## Theme # terminal colors - if [[ -f "$SHELL_CONFIG_DIR/colors.sh" ]];then - # custom colors - source "$SHELL_CONFIG_DIR/colors.sh" - else - # onedark shell colors + careful_source "$SHELL_CONFIG_DIR/colors.sh" || zinit snippet 'https://github.com/chriskempson/base16-shell/blob/master/scripts/base16-onedark.sh' - fi + # LS Colors zinit ice atclone"dircolors -b ./src/dir_colors > colors.zsh" \ atpull'%atclone' pick"colors.zsh" nocompile'!' \ atload'zstyle ":completion:*" list-colors “${(s.:.)LS_COLORS}”' zinit light arcticicestudio/nord-dircolors + # prompt zinit load "romkatv/powerlevel10k" - if [[ -e "$P10K_CONFIG_LOCATION" ]]; then - source "$P10K_CONFIG_LOCATION" - else - >&2 echo "No p10k theme selected. Please use \`p10k configure\` to make one or select an existing one like this:" - >&2 echo " ln -s $SHELL_CONFIG_DIR/p10k/colorful-angular.p10k.zsh $SHELL_CONFIG_DIR/p10k/current" - fi + careful_source "$P10K_CONFIG_LOCATION" \ + "No p10k theme selected. Please use \`p10k configure\` to make one or select an existing one like this: + ln -s $SHELL_CONFIG_DIR/p10k/colorful-angular.p10k.zsh $SHELL_CONFIG_DIR/p10k/current" $LINENO + # clear plugin options set at the start of this block unalias zinit - # just gonna sneak this in here, too + # just gonna sneak this in here too alias zi > /dev/null && unalias zi zpl zini zplg which-command run-help fsh-alias } # <<< } # <<< -### General ZSH configuration >>> +### ZSH-specific configuration >>> # This section is (mostly) From manjaro's "manjaro-zsh-config" (/usr/share/zsh/manjaro-zsh-config) [ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history" @@ -183,7 +165,7 @@ ${SKIP_UPDATE:-false} || careful_source "$SHELL_CONFIG_DIR/updates" \ # setopt correct # Auto correct mistakes setopt extendedglob # Extended globbing. Allows using regular expressions with * [ -z "$TERMUX_VERSION" ] && - setopt nocaseglob # Case insensitive globbing (and fix for termux) + setopt nocaseglob # Case insensitive globbing (and fix for termux) setopt rcexpandparam # Array expension with parameters setopt checkjobs # Warn about running processes when exiting setopt numericglobsort # Sort filenames numerically when it makes sense @@ -225,7 +207,7 @@ ${SKIP_UPDATE:-false} || careful_source "$SHELL_CONFIG_DIR/updates" \ WORDCHARS=${WORDCHARS//\/[&.;]} # Don't consider certain characters part of the word } # <<< -## Keybindings >>> +## Keybinds >>> bindkey -v # Enable Vi mode bindkey '^[[7~' beginning-of-line # Home key bindkey '^[[H' beginning-of-line # Home key @@ -315,7 +297,6 @@ load_working_dir && cd - > /dev/null || echo -n # <<< # Optionally source another zshrc -[ -f "$SHELL_CONFIG_DIR/zshrc.local" ] && source "$SHELL_CONFIG_DIR/zshrc.local" || true - -# vim:fdm=marker:fmr=>>>,<<<:et:ft=bash:sw=3 +${SKIP_LOCAL_ZSHRC:-false} || careful_source "$SHELL_CONFIG_DIR/local/zshrc" +# vim:fdm=marker:fmr=>>>,<<<:et:ft=bash:sw=3:ts=3