diff --git a/.bash_login b/.bash_login new file mode 100644 index 0000000..168e140 --- /dev/null +++ b/.bash_login @@ -0,0 +1,8 @@ +# Executed by bash when a login shell starts + +# Mimic bash's default behavior explicitly +if [ -f "$HOME/.profile" ]; then + source "$HOME/.profile" +else + source "$HOME/.bashrc" +fi diff --git a/.bash_logout b/.bash_logout index 4a71b10..e7aef5a 100644 --- a/.bash_logout +++ b/.bash_logout @@ -1,3 +1,3 @@ -#!/bin/bash +# Executed by bash when a login shell exits -. "$XDG_CONFIG_HOME/shell/logout" +source "$HOME/.config/shell/logout.sh" diff --git a/.bash_profile b/.bash_profile new file mode 100644 index 0000000..106a7a9 --- /dev/null +++ b/.bash_profile @@ -0,0 +1,10 @@ +# Executed by bash when a login shell starts + +# Mimic bash's default behavior explicitly +if [ -f "$HOME/.bash_login" ]; then + source "$HOME/.bash_login" +elif [ -f "$HOME/.profile" ]; then + source "$HOME/.profile" +else + source "$HOME/.bashrc" +fi diff --git a/.bashrc b/.bashrc index e67c28a..c9687e4 100644 --- a/.bashrc +++ b/.bashrc @@ -1,80 +1,86 @@ -#!/bin/bash - -# `bash`-specific configurations +# Executed by bash when a (non-)login shell starts -# Load configuration files common to all kinds of shells, -# if not already done by a `bash` login shell -[ -z "$PROFILE_LOADED" ] && [ -f "$HOME/.profile" ] && . "$HOME/.profile" +# Ensure bash is running interactively +[[ $- != *i* ]] && return -# Ensure `bash` is running interactively -case $- in - *i*) ;; - *) return;; -esac +# Check if a command can be found on the $PATH +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} -# Configure the `history` -# Set these environment variables here -# to avoid conflict/overlap with `zsh` +# Enable XON/XOFF software flow control +stty -ixon +# Report status of background jobs immediately +set -o notify +# Show number of running jobs when exiting a shell +shopt -s checkjobs + +# Just type the directory to cd into it +shopt -s autocd +# Correct minor spelling mistakes with cd +shopt -s cdspell + +# Include hidden files in * glob expansion +shopt -s dotglob +shopt -s extglob +# Expand ** into (recursive) directories +shopt -s globstar +# Ignore case when * expanding +shopt -s nocaseglob + +# Update $ROWS and $COLUMNS after each command +shopt -s checkwinsize + + + +# Set these environment variables here (and not in ~/.profile) +# due to conflict/overlap with zsh export HISTFILE="$XDG_STATE_HOME/bash/history" +export HISTSIZE=999999 # number of lines kept in memory +export HISTFILESIZE=999999 # number of lines kept in $HISTFILE -export HISTSIZE=999999 # Number of lines kept in memory -export HISTFILESIZE=999999 # Number of lines kept in the `$HISTFILE` - -# Ignore commands prefixed with a space +# Ignore commands prefixed with a space, # and ones entered identically just before +# (this mimics zsh's default behavior) export HISTCONTROL=ignoreboth -shopt -s cmdhist # Remember multi-line commands as just one line -shopt -s histappend # Do not overwrite the `$HISTFILE` -shopt -s histreedit # Allow editing failed history substitutions -shopt -s lithist # Store multi-line commands in history without `;` +# Remember multi-line commands in history as one command +shopt -s cmdhist +# Do not overwrite .bash_history file +shopt -s histappend +# Allow re-editing a failed history substitution +shopt -s histreedit +# Store multi-line commands in history without semicolons +shopt -s lithist -# Make `bash` feel a bit more like `zsh` -shopt -s autocd # Just type the directory to `cd` into it -shopt -s cdspell # Correct minor spelling mistakes with `cd` -shopt -s checkjobs # Show number of running jobs when exiting `bash` -shopt -s checkwinsize # Update `$ROWS` and `$COLUMNS` after commands -shopt -s globstar # Expand ** into recursive directories +# Initialize various utilities and aliases +source "$HOME/.config/shell/init.sh" -stty -ixon # Prevent Ctrl+S from freezing `bash` - - -# Make `bash` show `chroot`s -if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then - debian_chroot=$(cat /etc/debian_chroot) -fi - - -# Make `bash` more colorful - -case "$TERM" in - xterm-color|*-256color) color_prompt=yes;; -esac - -if [ -x /usr/bin/dircolors ]; then - test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" - alias ls='ls --color=auto' -fi - - -# Enable tab completion +# Enable programmable completion features if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then - . /usr/share/bash-completion/bash_completion + source /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then - . /etc/bash_completion + source /etc/bash_completion fi fi +# Enable completions for various tools +_command_exists invoke && eval "$(invoke --print-completion-script=bash)" +_command_exists nox && eval "$(register-python-argcomplete nox)" +_command_exists pip && eval "$(pip completion --bash)" +_command_exists pipx && eval "$(register-python-argcomplete pipx)" +_command_exists poetry && eval "$(poetry completions bash)" + # Add tab completion for all aliases to commands with completion functions # (must come after bash completions have been set up) # Source: https://superuser.com/a/437508 @@ -134,5 +140,86 @@ _alias_completion() { new_completion="${new_completion% *} $alias_name" echo "$new_completion" >> "$tmp_file" done < <(alias -p | sed -Ene "s/$alias_regex/\1 '\2' '\3'/p") - . "$tmp_file" && \rm -f "$tmp_file" + source "$tmp_file" && \rm -f "$tmp_file" }; _alias_completion + + + +# Mimic zsh's PowerLevel10k + +if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then + _debian_chroot=$(cat /etc/debian_chroot) +fi + +_prompt_git() { # Show a git repo's state + local out ref uncommited unstaged untracked ahead behind + # Check if the pwd contains a git repository and exit early if it does not + ref=$(git rev-parse --abbrev-ref --symbolic-full-name HEAD 2> /dev/null) + [ "$ref" == "" ] && return + # Check if the current HEAD is detached or reachable by a ref + printf "\033[0;37m " + if [ "$ref" == "HEAD" ]; then + ref=$(git rev-parse --short HEAD) + printf "@" + fi + printf "\033[0;32m$ref\033[0m" + # Indicate if local is ahead and/or behind upstream + ahead=0 + behind=0 + git status 2>/dev/null | ( + while read -r line ; do + case "$line" in + *'diverged'*) # For simplicity, a diverged local branch is + ahead=1 ; behind=1 ; break ; ;; # indicated as being + *'ahead'*) # both ahead and behind its upstream + ahead=1 ; ;; + *'behind'*) + behind=1 ; ;; + esac + done + + if [ $ahead -gt 0 ] && [ $behind -gt 0 ]; then + printf "\033[0;32m <>\033[0m" + elif [ $ahead -gt 0 ]; then + printf "\033[0;32m >\033[0m" + elif [ $behind -gt 0 ]; then + printf "\033[0;32m <\033[0m" + fi + ) + # Indicate stashed files with a * + [ "$(git stash list 2> /dev/null)" != "" ] && printf "\033[0;32m *\033[0m" + # Indicate uncommited/staged with a + + git diff-index --cached --exit-code --quiet HEAD -- 2> /dev/null + [ $? -gt 0 ] && printf "\033[0;33m +\033[0m" + # Indicate unstaged with a ! + git diff-files --exit-code --quiet 2> /dev/null + [ $? -gt 0 ] && printf "\033[0;33m !\033[0m" + # Indicate untracked files with a ? + if [ "$(git ls-files --exclude-standard --others 2> /dev/null)" != "" ]; then + printf "\033[0;34m ?\033[0m" + fi +} + +_prompt_jobs() { # Indicate running background jobs with a"%" + local running + (( $(jobs -rp | wc -l) )) && printf "\033[0;32m %\033[0m" +} + +_prompt_pyenv() { # Mimic zsh's pyenv/venv integration + if [ -n "$VIRTUAL_ENV" ]; then + echo -e "\033[0;36m py $(python -c "import os, sys; (hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix)) and print(os.path.basename(sys.prefix))")\033[0m" + elif [ -n "$PYENV_VERSION" ]; then + if [ "$PYENV_VERSION" != "system" ]; then + echo -e "\033[0;36m py $PYENV_VERSION\033[0m" + fi + elif [ -f "$(pwd)/.python-version" ]; then + echo -e "\033[0;36m py $(cat .python-version | sed ':a;N;$!ba;s/\n/:/g')\033[0m" + fi +} + +# Disable the default prompts set by pyenv and venv +export PYENV_VIRTUALENV_DISABLE_PROMPT=1 +export VIRTUAL_ENV_DISABLE_PROMPT=1 + +PS1='${chroot:+($_debian_chroot)}\w$(_prompt_git)$(_prompt_jobs)$(_prompt_pyenv) > ' +PS2='... ' diff --git a/.config/Nextcloud/nextcloud.cfg b/.config/Nextcloud/nextcloud.cfg new file mode 100644 index 0000000..51df95c --- /dev/null +++ b/.config/Nextcloud/nextcloud.cfg @@ -0,0 +1,46 @@ +[General] +confirmExternalStorage=true +crashReporter=false +desktopEnterpriseChannel=daily +isVfsEnabled=false +launchOnSystemStartup=true +monoIcons=true +moveToTrash=false +newBigFolderSizeLimit=10000 +notifyExistingFoldersOverLimit=false +optionalServerNotifications=false +overrideLocalDir= +overrideServerUrl= +promptDeleteAllFiles=false +showCallNotifications=false +stopSyncingExistingFoldersOverLimit=false +useNewBigFolderSizeLimit=false + +[Accounts] +0\Folders\1\ignoreHiddenFiles=false +0\Folders\1\localPath=/home/alexander/Cloud/ +0\Folders\1\paused=false +0\Folders\1\targetPath=/ +0\Folders\1\version=2 +0\Folders\1\virtualFilesMode=off +0\authType=webflow +0\dav_user=alexander +0\networkDownloadLimit=0 +0\networkDownloadLimitSetting=-2 +0\networkProxyHostName= +0\networkProxyNeedsAuth=false +0\networkProxyPort=0 +0\networkProxySetting=0 +0\networkProxyType=0 +0\networkProxyUser= +0\networkUploadLimit=0 +0\networkUploadLimitSetting=-2 +0\url=https://getraenkemarkt.cloud +0\user=@Invalid() +0\webflow_user=alexander + +[Nextcloud] +autoUpdateCheck=false + +[Proxy] +type=2 diff --git a/.config/Nextcloud/sync-exclude.lst b/.config/Nextcloud/sync-exclude.lst new file mode 100644 index 0000000..4490d05 --- /dev/null +++ b/.config/Nextcloud/sync-exclude.lst @@ -0,0 +1,52 @@ +# This file contains fixed global exclude patterns + +*~ +~$* +.~lock.* +~*.tmp +]*.~* +]Icon\r* +].DS_Store +].ds_store +*.textClipping +._* +]Thumbs.db +]photothumb.db +System Volume Information + +.*.sw? +.*.*sw? + +].TemporaryItems +].Trashes +].DocumentRevisions-V100 +].Trash-* +.fseventd +.apdisk +.Spotlight-V100 + +.directory + +*.part +*.filepart +*.crdownload + +*.kate-swp +*.gnucash.tmp-* + +.synkron.* +.sync.ffs_db +.symform +.symform-store +.fuse_hidden* +*.unison +.nfs* + +My Saved Places. + +\#*# + +*.sb-* + +# LibreOffice's lock files +.lock diff --git a/.config/alacritty/alacritty.toml b/.config/alacritty/alacritty.toml new file mode 100644 index 0000000..8445fe8 --- /dev/null +++ b/.config/alacritty/alacritty.toml @@ -0,0 +1,56 @@ +[colors] +draw_bold_text_with_bright_colors = true + +[cursor] +blink_interval = 500 +thickness = 0.1 +unfocused_hollow = true + +[cursor.style] +blinking = "On" +shape = "Block" + +[font] +size = 12.0 + +[font.bold] +family = "FiraCode Nerd Font" +style = "Bold" + +[font.bold_italic] +family = "FiraCode Nerd Font" +style = "Semibold" + +[font.italic] +family = "FiraCode Nerd Font" +style = "Light" + +[font.normal] +family = "FiraCode Nerd Font" +style = "Regular" + +[font.offset] +x = 0 +y = 0 + +[[keyboard.bindings]] +action = "SpawnNewInstance" +key = "Return" +mods = "Control|Shift" + +[scrolling] +history = 9999 +multiplier = 10 + +[terminal.shell] +args = ["-l"] +program = "/usr/bin/zsh" + +[window] +decorations = "none" +dynamic_padding = true +opacity = 0.95 + +[window.padding] +x = 10 +y = 10 diff --git a/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop b/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop new file mode 100644 index 0000000..219765f --- /dev/null +++ b/.config/autostart/com.nextcloud.desktopclient.nextcloud.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=Nextcloud +GenericName=File Synchronizer +Exec="/usr/bin/nextcloud" --background +Terminal=false +Icon=Nextcloud +Categories=Network +Type=Application +StartupNotify=false +X-GNOME-Autostart-enabled=true +X-GNOME-Autostart-Delay=10 diff --git a/.config/bpython/config b/.config/bpython/config new file mode 100644 index 0000000..e554a04 --- /dev/null +++ b/.config/bpython/config @@ -0,0 +1,7 @@ +[general] + +# Make `bpython` and `python` share their history +hist_file = ~/.python_history + +# No limit +hist_length = 0 diff --git a/.config/flameshot/flameshot.ini b/.config/flameshot/flameshot.ini new file mode 100644 index 0000000..7674f36 --- /dev/null +++ b/.config/flameshot/flameshot.ini @@ -0,0 +1,11 @@ +[General] +contrastOpacity=188 +disabledTrayIcon=true +drawColor=#ff0000 +drawThickness=3 +filenamePattern=%F_%H-%M-%S +saveAsFileExtension=png +savePath=/home/alexander/data/uploads/screenshots +showHelp=false +startupLaunch=false +uiColor=#ff3a00 diff --git a/.config/git/commit_msg_template.txt b/.config/git/commit_msg_template.txt index 5b07947..95a7c66 100644 --- a/.config/git/commit_msg_template.txt +++ b/.config/git/commit_msg_template.txt @@ -1,18 +1,38 @@ -# SUBJECT -> What does the commit do? -# - Imperative mood, no "." at the end -# - Start with "Add", "Fix", "Make", "Remove", ... +#=================================================| +# SUBJECT ========================================| +#=================================================| +# - what does the commit do +# - capitalize the first word +# - use imperative mood (e.g., "Add" over "Adds") +# - do not end the line with a period +# - start with "Fix" for any fixes #---------- 50 characters / 1 line ---------------| - -# BODY -> The why and how -# - Use plain text without formatting -# + Use "-" and "+" as bullets -# - "See: URL" to link to external resources -#---------- 72 characters / multiple lines -----------------------------| +#-------------------------------------------------| -# ISSUE TRACKER -> Uncomment one of the lines below -# Closes #41 -# Fixes #42 -# Resolves #43 +#=======================================================================| +# BODY (optional) ======================================================| +#=======================================================================| +# - explain what the commit does, why it does it, and how +# - do not format the text (e.g., Markdown) +# - use multiple lines starting with "-" as bullet points +# + first sub-level +# * second sub-level +# - link to external resources for more context +#---------- 72 characters / multiple lines (and paragraphs) ------------| + + + + +#=======================================================================| +# ISSUE TRACKER (optional) =============================================| +#=======================================================================| +# - uncomment and adapt one of the lines below +# - use the "closes" keyword if applicable +# (see https://help.github.com/articles/closing-issues-using-keywords) +#-----------------------------------------------------------------------| +# Closes #41 on the issue tracker +# Fixes #42 on the issue tracker +# Resolves #43 on the issue tracker diff --git a/.config/git/config b/.config/git/config index f0092cb..e9002e5 100644 --- a/.config/git/config +++ b/.config/git/config @@ -1,160 +1,132 @@ [alias] - -# Note that ~/.config/shell/aliases loads all `git` aliases with +# Important: ~/.config/shell/aliases.sh loads all git aliases with # less than 7 characters into the shell's "namespace" with a "g" prefix -# Example: `git add` <=> `git a` <=> `ga` - +# Example: git add <=> git a <=> ga a = add ap = add --patch - +bi = bisect br = branch bra = branch --all brd = branch --delete brdd = branch --delete --force brm = branch --move - +cf = cat-file ci = commit cim = commit --message - cl = clone - +checkout-all = "!f() { for branch in $(git branch -r | grep -v '\\->'); do git branch --track ${branch#origin/} $branch; done; git fetch --all; }; f" co = checkout +coa = checkout-all cob = checkout -b cod = checkout develop -com = checkout main - +com = checkout master cp = cherry-pick - +de = describe --tags df = diff - fe = fetch - lg = log lga = log --all - +mb = merge-base me = merge mea = merge --abort mec = merge --continue +mefeat = "!f() { if [ $# -eq 0 ]; then echo "Must specify a branch to merge in"; exit 1; fi; git check-pull; if [ $? -gt 0 ]; then echo "$1 must be rebased first"; exit 1; fi; cb=$(git current-branch) && printf '# SUBJECT\n# =======\n# - what does the commit do\n# - capitalize the first word and use the\n# imperative mood (e.g. "Add" vs "Adds")\n# - do not end the line with a period\n# - start with "Fix" for any hotfixes\n# ========= 50 characters / 1 line ============= |\nMerge in \"%s\"\n# ============================================== |\n\n\n# BODY (optional)\n# ===============\n# - explain what the commit does, why it does it, and how\n# - do not format the text (e.g., Markdown or reStructuredText)\n# - use multiple lines starting with "-" as bullet points\n# - link to external resources for even more context where appropriate\n# ========= 72 characters / multiple lines (and paragraphs) ========== |\nMerge branch \"%s\" into \"%s\"\n\nSummary of the merged in commits:\n' $1 $1 $cb > .merge_msg.txt.tmp && git log --format=format:' * %h: %s' $cb..$1 >> .merge_msg.txt.tmp && printf '\n\n\n# ==================================================================== |\n\n\n# GITHUB ISSUE (optional)\n# =======================\n# - uncomment and adapt one of the lines below\n# - use the "closes" keyword if applicable\n# (see https://help.github.com/en/articles/closing-issues-using-keywords)\n#\n# Related GitHub issue: #21\n# This commit closes #42 on the GitHub issue tracker\n\n\n#\n# END\n#\n' >> .merge_msg.txt.tmp && git merge --no-ff --no-commit $1 && SKIP=no-commit-to-branch git commit --edit --file=.merge_msg.txt.tmp; rm -f .merge_msg.txt.tmp; }; f" meff = merge --ff-only menoff = merge --no-ff - pl = pull plrb = pull --rebase - ps = push psf = push --force - rb = rebase --committer-date-is-author-date rba = rebase --abort rbc = rebase --continue rbi = rebase --interactive rbq = rebase --quit rbs = rebase --skip - rl = reflog - -rm = rm # to make it available as the `grm` alias in the shell - +rm = rm # To make it available as the grm alias +rp = rev-parse rs = reset - rv = revert s = status ss = status --short - sh = show - st = stash -sta = stash push --include-untracked # "push" does not go into the shortcut! +sta = stash push --include-untracked # push does not go into the shortcut! stam = stash push --include-untracked --message stapp = stash apply stl = stash list stp = stash pop stsh = stash show - -# Synonyms as "specified" in the `git status` header +# Provide an overview of all aliases. Second one is for use in ~/.bashrc +aliases = config --get-regexp 'alias.*' +internal-aliases = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1/' | sort +# Provide synonyms as "specified" in the git status header discard = checkout -- unstage = reset HEAD -- - -amend-commit = !git log -n 1 --pretty=tformat:%B | git commit -F - --amend # Keep the commit message - +# Common tasks with tedious or non-intuitive flags +amend-commit = !git log -n 1 --pretty=tformat:%B | git commit -F - --amend # Keep the commit message +check-pull = "!f() { git fetch; upstream=${1:-'@{u}'}; local=$(git rev-parse @); remote=$(git rev-parse "$upstream"); base=$(git merge-base @ "$upstream"); if [ $local = $remote ]; then echo "Up-to-date"; exit 0; elif [ $local = $base ]; then echo "Local branch is behind upstream"; elif [ $remote = $base ]; then echo "Local branch is ahead of upstream"; else echo "Local and remote branches diverged"; fi; exit 1; }; f" current-branch = !git rev-parse --abbrev-ref HEAD - -project-root = rev-parse --show-toplevel - -uncommit = reset --soft HEAD~1 - +project-root = rev-parse --show-toplevel +uncommit = reset --soft HEAD~1 # Sync the working directory into the index -sync-deleted = !git ls-files -z --deleted | xargs -r -0 git rm -sync = !git sync-deleted && git add . --all - +rm-deleted = !git ls-files -z --deleted | xargs -r -0 git rm +sync-pwd-to-index = !git rm-deleted && git add . --all +sy = !git sync-pwd-to-index # Make minimal diff the default diff-minimal = diff --color-words=. --ws-error-highlight=all -d = !git diff-minimal -dlc = diff --color-words=. --ws-error-highlight=all HEAD -ds = diff --color-words=. --ws-error-highlight=all --staged - +d = diff --color-words=. --ws-error-highlight=all +dlc = diff --color-words=. --ws-error-highlight=all HEAD +ds = diff --color-words=. --ws-error-highlight=all --staged # Clean the project folder with intuitive commands -clean-all = !git reset --hard && git clean-ignored && git clean-untracked -clean-ignored = "!f() { if [ -f .python-version ]; then mv .python-version .python-version.XYZ; fi; if [ -f .env ]; then mv .env .env.XYZ; fi; git clean -X -d -f "$@"; if [ -f .python-version.XYZ ]; then mv .python-version.XYZ .python-version; fi; if [ -f .env.XYZ ]; then mv .env.XYZ .env; fi }; f" -clean-untracked = !git clean -x -d -e ".python-version" -e ".env" -f # because the "-e" flag does not work with "-X" - -# Delete EVERYTHING not reachable from a branch from the repository +# Always keep the .python-version file, which is also often in ~.gitignore +clean-all = !git reset --hard && git clean-ignored && git clean-untracked +clean-ignored = "!f() { if [ -f .python-version ]; then mv .python-version .python-version.XYZ; fi; if [ -f .env ]; then mv .env .env.XYZ; fi; git clean -X -d -f "$@"; if [ -f .python-version.XYZ ]; then mv .python-version.XYZ .python-version; fi; if [ -f .env.XYZ ]; then mv .env.XYZ .env; fi }; f" +clean-untracked = !git clean -x -d -e ".python-version" -e ".env" -f # The -e flag does not work with -X +# Delete everything not reachable from a branch from the repository gc-everything = "!f() { git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@"; }; f" - # Make the logs look nice by default -log-format1 = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%an @ %ad => %ar%n' --date=format:'%a %Y-%m-%d %H:%M:%S %z' -log-format2 = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%aN @ %ad => %ar%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S %z' -last-commit = !git log-format2 -1 -p --stat -lc = !git last-commit -history = !git log-format2 --graph -hi = !git history -hia = !git history --all -summary = !git log-format1 --graph -su = !git summary -sua = !git summary --all -oneline = log --pretty='%C(auto)%h: %s%d' --graph -ol = !git oneline -ola = !git oneline --all - +last-commit = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%aN @ %ad => %ar%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S %z' -1 -p --stat +lc = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%aN @ %ad => %ar%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S %z' -1 -p --stat +history = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%aN @ %ad => %ar%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S %z' --graph +hi = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%aN @ %ad => %ar%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S %z' --graph +hia = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%aN @ %ad => %ar%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S %z' --graph --all +summary = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%an @ %ad => %ar%n' --date=format:'%a %Y-%m-%d %H:%M:%S %z' --graph +su = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%an @ %ad => %ar%n' --date=format:'%a %Y-%m-%d %H:%M:%S %z' --graph +sua = log --pretty='%C(auto)%h: %s%d%Creset%n%C(dim)%an @ %ad => %ar%n' --date=format:'%a %Y-%m-%d %H:%M:%S %z' --graph --all +oneline = log --pretty='%C(auto)%h: %s%d' --graph +ol = log --pretty='%C(auto)%h: %s%d' --graph +ola = log --pretty='%C(auto)%h: %s%d' --graph --all # Search the repository grep-code = grep --break --context 1 --full-name --heading --line-number --show-function -grepc = !git grep-code -grep-log = log --all --regexp-ignore-case --pretty='%C(auto)%h: %s%+D%Creset%n%C(reverse)%C(dim)%aN @ %ad = %ar%Creset%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S' --grep -grepl = !git grep-log +grepc = grep --break --context 1 --full-name --heading --line-number --show-function +grep-log = log --all --regexp-ignore-case --pretty='%C(auto)%h: %s%+D%Creset%n%C(reverse)%C(dim)%aN @ %ad = %ar%Creset%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S' --grep +grepl = log --all --regexp-ignore-case --pretty='%C(auto)%h: %s%+D%Creset%n%C(reverse)%C(dim)%aN @ %ad = %ar%Creset%n%+b' --date=format:'%a %Y-%m-%d %H:%M:%S' --grep grep-text = grep --break --context 1 --full-name --heading --ignore-case --line-number -grept = !git grep-text - -# Prune local branches that were deleted remotely +grept = grep --break --context 1 --full-name --heading --ignore-case --line-number +# Push current branch to origin +push-to-origin = "!f(){ git push --set-upstream origin $(git current-branch) "$@"; }; f" +pso = "!f(){ git push --set-upstream origin $(git current-branch) "$@"; }; f" +prune-gone = "!git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}'" prune-delete = "!git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d" -prune-show = "!git fetch --prune && git branch -vv | grep ': gone]' | awk '{print $1}'" - -aliases = config --get-regexp 'alias.*' -aliases-internal = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1/' | sort # used in ~/.config/shell/aliases - [clean] - requireforce = true - [color "branch"] - current = cyan dim bold reverse local = green bold remote = red bold - [color "decorate"] - HEAD = cyan dim bold reverse branch = green bold remoteBranch = red bold stash = magenta dim bold reverse tag = magenta bold - [color "diff"] - context = white frag = blue dim bold reverse meta = yellow dim bold reverse @@ -162,9 +134,7 @@ new = green bold old = red bold whitespace = red dim bold reverse - [color "grep"] - context = white filename = yellow dim bold reverse function = white bold @@ -173,17 +143,13 @@ match = red bold selected = white separator = blue dim bold reverse - [color "interactive"] - error = red dim bold reverse header = white help = yellow bold prompt = white dim bold reverse - [color "status"] - added = green bold branch = cyan dim bold reverse changed = yellow bold @@ -194,80 +160,53 @@ remoteBranch = red bold unmerged = yellow dim bold reverse untracked = red bold - [commit] - cleanup = strip gpgSign = true template = ~/.config/git/commit_msg_template.txt verbose = true - [core] - editor = vim excludesfile = ~/.config/git/ignore pager = less --chop-long-lines --ignore-case --LONG-PROMPT --status-column --quit-if-one-screen whitespace = -space-before-tab,tab-in-indent - [diff] - renames = true submodule = log - [help] - autocorrect = 50 - [init] - defaultBranch = main - [merge] - conflictstyle = diff3 ff = only - [pull] - ff = only rebase = true - [push] - -autoSetupRemote = true default = upstream recursesubmodules = check - [rerere] - enabled = true - [url "https://bitbucket.org/"] - insteadOf = bb: - [url "https://github.com/"] - insteadOf = gh: - [url "https://gitlab.com/"] - insteadOf = gl: - [user] - name = Alexander Hess email = alexander@webartifex.biz -signingKey = alexander@webartifex.biz +signingKey = AB5C0E319D77350FBA6CF143344EA5AB10D868E0 diff --git a/.config/git/ignore b/.config/git/ignore index ee17658..1576110 100644 --- a/.config/git/ignore +++ b/.config/git/ignore @@ -5,6 +5,28 @@ *.temp *.tmp +# LibreOffice +# Source: https://github.com/github/gitignore/blob/main/Global/LibreOffice.gitignore +# +# Locks +.~lock.*# + +# Linux typical files we do not want under version control +# Source: https://github.com/github/gitignore/blob/main/Global/Linux.gitignore +# +*~ +# Temporary files created if a process still has a handle open to a deleted file +.fuse_hidden* +# KDE directory preferences +.directory +# Linux trash folder possibly appearing on any partition or disk +.Trash-* +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# pyenv +.python-version + # Vim # Source: https://github.com/github/gitignore/blob/main/Global/Vim.gitignore # diff --git a/.config/gnome-settings/README.md b/.config/gnome-settings/README.md new file mode 100644 index 0000000..4bbf86b --- /dev/null +++ b/.config/gnome-settings/README.md @@ -0,0 +1,7 @@ +# Gnome Settings + +This folder contains my Gnome settings + split into several \*.ini files by logical group. + +Load them into Gnome with `dconf load / < `. +It is important to always load them in anchored at the root (i.e., `/`). diff --git a/.config/gnome-settings/app-folders.ini b/.config/gnome-settings/app-folders.ini new file mode 100644 index 0000000..044ded2 --- /dev/null +++ b/.config/gnome-settings/app-folders.ini @@ -0,0 +1,53 @@ +[org/gnome/desktop/app-folders] +folder-children=['Browsers', 'Communication', 'Develop', 'Files', 'Multimedia', 'Office', 'Remote', 'Settings', 'Terminal', 'Utilities'] + + +[org/gnome/desktop/app-folders/folders/Browsers] +apps=['google-chrome.desktop', 'org.mozilla.firefox.desktop'] +name='Browsers' +translate=true + +[org/gnome/desktop/app-folders/folders/Communication] +apps=['org.mozilla.thunderbird.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Contacts.desktop', 'org.gnome.Evolution.desktop', 'org.telegram.desktop.desktop', 'Zoom.desktop'] +name='Communication' +translate=true + +[org/gnome/desktop/app-folders/folders/Develop] +apps=['com.jetbrains.PyCharm-Professional.desktop', 'org.gnome.Boxes.desktop', 'rstudio.desktop', 'texmaker.desktop', 'scrcpy.desktop', 'scrcpy-console.desktop', 'sqlitebrowser.desktop'] +name='Develop' +translate=true + +[org/gnome/desktop/app-folders/folders/Files] +apps=['fr.romainvigier.MetadataCleaner.desktop', 'org.cryptomator.Cryptomator.desktop', 'org.gnome.Evince.desktop', 'org.gnome.FileRoller.desktop', 'org.gnome.Loupe.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.TextEditor.desktop', 'simple-scan.desktop'] +name='Files' +translate=true + +[org/gnome/desktop/app-folders/folders/Multimedia] +apps=['com.obsproject.Studio.desktop', 'com.spotify.Client.desktop', 'org.gnome.Rhythmbox3.desktop', 'vlc.desktop'] +name='Multimedia' +translate=true + +[org/gnome/desktop/app-folders/folders/Office] +apps=['libreoffice-base.desktop', 'libreoffice-calc.desktop', 'libreoffice-draw.desktop', 'libreoffice-impress.desktop', 'libreoffice-math.desktop', 'libreoffice-startcenter.desktop', 'libreoffice-writer.desktop', 'simple-scan.desktop'] +name='Office' +translate=true + +[org/gnome/desktop/app-folders/folders/Remote] +apps=['org.remmina.Remmina.desktop', 'rustdesk.desktop', 'scrcpy.desktop', 'scrcpy-console.desktop'] +name='Remote' +translate=true + +[org/gnome/desktop/app-folders/folders/Settings] +apps=['ca.desrt.dconf-editor.desktop', 'com.github.joseexposito.touche.desktop', 'com.system76.keyboardconfigurator.desktop', 'firewall-config.desktop', 'gnome-language-selector.desktop', 'gnome-session-properties.desktop', 'gnome-system-monitor.desktop', 'im-config.desktop', 'menulibre.desktop', 'nm-connection-editor.desktop', 'nvidia-settings.desktop', 'org.bleachbit.BleachBit.desktop', 'org.gnome.Extensions.desktop', 'org.gnome.PowerStats.desktop', 'org.gnome.Settings.desktop', 'org.gnome.Software.desktop', 'org.gnome.tweaks.desktop', 'org.pulseaudio.pavucontrol.desktop', 'software-properties-gnome.desktop', 'system76-driver.desktop', 'system76-firmware.desktop'] +name='Settings' +translate=true + +[org/gnome/desktop/app-folders/folders/Terminal] +apps=['Alacritty.desktop', 'htop.desktop', 'org.gnome.Terminal.desktop', 'ranger.desktop'] +name='Terminal' +translate=true + +[org/gnome/desktop/app-folders/folders/Utilities] +apps=['com.github.donadigo.eddy.desktop', 'com.system76.Popsicle.desktop', 'gparted.desktop', 'gucharmap.desktop', 'info.desktop', 'java-17-openjdk-17.0.4.0.8-1.fc36.x86_64-jconsole.desktop', 'org.gnome.baobab.desktop', 'org.gnome.Characters.desktop', 'org.gnome.DiskUtility.desktop', 'org.gnome.eog.desktop', 'org.gnome.font-viewer.desktop', 'org.gnome.Logs.desktop', 'org.gnome.Screenshot.desktop', 'org.gnome.seahorse.Application.desktop', 'org.gnome.Totem.desktop', 'pop-cosmic-applications.desktop', 'pop-cosmic-launcher.desktop', 'pop-cosmic-workspaces.desktop', 'screenkey.desktop', 'yelp.desktop'] +name='Utilities' +translate=true diff --git a/.config/gnome-settings/apps.ini b/.config/gnome-settings/apps.ini new file mode 100644 index 0000000..7c75d55 --- /dev/null +++ b/.config/gnome-settings/apps.ini @@ -0,0 +1,144 @@ +# This file contains settings for various individual desktop apps + + +[ca/desrt/dconf-editor] +# Always start at dconf's root +saved-pathbar-path='/' +saved-view='/' +show-warning=false + + +[org/gnome/Contacts] +did-initial-setup=true + + +[org/gnome/TextEditor] +auto-indent=true +highlight-current-line=true +indent-style='space' +restore-session=false +show-grid=true +show-map=true +tab-width=4 +wrap-text=false + + +[org/gnome/calendar] +active-view='week' + + +[org/gnome/control-center] +last-panel='info-overview' + + +# [org/gnome/gedit] + +[org/gnome/gedit/plugins/filebrowser] +tree-view=true + +[org/gnome/gedit/preferences/ui] +show-tabs-mode='auto' + + +[org/gnome/gnome-system-monitor] +cpu-smooth-graph=true +cpu-stacked-area-chart=false +disks-interval=1000 +graph-update-interval=250 +maximized=false +network-in-bits=true +show-all-fs=true +show-dependencies=false +show-whose-processes='user' +update-interval=1000 + + +# [org/gnome/nautilus] + +[org/gnome/nautilus/compression] +default-compression-format='zip' + +[org/gnome/nautilus/icon-view] +captions=['size', 'none', 'none'] + +[org/gnome/nautilus/list-view] +default-column-order=['name', 'size', 'type', 'owner', 'group', 'permissions', 'where', 'date_modified', 'date_modified_with_time', 'date_accessed', 'recency', 'starred', 'detailed_type'] +default-visible-columns=['name', 'size', 'date_modified', 'starred'] +use-tree-view=true + +[org/gnome/nautilus/preferences] +always-use-location-entry=true +default-folder-viewer='list-view' +search-filter-time-type='last_modified' +search-view='list-view' +show-create-link=false +show-delete-permanently=true + + +[org/gnome/software] +allow-updates=false +check-timestamp=0 +download-updates=false +download-updates-notify=false +first-run=false +install-timestamp=0 +online-updates-timestamp=0 +security-timestamp=0 +update-notification-timestamp=0 +upgrade-notification-timestamp=0 + + +# [org/gnome/terminal] + +[org/gnome/terminal/legacy] +confirm-close=false + +# [org/gnome/terminal/legacy/keybindings] +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings + +[org/gnome/terminal/legacy/profiles:] +default='b1dcc9dd-5262-4d8d-a863-c897e6d979b9' +list=['b1dcc9dd-5262-4d8d-a863-c897e6d979b9'] + +[org/gnome/terminal/legacy/profiles:/:b1dcc9dd-5262-4d8d-a863-c897e6d979b9] +audible-bell=false +background-color='rgb(0,0,0)' +bold-is-bright=true +custom-command='/usr/bin/zsh' +foreground-color='rgb(255,255,255)' +login-shell=false +use-custom-command=true +use-theme-colors=true +visible-name='Default' + + +[org/gnome/tweaks] +show-extensions-notice=false + + +# [org/gtk/*/settings/file-chooser] +# This is Gnome Files + +[org/gtk/gtk4/settings/file-chooser] +# Keep in sync with [org/gtk/settings/file-chooser] +date-format='regular' +location-mode='path-bar' +show-hidden=false +show-size-column=true +show-type-column=true +sort-column='name' +sort-directories-first=true +sort-order='ascending' +type-format='category' + +[org/gtk/settings/file-chooser] +# Keep in sync with [org/gtk/gtk4/settings/file-chooser] +date-format='regular' +location-mode='path-bar' +show-hidden=false +show-size-column=true +show-type-column=true +sort-column='name' +sort-directories-first=true +sort-order='ascending' +type-format='category' diff --git a/.config/gnome-settings/elgato/README.md b/.config/gnome-settings/elgato/README.md new file mode 100644 index 0000000..0d9f452 --- /dev/null +++ b/.config/gnome-settings/elgato/README.md @@ -0,0 +1,5 @@ +# Elgato Key Lights + +The Python files in this folder are hooked as keyboard shortcuts in Gnome. +They allow to toggle the key lights in my office. +In the long-run, these scripts should be improved a bit. diff --git a/.config/gnome-settings/elgato/dec_brightness.py b/.config/gnome-settings/elgato/dec_brightness.py new file mode 100755 index 0000000..9382947 --- /dev/null +++ b/.config/gnome-settings/elgato/dec_brightness.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +import leglight + +LEFT_KEYLIGHT_IP = "192.168.190.62" +RIGHT_KEYLIGHT_IP = "192.168.190.63" + +left = leglight.LegLight(LEFT_KEYLIGHT_IP, port=9123) +right = leglight.LegLight(RIGHT_KEYLIGHT_IP, port=9123) + +left.decBrightness(5) +right.decBrightness(5) diff --git a/.config/gnome-settings/elgato/dec_color.py b/.config/gnome-settings/elgato/dec_color.py new file mode 100755 index 0000000..c21a899 --- /dev/null +++ b/.config/gnome-settings/elgato/dec_color.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +import leglight + +LEFT_KEYLIGHT_IP = "192.168.190.62" +RIGHT_KEYLIGHT_IP = "192.168.190.63" + +left = leglight.LegLight(LEFT_KEYLIGHT_IP, port=9123) +right = leglight.LegLight(RIGHT_KEYLIGHT_IP, port=9123) + +left.decColor(200) +right.decColor(200) diff --git a/.config/gnome-settings/elgato/inc_brightness.py b/.config/gnome-settings/elgato/inc_brightness.py new file mode 100755 index 0000000..21a5ae0 --- /dev/null +++ b/.config/gnome-settings/elgato/inc_brightness.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +import leglight + +LEFT_KEYLIGHT_IP = "192.168.190.62" +RIGHT_KEYLIGHT_IP = "192.168.190.63" + +left = leglight.LegLight(LEFT_KEYLIGHT_IP, port=9123) +right = leglight.LegLight(RIGHT_KEYLIGHT_IP, port=9123) + +left.incBrightness(5) +right.incBrightness(5) diff --git a/.config/gnome-settings/elgato/inc_color.py b/.config/gnome-settings/elgato/inc_color.py new file mode 100755 index 0000000..9105b9e --- /dev/null +++ b/.config/gnome-settings/elgato/inc_color.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python + +import leglight + +LEFT_KEYLIGHT_IP = "192.168.190.62" +RIGHT_KEYLIGHT_IP = "192.168.190.63" + +left = leglight.LegLight(LEFT_KEYLIGHT_IP, port=9123) +right = leglight.LegLight(RIGHT_KEYLIGHT_IP, port=9123) + +left.incColor(200) +right.incColor(200) diff --git a/.config/gnome-settings/elgato/toggle_keylights.py b/.config/gnome-settings/elgato/toggle_keylights.py new file mode 100755 index 0000000..f6f7413 --- /dev/null +++ b/.config/gnome-settings/elgato/toggle_keylights.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import leglight + +LEFT_KEYLIGHT_IP = "192.168.190.62" +RIGHT_KEYLIGHT_IP = "192.168.190.63" + +left = leglight.LegLight(LEFT_KEYLIGHT_IP, port=9123) +right = leglight.LegLight(RIGHT_KEYLIGHT_IP, port=9123) + +if left.info()["on"] or right.info()["on"]: + left.off() + right.off() + +else: + left.on() + right.on() + left.brightness(30) + right.brightness(30) + left.color(6000) + right.color(6000) diff --git a/.config/gnome-settings/key-bindings.ini b/.config/gnome-settings/key-bindings.ini new file mode 100644 index 0000000..bb6d193 --- /dev/null +++ b/.config/gnome-settings/key-bindings.ini @@ -0,0 +1,318 @@ +# Unify all key bindings in this file to conveniently keep them consistent + + +[org/gnome/desktop/wm/keybindings] + +# q is i3wm's default +close=['Q', 'Q', 'Q', 'F4'] + +maximize=@as [] +unmaximize=@as [] +toggle-maximized=['M'] +minimize=@as [] + +switch-applications=['Tab', 'Tab'] +switch-applications-backward=['Tab', 'Tab'] + +switch-input-source=@as [] +switch-input-source-backward=@as [] + +switch-group=@as [] +switch-group-backward=@as [] +switch-panels=@as [] +switch-panels-backward=@as [] + +cycle-group=@as [] +cycle-group-backward=@as [] +cycle-panels=@as [] +cycle-panels-backward=@as [] +cycle-windows=@as [] +cycle-windows-backward=@as [] + +begin-move=@as [] +begin-resize=@as [] + +# - Left/Right is the default to move left/right => 1-5 +# - 1-5 is i3wm's default way +switch-to-workspace-1=['1', '1'] +switch-to-workspace-2=['2', '2'] +switch-to-workspace-3=['3', '3'] +switch-to-workspace-4=['4', '4'] +switch-to-workspace-5=['5', '5'] +switch-to-workspace-6=['6', '6'] +switch-to-workspace-7=['7', '7'] +switch-to-workspace-8=['8', '8'] +switch-to-workspace-9=['9', '9'] +switch-to-workspace-10=['0', '0'] +switch-to-workspace-last=['End', 'End'] +switch-to-workspace-left=['Left'] +switch-to-workspace-right=['Right'] + +# 1-5 is i3wm's default +move-to-workspace-1=['1', '1'] +move-to-workspace-2=['2', '2'] +move-to-workspace-3=['3', '3'] +move-to-workspace-4=['4', '4'] +move-to-workspace-5=['5', '5'] +move-to-workspace-6=['6', '6'] +move-to-workspace-7=['7', '7'] +move-to-workspace-8=['8', '8'] +move-to-workspace-9=['9', '9'] +move-to-workspace-10=['0', '0'] +move-to-workspace-last=['End', 'End'] +move-to-workspace-left=['Left', 'Left'] +move-to-workspace-right=['Right', 'Right'] + + +[org/gnome/mutter/keybindings] +toggle-tiled-left=@as [] +toggle-tiled-right=@as [] + + +[org/gnome/settings-daemon/plugins/media-keys] + +email=['E'] +help=@as [] +home=['F'] +search=['slash'] +terminal=@as [] +www=['B'] + +screensaver=['Escape'] +logout=@as [] + +# Besides the numkeys, we use "/", ".", and "," to control the media +play=['Slash'] +next=['Right'] +previous=['Left'] +# Note: I often type "m" for "mute" intuitively +volume-mute=['M'] +volume-up=['Up'] +volume-down=['Down'] + +magnifier=@as [] +magnifier-zoom-in=@as [] +magnifier-zoom-out=@as [] + +on-screen-keyboard=@as [] +screenreader=@as [] + +custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom6/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom7/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom8/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom9/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom10/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom11/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom12/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom13/'] + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0] +binding='Home' +command='gnome-session-quit --reboot' +name='Reboot Machine' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1] +binding='End' +command='gnome-session-quit --power-off' +name='Shutdown Machine' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2] +binding='Delete' +command='gnome-session-quit --logout' +name='Log out (1)' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3] +binding='BackSpace' +command='gnome-session-quit --logout' +name='Log out (2)' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4] +binding='G' +command='google-chrome' +name='Google Chrome' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5] +# Mimic i3wm's default way to open terminals +binding='Return' +command='alacritty' +name='Terminal (1)' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom6] +# Faster than the default t +binding='T' +command='alacritty' +name='Terminal (2)' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom7] +# Gnome's actual default, but with a custom terminal emulator +binding='T' +command='alacritty' +name='Terminal (3)' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom8] +binding='L' +command='/home/alexander/.local/share/elgato/bin/python /home/alexander/.config/gnome-settings/elgato/toggle_keylights.py' +name='Toggle Keylights in the Office' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom9] +binding='Apostrophe' +command='/home/alexander/.local/share/elgato/bin/python /home/alexander/.config/gnome-settings/elgato/inc_brightness.py' +name='Increase Brightness of Keylights in the Office' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom10] +binding='Semicolon' +command='/home/alexander/.local/share/elgato/bin/python /home/alexander/.config/gnome-settings/elgato/dec_brightness.py' +name='Decrease Brightness of Keylights in the Office' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom11] +binding='Bracketright' +command='/home/alexander/.local/share/elgato/bin/python /home/alexander/.config/gnome-settings/elgato/inc_color.py' +name='Increase Color of Keylights in the Office' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom12] +binding='Bracketleft' +command='/home/alexander/.local/share/elgato/bin/python /home/alexander/.config/gnome-settings/elgato/dec_color.py' +name='Decrease Color of Keylights in the Office' + +[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom13] +binding='U' +command='/usr/bin/flatpak run com.spotify.Client' +name='Spotify' + + +[org/gnome/shell/extensions/forge/keybindings] + +focus-border-toggle=@as [] +prefs-tiling-toggle=@as [] + +# Changing the gap size dynamically is not needed +window-gap-size-decrease=@as [] +window-gap-size-increase=@as [] + +workspace-active-tile-toggle=['Y'] + +window-toggle-float=@as [] +window-toggle-always-float=['Y'] + +window-focus-up=['Up'] +window-focus-down=['Down'] +window-focus-left=['Left'] +window-focus-right=['Right'] + +window-move-up=['Up'] +window-move-down=['Down'] +window-move-left=['Left'] +window-move-right=['Right'] + +window-swap-up=['Up'] +window-swap-down=['Down'] +window-swap-left=['Left'] +window-swap-right=['Right'] +window-swap-last-active=['Return'] + +window-resize-top-increase=['Up'] +window-resize-top-decrease=['Down'] +window-resize-bottom-increase=['Down'] +window-resize-bottom-decrease=['Up'] +window-resize-left-increase=['Left'] +window-resize-left-decrease=['Right'] +window-resize-right-increase=['Right'] +window-resize-right-decrease=['Left'] + +window-snap-center=@as [] +window-snap-one-third-left=@as [] +window-snap-one-third-right=@as [] +window-snap-two-third-left=@as [] +window-snap-two-third-right=@as [] + +# Container stuff +con-split-horizontal=@as [] +con-split-vertical=@as [] +con-split-layout-toggle=@as [] +con-stacked-layout-toggle=@as [] +con-tabbed-layout-toggle=@as [] +con-tabbed-showtab-decoration-toggle=@as [] + + +[org/gnome/shell/extensions/nightthemeswitcher/time] +nightthemeswitcher-ondemand-keybinding=['D'] + + +[org/gnome/shell/extensions/pop-shell] + +# The launcher does not work without Pop!OS +activate-launcher=@as [] + +# "toggle-floating" only puts the active window into floating mode +# while "toggle-tiling" turns the tiling mode on and off for all windows +toggle-floating=['Y'] +toggle-tiling=['Y'] + +focus-up=['Up'] +focus-down=['Down'] +focus-left=['Left'] +focus-right=['Right'] + +# Extends the move-to-workspace-* options above; in particular, +# "Up" and "Down" can be used to move windows to the upper monitors +pop-monitor-up=['Up', 'Up', 'Up'] +pop-monitor-down=['Down', 'Down', 'Down'] +pop-monitor-left=['Left'] +pop-monitor-right=['Right'] +pop-workspace-down=@as [] +pop-workspace-up=@as [] + +# Return instead of the default Return +# so that Return opens terminal (like i3wm) above +tile-enter=['Return', 'Return'] +tile-accept=['Return'] + +tile-move-up=['Up'] +tile-move-down=['Down'] +tile-move-left=['Left'] +tile-move-right=['Right'] + +tile-resize-up=['Down'] +tile-resize-down=['Up'] +tile-resize-left=['Left'] +tile-resize-right=['Right'] + +tile-swap-up=['Up'] +tile-swap-down=['Down'] +tile-swap-left=['Left'] +tile-swap-right=['Right'] + + +[org/gnome/shell/keybindings] + +focus-active-notification=@as [] +open-application-menu=@as [] + +# Disable Gnome's default behavior of opening "favorite" apps +# with 1-10 and instead switch workspaces +# (goes together with [org/gnome/shell/extensions/dash-to-dock] > hot-keys) +# Source: https://askubuntu.com/a/1138322 +switch-to-application-1=@as [] +switch-to-application-2=@as [] +switch-to-application-3=@as [] +switch-to-application-4=@as [] +switch-to-application-5=@as [] +switch-to-application-6=@as [] +switch-to-application-7=@as [] +switch-to-application-8=@as [] +switch-to-application-9=@as [] +switch-to-application-10=@as [] + +toggle-message-tray=@as [] +toggle-overview=@as [] + + +[org/gnome/terminal/legacy/keybindings] + +close-tab='W' +close-window='Q' + +find='F' +find-clear='J' +find-next='N' +find-previous='H' + +new-tab='T' +new-window='N' + +zoom-in='Plus' +# default: zoom-out='minus' + diff --git a/.config/gnome-settings/misc.ini b/.config/gnome-settings/misc.ini new file mode 100644 index 0000000..70a8783 --- /dev/null +++ b/.config/gnome-settings/misc.ini @@ -0,0 +1,199 @@ +[org/freedesktop/tracker/miner/files] +index-recursive-directories=['&DESKTOP', '&DOCUMENTS', '&MUSIC', '&PICTURES', '&VIDEOS', '&DOWNLOAD', '/home/alexander/Cloud'] + + +[org/gnome/desktop/a11y/applications] +screen-keyboard-enabled=false + + +[org/gnome/desktop/background] +# Keep picture-* in sync with [org/gnome/desktop/screensaver] below +color-shading-type='solid' +picture-options='spanned' +picture-uri='file:///usr/share/backgrounds/lake_in_front_of_mountains.jpg' +picture-uri-dark='file:///usr/share/backgrounds/lake_in_front_of_mountains.jpg' +primary-color='#000000000000' +secondary-color='#000000000000' + + +[org/gnome/desktop/calendar] +show-weekdate=true + + +[org/gnome/desktop/datetime] +automatic-timezone=true + + +[org/gnome/desktop/input-sources] +per-window=false +sources=[('xkb', 'us')] +xkb-options=['compose:ralt', 'caps:ctrl_modifier', 'lv3:menu_switch'] + + +[org/gnome/desktop/interface] +clock-format='24h' +clock-show-date=true +clock-show-seconds=true +clock-show-weekday=true +color-scheme='default' +document-font-name='Clear Sans Medium 11' +enable-animations=true +enable-hot-corners=false +font-antialiasing='grayscale' +font-hinting='slight' +font-name='Clear Sans Medium 11' +# gtk-im-module='gtk-im-context-simple' +# gtk-theme='Pop-dark' +# icon-theme='Pop' +monospace-font-name='FiraCode Nerd Font Mono 11' +show-battery-percentage=true +toolkit-accessibility=false + + +[org/gnome/desktop/lockdown] +disbale-user-switching=true + + +[org/gnome/desktop/media-handling] +automount=true +automount-open=false +autorun-never=true +autorun-x-content-ignore=@as [] +autorun-x-content-open-folder=@as [] +autorun-x-content-start-app=@as [] + + +[org/gnome/desktop/peripherals/keyboard] +numlock-state=true +remember-numlock-state=true + + +[org/gnome/desktop/peripherals/mouse] +natural-scroll=false + + +[org/gnome/desktop/peripherals/touchpad] +edge-scrolling-enabled=false +natural-scroll=true +tap-to-click=true +two-finger-scrolling-enabled=true + + +[org/gnome/desktop/privacy] +disable-camera=false +disable-microphone=false +disable-sound-output=false +hide-identity=true +old-files-age=uint32 7 +recent-files-max-age=int32 1 +remember-app-usage=false +remember-recent-files=false +remove-old-temp-files=true +remove-old-trash-files=true +report-technical-problems=false +send-software-usage-stats=false +show-full-name-in-top-bar=false + + +[org/gnome/desktop/screensaver] +# Keep picture-* in sync with [org/gnome/desktop/background] above +color-shading-type='solid' +lock-delay=uint32 0 +lock-enabled=false +logout-enabled=true +picture-options='spanned' +picture-uri='file:///usr/share/backgrounds/lake_in_front_of_mountains.jpg' +primary-color='#000000000000' +secondary-color='#000000000000' +show-full-name-in-top-bar=false +status-message-enabled=false +user-switch-enabled=false + + +[org/gnome/desktop/search-providers] +disable-external=false +disabled=['firefox.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Characters.desktop', 'org.gnome.Contacts.desktop', 'org.gnome.Photos.desktop', 'org.gnome.seahorse.Application.desktop', 'org.gnome.Terminal.desktop'] +sort-order=['org.gnome.Documents.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Settings.desktop', 'org.gnome.Software.desktop'] + + +[org/gnome/desktop/session] +idle-delay=uint32 900 + + +[org/gnome/desktop/sound] +allow-volume-above-100-percent=true +event-sounds=true +input-feedback-sounds=true + + +# [org/gnome/desktop/wm/keybindings] +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings + + +[org/gnome/desktop/wm/preferences] +audible-bell=false +button-layout='close:' +num-workspaces=10 +titlebar-font='Clear Sans Bold 12' +workspace-names=['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] + + +[org/gnome/login-screen] +allowed-failures=999 +disable-user-list=true +# The following keys are non-writeable +# See: /etc/dconf/db/distro.d/locks/20-authselect +# enable-fingerprint-authentication=false +# enable-password-authentication=true +# enable-smartcard-authentication=false + + +[org/gnome/mutter] +dynamic-workspaces=false +# We use Pop Shell for tiling +edge-tiling=false +workspaces-only-on-primary=true + + +# [org/gnome/mutter/keybindings] +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings + + +[org/gnome/nm-applet] +disable-connected-notifications=true +disable-disconnected-notifications=true +suppress-wireless-networks-available=true + + +[org/gnome/settings-daemon/plugins/color] +night-light-enabled=true +night-light-schedule-automatic=true +night-light-schedule-from=22.0 +night-light-schedule-to=6.0 + + +[org/gnome/settings-daemon/plugins/media-keys] +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings +volume-step=10 + + +[org/gnome/settings-daemon/plugins/power] +idle-dim=false +power-button-action='suspend' +sleep-inactive-ac-timeout=0 +sleep-inactive-ac-type='nothing' +sleep-inactive-battery-timeout=600 +sleep-inactive-battery-type='nothing' + + +[org/gnome/system/location] +enabled=false + + +[system/locale] +# Basically English display with near-German settings (e.g., DIN A4) +region='en_DK.UTF-8' + + +[system/proxy] +mode='none' diff --git a/.config/gnome-settings/notifications.ini b/.config/gnome-settings/notifications.ini new file mode 100644 index 0000000..bd30b0f --- /dev/null +++ b/.config/gnome-settings/notifications.ini @@ -0,0 +1,298 @@ +[org/gnome/desktop/notifications] +application-children=@as [] +show-banners=true +show-in-lock-screen=false + + +[org/gnome/desktop/notifications/application/alacritty] +enable=false + +[org/gnome/desktop/notifications/application/ca-desrt-dconf-editor] +enable=false + +[org/gnome/desktop/notifications/application/com-alacritty-alacritty] +enable=false + +[org/gnome/desktop/notifications/application/com-cisco-anyconnect-gui] +enable=false + +[org/gnome/desktop/notifications/application/com-github-donadigo-eddy] +enable=false + +[org/gnome/desktop/notifications/application/com-nextcloud-desktopclient-nextcloud] +enable=false + +[org/gnome/desktop/notifications/application/com-obsproject-studio] +enable=false + +[org/gnome/desktop/notifications/application/com-spotify-client] +enable=false + +[org/gnome/desktop/notifications/application/com-system76-keyboardconfigurator] +enable=false + +[org/gnome/desktop/notifications/application/discord] +enable=false + +[org/gnome/desktop/notifications/application/display-im6-q16] +enable=false + +[org/gnome/desktop/notifications/application/firewall-config] +enable=false + +[org/gnome/desktop/notifications/application/gnome-analytics-panel] +enable=false + +[org/gnome/desktop/notifications/application/gnome-color-panel] +enable=false + +[org/gnome/desktop/notifications/application/gnome-control-center] +enable=false + +[org/gnome/desktop/notifications/application/gnome-datetime-panel] +enable=false + +[org/gnome/desktop/notifications/application/gnome-firmware-panel] +enable=true +show-banners=false + +[org/gnome/desktop/notifications/application/gnome-language-selector] +enable=false + +[org/gnome/desktop/notifications/application/gnome-network-panel] +enable=false + +[org/gnome/desktop/notifications/application/gnome-power-panel] +enable=true +show-banners=false + +[org/gnome/desktop/notifications/application/gnome-printers-panel] +enable=false + +[org/gnome/desktop/notifications/application/gnome-session-properties] +enable=false + +[org/gnome/desktop/notifications/application/gnome-support-panel] +enable=false + +[org/gnome/desktop/notifications/application/gnome-system-monitor] +enable=false + +[org/gnome/desktop/notifications/application/gnome-upgrade-panel] +enable=false + +[org/gnome/desktop/notifications/application/gparted] +enable=false + +[org/gnome/desktop/notifications/application/gucharmap] +enable=false + +[org/gnome/desktop/notifications/application/htop] +enable=false + +[org/gnome/desktop/notifications/application/info] +enable=false + +[org/gnome/desktop/notifications/application/install4j-a303jh-mediathekview] +enable=false + +[org/gnome/desktop/notifications/application/io-elementary-appcenter] +enable=false + +[org/gnome/desktop/notifications/application/java-17-openjdk-17-0-4-0-8-1-fc36-x86-64-jconsole] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-base] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-calc] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-draw] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-impress] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-math] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-startcenter] +enable=false + +[org/gnome/desktop/notifications/application/libreoffice-writer] +enable=false + +[org/gnome/desktop/notifications/application/menulibre] +enable=false + +[org/gnome/desktop/notifications/application/nm-connection-editor] +enable=false + +[org/gnome/desktop/notifications/application/nvidia-settings] +enable=false + +[org/gnome/desktop/notifications/application/org-bleachbit-bleachbit] +enable=false + +[org/gnome/desktop/notifications/application/org-cryptomator-cryptomator] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-baobab] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-calculator] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-calendar] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-characters] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-chromegnomeshell] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-contacts] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-diskutility] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-eog] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-evince] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-evolution-alarm-notify] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-evolution] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-extensions-desktop] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-extensions] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-fileroller] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-font-viewer] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-gedit] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-logs] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-nautilus] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-octave] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-photos] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-powerstats] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-screenshot] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-seahorse-application] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-settings] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-shell-extensions] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-software] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-terminal] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-texteditor] +enable=false + +[org/gnome/desktop/notifications/application/org-gnome-tweaks] +enable=false + +[org/gnome/desktop/notifications/application/org-mozilla-firefox] +enable=false + +[org/gnome/desktop/notifications/application/org-mozilla-thunderbird] +enable=false + +[org/gnome/desktop/notifications/application/org-pulseaudio-pavucontrol] +enable=false + +[org/gnome/desktop/notifications/application/org-remmina-remmina] +enable=false + +[org/gnome/desktop/notifications/application/org-telegram-desktop] +enable=false + +[org/gnome/desktop/notifications/application/pop-cosmic-applications] +enable=false + +[org/gnome/desktop/notifications/application/pop-cosmic-launcher] +enable=false + +[org/gnome/desktop/notifications/application/pop-cosmic-workspaces] +enable=false + +[org/gnome/desktop/notifications/application/r] +enable=false + +[org/gnome/desktop/notifications/application/ranger] +enable=false + +[org/gnome/desktop/notifications/application/rstudio] +enable=false + +[org/gnome/desktop/notifications/application/screenkey] +enable=false + +[org/gnome/desktop/notifications/application/simple-scan] +enable=false + +[org/gnome/desktop/notifications/application/sqlitebrowser] +enable=false + +[org/gnome/desktop/notifications/application/system76-driver] +enable=false + +[org/gnome/desktop/notifications/application/telegramdesktop] +enable=false + +[org/gnome/desktop/notifications/application/texdoctk] +enable=false + +[org/gnome/desktop/notifications/application/texmaker] +enable=false + +[org/gnome/desktop/notifications/application/timeshift-gtk] +enable=false + +[org/gnome/desktop/notifications/application/us-zoom-zoom] +enable=false + +[org/gnome/desktop/notifications/application/vim] +enable=false + +[org/gnome/desktop/notifications/application/vlc] +enable=false + +[org/gnome/desktop/notifications/application/yelp] +enable=false + +[org/gnome/desktop/notifications/application/zoom] +enable=false diff --git a/.config/gnome-settings/shell-base.ini b/.config/gnome-settings/shell-base.ini new file mode 100644 index 0000000..c7cabc4 --- /dev/null +++ b/.config/gnome-settings/shell-base.ini @@ -0,0 +1,31 @@ +[org/gnome/shell] +# We use the 'AlphabeticalAppGrid@stuarthayhurst' +# extension to populate "app-picker-layout" +# See ~/.config/gnome-settings/shell-extensions.ini +# app-picker-layout=@aa{sv} [] + +# Always reset the command history +command-history=@as [] + +development-tools=false +favorite-apps=@as [] + +# Never show Gnome's welcome dialog again +welcome-dialog-last-shown-version='999.999' + + +[org/gnome/shell/app-switcher] +current-workspace-only=true + + +# [org/gnome/shell/keybindings] +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings + + +[org/gnome/shell/window-switcher] +app-icon-mode='both' +current-workspace-only=true + + +[org/gnome/shell/world-clocks] +locations=@av [] diff --git a/.config/gnome-settings/shell-extensions.ini b/.config/gnome-settings/shell-extensions.ini new file mode 100644 index 0000000..9447975 --- /dev/null +++ b/.config/gnome-settings/shell-extensions.ini @@ -0,0 +1,263 @@ +[org/gnome/shell] +disable-user-extensions=false +disabled-extensions=@as [] +enabled-extensions=['allowlockedremotedesktop@kamens.us', 'AlphabeticalAppGrid@stuarthayhurst', 'appindicatorsupport@rgcjonas.gmail.com', 'auto-move-windows@gnome-shell-extensions.gcampax.github.com', 'blur-my-shell@aunetx', 'caffeine@patapon.info', 'just-perfection-desktop@just-perfection', 'launch-new-instance@gnome-shell-extensions.gcampax.github.com', 'space-bar@luchrioh', 'pop-shell@system76.com'] + + +[org/gnome/shell/extensions/alphabetical-app-grid] +folder-order-position='alphabetical' +logging-enabled=false +sort-folder-contents=true + + +[org/gnome/shell/extensions/auto-move-windows] +application-list=['org.mozilla.firefox.desktop:1', 'com.google.Chrome.desktop:2', 'com.discordapp.Discord.desktop:3', 'org.telegram.desktop.desktop:3', 'Zoom.desktop:3', 'org.gnome.Evolution.desktop:4', 'org.mozilla.thunderbird.desktop:4', 'com.spotify.Client.desktop:9', 'org.gnome.Settings.desktop:10', 'gnome-background-panel.desktop:10', 'gnome-bluetooth-panel.desktop:10', 'bluetooth-sendto.desktop:10', 'gnome-display-panel.desktop:10', 'gnome-info-overview-panel.desktop:10', 'gnome-keyboard-panel.desktop:10', 'gnome-network-panel.desktop:10', 'gnome-notifications-panel.desktop:10', 'gnome-power-panel.desktop:10', 'gnome-printers-panel.desktop:10', 'gnome-sound-panel.desktop:10', 'gnome-wifi-panel.desktop:10', 'nvidia-settings.desktop:10', 'org.pulseaudio.pavucontrol.desktop:10'] + + +[org/gnome/shell/extensions/blur-my-shell/applications] +blur=false + + +[org/gnome/shell/extensions/caffeine] +countdown-timer=0 +duration-timer=2 +enable-fullscreen=true +indicator-position-max=2 +restore-state=true +show-notifications=false +toggle-state=false +user-enabled=false + + +[org/gnome/shell/extensions/dash-to-dock] +extend-height=false +# Disable Gnome's default behavior of opening "favorite" apps +# with 1-10 and instead switch workspaces +# (goes together with [org/gnome/shell/keybindings] > switch-to-application-1-10) +# Source: https://askubuntu.com/a/1138322 +hot-keys=false +manualhide=true + + +[org/gnome/shell/extensions/forge] +auto-split-enabled=true +dnd-center-layout='tabbed' +float-always-on-top-enabled=true +focus-border-toggle=true +preview-hint-enabled=true +quick-settings-enabled=true +split-border-toggle=true +stacked-tiling-mode-enabled=true +tabbed-tiling-mode-enabled=true +window-gap-hidden-on-single=true +window-gap-size=uint32 1 +window-gap-size-increment=uint32 1 + + +[org/gnome/shell/extensions/just-perfection] +accessibility-menu=false +activities-button=false +activities-button-icon-monochrome=false +activities-button-label=false +aggregate-menu=true +app-menu=false +app-menu-icon=false +background-menu=false +calendar=false +clock-menu=false +controls-manager-spacing-size=0 +dash=true +double-super-to-appgrid=false +events-button=false +keyboard-layout=false +osd=true +panel=true +panel-in-overview=true +panel-notification-icon=false +power-icon=true +quick-settings=true +ripple-box=false +screen-recording-indicator=true +screen-sharing-indicator=true +search=true +show-apps-button=false +startup-status=0 +theme=false +type-to-search=true +weather=false +window-demands-attention-focus=false +window-picker-icon=true +window-preview-caption=false +window-preview-close-button=true +workspace=false +workspace-background-corner-size=0 +workspace-popup=false +workspace-switcher-should-show=false +workspace-wrap-around=false +workspaces-in-app-grid=false +world-clock=false + + +# [org/gnome/shell/extensions/nightthemeswitcher] + +[org/gnome/shell/extensions/nightthemeswitcher/cursor-variants] +enabled=false + +[org/gnome/shell/extensions/nightthemeswitcher/gtk-variants] +enabled=false + +[org/gnome/shell/extensions/nightthemeswitcher/icon-variants] +enabled=false + +[org/gnome/shell/extensions/nightthemeswitcher/shell-variants] +enabled=false + +[org/gnome/shell/extensions/nightthemeswitcher/time] + +manual-schedule=true +sunrise=6.0 +sunset=21.0 + +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings +# nightthemeswitcher-ondemand-keybinding=['D'] + + +[org/gnome/shell/extensions/openweather] +appid='e1c415e4aa29916a39e8992f57e2b09d' +city='49.6179281,9.1773699>Kirchzell, Germany>0' +days-forecast=2 +delay-ext-init=1 +disable-forecast=false +expand-forecast=true +position-index=1 +show-comment-in-forecast=false +show-comment-in-panel=false + + +[org/gnome/shell/extensions/pop-cosmic] +show-applications-button=false +show-workspaces-button=false + + +[org/gnome/shell/extensions/pop-shell] +# See ~/.config/gnome-settings/key-bindings.ini for the key bindings +active-hint=true +gap-inner=uint32 1 +gap-outer=uint32 1 +hint-color-rgba='rgb(53,132,228)' +show-skip-taskbar=true +show-title=true +smart-gaps=false +tile-by-default=true + + +[org/gnome/shell/extensions/simple-system-monitor] +cpu-usage-text='cpu' +download-speed-text='↓' +is-cpu-usage-enable=true +is-download-speed-enable=false +is-memory-usage-enable=true +is-upload-speed-enable=false +item-separator=' ' +memory-usage-text='ram' +refresh-interval=1 +upload-speed-text='↑' + + +[org/gnome/shell/extensions/sound-output-device-chooser] +expand-volume-menu=true +hide-on-single-device=true +integrate-with-slider=true +show-profiles=false + + +[org/gnome/shell/extensions/space-bar/appearance] +active-workspace-border-radius=8 +active-workspace-border-width=0 +active-workspace-padding-h=8 +active-workspace-padding-v=2 +empty-workspace-border-radius=8 +empty-workspace-border-width=0 +empty-workspace-padding-h=8 +empty-workspace-padding-v=2 +inactive-workspace-border-radius=8 +inactive-workspace-border-width=0 +inactive-workspace-padding-h=8 +inactive-workspace-padding-v=2 +workspace-margin=0 +workspaces-bar-padding=4 + +[org/gnome/shell/extensions/space-bar/behavior] +scroll-wheel='disabled' +show-empty-workspaces=false + +[org/gnome/shell/extensions/space-bar/shortcuts] +enable-move-to-workspace-shortcuts=true +open-menu=@as [] + + +[org/gnome/shell/extensions/status-area-horizontal-spacing] +hpadding=10 + + +[org/gnome/shell/extensions/system-monitor] + +center-display=false +compact-display=false +icon-display=false +move-clock=false +show-tooltip=false + +battery-display=false +battery-hidesystem=false +battery-show-menu=false +battery-show-text=false +battery-time=false + +cpu-display=true +cpu-show-menu=false +cpu-show-text=true +cpu-style='digit' +cpu-individual-cores=false + +disk-display=false +disk-show-menu=false +disk-show-text=false +disk-style='digit' +disk-usage-style='none' + +fan-display=false +fan-show-menu=false +fan-show-text=false +fan-style='digit' + +freq-display=false +freq-show-menu=false +freq-show-text=false +freq-style='digit' + +gpu-display=false +gpu-show-menu=false +gpu-show-text=false +gpu-style='digit' + +memory-display=true +memory-show-menu=false +memory-show-text=true +memory-style='digit' + +net-display=false +net-show-menu=false +net-show-text=false +net-style='digit' + +swap-display=false +swap-show-menu=false +swap-show-text=false +swap-style='digit' + +thermal-display=false +thermal-show-menu=false +thermal-show-text=false +thermal-style='digit' +thermal-fahrenheit-unit=false diff --git a/.config/mackup/README.md b/.config/mackup/README.md new file mode 100644 index 0000000..9fb09de --- /dev/null +++ b/.config/mackup/README.md @@ -0,0 +1,16 @@ +# Configuration for `mackup` + +This folder contains various **config** files + to make [`mackup`](https://github.com/lra/mackup) + synchronize (dot) files the general public should *not* see. +Their format is described [here](https://github.com/lra/mackup/tree/master/doc#add-support-for-an-application-or-almost-any-file-or-directory). + + +## Changed Location + +`mackup`'s default configuration lies the the ~/.mackup.cfg file + and in the ~/.mackup folder that holds config files with + custom sync rules not supported "out of the box." + +With a "little hack" during the setup of the dotfiles in this repository, + `mackup`s config files are moved to $XDG_CONFIG_HOME/mackup. diff --git a/.config/mackup/anyconnect.cfg b/.config/mackup/anyconnect.cfg new file mode 100644 index 0000000..729f0de --- /dev/null +++ b/.config/mackup/anyconnect.cfg @@ -0,0 +1,5 @@ +[application] +name = Cisco's AnyConnect + +[configuration_files] +.anyconnect diff --git a/.config/mackup/gnupg.cfg b/.config/mackup/gnupg.cfg new file mode 100644 index 0000000..5d03f48 --- /dev/null +++ b/.config/mackup/gnupg.cfg @@ -0,0 +1,5 @@ +[application] +name = gnupg + +[configuration_files] +.local/share/gnupg/trustdb.gpg diff --git a/.config/mackup/histories.cfg b/.config/mackup/histories.cfg new file mode 100644 index 0000000..7f0ca41 --- /dev/null +++ b/.config/mackup/histories.cfg @@ -0,0 +1,14 @@ +[application] +name = various history files + +[configuration_files] +# Note: $XDG_STATE_HOME => ~/.local/state +.local/state/bash/history +# .local/state/less/history -> less overwrites the symlink unfortunately +.local/state/python/history +# tig only supports $XDG_DATA_HOME +.local/share/tig/history +# entire folder as $XDG_CONFIG_HOME/psql/psqlrc sets one history file per database +.local/state/psql +.local/state/wget/history +# .local/state/zsh/history -> zsh overwrites the symlink unfortunately diff --git a/.config/mackup/mackup.cfg b/.config/mackup/mackup.cfg new file mode 100644 index 0000000..1be6c06 --- /dev/null +++ b/.config/mackup/mackup.cfg @@ -0,0 +1,35 @@ +[storage] +engine = file_system +path = /home/alexander/Cloud/Getraenkemarkt +directory = Mackup + +[applications_to_ignore] +# Do not sync configuration files managed by +# https://code.webartifex.biz/alexander/dotfiles + +alacritty +bash +bat +git +flameshot +mackup +neofetch +p10k +pgsql +poetry +ssh +vim +zsh + +# Do not sync $XDG_DATA_HOME/password-store as it contains symlinks +# that Nextcloud does NOT support +pass + + +# This section is mainly needed such that this file +# does not cause a ConfigParser error +# => Background: The enclosing folder should only +# contain config files for individual applications +# that are to be synced and not mackup's own config +[application] +name = mackup diff --git a/.config/mackup/nautilus.cfg b/.config/mackup/nautilus.cfg new file mode 100644 index 0000000..cac15a4 --- /dev/null +++ b/.config/mackup/nautilus.cfg @@ -0,0 +1,5 @@ +[application] +name = Gnome Files a.k.a. Nautilus + +[xdg_configuration_files] +gtk-3.0/bookmarks diff --git a/.config/mackup/remmina.cfg b/.config/mackup/remmina.cfg new file mode 100644 index 0000000..3eb4fcc --- /dev/null +++ b/.config/mackup/remmina.cfg @@ -0,0 +1,8 @@ +[application] +name = Remmina's remote clients and config + +[configuration_files] +# Note: $XDG_CONFIG_HOME => ~/.config +.config/remmina/remmina.pref +# Note: $XDG_DATA_HOME => ~/.local/share +.local/share/remmina diff --git a/.config/mackup/ssh_private.cfg b/.config/mackup/ssh_private.cfg new file mode 100644 index 0000000..3b8153d --- /dev/null +++ b/.config/mackup/ssh_private.cfg @@ -0,0 +1,5 @@ +[application] +name = private SSH (config) files + +[configuration_files] +.ssh/config diff --git a/.config/mediathek-view/README.md b/.config/mediathek-view/README.md new file mode 100644 index 0000000..00a25fb --- /dev/null +++ b/.config/mediathek-view/README.md @@ -0,0 +1,12 @@ +# MediathekView + +This folder contains the configuration for the tool + [MediathekView](https://mediathekview.de/), + a downloading software for Germany's public media publications. + +Some files in this folder get created by running the program + and are *not* kept under version control. + +**Important**: In order for the configurations in this folder to be used, + the program must be started with a custom config location, i.e.: + `/opt/MediathekView/MediathekView $XDG_CONFIG_HOME/mediathek-view` diff --git a/.config/mediathek-view/bookmarks.json b/.config/mediathek-view/bookmarks.json new file mode 100644 index 0000000..b2914f7 --- /dev/null +++ b/.config/mediathek-view/bookmarks.json @@ -0,0 +1,3 @@ +{ + "bookmarks" : [ ] +} \ No newline at end of file diff --git a/.local/state/psql/.gitkeep b/.config/mediathek-view/downloadAbos.txt similarity index 100% rename from .local/state/psql/.gitkeep rename to .config/mediathek-view/downloadAbos.txt diff --git a/.config/mediathek-view/mediathek.xml b/.config/mediathek-view/mediathek.xml new file mode 100644 index 0000000..2244424 --- /dev/null +++ b/.config/mediathek-view/mediathek.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + true + + + false + 0 + + false + + true + true + + false + + 75,75,150,100,150,250,50,50,100,100,100,100,100,100,100,50,50,0,100,0,0,200,0,0,200,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0|0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39|| + 75,100,200,300,20,20,20,100,100,100,100,50,50,100,500,0,0|0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,0|| + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + /usr/bin/ffmpeg + /usr/bin/vlc + + + + + true + true + true + true + true + false + true + true + false + 2 + 6 + + + + + + + Linux Speichern + http + mp4,mp3,m4v,flv,m4a + /home/alexander/downloads/mediathek-view + %t-%T-%z + true + false + true + + true + false + false + 25 + normal + Standardset zum Speichern der Filme + false + false + false + + + ffmpeg + %t-%T-%Z.mp4 + /usr/bin/ffmpeg + -i %f -c copy -bsf:a aac_adtstoasc ** + http + m3u8 + false + false + + + VLC + %t-%T-%Z.ts + /usr/bin/vlc + %f :sout=#standard{access=file,mux=ts,dst=**} -I dummy --play-and-exit + false + false + + + Linux Abspielen + true + true + false + + false + false + false + 25 + normal + Standardset zum direkten Abspielen der Filme + false + false + false + + + Vlc + /usr/bin/vlc + %f --play-and-exit + false + false + + + + + _ + + + + + + \ No newline at end of file diff --git a/.config/neofetch/config.conf b/.config/neofetch/config.conf new file mode 100644 index 0000000..91cb11f --- /dev/null +++ b/.config/neofetch/config.conf @@ -0,0 +1,859 @@ +# See this Wiki for more info: +# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info + +print_info() { + info title + info underline + + info "OS" distro + info "Host" model + info "Kernel" kernel + info "Uptime" uptime + info "Packages" packages + info "Shell" shell + info "Resolution" resolution + info "DE" de + info "WM" wm + info "WM Theme" wm_theme + info "Theme" theme + info "Icons" icons + info "Terminal" term + info "Terminal Font" term_font + info "Font" font + info "CPU" cpu + info "GPU" gpu + info "GPU Driver" gpu_driver + info "Memory" memory + info "Disk" disk + info "Local IP" local_ip + info "Public IP" public_ip + info "Locale" locale + + info cols +} + +# Title + + +# Hide/Show Fully qualified domain name. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --title_fqdn +title_fqdn="on" + + +# Kernel + + +# Shorten the output of the kernel function. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --kernel_shorthand +# Supports: Everything except *BSDs (except PacBSD and PC-BSD) +# +# Example: +# on: '4.8.9-1-ARCH' +# off: 'Linux 4.8.9-1-ARCH' +kernel_shorthand="on" + + +# Distro + + +# Shorten the output of the distro function +# +# Default: 'off' +# Values: 'on', 'tiny', 'off' +# Flag: --distro_shorthand +# Supports: Everything except Windows and Haiku +distro_shorthand="off" + +# Show/Hide OS Architecture. +# Show 'x86_64', 'x86' and etc in 'Distro:' output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --os_arch +# +# Example: +# on: 'Arch Linux x86_64' +# off: 'Arch Linux' +os_arch="on" + + +# Uptime + + +# Shorten the output of the uptime function +# +# Default: 'on' +# Values: 'on', 'tiny', 'off' +# Flag: --uptime_shorthand +# +# Example: +# on: '2 days, 10 hours, 3 mins' +# tiny: '2d 10h 3m' +# off: '2 days, 10 hours, 3 minutes' +uptime_shorthand="off" + + +# Memory + + +# Show memory pecentage in output. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --memory_percent +# +# Example: +# on: '1801MiB / 7881MiB (22%)' +# off: '1801MiB / 7881MiB' +memory_percent="on" + +# Change memory output unit. +# +# Default: 'mib' +# Values: 'kib', 'mib', 'gib' +# Flag: --memory_unit +# +# Example: +# kib '1020928KiB / 7117824KiB' +# mib '1042MiB / 6951MiB' +# gib: ' 0.98GiB / 6.79GiB' +memory_unit="gib" + + +# Packages + + +# Show/Hide Package Manager names. +# +# Default: 'tiny' +# Values: 'on', 'tiny' 'off' +# Flag: --package_managers +# +# Example: +# on: '998 (pacman), 8 (flatpak), 4 (snap)' +# tiny: '908 (pacman, flatpak, snap)' +# off: '908' +package_managers="on" + + +# Shell + + +# Show the path to $SHELL +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --shell_path +# +# Example: +# on: '/bin/bash' +# off: 'bash' +shell_path="off" + +# Show $SHELL version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --shell_version +# +# Example: +# on: 'bash 4.4.5' +# off: 'bash' +shell_version="on" + + +# CPU + + +# CPU speed type +# +# Default: 'bios_limit' +# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'. +# Flag: --speed_type +# Supports: Linux with 'cpufreq' +# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value. +speed_type="bios_limit" + +# CPU speed shorthand +# +# Default: 'off' +# Values: 'on', 'off'. +# Flag: --speed_shorthand +# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz +# +# Example: +# on: 'i7-6500U (4) @ 3.1GHz' +# off: 'i7-6500U (4) @ 3.100GHz' +speed_shorthand="off" + +# Enable/Disable CPU brand in output. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_brand +# +# Example: +# on: 'Intel i7-6500U' +# off: 'i7-6500U (4)' +cpu_brand="on" + +# CPU Speed +# Hide/Show CPU speed. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --cpu_speed +# +# Example: +# on: 'Intel i7-6500U (4) @ 3.1GHz' +# off: 'Intel i7-6500U (4)' +cpu_speed="on" + +# CPU Cores +# Display CPU cores in output +# +# Default: 'logical' +# Values: 'logical', 'physical', 'off' +# Flag: --cpu_cores +# Support: 'physical' doesn't work on BSD. +# +# Example: +# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores) +# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores) +# off: 'Intel i7-6500U @ 3.1GHz' +cpu_cores="logical" + +# CPU Temperature +# Hide/Show CPU temperature. +# Note the temperature is added to the regular CPU function. +# +# Default: 'off' +# Values: 'C', 'F', 'off' +# Flag: --cpu_temp +# Supports: Linux, BSD +# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable +# coretemp kernel module. This only supports newer Intel processors. +# +# Example: +# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]' +# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]' +# off: 'Intel i7-6500U (4) @ 3.1GHz' +cpu_temp="C" + + +# GPU + + +# Enable/Disable GPU Brand +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gpu_brand +# +# Example: +# on: 'AMD HD 7950' +# off: 'HD 7950' +gpu_brand="on" + +# Which GPU to display +# +# Default: 'all' +# Values: 'all', 'dedicated', 'integrated' +# Flag: --gpu_type +# Supports: Linux +# +# Example: +# all: +# GPU1: AMD HD 7950 +# GPU2: Intel Integrated Graphics +# +# dedicated: +# GPU1: AMD HD 7950 +# +# integrated: +# GPU1: Intel Integrated Graphics +gpu_type="all" + + +# Resolution + + +# Display refresh rate next to each monitor +# Default: 'off' +# Values: 'on', 'off' +# Flag: --refresh_rate +# Supports: Doesn't work on Windows. +# +# Example: +# on: '1920x1080 @ 60Hz' +# off: '1920x1080' +refresh_rate="on" + + +# Gtk Theme / Icons / Font + + +# Shorten output of GTK Theme / Icons / Font +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --gtk_shorthand +# +# Example: +# on: 'Numix, Adwaita' +# off: 'Numix [GTK2], Adwaita [GTK3]' +gtk_shorthand="off" + + +# Enable/Disable gtk2 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk2 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Adwaita [GTK3]' +gtk2="on" + +# Enable/Disable gtk3 Theme / Icons / Font +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --gtk3 +# +# Example: +# on: 'Numix [GTK2], Adwaita [GTK3]' +# off: 'Numix [GTK2]' +gtk3="on" + + +# IP Address + + +# Website to ping for the public IP +# +# Default: 'http://ident.me' +# Values: 'url' +# Flag: --ip_host +public_ip_host="http://ident.me" + +# Public IP timeout. +# +# Default: '2' +# Values: 'int' +# Flag: --ip_timeout +public_ip_timeout=2 + + +# Desktop Environment + + +# Show Desktop Environment version +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --de_version +de_version="on" + + +# Disk + + +# Which disks to display. +# The values can be any /dev/sdXX, mount point or directory. +# NOTE: By default we only show the disk info for '/'. +# +# Default: '/' +# Values: '/', '/dev/sdXX', '/path/to/drive'. +# Flag: --disk_show +# +# Example: +# disk_show=('/' '/dev/sdb1'): +# 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 823G / 893G (93%)' +# +# disk_show=('/'): +# 'Disk (/): 74G / 118G (66%)' +# +disk_show=('/') + +# Disk subtitle. +# What to append to the Disk subtitle. +# +# Default: 'mount' +# Values: 'mount', 'name', 'dir', 'none' +# Flag: --disk_subtitle +# +# Example: +# name: 'Disk (/dev/sda1): 74G / 118G (66%)' +# 'Disk (/dev/sdb2): 74G / 118G (66%)' +# +# mount: 'Disk (/): 74G / 118G (66%)' +# 'Disk (/mnt/Local Disk): 74G / 118G (66%)' +# 'Disk (/mnt/Videos): 74G / 118G (66%)' +# +# dir: 'Disk (/): 74G / 118G (66%)' +# 'Disk (Local Disk): 74G / 118G (66%)' +# 'Disk (Videos): 74G / 118G (66%)' +# +# none: 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +# 'Disk: 74G / 118G (66%)' +disk_subtitle="mount" + +# Disk percent. +# Show/Hide disk percent. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --disk_percent +# +# Example: +# on: 'Disk (/): 74G / 118G (66%)' +# off: 'Disk (/): 74G / 118G' +disk_percent="on" + + +# Song + + +# Manually specify a music player. +# +# Default: 'auto' +# Values: 'auto', 'player-name' +# Flag: --music_player +# +# Available values for 'player-name': +# +# amarok +# audacious +# banshee +# bluemindo +# clementine +# cmus +# deadbeef +# deepin-music +# dragon +# elisa +# exaile +# gnome-music +# gmusicbrowser +# gogglesmm +# guayadeque +# io.elementary.music +# iTunes +# juk +# lollypop +# mocp +# mopidy +# mpd +# muine +# netease-cloud-music +# olivia +# playerctl +# pogo +# pragha +# qmmp +# quodlibet +# rhythmbox +# sayonara +# smplayer +# spotify +# strawberry +# tauonmb +# tomahawk +# vlc +# xmms2d +# xnoise +# yarock +music_player="auto" + +# Format to display song information. +# +# Default: '%artist% - %album% - %title%' +# Values: '%artist%', '%album%', '%title%' +# Flag: --song_format +# +# Example: +# default: 'Song: Jet - Get Born - Sgt Major' +song_format="%artist% - %album% - %title%" + +# Print the Artist, Album and Title on separate lines +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --song_shorthand +# +# Example: +# on: 'Artist: The Fratellis' +# 'Album: Costello Music' +# 'Song: Chelsea Dagger' +# +# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger' +song_shorthand="off" + +# 'mpc' arguments (specify a host, password etc). +# +# Default: '' +# Example: mpc_args=(-h HOST -P PASSWORD) +mpc_args=() + + +# Text Colors + + +# Text Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --colors +# +# Each number represents a different part of the text in +# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info' +# +# Example: +# colors=(distro) - Text is colored based on Distro colors. +# colors=(4 6 1 8 8 6) - Text is colored in the order above. +colors=(distro) + + +# Text Options + + +# Toggle bold text +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bold +bold="on" + +# Enable/Disable Underline +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --underline +underline_enabled="on" + +# Underline character +# +# Default: '-' +# Values: 'string' +# Flag: --underline_char +underline_char="=" + + +# Info Separator +# Replace the default separator with the specified string. +# +# Default: ':' +# Flag: --separator +# +# Example: +# separator="->": 'Shell-> bash' +# separator=" =": 'WM = dwm' +separator=":" + + +# Color Blocks + + +# Color block range +# The range of colors to print. +# +# Default: '0', '15' +# Values: 'num' +# Flag: --block_range +# +# Example: +# +# Display colors 0-7 in the blocks. (8 colors) +# neofetch --block_range 0 7 +# +# Display colors 0-15 in the blocks. (16 colors) +# neofetch --block_range 0 15 +block_range=(0 15) + +# Toggle color blocks +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --color_blocks +color_blocks="on" + +# Color block width in spaces +# +# Default: '3' +# Values: 'num' +# Flag: --block_width +block_width=3 + +# Color block height in lines +# +# Default: '1' +# Values: 'num' +# Flag: --block_height +block_height=1 + +# Color Alignment +# +# Default: 'auto' +# Values: 'auto', 'num' +# Flag: --col_offset +# +# Number specifies how far from the left side of the terminal (in spaces) to +# begin printing the columns, in case you want to e.g. center them under your +# text. +# Example: +# col_offset="auto" - Default behavior of neofetch +# col_offset=7 - Leave 7 spaces then print the colors +col_offset="auto" + +# Progress Bars + + +# Bar characters +# +# Default: '-', '=' +# Values: 'string', 'string' +# Flag: --bar_char +# +# Example: +# neofetch --bar_char 'elapsed' 'total' +# neofetch --bar_char '-' '=' +bar_char_elapsed="-" +bar_char_total="=" + +# Toggle Bar border +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --bar_border +bar_border="on" + +# Progress bar length in spaces +# Number of chars long to make the progress bars. +# +# Default: '15' +# Values: 'num' +# Flag: --bar_length +bar_length=15 + +# Progress bar colors +# When set to distro, uses your distro's logo colors. +# +# Default: 'distro', 'distro' +# Values: 'distro', 'num' +# Flag: --bar_colors +# +# Example: +# neofetch --bar_colors 3 4 +# neofetch --bar_colors distro 5 +bar_color_elapsed="distro" +bar_color_total="distro" + + +# Info display +# Display a bar with the info. +# +# Default: 'off' +# Values: 'bar', 'infobar', 'barinfo', 'off' +# Flags: --cpu_display +# --memory_display +# --battery_display +# --disk_display +# +# Example: +# bar: '[---=======]' +# infobar: 'info [---=======]' +# barinfo: '[---=======] info' +# off: 'info' +cpu_display="off" +memory_display="off" +battery_display="off" +disk_display="off" + + +# Backend Settings + + +# Image backend. +# +# Default: 'ascii' +# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off', +# 'pot', 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty' +# Flag: --backend +image_backend="ascii" + +# Image Source +# +# Which image or ascii file to display. +# +# Default: 'auto' +# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/' +# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")' +# Flag: --source +# +# NOTE: 'auto' will pick the best image source for whatever image backend is used. +# In ascii mode, distro ascii art will be used and in an image mode, your +# wallpaper will be used. +image_source="auto" + + +# Ascii Options + + +# Ascii distro +# Which distro's ascii art to display. +# +# Default: 'auto' +# Values: 'auto', 'distro_name' +# Flag: --ascii_distro +# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, "AOSC OS", +# "AOSC OS/Retro", Apricity, ArcoLinux, ArchBox, ARCHlabs, +# ArchStrike, XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, +# Bitrig, BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD, +# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS, +# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover, +# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin, +# DesaOS, Devuan, DracOS, DarkOs, DragonFly, Drauger, Elementary, +# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD, +# FreeMiNT, Frugalware, Funtoo, GalliumOS, Garuda, Gentoo, Pentoo, +# gNewSense, GNOME, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra, +# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion, +# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite, +# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva, +# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib, +# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner, +# NuTyX, OBRevenge, OpenBSD, openEuler, OpenIndiana, openmamba, +# OpenMandriva, OpenStage, OpenWrt, osmc, Oracle, OS Elbrus, PacBSD, +# Parabola, Pardus, Parrot, Parsix, TrueOS, PCLinuxOS, Peppermint, +# popos, Porteus, PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix, +# Raspbian, Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, +# Regata, Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, +# Septor, SereneLinux, SharkLinux, Siduction, Slackware, SliTaz, +# SmartOS, Solus, Source_Mage, Sparky, Star, SteamOS, SunOS, +# openSUSE_Leap, openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, +# Trisquel, Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio, +# Ubuntu, Venom, Void, Obarun, windows10, Windows7, Xubuntu, Zorin, +# and IRIX have ascii logos +# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants. +# Use '{distro name}_old' to use the old logos. +# NOTE: Ubuntu has flavor variants. +# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME, +# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors. +# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu, +# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android, +# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola, +# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS, +# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian, +# postmarketOS, and Void have a smaller logo variant. +# Use '{distro name}_small' to use the small variants. +ascii_distro="auto" + +# Ascii Colors +# +# Default: 'distro' +# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num' +# Flag: --ascii_colors +# +# Example: +# ascii_colors=(distro) - Ascii is colored based on Distro colors. +# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors. +ascii_colors=(distro) + +# Bold ascii logo +# Whether or not to bold the ascii logo. +# +# Default: 'on' +# Values: 'on', 'off' +# Flag: --ascii_bold +ascii_bold="on" + + +# Image Options + + +# Image loop +# Setting this to on will make neofetch redraw the image constantly until +# Ctrl+C is pressed. This fixes display issues in some terminal emulators. +# +# Default: 'off' +# Values: 'on', 'off' +# Flag: --loop +image_loop="off" + +# Thumbnail directory +# +# Default: '~/.cache/thumbnails/neofetch' +# Values: 'dir' +thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch" + +# Crop mode +# +# Default: 'normal' +# Values: 'normal', 'fit', 'fill' +# Flag: --crop_mode +# +# See this wiki page to learn about the fit and fill options. +# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F +crop_mode="normal" + +# Crop offset +# Note: Only affects 'normal' crop mode. +# +# Default: 'center' +# Values: 'northwest', 'north', 'northeast', 'west', 'center' +# 'east', 'southwest', 'south', 'southeast' +# Flag: --crop_offset +crop_offset="center" + +# Image size +# The image is half the terminal width by default. +# +# Default: 'auto' +# Values: 'auto', '00px', '00%', 'none' +# Flags: --image_size +# --size +image_size="auto" + +# Gap between image and text +# +# Default: '3' +# Values: 'num', '-num' +# Flag: --gap +gap=3 + +# Image offsets +# Only works with the w3m backend. +# +# Default: '0' +# Values: 'px' +# Flags: --xoffset +# --yoffset +yoffset=0 +xoffset=0 + +# Image background color +# Only works with the w3m backend. +# +# Default: '' +# Values: 'color', 'blue' +# Flag: --bg_color +background_color= + + +# Misc Options + +# Stdout mode +# Turn off all colors and disables image backend (ASCII/Image). +# Useful for piping into another command. +# Default: 'off' +# Values: 'on', 'off' +stdout="off" diff --git a/.config/psql/psqlrc b/.config/psql/psqlrc index e65bdc3..cec074d 100644 --- a/.config/psql/psqlrc +++ b/.config/psql/psqlrc @@ -1,48 +1,35 @@ --- `psql` executes the commands in this file creating output --- => This flag hides that and is unset again at the bottom +-- psql executes the commands in this ~/.psqlrc creating output +-- (this flag hides that and is unset again at the bottom) \set QUIET 1 - -- Show verbose error messages \set VERBOSITY verbose - --- Use normal "table" format by default --- and "expanded table" with lots of columns +-- Use normal "table" format by default and "expanded table" with lots of columns \x auto - --- By default, `NULL`s show up as empty spaces, --- which may be confused with empty strings --- => Show "NULL" instead for clarity +-- By default, NULLs show up as empty spaces, which looks like empty strings \pset null 'NULL' - --- Ignore errors in interactive sessions --- but not when executing scripts +-- Ignore errors in interactive sessions but not when executing scripts \set ON_ERROR_ROLLBACK interactive - -- Upper case SQL keywords \set COMP_KEYWORD_CASE upper - --- Make VI the default editor +-- Use the best text editor in the world \set EDITOR vi - --- Use separate history files per database --- and keep them in one folder +-- Use separate history files per database and +-- keep them in one folder (for easier sync with mackup) +-- under $XDG_STATE_HOME/psql \set HISTFILE ~/.local/state/psql/history- :DBNAME - -- Don't store the same SQL statement repeatedly \set HISTCONTROL ignoredups - -- Make all queries display query times \timing - -- Unset the flag set at the top of this file \unset QUIET diff --git a/.config/pypoetry/config.toml b/.config/pypoetry/config.toml new file mode 100644 index 0000000..53b35d3 --- /dev/null +++ b/.config/pypoetry/config.toml @@ -0,0 +1,3 @@ +[virtualenvs] +create = true +in-project = true diff --git a/.config/python/pythonrc b/.config/python/pythonrc new file mode 100644 index 0000000..924ee35 --- /dev/null +++ b/.config/python/pythonrc @@ -0,0 +1,38 @@ +# This file moves Python's history file to $XDG_STATE_HOME/python/history +# Adapted from: https://unix.stackexchange.com/questions/630642/change-location-of-python-history + +import os +import atexit +import readline + +try: + import pathlib +except ImportError: # not part of python2 + pass +else: + + if readline.get_current_history_length() == 0: + state_home = os.environ.get("XDG_STATE_HOME") + if state_home is None: + state_home = pathlib.Path.home() / ".local" / "state" + else: + state_home = pathlib.Path(state_home) + + history_path = state_home / "python" / "history" + if history_path.is_dir(): + raise OSError(history_path + " cannot be a directory") + + history = str(history_path) + + try: + readline.read_history_file(history) + except OSError: # Non existent + pass + + def write_history(): + try: + readline.write_history_file(history) + except OSError: + pass + + atexit.register(write_history) diff --git a/.config/python/startup.py b/.config/python/startup.py deleted file mode 100644 index 9c1a938..0000000 --- a/.config/python/startup.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Move Python's history file to "$XDG_STATE_HOME/python/history".""" - -import atexit -import os -import readline -import sys - - -# For Python 3.13+ let `$PYTHON_HISTORY` handle it -if sys.version_info >= (3, 13): - sys.exit(0) - - -# For Python 2, do nothing -try: - import pathlib -except ImportError: - sys.exit(0) - - -if readline.get_current_history_length() == 0: - state_home = os.environ.get("XDG_STATE_HOME") - - if state_home is None: - state_home = pathlib.Path.home() / ".local" / "state" - else: - state_home = pathlib.Path(state_home) - - history_path = state_home / "python" / "history" - history_path.parent.mkdir(parents=True, exist_ok=True) - - history_location = str(history_path) - - if history_path.is_dir(): - msg = history_location + " must not be a directory" - raise OSError(msg) - - try: - readline.read_history_file(history_location) - except OSError: # Non existent - pass - - readline.set_auto_history() - readline.set_history_length(99999) - - def write_history(): - try: - readline.write_history_file(history_location) - except OSError: - pass - - atexit.register(write_history) - diff --git a/.config/shell/README.md b/.config/shell/README.md index bd3a821..7731f1c 100644 --- a/.config/shell/README.md +++ b/.config/shell/README.md @@ -1,3 +1,11 @@ -# Shell-related Configurations +# Shell-related Configuration -This folder contains files that are sourced by `bash` and `zsh`. +This folder contains further files that are sourced by `bash` and `zsh`. + +[init.sh](https://gitlab.webartifex.biz/alexander/dotfiles/-/blob/main/.config/shell/init.sh) + contains the common initialization logic for all shells + and + integrates the two sub-folders + [aliases.d](https://gitlab.webartifex.biz/alexander/dotfiles/-/tree/main/.config/shell/aliases.d) + and + [utils.d](https://gitlab.webartifex.biz/alexander/dotfiles/-/tree/main/.config/shell/utils.d). diff --git a/.config/shell/aliases b/.config/shell/aliases deleted file mode 100644 index 19a151c..0000000 --- a/.config/shell/aliases +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -# Aliases used in all kinds of shells - - -# Manage the bare `git` repository in ~/ holding the dotfiles -alias dotfiles='git --git-dir=$XDG_DATA_HOME/dotfiles --work-tree=$HOME' - - -# Integrate `git` -if _command_exists git; then - alias g='git' - - # Make all `git` aliases become shell aliases with a "g" prefix - for al in $(git aliases-internal); do - # Only "real" (i.e., short) aliases are created - [ ${#al} -lt 7 ] && eval "alias g$al='git $al'" - done - - # Check if a "main" branch exists in place of a "master" branch - git_main_branch() { - if [[ -n "$(git branch --list main)" ]]; then - echo "main" - else - echo "master" - fi - } -fi diff --git a/.config/shell/aliases.d/README.md b/.config/shell/aliases.d/README.md new file mode 100644 index 0000000..81e8657 --- /dev/null +++ b/.config/shell/aliases.d/README.md @@ -0,0 +1,7 @@ +# Shell Aliases + +This folder contains various files that define aliases + to be used in the shell. + +Originally, they all were defined in one big "~/.config/shell/aliases.sh" file + but are now split across many smaller files here for clarity. diff --git a/.config/shell/aliases.d/files.sh b/.config/shell/aliases.d/files.sh new file mode 100644 index 0000000..9e20725 --- /dev/null +++ b/.config/shell/aliases.d/files.sh @@ -0,0 +1,59 @@ +# Make working with files more convenient + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +# Avoid bad mistakes and show what happens +alias cp="cp --interactive --verbose" +alias ln='ln --interactive --verbose' +alias mv='mv --interactive --verbose' +alias rm='rm -I --preserve-root --verbose' + + +# Faster directory switching +alias cd..='cd ..' +alias ..='cd ..' +alias ...='cd ../..' +alias ....='cd ../../..' +alias .....='cd ../../../..' + + +# Convenient defaults +alias mkdir='mkdir -p' +alias md='mkdir' +alias rmdir='rmdir --parents --verbose' +alias rd='rmdir' + + +# Convenient grepping +alias grep='grep --color=auto --exclude-dir={.cache,\*.egg-info,.git,.nox,.tox,.venv}' +alias egrep='egrep --color=auto --exclude-dir={.cache,\*.egg-info,.git,.nox,.tox,.venv}' +alias fgrep='fgrep --color=auto --exclude-dir={.cache,*.egg-info,.git,.nox,.tox,.venv}' + + +# Convenient searching +alias fdir='find . -type d -name' +alias ffile='find . -type f -name' + + +# Convenient listings +alias ls='ls --classify --color=auto --group-directories-first --human-readable --no-group --time-style=long-iso' +alias la='ls --almost-all' +alias lal='la -l' +alias ll='ls -l' +alias l.='ls --directory .*' +alias ll.='l. -l' + + +# More convenience with various other file-related utilities +alias df='df --human-readable' +alias du='du --human-readable' +alias diff='diff --color=auto --unified' +_command_exists colordiff && alias diff='colordiff --unified' +alias free='free --human --total' +alias less='less --chop-long-lines --ignore-case --LONG-PROMPT --no-init --status-column --quit-if-one-screen' +alias more='less' +alias tree='tree -C --dirsfirst' diff --git a/.config/shell/aliases.d/generic.sh b/.config/shell/aliases.d/generic.sh new file mode 100644 index 0000000..1134d7f --- /dev/null +++ b/.config/shell/aliases.d/generic.sh @@ -0,0 +1,77 @@ +# Generic shell aliases for bash and zsh + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + +_in_zsh() { + [ -n "$ZSH_VERSION" ] +} + + +# Re-run last command with sudo privileges +if _in_zsh; then + alias ,,='sudo $(fc -ln -1)' +else + alias ,,='sudo $(history -p !!)' +fi + + +# Convenient piping with zsh +if _in_zsh; then + alias -g B='| bat' + alias -g F='| fzf' + alias -g G='| grep' + alias -g H='| head' + alias -g L='| less' + alias -g T='| tail' + alias -g NE='2 > /dev/null' + alias -g NUL='> /dev/null 2>&1' +fi + + +# (Non-)obvious synonyms +alias cls='clear' +alias help='man' + + +# Edit the $HISTFILE +alias HISTFILE="vi $HISTFILE" + + +# Various one-line utilities +alias datetime='date +"%Y-%m-%d %H:%M:%S %z (%Z)"' +alias datetime-iso='date --iso-8601=seconds' +alias dotfiles='git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME' +alias external-ip="curl https://icanhazip.com" +alias external-ip-alt="curl https://ipinfo.io/ip\?token=cfd78a97e15ebf && echo" +alias external-ip-extended-infos="curl https://ipinfo.io/json\?token=cfd78a97e15ebf && echo" +alias speedtest="curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/22210ca35228f0bbcef75a7c14587c4ecb875ab4/speedtest.py | python -" + + +# Fix common typos +_command_exists ifconfig && alias ipconfig='ifconfig' +_command_exists R && alias r='R' + + +# Use sane defaults +_command_exists exa && alias exa='exa --group-directories-first --git --time-style=long-iso' +_command_exists netstat && alias ports='netstat -tulanp' +_command_exists screenfetch && alias screenfetch='screenfetch -n' +alias uptime='uptime --pretty' +alias wget="wget --continue --hsts-file=$XDG_STATE_HOME/wget/history" + + +# Create shorter aliases for various utilities +_command_exists batcat && alias bat='batcat' +_command_exists fdfind && alias fd='fdfind' +_command_exists neofetch && alias nf='neofetch' +_command_exists ranger && alias rn='ranger' +_command_exists screenfetch && alias sf='screenfetch' + + +# Alias to align commands in ~/.config/i3/config +# Debian/Arch => dex +# Fedora => dex-autostart +_command_exists dex-autostart && alias dex='dex-autostart' diff --git a/.config/shell/aliases.d/git.sh b/.config/shell/aliases.d/git.sh new file mode 100644 index 0000000..10d1d0c --- /dev/null +++ b/.config/shell/aliases.d/git.sh @@ -0,0 +1,24 @@ +# All git aliases (with < 7 characters) become shell aliases with a "g" prefix + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +if _command_exists git; then + alias g='git' + + for al in $(git internal-aliases); do + [ ${#al} -lt 7 ] && eval "alias g$al='git $al'" + done + + # Check if a 'main' branch exists in place of a 'master' branch + git_main_branch() { + if [[ -n "$(git branch --list main)" ]]; then + echo 'main' + else + echo 'master' + fi + } +fi diff --git a/.config/shell/aliases.d/python.sh b/.config/shell/aliases.d/python.sh new file mode 100644 index 0000000..126cd31 --- /dev/null +++ b/.config/shell/aliases.d/python.sh @@ -0,0 +1,25 @@ +# Make working with Python more convenient + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +# Interactive shells +alias py='python' +alias bpy='bpython' +alias ipy='ipython' + + +if _command_exists poetry; then + alias pr='poetry run' +fi + + +if _command_exists pyenv; then + alias pyvenvs='pyenv virtualenvs --bare --skip-aliases' + alias pyver='pyenv version' + alias pyvers='pyenv versions --skip-aliases' + alias pywhich='pyenv which' +fi diff --git a/.config/shell/env b/.config/shell/env deleted file mode 100644 index b1f9a2d..0000000 --- a/.config/shell/env +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -# Environment variables for all kinds of shells - - -# Standard XDG base directories -# See: https://wiki.archlinux.org/title/XDG_Base_Directory -export XDG_CACHE_HOME="$HOME/.cache" -export XDG_CONFIG_HOME="$HOME/.config" -export XDG_DATA_HOME="$HOME/.local/share" # also set in ~/.local/bin/install-dotfiles -export XDG_STATE_HOME="$HOME/.local/state" -# Make up a XDG directory for binaries (that does not exist in the standard) -export XDG_BIN_HOME="$HOME/.local/bin" - - -# Convenient names for various places in the system -export DOTFILES_DIR="$XDG_DATA_HOME/dotfiles" # also set in ~/.local/bin/install-dotfiles - - -# Generic shell configs -export EDITOR=vim -export GPG_TTY=$(tty) -export PAGER="less --chop-long-lines --ignore-case --LONG-PROMPT --no-init --status-column --quit-if-one-screen" -export TERM=xterm-256color -export TZ="Europe/Berlin" -export VISUAL=$EDITOR - - -# Move common tools' config and cache files into XDG directories -export BAT_CONFIG_PATH="$XDG_CONFIG_HOME/bat/config" -export LESSHISTFILE="$XDG_STATE_HOME/less/history" -export PSQLRC="$XDG_CONFIG_HOME/psql/psqlrc" -export PYTHON_HISTORY="$XDG_STATE_HOME/python/history" -export PYTHONSTARTUP="$XDG_CONFIG_HOME/python/startup.py" -export VIMINIT="source $XDG_CONFIG_HOME/vim/vimrc" diff --git a/.config/shell/init.sh b/.config/shell/init.sh new file mode 100644 index 0000000..5b6e6ab --- /dev/null +++ b/.config/shell/init.sh @@ -0,0 +1,49 @@ +# This file initializes the shell + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +_init_pyenv () { # used in ~/.config/shell/utils.d/python.sh as well + _command_exists pyenv || return + + eval "$(pyenv init -)" + eval "$(pyenv virtualenv-init -)" +} +_init_pyenv + + +_in_x11 () { + _result=$(loginctl show-session $(loginctl | grep $(whoami) | awk '{print $1}') -p Type --value) + if [[ $_result == "x11" ]]; then + return 0 + else + return 1 + fi +} + +_in_wayland () { + _result=$(loginctl show-session $(loginctl | grep $(whoami) | awk '{print $1}') -p Type --value) + if [[ $_result == "wayland" ]]; then + return 0 + else + return 1 + fi +} + + +# Configure the keyboard: +# - make right alt the compose key, e.g., for German Umlauts +# - make caps lock a ctrl modifier and Esc key +if _in_x11; then + setxkbmap us -option 'compose:ralt,caps:ctrl_modifier,lv3:menu_switch' + _command_exists xcape && xcape -e "Caps_Lock=Escape" +fi + + +# Load shell utilities and create aliases +for file in $HOME/.config/shell/{utils.d,aliases.d}/*.sh; do + source $file +done diff --git a/.config/shell/logout b/.config/shell/logout deleted file mode 100644 index e5c5993..0000000 --- a/.config/shell/logout +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -# When logging out of a machine, clear the screen to increase privacy - - -if [ "$SHLVL" = 1 ]; then # If on the outermost shell instance - - # Clear screen and scrollback in SSH/terminal emulators - if _command_exists clear; then - clear - printf '\e[3J' # Clear scrollback buffer in modern emulators - fi - - # On real Linux tty, run `clear_console` for full reset as well - if [ -t 0 ] && [ "$(tty)" != "not a tty" ]; then - case "$(tty)" in - /dev/tty[0-9]*) - if _command_exists clear_console; then - clear_console -q - fi - ;; - esac - fi - -fi diff --git a/.config/shell/logout.sh b/.config/shell/logout.sh new file mode 100644 index 0000000..6baa825 --- /dev/null +++ b/.config/shell/logout.sh @@ -0,0 +1 @@ +# This file is sourced by a login shell upon logout diff --git a/.config/shell/utils.d/README.md b/.config/shell/utils.d/README.md new file mode 100644 index 0000000..abbb008 --- /dev/null +++ b/.config/shell/utils.d/README.md @@ -0,0 +1,7 @@ +# Shell Utilities + +This folder contains various files that provide utilities + to be used in the shell. + +Originally, they all were defined in one big "~/.config/shell/utils.sh" file + but are now split across many smaller files here for clarity. diff --git a/.config/shell/utils.d/files.sh b/.config/shell/utils.d/files.sh new file mode 100644 index 0000000..7bf10f1 --- /dev/null +++ b/.config/shell/utils.d/files.sh @@ -0,0 +1,66 @@ +# The utilities defined here make working with files and folders easier + + +# List the $PATH variable, one element per line +# (if an argument is passed, grep for it) +path() { + if [ -n "$1" ]; then + echo $PATH | perl -p -e 's/:/\n/g;' | grep -i "$1" + else + echo $PATH | perl -p -e 's/:/\n/g;' + fi +} + + +# Show folders by size +disk-usage() { + if [ -n "$1" ]; then + _dest="$1" + else + _dest=. + fi + \du --human-readable --max-depth=1 $_dest 2>/dev/null | sort --human-numeric-sort --reverse +} + + +# Search all files in a directory and its children +lsgrep() { + ls --almost-all --directory . ./**/* | uniq | grep --color=auto -i "$*" +} + +# Make a directory and cd there +mcd() { + test -n "$1" || return + mkdir -p "$1" && cd "$1" || return +} + + +# Extract any compressed archive or file +extract() { + if [ -f "$1" ] ; then + case "$1" in + *.tar.bz2) tar xjvf "$1" ;; + *.tar.gz) tar xzvf "$1" ;; + *.tar.xz) tar xvf "$1" ;; + *.bz2) bzip2 -d "$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 automatically" ;; + esac + else + echo "'$1' is not a file" + fi +} + +mktar() { # out of a directory + tar cvzf "${1%%/}.tar.gz" "${1%%/}/" +} + +mkzip() { # out of a file or directory + zip -r "${1%%/}.zip" "$1" +} diff --git a/.config/shell/utils.d/passwords.sh b/.config/shell/utils.d/passwords.sh new file mode 100644 index 0000000..8f089aa --- /dev/null +++ b/.config/shell/utils.d/passwords.sh @@ -0,0 +1,80 @@ +# The utilities defined here allow to create random login credentials + + +# Generate random passwords that are accepted by most services +genpw() { + PARSED=$(getopt --quiet --options=acn: --longoptions=alphanum,clip,chars: -- "$@") + eval set -- "$PARSED" + SYMBOLS='--symbols' + CHARS=30 + XCLIP=false + while true; do + case "$1" in + -a|--alphanum) + SYMBOLS='' + shift + ;; + -c|--clip) + XCLIP=true + shift + ;; + -n|--chars) + CHARS=$2 + shift 2 + ;; + --) + shift + break + ;; + *) + break + ;; + esac + done + PW=$(pwgen --ambiguous --capitalize --numerals --secure $SYMBOLS --remove-chars="|/\\\"\`\'()[]{}<>^~@§$\#" $CHARS 1) + if [[ $XCLIP == true ]]; then + echo $PW | xclip -selection c + else + echo $PW + fi +} + +alias genpw-alphanum='pwgen --ambiguous --capitalize --numerals --secure 30 1' + + +# Random email addresses that look like "normal" ones +genemail() { + PARSED=$(getopt --quiet --options=c --longoptions=clip -- "$@") + eval set -- "$PARSED" + XCLIP=false + while true; do + case "$1" in + -c|--clip) + XCLIP=true + shift + ;; + --) + shift + break + ;; + *) + break + ;; + esac + done + FIRST=$(shuf -i 4-5 -n 1) + LAST=$(shuf -i 8-10 -n 1) + + if _command_exists gpw; then + USER="$(gpw 1 $FIRST).$(gpw 1 $LAST)@webartifex.biz" + else + # Fallback that looks a bit less "normal" + USER="$(pwgen --no-capitalize --no-numerals --secure $FIRST 1).$(pwgen --no-capitalize --no-numerals --secure $LAST 1)@webartifex.biz" + fi + + if [[ $XCLIP == true ]]; then + echo $USER | xclip -selection c + else + echo $USER + fi +} diff --git a/.config/shell/utils.d/python.sh b/.config/shell/utils.d/python.sh new file mode 100644 index 0000000..d63fa6b --- /dev/null +++ b/.config/shell/utils.d/python.sh @@ -0,0 +1,101 @@ +# This file creates a function to install and update the Python develop environments + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + +prepend-to-path () { # if not already there + if [ -d "$1" ] ; then + case :$PATH: in + *:$1:*) ;; + *) PATH=$1:$PATH ;; + esac + fi +} + + + +# The Python versions pyenv creates (in descending order) +# Important: The first version also holds the "interactive" and "utils" environments +_py3_versions=('3.10.6' '3.9.13' '3.8.13' '3.7.13') +_py2_version='2.7.18' + + +# Each Python version receives its own copy of black, pipenv, and poetry +# (e.g., to avoid possible integration problems between pyenv and poetry +# Source: https://github.com/python-poetry/poetry/issues/5252#issuecomment-1055697424) +_py3_site_packages=('black' 'pipenv' 'poetry') + + +# The pyenv virtualenv "utils" contains some globally available tools (e.g., mackup) +_py3_utils=('leglight' 'mackup' 'youtube-dl') + + +# Important: this REMOVES the old ~/.pyenv installation +_install_pyenv() { + echo "(Re-)Installing pyenv" + + # Ensure that pyenv is on the $PATH + # (otherwise, the pyenv installer emits warnings) + mkdir -p "$PYENV_ROOT/bin" + prepend-to-path "$PYENV_ROOT/bin" + + # Remove old pyenv for clean install + rm -rf "$PYENV_ROOT" >/dev/null + + # Run the official pyenv installer + curl https://pyenv.run | bash + + # Make pyenv usable after this installation in the same shell session + _init_pyenv # defined in ~/.config/shell/utils.sh +} + + +create-or-update-python-envs() { + _command_exists pyenv || _install_pyenv + + eval "$(pyenv init --path)" + + # Keep a legacy Python 2.7, just in case + echo "Installing/updating Python $_py2_version" + pyenv install --skip-existing $_py2_version + pyenv rehash # needed on a first install + PYENV_VERSION=$_py2_version pip install --upgrade pip setuptools + PYENV_VERSION=$_py2_version python -c "import sys; print sys.version" + + for version in ${_py3_versions[@]}; do + echo "Installing/updating Python $version" + pyenv install --skip-existing $version + pyenv rehash # needed on a first install + + # Start the new environment with the latest pip and setuptools versions + PYENV_VERSION=$version pip install --upgrade pip setuptools + PYENV_VERSION=$version python -c "import sys; print(sys.version)" + + # Put the specified utilities in the fresh environments or update them + for lib in ${_py3_site_packages[@]}; do + PYENV_VERSION=$version pip install --upgrade $lib + done + done + + # Create a virtualenv based off the latest Python version to host global utilities + echo "Installing/updating the global Python utilities" + pyenv virtualenv $_py3_versions[1] 'utils' + pyenv rehash # needed on a first install + PYENV_VERSION='utils' pip install --upgrade pip setuptools + for util in ${_py3_utils[@]}; do + PYENV_VERSION='utils' pip install --upgrade $util + done + + # Create a virtualenv based off the latest Python version for interactive usage + echo "Installing/updating the default/interactive Python environment" + pyenv virtualenv $_py3_versions[1] 'interactive' + pyenv rehash # needed on a first install + PYENV_VERSION='interactive' pip install --upgrade pip setuptools + # Install some tools to make interactive usage nicer + PYENV_VERSION='interactive' pip install --upgrade black bpython ipython + + # Put all Python binaries/virtualenvs and the utilities on the $PATH + pyenv global 'interactive' $_py3_versions 'utils' $_py2_version +} diff --git a/.config/shell/utils.d/update.sh b/.config/shell/utils.d/update.sh new file mode 100644 index 0000000..29a06c2 --- /dev/null +++ b/.config/shell/utils.d/update.sh @@ -0,0 +1,230 @@ +# This file defines the `update-machine` function that updates basically everything + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + +_in_zsh() { + [ -n "$ZSH_VERSION" ] +} + + + +_update_apt() { + _command_exists apt || return + + echo 'Updating apt packages' + sudo apt update + sudo apt dist-upgrade + sudo apt autoremove + sudo apt clean +} + +_update_dnf() { + _command_exists dnf || return + + echo 'Updating dnf packages' + sudo dnf upgrade --refresh + sudo dnf autoremove + sudo dnf clean all +} + +_remove_old_snaps() { + sudo snap list --all | awk "/disabled/{print $1, $3}" | + while read snapname revision; do + sudo snap remove "$snapname" --revision="$revision" + done +} + + + +function _fetch_repos { + local base_dir="$1" + local has_dirs=false + + if [ "$(ls -A "$base_dir")" ]; then + for dir in "$base_dir"/*; do + if [ -d "$dir" ]; then + has_dirs=true + break + fi + done + fi + + if [ "$has_dirs" = true ]; then + for dir in "$base_dir"/*; do + if [ -d "$dir" ]; then + if [ -d "$dir/.git" ]; then + echo "Fetching $dir" + (cd "$dir" && git fetch --all --prune) + fi + _fetch_repos "$dir" + fi + done + fi +} + +_update_repositories() { + [ -d $REPOS ] || return + + echo 'Updating repositories' + + cwd=$(pwd) + cd $REPOS + + # Otherwise the for-loop waites for manual input + # if it cd's into a folder with a ".env" file + ZSH_DOTENV_FILE='.do_not_run_dotenv' + + _fetch_repos "$REPOS" + + ZSH_DOTENV_FILE='.env' + + _command_exists pass && [ -d "$XDG_DATA_HOME/pass" ] && echo "Fetching $XDG_DATA_HOME/pass" && pass git pull + _update_dotfiles + + cd $cwd +} + +# Update the $XDG_DATA_HOME/dotfiles repository +_update_dotfiles() { + echo "Fetching $XDG_DATA_HOME/dotfiles" + # The `dotfiles` alias is defined in ~/.bashrc at the end of the + # "Shell Utilities & Aliases" section and can NOT be used here + git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME stash --quiet + git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME fetch --all --prune + git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME pull --rebase --quiet + git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME stash pop # --quiet is ignored +} + + + +_update_zsh() { + _in_zsh || return + + echo 'Updating zsh' + _update_omz_fork + _update_zplug +} + +_update_omz_fork() { + _command_exists omz || return + + # In a nutshell, `omz update` pulls the latest origin/master + # from the original "oh-my-zsh" repo + omz update + + cwd=$(pwd) + cd $ZSH + + git checkout --quiet forked # most likely already the case + + # Keep our personal "oh-my-zsh" fork up-to-date + # See: https://code.webartifex.biz/alexander/oh-my-zsh + # Note: Without a proper GPG key, the rebasing is done without signing + + # First, check if `gpg` exists and works in general + # as it might not be set up on some servers + if _command_exists gpg; then + gpg --list-keys > /dev/null + rv=$? + else + rv=1 + fi + + if [ $rv -eq 0 ] && [ $(gpg --list-keys | grep "AB5C0E319D77350FBA6CF143344EA5AB10D868E0") ]; then + git rebase --quiet master + # Only push a properly rebased and signed fork + git push --quiet fork forked --force + git push --quiet fork master + else + git -c commit.gpgsign=false rebase --quiet master + fi + + cd $cwd +} + +_update_zplug() { + _command_exists zplug || return + + zplug update + zplug install # ensure newly added plugins in ~/.zshrc are never forgotten + zplug load +} + + + +_update_python() { + echo 'Updating the Python tool chain' + + if _command_exists pyenv; then + pyenv update + create-or-update-python-envs # defined in ~/.config/shell/utils.d/python.sh + fi + + if _command_exists zsh-pip-cache-packages; then + zsh-pip-clear-cache + zsh-pip-cache-packages + fi +} + + + +restore-gnome() { + _command_exists dconf || return + + for file in $HOME/.config/gnome-settings/*.ini; do + dconf load / < $file + done +} + + + +_fix_locations() { + + # Gnome Seahorse (i.e., "Keyrings") uses ~/.pki by default but also + # detects $XDG_DATA_HOME/pki if it is there and uses it insead; + # setting this explicitly via an environment variable is not possible + if [ -d "$HOME/.pki" ]; then + if [ -d "$XDG_DATA_HOME/pki" ]; then + echo "Warning: both $HOME/.pki and $XDG_DATA_HOME/pki exist!" + else + mv "$HOME/.pki" "$XDG_DATA_HOME/pki" + fi + fi + +} + + + +run-private-scripts() { # in the Nextcloud + sudo --validate || return + + echo + + if [ -d "$HOME/Cloud/Getraenkemarkt/Setup/Shell" ]; then + for file in $HOME/Cloud/Getraenkemarkt/Setup/Shell/*.sh; do + source $file + done + fi +} + + + +update-machine() { + sudo --validate || return + + _update_apt + _update_dnf + _command_exists flatpak && sudo flatpak update -y && sudo flatpak uninstall --unused + _command_exists snap && sudo snap refresh && _remove_old_snaps + _update_repositories + _update_zsh + _update_python + restore-gnome + _fix_locations + run-private-scripts + + sudo --reset-timestamp +} diff --git a/.config/shell/utils.d/web.sh b/.config/shell/utils.d/web.sh new file mode 100644 index 0000000..a58babc --- /dev/null +++ b/.config/shell/utils.d/web.sh @@ -0,0 +1,26 @@ +# This file defines various utilities regarding "the web" + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +# List all internal IPs +internal-ips() { + if _command_exists ifconfig; then + ifconfig | awk '/inet /{ gsub(/addr:/, ""); print $2 }' + else + echo 'ifconfig not installed' + fi +} + + +# Obtain a weather report +weather() { + if [ -n "$1" ]; then + curl "v1.wttr.in/$1" + else + curl 'v1.wttr.in' + fi +} diff --git a/.config/shell/welcome b/.config/shell/welcome deleted file mode 100644 index 1c707a9..0000000 --- a/.config/shell/welcome +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh - -# Show system info each time a shell is started - - -_hostname=$(hostname) -_os="$(uname -s) $(uname -r)" -_uptime=$(uptime -p | sed 's/up //; s/weeks\?/w/g; s/days\?/d/g; s/hours\?/h/g; s/minutes\?/m/g; s/ //g') -_user=$(whoami) -_work_dir=$(echo "$PWD" | sed "s|^$HOME|~|") - - -if [ "$(id -u)" -eq 0 ]; then - _prompt="#" -else - _prompt="$" -fi - - -if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then - _remote=" ssh" -else - _remote=" local" -fi - - -if _in_bash; then - _shell_type="bash" -elif _in_zsh; then - _shell_type="zsh" -else - _shell_type="non-bash/zsh shell" -fi - - -_info_line="$_user@$_hostname:$_work_dir$_prompt$_remote $_os uptime: $_uptime $_shell_type" -_sep_line=$(echo "$_info_line" | sed 's/./─/g') - - -echo "" -echo "$_sep_line" -echo "$_info_line" -echo "$_sep_line" -echo "" diff --git a/.config/user-dirs.dirs b/.config/user-dirs.dirs new file mode 100644 index 0000000..86b0cf4 --- /dev/null +++ b/.config/user-dirs.dirs @@ -0,0 +1,8 @@ +XDG_DESKTOP_DIR="$HOME/Desktop" +XDG_DOCUMENTS_DIR="$HOME/Cloud" +XDG_DOWNLOAD_DIR="$HOME/Downloads" +XDG_MUSIC_DIR="$HOME/Cloud/Photos/Music" +XDG_PICTURES_DIR="$HOME/Cloud/Photos" +XDG_PUBLICSHARE_DIR="$HOME/" +XDG_TEMPLATES_DIR="$HOME/Cloud/Templates" +XDG_VIDEOS_DIR="$HOME/Cloud/Photos/Videos" diff --git a/.config/vim/vimrc b/.config/vim/vimrc index ccaae72..05bb49a 100644 --- a/.config/vim/vimrc +++ b/.config/vim/vimrc @@ -1,3 +1,7 @@ +" Good sources on vimrc files: +" - https://www.youtube.com/watch?v=Gs1VDYnS-Ac + + " Use VIM improved mode set nocompatible @@ -300,7 +304,7 @@ augroup checktime augroup END -" Auto-reload ~/.config/vim/vimrc +" Auto-reload ~/.vim/vimrc augroup vimrc autocmd! BufWritePost $RC source % | redraw augroup END diff --git a/.config/zsh/.p10k.zsh b/.config/zsh/.p10k.zsh new file mode 100644 index 0000000..42c4895 --- /dev/null +++ b/.config/zsh/.p10k.zsh @@ -0,0 +1,1622 @@ +# Generated by Powerlevel10k configuration wizard on 2022-08-08 at 23:58 CEST. +# Based on romkatv/powerlevel10k/config/p10k-lean.zsh, checksum 28996. +# Wizard options: nerdfont-complete + powerline, small icons, ascii, lean, 1 line, +# compact, concise, transient_prompt, instant_prompt=verbose. +# Type `p10k configure` to generate another config. +# +# Config for Powerlevel10k with lean prompt style. Type `p10k configure` to generate +# your own config based on it. +# +# Tip: Looking for a nice color? Here's a one-liner to print colormap. +# +# for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done + +# Temporarily change options. +'builtin' 'local' '-a' 'p10k_config_opts' +[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') +[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') +[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') +'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' + +() { + emulate -L zsh -o extended_glob + + # Unset all configuration options. This allows you to apply configuration changes without + # restarting zsh. Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`. + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + # Zsh >= 5.1 is required. + autoload -Uz is-at-least && is-at-least 5.1 || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # os_icon # os identifier + dir # current directory + vcs # git status + prompt_char # prompt symbol + ) + + # The list of segments shown on the right. Fill it with less important segments. + # Right prompt on the last prompt line (where you are typing your commands) gets + # automatically hidden when the input line reaches it. Right prompt above the + # last prompt line gets hidden if it would overlap with left prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + status # exit code of the last command + command_execution_time # duration of the last command + background_jobs # presence of background jobs + direnv # direnv status (https://direnv.net/) + asdf # asdf version manager (https://github.com/asdf-vm/asdf) + virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html) + anaconda # conda environment (https://conda.io/) + pyenv # python environment (https://github.com/pyenv/pyenv) + goenv # go environment (https://github.com/syndbg/goenv) + nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) + nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) + nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) + # node_version # node.js version + # go_version # go version (https://golang.org) + # rust_version # rustc version (https://www.rust-lang.org) + # dotnet_version # .NET version (https://dotnet.microsoft.com) + # php_version # php version (https://www.php.net/) + # laravel_version # laravel php framework version (https://laravel.com/) + # java_version # java version (https://www.java.com/) + # package # name@version from package.json (https://docs.npmjs.com/files/package.json) + rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) + rvm # ruby version from rvm (https://rvm.io) + fvm # flutter version management (https://github.com/leoafarias/fvm) + luaenv # lua version from luaenv (https://github.com/cehoffman/luaenv) + jenv # java version from jenv (https://github.com/jenv/jenv) + plenv # perl version from plenv (https://github.com/tokuhirom/plenv) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + phpenv # php version from phpenv (https://github.com/phpenv/phpenv) + scalaenv # scala version from scalaenv (https://github.com/scalaenv/scalaenv) + haskell_stack # haskell version from stack (https://haskellstack.org/) + kubecontext # current kubernetes context (https://kubernetes.io/) + terraform # terraform workspace (https://www.terraform.io) + # terraform_version # terraform version (https://www.terraform.io) + aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) + aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) + azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) + gcloud # google cloud cli account and project (https://cloud.google.com/) + google_app_cred # google application credentials (https://cloud.google.com/docs/authentication/production) + toolbox # toolbox name (https://github.com/containers/toolbox) + context # user@hostname + nordvpn # nordvpn connection status, linux only (https://nordvpn.com/) + ranger # ranger shell (https://github.com/ranger/ranger) + nnn # nnn shell (https://github.com/jarun/nnn) + xplr # xplr shell (https://github.com/sayanarijit/xplr) + vim_shell # vim shell indicator (:sh) + midnight_commander # midnight commander shell (https://midnight-commander.org/) + nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) + # vpn_ip # virtual private network indicator + # load # CPU load + # disk_usage # disk usage + # ram # free RAM + # swap # used swap + todo # todo items (https://github.com/todotxt/todo.txt-cli) + timewarrior # timewarrior tracking status (https://timewarrior.net/) + taskwarrior # taskwarrior task count (https://taskwarrior.org/) + # time # current time + # ip # ip address and bandwidth usage for a specified network interface + # public_ip # public IP address + # proxy # system-wide http/https/ftp proxy + # battery # internal battery + # wifi # wifi speed + # example # example user-defined segment (see prompt_example function below) + ) + + # Defines character set used by powerlevel10k. It's best to let `p10k configure` set it for you. + typeset -g POWERLEVEL9K_MODE=ascii + # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid + # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added. + typeset -g POWERLEVEL9K_ICON_PADDING=none + + # Basic style options that define the overall look of your prompt. You probably don't want to + # change them. + typeset -g POWERLEVEL9K_BACKGROUND= # transparent background + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space + typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol + + # When set to true, icons appear before content on both sides of the prompt. When set + # to false, icons go after content. If empty or not set, icons go before content in the left + # prompt and after content in the right prompt. + # + # You can also override it for a specific segment: + # + # POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false + # + # Or for a specific segment in specific state: + # + # POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false + typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + + # Connect left prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX= + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX= + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX= + + # The left end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= + # The right end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + # Ruler, a.k.a. the horizontal line before each prompt. If you set it to true, you'll + # probably want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false above and + # POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' below. + typeset -g POWERLEVEL9K_SHOW_RULER=false + typeset -g POWERLEVEL9K_RULER_CHAR='-' # reasonable alternative: '·' + typeset -g POWERLEVEL9K_RULER_FOREGROUND=242 + + # Filler between left and right prompt on the first prompt line. You can set it to '·' or '-' + # to make it easier to see the alignment between left and right prompt and to separate prompt + # from command output. It serves the same purpose as ruler (see above) without increasing + # the number of prompt lines. You'll probably want to set POWERLEVEL9K_SHOW_RULER=false + # if using this. You might also like POWERLEVEL9K_PROMPT_ADD_NEWLINE=false for more compact + # prompt. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 + # Add a space between the end of left prompt and the filler. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=' ' + # Add a space between the filler and the start of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL=' ' + # Start filler from the edge of the screen if there are no left segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}' + # End filler on the edge of the screen if there are no right segments on the first line. + typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}' + fi + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND= + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' + + ################################[ prompt_char: prompt symbol ]################################ + # Green prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 + # Default prompt symbol. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='>' + # Prompt symbol in command vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='<' + # Prompt symbol in visual vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V' + # Prompt symbol in overwrite vi mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='^' + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true + # No line terminator if prompt_char is the last segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='' + # No line introducer if prompt_char is the first segment. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= + + ##################################[ dir: current directory ]################################## + # Default current directory color. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=31 + # If directory is too long, shorten some of its segments to the shortest possible unique + # prefix. The shortened directory can be tab-completed to the original. + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique + # Replace removed segment suffixes with this symbol. + typeset -g POWERLEVEL9K_SHORTEN_DELIMITER= + # Color of the shortened directory segments. + typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=103 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=39 + # Display anchor directory segments in bold. + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true + # Don't shorten directories that contain any of these files. They are anchors. + local anchor_files=( + .bzr + .citc + .git + .hg + .node-version + .python-version + .go-version + .ruby-version + .lua-version + .java-version + .perl-version + .php-version + .tool-version + .shorten_folder_marker + .svn + .terraform + CVS + Cargo.toml + composer.json + go.mod + package.json + stack.yaml + ) + typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" + # If set to "first" ("last"), remove everything before the first (last) subdirectory that contains + # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is + # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first) + # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers + # and other directories don't. + # + # Optionally, "first" and "last" can be followed by ":" where is an integer. + # This moves the truncation point to the right (positive offset) or to the left (negative offset) + # relative to the marker. Plain "first" and "last" are equivalent to "first:0" and "last:0" + # respectively. + typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false + # Don't shorten this many last directory segments. They are anchors. + typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 + # Shorten directory if it's longer than this even if there is space for it. The value can + # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty, + # directory will be shortened only when prompt doesn't fit or when other parameters demand it + # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below). + # If set to `0`, directory will always be shortened to its minimum length. + typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this + # many columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 + # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least + # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. + typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 + # If set to true, embed a hyperlink into the directory. Useful for quickly + # opening a directory in the file manager simply by clicking the link. + # Can also be handy when the directory is shortened, as it allows you to see + # the full directory that was used in previous commands. + typeset -g POWERLEVEL9K_DIR_HYPERLINK=false + + # Enable special styling for non-writable and non-existent directories. See POWERLEVEL9K_LOCK_ICON + # and POWERLEVEL9K_DIR_CLASSES below. + typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3 + + # The default icon shown next to non-writable and non-existent directories when + # POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3. + # typeset -g POWERLEVEL9K_LOCK_ICON='⭐' + + # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons and colors for different + # directories. It must be an array with 3 * N elements. Each triplet consists of: + # + # 1. A pattern against which the current directory ($PWD) is matched. Matching is done with + # extended_glob option enabled. + # 2. Directory class for the purpose of styling. + # 3. An empty string. + # + # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. + # + # If POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3, non-writable and non-existent directories + # acquire class suffix _NOT_WRITABLE and NON_EXISTENT respectively. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_DIR_CLASSES=( + # '~/work(|/*)' WORK '' + # '~(|/*)' HOME '' + # '*' DEFAULT '') + # + # Whenever the current directory is ~/work or a subdirectory of ~/work, it gets styled with one + # of the following classes depending on its writability and existence: WORK, WORK_NOT_WRITABLE or + # WORK_NON_EXISTENT. + # + # Simply assigning classes to directories doesn't have any visible effects. It merely gives you an + # option to define custom colors and icons for different directory classes. + # + # # Styling for WORK. + # typeset -g POWERLEVEL9K_DIR_WORK_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=31 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=103 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=39 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=31 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=103 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=39 + # + # # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=31 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=103 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=39 + # + # If a styling parameter isn't explicitly defined for some class, it falls back to the classless + # parameter. For example, if POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND is not set, it falls + # back to POWERLEVEL9K_DIR_FOREGROUND. + # + typeset -g POWERLEVEL9K_DIR_CLASSES=() + + # Custom prefix. + # typeset -g POWERLEVEL9K_DIR_PREFIX='%fin ' + + #####################################[ vcs: git status ]###################################### + # Branch icon. Set this parameter to '\UE0A0 ' for the popular Powerline branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= + + # Untracked files icon. It's really a question mark, your font isn't broken. + # Change the value of this parameter to show a different icon. + typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' + + # Formatter for Git status. + # + # Example output: master wip <42>42 *42 merge ~42 +42 !42 ?42. + # + # You can edit the function to customize how Git status looks. + # + # VCS_STATUS_* parameters are set by gitstatus plugin. See reference: + # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. + function my_git_formatter() { + emulate -L zsh + + if [[ -n $P9K_CONTENT ]]; then + # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from + # gitstatus plugin). VCS_STATUS_* parameters are not available in this case. + typeset -g my_git_format=$P9K_CONTENT + return + fi + + if (( $1 )); then + # Styling for up-to-date Git status. + local meta='%f' # default foreground + local clean='%76F' # green foreground + local modified='%178F' # yellow foreground + local untracked='%39F' # blue foreground + local conflicted='%196F' # red foreground + else + # Styling for incomplete and stale Git status. + local meta='%244F' # grey foreground + local clean='%244F' # grey foreground + local modified='%244F' # grey foreground + local untracked='%244F' # grey foreground + local conflicted='%244F' # grey foreground + fi + + local res + + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + local branch=${(V)VCS_STATUS_LOCAL_BRANCH} + # If local branch name is at most 32 characters long, show it in full. + # Otherwise show the first 12 .. the last 12. + # Tip: To always show local branch name in full without truncation, delete the next line. + (( $#branch > 32 )) && branch[13,-13]=".." # <-- this line + res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}" + fi + + if [[ -n $VCS_STATUS_TAG + # Show tag only if not on a branch. + # Tip: To always show tag, delete the next line. + && -z $VCS_STATUS_LOCAL_BRANCH # <-- this line + ]]; then + local tag=${(V)VCS_STATUS_TAG} + # If tag name is at most 32 characters long, show it in full. + # Otherwise show the first 12 .. the last 12. + # Tip: To always show tag name in full without truncation, delete the next line. + (( $#tag > 32 )) && tag[13,-13]=".." # <-- this line + res+="${meta}#${clean}${tag//\%/%%}" + fi + + # Display the current Git commit if there is no branch and no tag. + # Tip: To always display the current Git commit, delete the next line. + [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && # <-- this line + res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" + + # Show tracking branch name if it differs from local branch. + if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then + res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" + fi + + # Display "wip" if the latest commit's summary contains "wip" or "WIP". + if [[ $VCS_STATUS_COMMIT_SUMMARY == (|*[^[:alnum:]])(wip|WIP)(|[^[:alnum:]]*) ]]; then + res+=" ${modified}wip" + fi + + # <42 if behind the remote. + (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}<${VCS_STATUS_COMMITS_BEHIND}" + # >42 if ahead of the remote; no leading space if also behind the remote: <42>42. + (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " + (( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}>${VCS_STATUS_COMMITS_AHEAD}" + # <-42 if behind the push remote. + (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" ${clean}<-${VCS_STATUS_PUSH_COMMITS_BEHIND}" + (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" " + # ->42 if ahead of the push remote; no leading space if also behind: <-42->42. + (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && res+="${clean}->${VCS_STATUS_PUSH_COMMITS_AHEAD}" + # *42 if have stashes. + (( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" + # 'merge' if the repo is in an unusual state. + [[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" + # ~42 if have merge conflicts. + (( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" + # +42 if have staged changes. + (( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}" + # !42 if have unstaged changes. + (( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" + # ?42 if have untracked files. It's really a question mark, your font isn't broken. + # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon. + # Remove the next line if you don't want to see untracked files at all. + (( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" + # "-" if the number of unstaged files is unknown. This can happen due to + # POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (see below) being set to a non-negative number lower + # than the number of files in the Git index, or due to bash.showDirtyState being set to false + # in the repository config. The number of staged and untracked files may also be unknown + # in this case. + (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=" ${modified}-" + + typeset -g my_git_format=$res + } + functions -M my_git_formatter 2>/dev/null + + # Don't count the number of unstaged, untracked and conflicted files in Git repositories with + # more than this many files in the index. Negative value means infinity. + # + # If you are working in Git repositories with tens of millions of files and seeing performance + # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output + # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's + # config: `git config bash.showDirtyState false`. + typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1 + + # Don't show Git status in prompt for repositories whose workdir matches this pattern. + # For example, if set to '~', the Git repository at $HOME/.git will be ignored. + # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'. + typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~' + + # Disable the default Git status formatting. + typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true + # Install our own Git status formatter. + typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}' + typeset -g POWERLEVEL9K_VCS_LOADING_CONTENT_EXPANSION='${$((my_git_formatter(0)))+${my_git_format}}' + # Enable counters for staged, unstaged, etc. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + # Icon color. + typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=76 + typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=244 + # Custom icon. + typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION= + # Custom prefix. + # typeset -g POWERLEVEL9K_VCS_PREFIX='%fon ' + + # Show status of repositories of these types. You can add svn and/or hg if you are + # using them. If you do, your prompt may become slow even when your current directory + # isn't in an svn or hg repository. + typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) + + # These settings are used for repositories other than Git or when gitstatusd fails and + # Powerlevel10k has to fall back to using vcs_info. + typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=76 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=76 + typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=178 + + ##########################[ status: exit code of the last command ]########################### + # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and + # style them independently from the regular OK and ERROR state. + typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true + + # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as + # it will signify success by turning green. + typeset -g POWERLEVEL9K_STATUS_OK=false + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='ok' + + # Status when some part of a pipe command fails but the overall exit status is zero. It may look + # like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='ok' + + # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as + # it will signify error by turning red. + typeset -g POWERLEVEL9K_STATUS_ERROR=false + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='err' + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=160 + # Use terse signal names: "INT" instead of "SIGINT(2)". + typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION= + + # Status when some part of a pipe command fails and the overall exit status is also non-zero. + # It may look like this: 1|0. + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='err' + + ###################[ command_execution_time: duration of the last command ]################### + # Show duration of the last command if takes at least this many seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 + # Show this many fractional digits. Zero means round to seconds. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + # Execution time color. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=101 + # Duration format: 1d 2h 3m 4s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + # Custom icon. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION= + # Custom prefix. + # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='%ftook ' + + #######################[ background_jobs: presence of background jobs ]####################### + # Don't show the number of background jobs. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + # Background jobs color. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=70 + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ asdf: asdf version manager (https://github.com/asdf-vm/asdf) ]############### + # Default asdf color. Only used to display tools for which there is no color override (see below). + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND. + typeset -g POWERLEVEL9K_ASDF_FOREGROUND=66 + + # There are four parameters that can be used to hide asdf tools. Each parameter describes + # conditions under which a tool gets hidden. Parameters can hide tools but not unhide them. If at + # least one parameter decides to hide a tool, that tool gets hidden. If no parameter decides to + # hide a tool, it gets shown. + # + # Special note on the difference between POWERLEVEL9K_ASDF_SOURCES and + # POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW. Consider the effect of the following commands: + # + # asdf local python 3.8.1 + # asdf global python 3.8.1 + # + # After running both commands the current python version is 3.8.1 and its source is "local" as + # it takes precedence over "global". If POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW is set to false, + # it'll hide python version in this case because 3.8.1 is the same as the global version. + # POWERLEVEL9K_ASDF_SOURCES will hide python version only if the value of this parameter doesn't + # contain "local". + + # Hide tool versions that don't come from one of these sources. + # + # Available sources: + # + # - shell `asdf current` says "set by ASDF_${TOOL}_VERSION environment variable" + # - local `asdf current` says "set by /some/not/home/directory/file" + # - global `asdf current` says "set by /home/username/file" + # + # Note: If this parameter is set to (shell local global), it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SOURCES. + typeset -g POWERLEVEL9K_ASDF_SOURCES=(shell local global) + + # If set to false, hide tool versions that are the same as global. + # + # Note: The name of this parameter doesn't reflect its meaning at all. + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_PROMPT_ALWAYS_SHOW. + typeset -g POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW=false + + # If set to false, hide tool versions that are equal to "system". + # + # Note: If this parameter is set to true, it won't hide tools. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_SYSTEM. + typeset -g POWERLEVEL9K_ASDF_SHOW_SYSTEM=true + + # If set to non-empty value, hide tools unless there is a file matching the specified file pattern + # in the current directory, or its parent directory, or its grandparent directory, and so on. + # + # Note: If this parameter is set to empty value, it won't hide tools. + # Note: SHOW_ON_UPGLOB isn't specific to asdf. It works with all prompt segments. + # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_ON_UPGLOB. + # + # Example: Hide nodejs version when there is no package.json and no *.js files in the current + # directory, in `..`, in `../..` and so on. + # + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.js|package.json' + typeset -g POWERLEVEL9K_ASDF_SHOW_ON_UPGLOB= + + # Ruby version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUBY_FOREGROUND=168 + # typeset -g POWERLEVEL9K_ASDF_RUBY_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUBY_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Python version from asdf. + typeset -g POWERLEVEL9K_ASDF_PYTHON_FOREGROUND=37 + # typeset -g POWERLEVEL9K_ASDF_PYTHON_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PYTHON_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Go version from asdf. + typeset -g POWERLEVEL9K_ASDF_GOLANG_FOREGROUND=37 + # typeset -g POWERLEVEL9K_ASDF_GOLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_GOLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Node.js version from asdf. + typeset -g POWERLEVEL9K_ASDF_NODEJS_FOREGROUND=70 + # typeset -g POWERLEVEL9K_ASDF_NODEJS_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Rust version from asdf. + typeset -g POWERLEVEL9K_ASDF_RUST_FOREGROUND=37 + # typeset -g POWERLEVEL9K_ASDF_RUST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_RUST_SHOW_ON_UPGLOB='*.foo|*.bar' + + # .NET Core version from asdf. + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_FOREGROUND=134 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=38 + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_FLUTTER_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Lua version from asdf. + typeset -g POWERLEVEL9K_ASDF_LUA_FOREGROUND=32 + # typeset -g POWERLEVEL9K_ASDF_LUA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_LUA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Java version from asdf. + typeset -g POWERLEVEL9K_ASDF_JAVA_FOREGROUND=32 + # typeset -g POWERLEVEL9K_ASDF_JAVA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JAVA_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Perl version from asdf. + typeset -g POWERLEVEL9K_ASDF_PERL_FOREGROUND=67 + # typeset -g POWERLEVEL9K_ASDF_PERL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PERL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Erlang version from asdf. + typeset -g POWERLEVEL9K_ASDF_ERLANG_FOREGROUND=125 + # typeset -g POWERLEVEL9K_ASDF_ERLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ERLANG_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Elixir version from asdf. + typeset -g POWERLEVEL9K_ASDF_ELIXIR_FOREGROUND=129 + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_ELIXIR_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Postgres version from asdf. + typeset -g POWERLEVEL9K_ASDF_POSTGRES_FOREGROUND=31 + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_POSTGRES_SHOW_ON_UPGLOB='*.foo|*.bar' + + # PHP version from asdf. + typeset -g POWERLEVEL9K_ASDF_PHP_FOREGROUND=99 + # typeset -g POWERLEVEL9K_ASDF_PHP_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_PHP_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Haskell version from asdf. + typeset -g POWERLEVEL9K_ASDF_HASKELL_FOREGROUND=172 + # typeset -g POWERLEVEL9K_ASDF_HASKELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_HASKELL_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Julia version from asdf. + typeset -g POWERLEVEL9K_ASDF_JULIA_FOREGROUND=70 + # typeset -g POWERLEVEL9K_ASDF_JULIA_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_ASDF_JULIA_SHOW_ON_UPGLOB='*.foo|*.bar' + + ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]########### + # NordVPN connection indicator color. + typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=39 + # Hide NordVPN connection indicator when not connected. + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION= + typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION= + # Custom icon. + # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## + # Ranger shell color. + typeset -g POWERLEVEL9K_RANGER_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## + # xplr shell color. + typeset -g POWERLEVEL9K_XPLR_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_XPLR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########################[ vim_shell: vim shell indicator (:sh) ]########################### + # Vim shell indicator color. + typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=34 + # Custom icon. + # typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]###### + # Midnight Commander shell color. + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]## + # Nix shell color. + typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=74 + + # Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line. + # typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_NIX_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ disk_usage: disk usage ]################################## + # Colors for different levels of disk usage. + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=35 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=220 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=160 + # Thresholds for different levels of disk usage (percentage points). + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=90 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=95 + # If set to true, hide disk usage when below $POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL percent. + typeset -g POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=false + # Custom icon. + # typeset -g POWERLEVEL9K_DISK_USAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ ram: free RAM ]####################################### + # RAM color. + typeset -g POWERLEVEL9K_RAM_FOREGROUND=66 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=96 + # Custom icon. + # typeset -g POWERLEVEL9K_SWAP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ######################################[ load: CPU load ]###################################### + # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15. + typeset -g POWERLEVEL9K_LOAD_WHICH=5 + # Load color when load is under 50%. + typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=66 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=178 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=166 + # Custom icon. + # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################ + # Todo color. + typeset -g POWERLEVEL9K_TODO_FOREGROUND=110 + # Hide todo when the total number of tasks is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true + # Hide todo when the number of tasks after filtering is zero. + typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false + + # Todo format. The following parameters are available within the expansion. + # + # - P9K_TODO_TOTAL_TASK_COUNT The total number of tasks. + # - P9K_TODO_FILTERED_TASK_COUNT The number of tasks after filtering. + # + # These variables correspond to the last line of the output of `todo.sh -p ls`: + # + # TODO: 24 of 42 tasks shown + # + # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. + # + # typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ timewarrior: timewarrior tracking status (https://timewarrior.net/) ]############ + # Timewarrior color. + typeset -g POWERLEVEL9K_TIMEWARRIOR_FOREGROUND=110 + # If the tracked task is longer than 24 characters, truncate and append "..". + # Tip: To always display tasks without truncation, delete the following parameter. + # Tip: To hide task names and display just the icon when time tracking is enabled, set the + # value of the following parameter to "". + typeset -g POWERLEVEL9K_TIMEWARRIOR_CONTENT_EXPANSION='${P9K_CONTENT:0:24}${${P9K_CONTENT:24}:+..}' + + # Custom icon. + # typeset -g POWERLEVEL9K_TIMEWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ taskwarrior: taskwarrior task count (https://taskwarrior.org/) ]############## + # Taskwarrior color. + typeset -g POWERLEVEL9K_TASKWARRIOR_FOREGROUND=74 + + # Taskwarrior segment format. The following parameters are available within the expansion. + # + # - P9K_TASKWARRIOR_PENDING_COUNT The number of pending tasks: `task +PENDING count`. + # - P9K_TASKWARRIOR_OVERDUE_COUNT The number of overdue tasks: `task +OVERDUE count`. + # + # Zero values are represented as empty parameters. + # + # The default format: + # + # '${P9K_TASKWARRIOR_OVERDUE_COUNT:+"!$P9K_TASKWARRIOR_OVERDUE_COUNT/"}$P9K_TASKWARRIOR_PENDING_COUNT' + # + # typeset -g POWERLEVEL9K_TASKWARRIOR_CONTENT_EXPANSION='$P9K_TASKWARRIOR_PENDING_COUNT' + + # Custom icon. + # typeset -g POWERLEVEL9K_TASKWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##################################[ context: user@hostname ]################################## + # Context color when running with privileges. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=178 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=180 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=180 + + # Context format when running with privileges: bold user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%B%n@%m' + # Context format when in SSH without privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' + # Default context format (no privileges, no SSH): user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' + + # Don't show context unless running with privileges or in SSH. + # Tip: Remove the next line to always show context. + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_CONTEXT_PREFIX='%fwith ' + + ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### + # Python virtual environment color. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=37 + # Don't show Python version next to the virtual environment name. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false + # If set to "false", won't show virtualenv if pyenv is already shown. + # If set to "if-different", won't show virtualenv if it's the same as pyenv. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=false + # Separate environment name from Python version only with a space. + typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ anaconda: conda environment (https://conda.io/) ]###################### + # Anaconda environment color. + typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=37 + + # Anaconda segment format. The following parameters are available within the expansion. + # + # - CONDA_PREFIX Absolute path to the active Anaconda/Miniconda environment. + # - CONDA_DEFAULT_ENV Name of the active Anaconda/Miniconda environment. + # - CONDA_PROMPT_MODIFIER Configurable prompt modifier (see below). + # - P9K_ANACONDA_PYTHON_VERSION Current python version (python --version). + # + # CONDA_PROMPT_MODIFIER can be configured with the following command: + # + # conda config --set env_prompt '({default_env}) ' + # + # The last argument is a Python format string that can use the following variables: + # + # - prefix The same as CONDA_PREFIX. + # - default_env The same as CONDA_DEFAULT_ENV. + # - name The last segment of CONDA_PREFIX. + # - stacked_env Comma-separated list of names in the environment stack. The first element is + # always the same as default_env. + # + # Note: '({default_env}) ' is the default value of env_prompt. + # + # The default value of POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION expands to $CONDA_PROMPT_MODIFIER + # without the surrounding parentheses, or to the last path component of CONDA_PREFIX if the former + # is empty. + typeset -g POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION='${${${${CONDA_PROMPT_MODIFIER#\(}% }%\)}:-${CONDA_PREFIX:t}}' + + # Custom icon. + # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################ + # Pyenv color. + typeset -g POWERLEVEL9K_PYENV_FOREGROUND=37 + # Hide python version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global) + # If set to false, hide python version if it's the same as global: + # $(pyenv version-name) == $(pyenv global). + typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide python version if it's equal to "system". + typeset -g POWERLEVEL9K_PYENV_SHOW_SYSTEM=true + + # Pyenv segment format. The following parameters are available within the expansion. + # + # - P9K_CONTENT Current pyenv environment (pyenv version-name). + # - P9K_PYENV_PYTHON_VERSION Current python version (python --version). + # + # The default format has the following logic: + # + # 1. Display just "$P9K_CONTENT" if it's equal to "$P9K_PYENV_PYTHON_VERSION" or + # starts with "$P9K_PYENV_PYTHON_VERSION/". + # 2. Otherwise display "$P9K_CONTENT $P9K_PYENV_PYTHON_VERSION". + typeset -g POWERLEVEL9K_PYENV_CONTENT_EXPANSION='${P9K_CONTENT}${${P9K_CONTENT:#$P9K_PYENV_PYTHON_VERSION(|/*)}:+ $P9K_PYENV_PYTHON_VERSION}' + + # Custom icon. + # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################[ goenv: go environment (https://github.com/syndbg/goenv) ]################ + # Goenv color. + typeset -g POWERLEVEL9K_GOENV_FOREGROUND=37 + # Hide go version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_GOENV_SOURCES=(shell local global) + # If set to false, hide go version if it's the same as global: + # $(goenv version-name) == $(goenv global). + typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide go version if it's equal to "system". + typeset -g POWERLEVEL9K_GOENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]########## + # Nodenv color. + typeset -g POWERLEVEL9K_NODENV_FOREGROUND=70 + # Hide node version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_NODENV_SOURCES=(shell local global) + # If set to false, hide node version if it's the same as global: + # $(nodenv version-name) == $(nodenv global). + typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NODENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]############### + # Nvm color. + typeset -g POWERLEVEL9K_NVM_FOREGROUND=70 + # Custom icon. + # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############ + # Nodeenv color. + typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=70 + # Don't show Node version next to the environment name. + typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false + # Separate environment name from Node version only with a space. + typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER= + # Custom icon. + # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##############################[ node_version: node.js version ]############################### + # Node version color. + typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=70 + # Show node version only when in a directory tree containing package.json. + typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ go_version: go version (https://golang.org) ]######################## + # Go version color. + typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=37 + # Show go version only when in a go project subdirectory. + typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #################[ rust_version: rustc version (https://www.rust-lang.org) ]################## + # Rust version color. + typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=37 + # Show rust version only when in a rust project subdirectory. + typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################ + # .NET version color. + typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=134 + # Show .NET version only when in a .NET project subdirectory. + typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #####################[ php_version: php version (https://www.php.net/) ]###################### + # PHP version color. + typeset -g POWERLEVEL9K_PHP_VERSION_FOREGROUND=99 + # Show PHP version only when in a PHP project subdirectory. + typeset -g POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHP_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ laravel_version: laravel php framework version (https://laravel.com/) ]########### + # Laravel version color. + typeset -g POWERLEVEL9K_LARAVEL_VERSION_FOREGROUND=161 + # Custom icon. + # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ####################[ java_version: java version (https://www.java.com/) ]#################### + # Java version color. + typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=32 + # Show java version only when in a java project subdirectory. + typeset -g POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY=true + # Show brief version. + typeset -g POWERLEVEL9K_JAVA_VERSION_FULL=false + # Custom icon. + # typeset -g POWERLEVEL9K_JAVA_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###[ package: name@version from package.json (https://docs.npmjs.com/files/package.json) ]#### + # Package color. + typeset -g POWERLEVEL9K_PACKAGE_FOREGROUND=117 + # Package format. The following parameters are available within the expansion. + # + # - P9K_PACKAGE_NAME The value of `name` field in package.json. + # - P9K_PACKAGE_VERSION The value of `version` field in package.json. + # + # typeset -g POWERLEVEL9K_PACKAGE_CONTENT_EXPANSION='${P9K_PACKAGE_NAME//\%/%%}@${P9K_PACKAGE_VERSION//\%/%%}' + # Custom icon. + # typeset -g POWERLEVEL9K_PACKAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## + # Rbenv color. + typeset -g POWERLEVEL9K_RBENV_FOREGROUND=168 + # Hide ruby version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global) + # If set to false, hide ruby version if it's the same as global: + # $(rbenv version-name) == $(rbenv global). + typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide ruby version if it's equal to "system". + typeset -g POWERLEVEL9K_RBENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## + # Rvm color. + typeset -g POWERLEVEL9K_RVM_FOREGROUND=168 + # Don't show @gemset at the end. + typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false + # Don't show ruby- at the front. + typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############ + # Fvm color. + typeset -g POWERLEVEL9K_FVM_FOREGROUND=38 + # Custom icon. + # typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]########### + # Lua color. + typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=32 + # Hide lua version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global) + # If set to false, hide lua version if it's the same as global: + # $(luaenv version-name) == $(luaenv global). + typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide lua version if it's equal to "system". + typeset -g POWERLEVEL9K_LUAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################ + # Java color. + typeset -g POWERLEVEL9K_JENV_FOREGROUND=32 + # Hide java version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global) + # If set to false, hide java version if it's the same as global: + # $(jenv version-name) == $(jenv global). + typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide java version if it's equal to "system". + typeset -g POWERLEVEL9K_JENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############ + # Perl color. + typeset -g POWERLEVEL9K_PLENV_FOREGROUND=67 + # Hide perl version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global) + # If set to false, hide perl version if it's the same as global: + # $(plenv version-name) == $(plenv global). + typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide perl version if it's equal to "system". + typeset -g POWERLEVEL9K_PLENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ + # PHP color. + typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=99 + # Hide php version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_PHPENV_SOURCES=(shell local global) + # If set to false, hide php version if it's the same as global: + # $(phpenv version-name) == $(phpenv global). + typeset -g POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide php version if it's equal to "system". + typeset -g POWERLEVEL9K_PHPENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_PHPENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #######[ scalaenv: scala version from scalaenv (https://github.com/scalaenv/scalaenv) ]####### + # Scala color. + typeset -g POWERLEVEL9K_SCALAENV_FOREGROUND=160 + # Hide scala version if it doesn't come from one of these sources. + typeset -g POWERLEVEL9K_SCALAENV_SOURCES=(shell local global) + # If set to false, hide scala version if it's the same as global: + # $(scalaenv version-name) == $(scalaenv global). + typeset -g POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW=false + # If set to false, hide scala version if it's equal to "system". + typeset -g POWERLEVEL9K_SCALAENV_SHOW_SYSTEM=true + # Custom icon. + # typeset -g POWERLEVEL9K_SCALAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ haskell_stack: haskell version from stack (https://haskellstack.org/) ]########### + # Haskell color. + typeset -g POWERLEVEL9K_HASKELL_STACK_FOREGROUND=172 + # Hide haskell version if it doesn't come from one of these sources. + # + # shell: version is set by STACK_YAML + # local: version is set by stack.yaml up the directory tree + # global: version is set by the implicit global project (~/.stack/global-project/stack.yaml) + typeset -g POWERLEVEL9K_HASKELL_STACK_SOURCES=(shell local) + # If set to false, hide haskell version if it's the same as in the implicit global project. + typeset -g POWERLEVEL9K_HASKELL_STACK_ALWAYS_SHOW=true + # Custom icon. + # typeset -g POWERLEVEL9K_HASKELL_STACK_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show kubecontext. + typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens|kubectx|oc|istioctl|kogito|k9s|helmfile|flux|fluxctl|stern|kubeseal|skaffold' + + # Kubernetes context classes for the purpose of using different colors, icons and expansions with + # different contexts. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current kubernetes context gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current kubernetes context is "deathray-testing/default", its class is TEST + # because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=134 + # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext + # segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # Within the expansion the following parameters are always available: + # + # - P9K_CONTENT The content that would've been displayed if there was no content + # expansion defined. + # - P9K_KUBECONTEXT_NAME The current context's name. Corresponds to column NAME in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_CLUSTER The current context's cluster. Corresponds to column CLUSTER in the + # output of `kubectl config get-contexts`. + # - P9K_KUBECONTEXT_NAMESPACE The current context's namespace. Corresponds to column NAMESPACE + # in the output of `kubectl config get-contexts`. If there is no + # namespace, the parameter is set to "default". + # - P9K_KUBECONTEXT_USER The current context's user. Corresponds to column AUTHINFO in the + # output of `kubectl config get-contexts`. + # + # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS), + # the following extra parameters are available: + # + # - P9K_KUBECONTEXT_CLOUD_NAME Either "gke" or "eks". + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT Account/project ID. + # - P9K_KUBECONTEXT_CLOUD_ZONE Availability zone. + # - P9K_KUBECONTEXT_CLOUD_CLUSTER Cluster. + # + # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example, + # if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=gke + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + # + # If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01": + # + # - P9K_KUBECONTEXT_CLOUD_NAME=eks + # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012 + # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1 + # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION= + # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME. + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}' + # Append the current context's namespace if it's not "default". + POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}' + + # Custom prefix. + # typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='%fat ' + + ################[ terraform: terraform workspace (https://www.terraform.io) ]################# + # Don't show terraform workspace if it's literally "default". + typeset -g POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT=false + # POWERLEVEL9K_TERRAFORM_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current terraform workspace gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_TERRAFORM_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_TERRAFORM_CLASSES defines the workspace class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current terraform workspace is "project_test", its class is TEST because "project_test" + # doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_FOREGROUND=38 + # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #############[ terraform_version: terraform version (https://www.terraform.io) ]############## + # Terraform version color. + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_FOREGROUND=38 + # Custom icon. + # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# + # Show aws only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show aws. + typeset -g POWERLEVEL9K_AWS_SHOW_ON_COMMAND='aws|awless|terraform|pulumi|terragrunt' + + # POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current AWS profile gets matched. + # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) + # that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AWS_CLASSES defines the profile class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' DEFAULT) + # + # If your current AWS profile is "company_test", its class is TEST + # because "company_test" doesn't match the pattern '*prod*' but does match '*test*'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AWS_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=208 + # typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # AWS segment format. The following parameters are available within the expansion. + # + # - P9K_AWS_PROFILE The name of the current AWS profile. + # - P9K_AWS_REGION The region associated with the current AWS profile. + typeset -g POWERLEVEL9K_AWS_CONTENT_EXPANSION='${P9K_AWS_PROFILE//\%/%%}${P9K_AWS_REGION:+ ${P9K_AWS_REGION//\%/%%}}' + + #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]# + # AWS Elastic Beanstalk environment color. + typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=70 + # Custom icon. + # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]########## + # Show azure only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show azure. + typeset -g POWERLEVEL9K_AZURE_SHOW_ON_COMMAND='az|terraform|pulumi|terragrunt' + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_FOREGROUND=32 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show gcloud. + typeset -g POWERLEVEL9K_GCLOUD_SHOW_ON_COMMAND='gcloud|gcs|gsutil' + # Google cloud color. + typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=32 + + # Google cloud format. Change the value of POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION and/or + # POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION if the default is too verbose or not informative + # enough. You can use the following parameters in the expansions. Each of them corresponds to the + # output of `gcloud` tool. + # + # Parameter | Source + # -------------------------|-------------------------------------------------------------------- + # P9K_GCLOUD_CONFIGURATION | gcloud config configurations list --format='value(name)' + # P9K_GCLOUD_ACCOUNT | gcloud config get-value account + # P9K_GCLOUD_PROJECT_ID | gcloud config get-value project + # P9K_GCLOUD_PROJECT_NAME | gcloud projects describe $P9K_GCLOUD_PROJECT_ID --format='value(name)' + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced with '%%'. + # + # Obtaining project name requires sending a request to Google servers. This can take a long time + # and even fail. When project name is unknown, P9K_GCLOUD_PROJECT_NAME is not set and gcloud + # prompt segment is in state PARTIAL. When project name gets known, P9K_GCLOUD_PROJECT_NAME gets + # set and gcloud prompt segment transitions to state COMPLETE. + # + # You can customize the format, icon and colors of gcloud segment separately for states PARTIAL + # and COMPLETE. You can also hide gcloud in state PARTIAL by setting + # POWERLEVEL9K_GCLOUD_PARTIAL_VISUAL_IDENTIFIER_EXPANSION and + # POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION to empty. + typeset -g POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_ID//\%/%%}' + typeset -g POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_NAME//\%/%%}' + + # Send a request to Google (by means of `gcloud projects describe ...`) to obtain project name + # this often. Negative value disables periodic polling. In this mode project name is retrieved + # only when the current configuration, account or project id changes. + typeset -g POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS=60 + + # Custom icon. + # typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]# + # Show google_app_cred only when the command you are typing invokes one of these tools. + # Tip: Remove the next line to always show google_app_cred. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_SHOW_ON_COMMAND='terraform|pulumi|terragrunt' + + # Google application credentials classes for the purpose of using different colors, icons and + # expansions with different credentials. + # + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first + # element in each pair defines a pattern against which the current kubernetes context gets + # matched. More specifically, it's P9K_CONTENT prior to the application of context expansion + # (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION + # parameters, you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order. + # The first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD + # '*:*test*:*' TEST + # '*' DEFAULT) + # + # If your current Google application credentials is "service_account deathray-testing x@y.com", + # its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'. + # + # You can define different colors, icons and content expansions for different classes: + # + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID' + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( + # '*:*prod*:*' PROD # These values are examples that are unlikely + # '*:*test*:*' TEST # to match your needs. Customize them as needed. + '*' DEFAULT) + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=32 + # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by + # google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference: + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. + # + # You can use the following parameters in the expansion. Each of them corresponds to one of the + # fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS. + # + # Parameter | JSON key file field + # ---------------------------------+--------------- + # P9K_GOOGLE_APP_CRED_TYPE | type + # P9K_GOOGLE_APP_CRED_PROJECT_ID | project_id + # P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email + # + # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced by '%%'. + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\%/%%}' + + ##############[ toolbox: toolbox name (https://github.com/containers/toolbox) ]############### + # Toolbox color. + typeset -g POWERLEVEL9K_TOOLBOX_FOREGROUND=178 + # Don't display the name of the toolbox if it matches fedora-toolbox-*. + typeset -g POWERLEVEL9K_TOOLBOX_CONTENT_EXPANSION='${P9K_TOOLBOX_NAME:#fedora-toolbox-*}' + # Custom icon. + # typeset -g POWERLEVEL9K_TOOLBOX_VISUAL_IDENTIFIER_EXPANSION='⭐' + # Custom prefix. + # typeset -g POWERLEVEL9K_TOOLBOX_PREFIX='%fin ' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=94 + # Custom icon. + # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ########################[ vpn_ip: virtual private network indicator ]######################### + # VPN IP color. + typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=81 + # When on VPN, show just an icon without the IP address. + # Tip: To display the private IP address when on VPN, remove the next line. + typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION= + # Regular expression for the VPN network interface. Run `ifconfig` or `ip -4 a show` while on VPN + # to see the name of the interface. + typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(gpd|wg|(.*tun)|tailscale)[0-9]*' + # If set to true, show one segment per matching network interface. If set to false, show only + # one segment corresponding to the first matching network interface. + # Tip: If you set it to true, you'll probably want to unset POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION. + typeset -g POWERLEVEL9K_VPN_IP_SHOW_ALL=false + # Custom icon. + # typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ###########[ ip: ip address and bandwidth usage for a specified network interface ]########### + # IP color. + typeset -g POWERLEVEL9K_IP_FOREGROUND=38 + # The following parameters are accessible within the expansion: + # + # Parameter | Meaning + # ----------------------+------------------------------------------- + # P9K_IP_IP | IP address + # P9K_IP_INTERFACE | network interface + # P9K_IP_RX_BYTES | total number of bytes received + # P9K_IP_TX_BYTES | total number of bytes sent + # P9K_IP_RX_BYTES_DELTA | number of bytes received since last prompt + # P9K_IP_TX_BYTES_DELTA | number of bytes sent since last prompt + # P9K_IP_RX_RATE | receive rate (since last prompt) + # P9K_IP_TX_RATE | send rate (since last prompt) + typeset -g POWERLEVEL9K_IP_CONTENT_EXPANSION='$P9K_IP_IP${P9K_IP_RX_RATE:+ %70F<$P9K_IP_RX_RATE}${P9K_IP_TX_RATE:+ %215F>$P9K_IP_TX_RATE}' + # Show information for the first network interface whose name matches this regular expression. + # Run `ifconfig` or `ip -4 a show` to see the names of all network interfaces. + typeset -g POWERLEVEL9K_IP_INTERFACE='[ew].*' + # Custom icon. + # typeset -g POWERLEVEL9K_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' + + #########################[ proxy: system-wide http/https/ftp proxy ]########################## + # Proxy color. + typeset -g POWERLEVEL9K_PROXY_FOREGROUND=68 + # Custom icon. + # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐' + + ################################[ battery: internal battery ]################################# + # Show battery in red when it's below this level and not connected to power supply. + typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20 + typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=160 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=70 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=178 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES=('battery') + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false + + #####################################[ wifi: wifi speed ]##################################### + # WiFi color. + typeset -g POWERLEVEL9K_WIFI_FOREGROUND=68 + # Custom icon. + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Use different colors and icons depending on signal strength ($P9K_WIFI_BARS). + # + # # Wifi colors and icons for different signal strength levels (low to high). + # typeset -g my_wifi_fg=(68 68 68 68 68) # <-- change these values + # typeset -g my_wifi_icon=('WiFi' 'WiFi' 'WiFi' 'WiFi' 'WiFi') # <-- change these values + # + # typeset -g POWERLEVEL9K_WIFI_CONTENT_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}$P9K_WIFI_LAST_TX_RATE Mbps' + # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}${my_wifi_icon[P9K_WIFI_BARS+1]}' + # + # The following parameters are accessible within the expansions: + # + # Parameter | Meaning + # ----------------------+--------------- + # P9K_WIFI_SSID | service set identifier, a.k.a. network name + # P9K_WIFI_LINK_AUTH | authentication protocol such as "wpa2-psk" or "none"; empty if unknown + # P9K_WIFI_LAST_TX_RATE | wireless transmit rate in megabits per second + # P9K_WIFI_RSSI | signal strength in dBm, from -120 to 0 + # P9K_WIFI_NOISE | noise in dBm, from -120 to 0 + # P9K_WIFI_BARS | signal strength in bars, from 0 to 4 (derived from P9K_WIFI_RSSI and P9K_WIFI_NOISE) + + ####################################[ time: current time ]#################################### + # Current time color. + typeset -g POWERLEVEL9K_TIME_FOREGROUND=66 + # Format for the current time: 09:51:02. See `man 3 strftime`. + typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' + # If set to true, time will update when you hit enter. This way prompts for the past + # commands will contain the start times of their commands as opposed to the default + # behavior where they contain the end times of their preceding commands. + typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false + # Custom icon. + typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION= + # Custom prefix. + # typeset -g POWERLEVEL9K_TIME_PREFIX='%fat ' + + # Example of a user-defined prompt segment. Function prompt_example will be called on every + # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or + # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and orange text greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -f 208 -i '*' -t 'hello, %n' + } + + # User-defined prompt segments may optionally provide an instant_prompt_* function. Its job + # is to generate the prompt segment for display in instant prompt. See + # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. + # + # Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function + # and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k + # will replay these calls without actually calling instant_prompt_*. It is imperative that + # instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this + # rule is not observed, the content of instant prompt will be incorrect. + # + # Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If + # instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt. + function instant_prompt_example() { + # Since prompt_example always makes the same `p10k segment` calls, we can call it from + # instant_prompt_example. This will give us the same `example` prompt segment in the instant + # and regular prompts. + prompt_example + } + + # User-defined prompt segments can be customized the same way as built-in segments. + # typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=208 + # typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐' + + # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt + # when accepting a command line. Supported values: + # + # - off: Don't change prompt when accepting a command line. + # - always: Trim down prompt when accepting a command line. + # - same-dir: Trim down prompt when accepting a command line unless this is the first command + # typed after changing current working directory. + typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always + + # Instant prompt mode. + # + # - off: Disable instant prompt. Choose this if you've tried instant prompt and found + # it incompatible with your zsh configuration files. + # - quiet: Enable instant prompt and don't print warnings when detecting console output + # during zsh initialization. Choose this if you've read and understood + # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. + # - verbose: Enable instant prompt and print a warning when detecting console output during + # zsh initialization. Choose this if you've never tried instant prompt, haven't + # seen the warning, or if you are unsure what this all means. + typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose + + # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. + # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload + # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you + # really need it. + typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true + + # If p10k is already loaded, reload configuration. + # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. + (( ! $+functions[p10k] )) || p10k reload +} + +# Tell `p10k configure` which file it should overwrite. +typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} + +(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} +'builtin' 'unset' 'p10k_config_opts' diff --git a/.config/zsh/.zlogout b/.config/zsh/.zlogout new file mode 100644 index 0000000..1b3cac8 --- /dev/null +++ b/.config/zsh/.zlogout @@ -0,0 +1,3 @@ +# Executed by zsh when a login shell exits + +source "$HOME/.config/shell/logout.sh" diff --git a/.config/zsh/.zprofile b/.config/zsh/.zprofile new file mode 100644 index 0000000..944c20c --- /dev/null +++ b/.config/zsh/.zprofile @@ -0,0 +1,5 @@ +# Executed by zsh when a login shell starts + +# Unify ~/.profile and ~/.zprofile conceptually +# (~/.zlogin is skipped here as it is sourced after ~/.zshrc) +source "$HOME/.profile" diff --git a/.config/zsh/.zshenv b/.config/zsh/.zshenv new file mode 100644 index 0000000..ce96390 --- /dev/null +++ b/.config/zsh/.zshenv @@ -0,0 +1,40 @@ +# This file is sourced by zsh before ~/.zprofile and ~/.zshrc +# (it's kind of a zsh-only ~/.profile file) + + +export XDG_CONFIG_HOME="$HOME/.config" +export XDG_DATA_HOME="$HOME/.local/share" + + +export ZDOTDIR="$XDG_CONFIG_HOME/zsh" +export ZSH="$XDG_DATA_HOME/oh-my-zsh" +export ZPLUG_HOME="$XDG_DATA_HOME/zplug" +export _Z_DATA="$XDG_DATA_HOME/z" + + +# Use key to auto-complete a partially typed command +# TODO: the coloring does not work when zsh-syntax-highlighting is loaded simultaniously +# Source: https://github.com/zsh-users/zsh-history-substring-search/issues/131 +export HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND="fg=#ffffff,bg=#38761d,bold" +export HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND="fg=#ffffff,bg=#990000,bold" + + +# Notify about shorter aliases for typed commands +# Source: https://github.com/MichaelAquilina/zsh-you-should-use +export YSU_MESSAGE_POSITION="before" +export YSU_MODE="BESTMATCH" + + +# Suggest commands as one types +# Source: https://github.com/zsh-users/zsh-autosuggestions +export ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#666666,bg=bold" +export ZSH_AUTOSUGGEST_STRATEGY=(history completion) + + +# Temporary files should go into ~/.cache +export ZSH_COMPDUMP="${XDG_CACHE_HOME:-$HOME/.cache}/.zcompdump-$HOST-$ZSH_VERSION" + + +# Automatically source ".env" files in folders +# Source: https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/dotenv +export ZSH_DOTENV_FILE=".env" diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 571e93c..c1fa6d1 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -1,10 +1,190 @@ -#!/bin/zsh - -# Load the real `zsh` config file in ~/ -# -# Recent Debian/Ubuntu versions look for .zshrc -# in .config/zsh and no longer in ~/ which -# is still the main location in many other distributions +# Executed by zsh when a (non-)login shell starts -. "$HOME/.zshrc" +# Ensure zsh is running interactively +[[ $- != *i* ]] && return + + +# Check if a command can be found on the $PATH +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + + +# Enable Powerlevel10k instant prompt +if [ -r "${XDG_CACHE_HOME:-$HOME/.cache}/zsh/p10k-instant-prompt-${(%):-%n}.zsh" ]; then + source "${XDG_CACHE_HOME:-$HOME/.cache}/zsh/p10k-instant-prompt-${(%):-%n}.zsh" +fi + + + +# Enable XON/XOFF software flow control +stty -ixon + +# Enable colors and change prompt +autoload -Uz colors +colors + +# Enable VI mode +bindkey -v + +# If an entered command does not exist per se +# but is the name of a folder instead, go there +setopt AUTO_CD + +# Treat "#", "~", and "^" as part of patterns for filename generation +setopt EXTENDED_GLOB +# Warn if there are no matches +setopt NO_MATCH + +# Silence the shell +setopt NO_BEEP + +# Report status of background jobs immediately +setopt NOTIFY + +# Remove all "built-in" aliases +unalias -a + + + +# Set these environment variables here (and not in ~/.profile) +# due to conflict/overlap with bash + +# Note: This file is NOT synced by mackup as zsh destroys the symbolic link +export HISTFILE="$XDG_STATE_HOME/zsh/history" + +export HISTSIZE=999999 # number of lines kept in memory +export SAVEHIST=999999 # number of lines kept in $HISTFILE + +# Append to the $HISTFILE rather than overwrite it +setopt APPEND_HISTORY +setopt INC_APPEND_HISTORY + + + +# Initialize oh-my-zsh's plugins + +if [ -r "$ZSH/oh-my-zsh.sh" ]; then + + plugins=( + command-not-found + dirhistory + dotenv # config in ~/.zshenv; `_update_repositories` temporarily disables this + git-escape-magic + invoke # completions for invoke + jsontools + pip # completions for pip + poetry # completions for poetry + z + ) + + source "$ZSH/oh-my-zsh.sh" + +fi + + +# Initialize zplug's plugins + +if [ -r "$XDG_DATA_HOME/zplug/init.zsh" ]; then + + source "$XDG_DATA_HOME/zplug/init.zsh" # config in ~/.config/zsh/.zshenv + + # Must use double quotes in this section + # Source: https://github.com/zplug/zplug#example + + # Make zplug manage itself like a plugin + # Source: https://github.com/zplug/zplug#let-zplug-manage-zplug + zplug "zplug/zplug", hook-build:"zplug --self-manage" + + zplug "MichaelAquilina/zsh-you-should-use" # config in ~/.zshenv + + zplug "zsh-users/zsh-autosuggestions" # config in ~/.zshenv + zplug "zsh-users/zsh-history-substring-search" # config in ~/.zshenv; there are key bindings below + zplug "zsh-users/zsh-syntax-highlighting" + + zplug "romkatv/powerlevel10k", as:theme, depth:1 + + zplug load + +fi + + + +# Initialize various utilities and aliases +source "$HOME/.config/shell/init.sh" + + + +# Initialize zsh's completions + +# This is already done via ~/.oh-my-zsh.sh above +# autoload -Uz compinit +# compinit -u -d "$ZSH_COMPDUMP" + +# Enable match highlighting and scrolling through long lists, +# and provide a different style of menu completion +zmodload zsh/complist + +# Include hidden files in tab completion +_comp_options+=(GLOB_DOTS) + +# Enable arrow-key driven interface +zstyle ':completion:*' menu select + +# Make compinit find new executables right away +zstyle ':completion:*' rehash true + +# Enable grouping and group headers +zstyle ':completion:*:descriptions' format '%B%d%b' +zstyle ':completion:*:messages' format '%d' +zstyle ':completion:*:warnings' format 'No matches for: %d' +zstyle ':completion:*' group-name '' + + +# Enable completions for various tools + +# invoke -> see plugins above; alternatively use +# _command_exists invoke && eval "$(invoke --print-completion-script=zsh)" + +_command_exists nox && eval "$(register-python-argcomplete nox)" + +# pip -> see plugins above; alternatively use +# _command_exists pip && eval "$(pip completion --zsh)" + +_command_exists pipx && eval "$(register-python-argcomplete pipx)" + +# poetry -> see plugins above; no alternative here + + + +# Define key bindings + +# zsh-autosuggestions plugin +bindkey "^ " autosuggest-accept + +# Enable Ctrl-R +bindkey "^R" history-incremental-search-backward + +# Use VI keys to navigate the completions in the menu +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 + +if [ -r "$XDG_DATA_HOME/zplug/init.zsh" ]; then + # history-substring-search plugin + # Source: https://github.com/zsh-users/zsh-history-substring-search#usage + # Normal mode + bindkey "$terminfo[kcuu1]" history-substring-search-up + bindkey "$terminfo[kcud1]" history-substring-search-down + # VI mode + bindkey -M vicmd 'k' history-substring-search-up + bindkey -M vicmd 'j' history-substring-search-down +fi + + + +# Enable Powerlevel10k "full" prompt +[[ ! -f $XDG_CONFIG_HOME/zsh/.p10k.zsh ]] || source $XDG_CONFIG_HOME/zsh/.p10k.zsh diff --git a/.config/zsh/README.md b/.config/zsh/README.md deleted file mode 100644 index a2882a4..0000000 --- a/.config/zsh/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `zsh`-related Configurations - -This folder contains files that are sourced by `zsh`. diff --git a/.hidden b/.hidden new file mode 100644 index 0000000..2194601 --- /dev/null +++ b/.hidden @@ -0,0 +1,4 @@ +LICENSE.txt +R +README.md +Screenshots diff --git a/.local/bin/README.md b/.local/bin/README.md deleted file mode 100644 index 241ea08..0000000 --- a/.local/bin/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# User-local Executables - -This folder contains executable files that are on the `$PATH`. diff --git a/.local/bin/install-dotfiles b/.local/bin/install-dotfiles deleted file mode 100755 index bb2e6ce..0000000 --- a/.local/bin/install-dotfiles +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -# Installation script to make the dotfiles available in ~/ -# -# `git` is the only dependency for this script to run (See: https://git-scm.com) -# -# See: https://code.webartifex.biz/alexander/dotfiles#installation - - -set -e - - -XDG_DATA_HOME="$HOME/.local/share" # also set in ~/.config/shell/env -DOTFILES_DIR="$XDG_DATA_HOME/dotfiles" # also set in ~/.config/shell/env - - -# Check if the dotfiles were installed previously -if [ -d "$DOTFILES_DIR" ] && [ "${FORCE_INSTALL:-}" != "1" ]; then - echo "" - echo "The dotfiles are already installed at: $DOTFILES_DIR" - echo "" - echo "Options:" - echo " - Set 'export FORCE_INSTALL=1' and run installation again" - echo " - Update with 'dotfiles pull' and continue using them" - echo "" -else - # Remove an already installed dotfiles repository - if [ -d "$DOTFILES_DIR" ]; then - rm -rf "$DOTFILES_DIR" - fi - - if [ -z "$DOTFILES_BRANCH" ]; then - # Auto-detect if we're on a desktop system - if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ] || [ "$(systemctl --user is-active graphical-session.target 2>/dev/null)" = "active" ]; then - export DOTFILES_BRANCH="desktop" - else - export DOTFILES_BRANCH="main" - fi - elif [ "$DOTFILES_BRANCH" != "desktop" ] && [ "$DOTFILES_BRANCH" != "main" ]; then - echo "" - echo "'DOTFILES_BRANCH' may only be one of: 'desktop' or 'main'" - exit 1 - fi - - mkdir -p "$XDG_DATA_HOME" - - git clone --bare https://code.webartifex.biz/alexander/dotfiles "$XDG_DATA_HOME/dotfiles" - - # Do not checkout project documentation intended for web GUIs (e.g., GitHub) - git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" config core.sparseCheckout true - echo "/*" > "$DOTFILES_DIR/info/sparse-checkout" - echo "!LICENSE.txt" >> "$DOTFILES_DIR/info/sparse-checkout" - echo "!README.md" >> "$DOTFILES_DIR/info/sparse-checkout" - - # Put the dotfiles in the user's `$HOME` folder - git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" checkout --force "$DOTFILES_BRANCH" - - # Do not show files not tracked in the dotfiles repository because there are simply too many - git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" config --local status.showUntrackedFiles no - - # The author of this file prefers to use SSH to sync his machines with the origin - git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" remote set-url origin git@git.webartifex.biz:alexander/dotfiles.git - - # Remove potentially conflicting `bash` startup files - rm -f "$HOME/.bash_login" - rm -f "$HOME/.bash_profile" - - echo "" - echo "The dotfiles were installed successfully" - - # Mimic starting a new shell to get new dotfiles right away - if [ -n "$ZSH_VERSION" ]; then - . "$HOME/.zshrc" - else - . "$HOME/.profile" - fi - -fi diff --git a/.local/share/backgrounds/lake_in_front_of_mountains.jpg b/.local/share/backgrounds/lake_in_front_of_mountains.jpg new file mode 100644 index 0000000..44e98ae Binary files /dev/null and b/.local/share/backgrounds/lake_in_front_of_mountains.jpg differ diff --git a/.local/share/dotfiles/setup.sh b/.local/share/dotfiles/setup.sh new file mode 100755 index 0000000..b092d5a --- /dev/null +++ b/.local/share/dotfiles/setup.sh @@ -0,0 +1,112 @@ +# This file sets up the $XDG_DATA_HOME/dotfiles, a bare git repository, +# such that they are available within a user's $HOME as common "dotfiles" + + +export XDG_BIN_HOME="$HOME/.local/bin" # temporarily set here; mainly set in ~/.profile +export XDG_DATA_HOME="$HOME/.local/share" # temporarily set here; mainly set in ~/.profile + + +_command_exists() { + command -v "$1" 1>/dev/null 2>&1 +} + + +cd $HOME + + +# Get the latest $XDG_DATA_HOME/dotfiles, possibly replacing the old ones +rm -rf "$XDG_DATA_HOME/dotfiles" >/dev/null +git clone --bare https://code.webartifex.biz/alexander/dotfiles.git "$XDG_DATA_HOME/dotfiles" + +# Distribute the dotfiles in $HOME +git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME checkout --force +git --git-dir=$XDG_DATA_HOME/dotfiles/ --work-tree=$HOME config --local status.showUntrackedFiles no +# Dirty Fix: Otherwise `gnupg` emits a warning +[ -d "$XDG_DATA_HOME/gnupg" ] && chmod 700 $XDG_DATA_HOME/gnupg + + +if _command_exists python3; then + + # Set up a Python venv to host the scripts controlling the Elgato keylights in my office + python3 -m venv $XDG_DATA_HOME/elgato + $XDG_DATA_HOME/elgato/bin/pip list + $XDG_DATA_HOME/elgato/bin/pip install --upgrade pip setuptools + $XDG_DATA_HOME/elgato/bin/pip install leglight + +fi + + +if _command_exists pip; then + + # Ensure `pipx` is installed in the user's local environment + pip install --upgrade --user pipx + + pipx install rexi + + if [ -d "$HOME/Cloud/Getraenkemarkt" ]; then + + # (Re-)Install `mackup` via `pipx` in the user's local environment + export PIPX_BIN_DIR=$XDG_BIN_HOME + export PIPX_HOME="$XDG_DATA_HOME/pipx" + $XDG_BIN_HOME/pipx uninstall mackup + $XDG_BIN_HOME/pipx install mackup + + # Litte Hack: Make `mackup` respect the XDG directory structure + sed -in 's/VERSION = \".*\"/VERSION = \"0.999.0\"/g' $HOME/.local/**/mackup/constants.py + sed -in 's/CUSTOM_APPS_DIR = \"\.mackup\"/CUSTOM_APPS_DIR = \"\.config\/mackup\"/g' $HOME/.local/**/mackup/constants.py + sed -in 's/MACKUP_CONFIG_FILE = \"\.mackup\.cfg\"/MACKUP_CONFIG_FILE = \"\.config\/mackup\/mackup\.cfg\"/g' $HOME/.local/**/mackup/constants.py + + $XDG_BIN_HOME/mackup restore + + fi + +fi + + +if _command_exists zsh; then + + # Set the $ZDOTDIR in /etc[/zsh]/zshenv if that is not already done + # Notes: + # - must use $HOME as $XDG_CONFIG_HOME is not yet set + # - on Fedora, the global config files are not in /etc/zsh but in /etc + export ZDOTDIR="$HOME/.config/zsh" + for _file in '/etc/zshenv' '/etc/zsh/zshenv'; do + if [ -f $_file ]; then + grep -q -F "export ZDOTDIR" $_file || echo 'export ZDOTDIR="$HOME"/.config/zsh' | sudo tee -a $_file + fi + done + + # (Re-)Install oh-my-zsh + export ZSH="$XDG_DATA_HOME/oh-my-zsh" # temporarily set here; mainly set in $XDG_CONFIG_HOME/zsh/.zshenv + rm -rf $ZSH >/dev/null + # Let's NOT use the main repository but our personal fork + git clone --origin fork --branch forked https://code.webartifex.biz/alexander/oh-my-zsh.git $ZSH + cd $ZSH + git remote add origin https://github.com/ohmyzsh/ohmyzsh.git + cd $HOME + + # (Re-)Install zplug + export ZPLUG_HOME="$XDG_DATA_HOME/zplug" # temporarily set here; mainly set in $XDG_CONFIG_HOME/zsh/.zshenv + rm -rf $ZPLUG_HOME >/dev/null + git clone https://github.com/zplug/zplug $ZPLUG_HOME + # Set up all the zplug plugins (-i so that the new $XDG_CONFIG_HOME/zsh/.zshrc is sourced) + zsh -i -c "zplug install" + +fi + + +# Warn user if ~/.local/pipx already exists +# => As we use the custom $XDG_DATA_HOME/pipx location, +# the user should NOT `pipx`'s default install location as well +if [ -d "$HOME/.local/pipx" ]; then + echo + echo "~/.local/pipx already existed!" + echo "It is recommended to delete this location in favor of $XDG_DATA_HOME/pipx" + echo +fi + + +echo +echo "Probably it's a good idea to restart the shell" +echo "Make sure to start bash or zsh as a login shell the next time" +echo diff --git a/.local/share/pki/.gitkeep b/.local/share/pki/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.local/share/tig/.gitkeep b/.local/share/tig/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.local/state/wget/.gitkeep b/.local/state/wget/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/.profile b/.profile index 0ef05d4..230ac52 100644 --- a/.profile +++ b/.profile @@ -1,32 +1,55 @@ -#!/bin/sh - -# Main setup file executed for all kinds of shells -# -# For `bash`, the following two files must not exist: -# - ~/.bash_login -# - ~/.bash_profile -# If they do, this file may not be executed! +# Executed by a login shell (e.g., bash, sh, or zsh) during start-up -# Prevent loading ~/.profile twice in `bash` -export PROFILE_LOADED=1 + +# Shell-independent stuff -# Basic utilities +# Configure the standard XDG base directories +# Further Info: https://wiki.archlinux.org/title/XDG_Base_Directory +export XDG_CACHE_HOME="$HOME/.cache" +export XDG_CONFIG_HOME="$HOME/.config" +export XDG_DATA_HOME="$HOME/.local/share" # also set temporarily in $XDG_DATA_HOME/dotfiles/setup.sh +export XDG_STATE_HOME="$HOME/.local/state" # also set temporarily in $XDG_DATA_HOME/dotfiles/setup.sh +# Make up a XDG directory for binaries (that does not exist in the standard) +export XDG_BIN_HOME="$HOME/.local/bin" # also set temporarily in $XDG_DATA_HOME/dotfiles/setup.sh -_command_exists() { - command -v "$1" 1>/dev/null 2>&1 -} -_in_bash() { - [ -n "$BASH_VERSION" ] -} +# Move common tools' config and cache files into XDG directories +export BAT_CONFIG_PATH="$XDG_CONFIG_PATH/bat/config" +export CUDA_CACHE_PATH="$XDG_CACHE_HOME/nv" +export GNUPGHOME="$XDG_DATA_HOME/gnupg" +export LESSHISTFILE="$XDG_STATE_HOME/less/history" +export PASSWORD_STORE_DIR="$XDG_DATA_HOME/pass" +export PIPX_HOME="$XDG_DATA_HOME/pipx" +export PYTHONSTARTUP="$XDG_CONFIG_HOME/python/pythonrc" +export PSQLRC="$XDG_CONFIG_HOME/psql/psqlrc" +export SSB_HOME="$XDG_DATA_HOME"/zoom +export VIMINIT="source $XDG_CONFIG_HOME/vim/vimrc" -_in_zsh() { - [ -n "$ZSH_VERSION" ] -} -_prepend_to_path () { +# Generic shell configs +export EDITOR=vim +export PAGER='less --chop-long-lines --ignore-case --LONG-PROMPT --no-init --status-column --quit-if-one-screen' +export TERM=xterm-256color +export TZ='Europe/Berlin' +export VISUAL=$EDITOR + + +# Convenience variables for easier access of some locations +export REPOS="$HOME/Repositories" + + +# Python-specific configs +export PIPX_BIN_DIR=$XDG_BIN_HOME +export PYENV_ROOT="$HOME/.pyenv" +# No need for *.pyc files (and __pycache__ folders) to be within project folders +# Note: `export PYTHONDONTWRITEBYTECODE=1` would disable them entirely +export PYTHONPYCACHEPREFIX=/tmp/pycache + + +# Put local binaries on the $PATH +prepend-to-path () { # if not already there if [ -d "$1" ] ; then case :$PATH: in *:$1:*) ;; @@ -35,33 +58,30 @@ _prepend_to_path () { fi } - -# Load configuration files common to all kinds of shells -[ -f "$HOME/.config/shell/env" ] && . "$HOME/.config/shell/env" -[ -f "$HOME/.config/shell/aliases" ] && . "$HOME/.config/shell/aliases" +prepend-to-path "$HOME/bin" +prepend-to-path "$HOME/.local/bin" +prepend-to-path "$PYENV_ROOT/bin" -# Source ~/.profile_local, which holds machine-specific ENV variables -[ -f "$HOME/.profile_local" ] && . "$HOME/.profile_local" + +# Shell-specific stuff -# Load `bash`-specific configurations for non-login `bash` shells -if [ -n "$BASH_VERSION" ] && [ -f "$HOME/.bashrc" ]; then - . "$HOME/.bashrc" +# zsh-specific stuff is automatically sourced from +# $XDG_CONFIG_HOME/zsh/.zshenv, $XDG_CONFIG_HOME/zsh/.zprofile, +# $XDG_CONFIG_HOME/zsh/.zlogin, and $XDG_CONFIG_HOME/.zshrc + + +# Source ~/.bashrc if we are running inside a bash shell +# because it is NOT automatically sourced by bash +if [ -n "$BASH_VERSION" ]; then + if [ -f "$HOME/.bashrc" ]; then + source "$HOME/.bashrc" + fi fi -# `zsh`-specific configurations are automatically sourced from ~/.zshrc, -# which then also ensures that this file is sourced - - -# Put local executables on the `$PATH` -_prepend_to_path "$HOME/.local/bin" - - -# Ensure ~/.profile is loaded each time `bash` starts -unset PROFILE_LOADED - - -# When everything is loaded, show a little welcome message -[ -f "$HOME/.config/shell/welcome" ] && . "$HOME/.config/shell/welcome" +# Source ~/.profile_local, which holds machine-specific ENV variables +if [ -f "$HOME/.profile_local" ]; then + source "$HOME/.profile_local" +fi diff --git a/.selected_editor b/.selected_editor new file mode 100644 index 0000000..2cab271 --- /dev/null +++ b/.selected_editor @@ -0,0 +1 @@ +SELECTED_EDITOR="/usr/bin/vim" diff --git a/.ssh/authorized_keys b/.ssh/authorized_keys index b9c64de..e2a8fd8 100644 --- a/.ssh/authorized_keys +++ b/.ssh/authorized_keys @@ -1,5 +1,8 @@ ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN0GVKtgpgzpdf7E6e2vCytDSa2zPSgZ+8fAKCOotugH alexander@webartifex.biz (getraenkemarkt.io) ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMRDaWrT2hH7BOV4Zv1ctVGqwfeqkssnHklRXBmng6Wr alexander@webartifex.biz (laptop1.getraenkemarkt.io) ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOhhfx063dGoaE62cbdyGL3kp1AIovWFojQGNdqUpxr8 alexander@webartifex.biz (laptop2.getraenkemarkt.io) +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO4WZPkmknmo3R+DLjWrebt+X8UrHgoWwjHckbhxHVKC alexander@webartifex.biz (phone1.getraenkemarkt.io) +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILNrAp79oekaV1SivIj9mVYAzaSD9FSTjEcmnOnon9eI alexander@webartifex.biz (phone2.getraenkemarkt.io) +ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIbVaLHl4T+TjphPGSutYKH00Z3cNG+EmlhUfh+N/m6E alexander@webartifex.biz (tablet1.getraenkemarkt.io) ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGGNCrFt/gUbBHVqhthBuRmdDH6yS30+GGcCnARSzg+q alexander@webartifex.biz (workstation1.getraenkemarkt.io) ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKfaK5LUp7ghZLfl7urwQx+l+m/Vm7iksz8deGx4L5sD alexander@webartifex.biz (workstation2.getraenkemarkt.io) diff --git a/.zlogout b/.zlogout deleted file mode 100644 index 4ec153e..0000000 --- a/.zlogout +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/zsh - -. "$XDG_CONFIG_HOME/shell/logout" diff --git a/.zshrc b/.zshrc deleted file mode 100644 index 81a88e8..0000000 --- a/.zshrc +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/zsh - -# `zsh`-specific configurations - - -# Remove built-in aliases because we use our own, sourced via ~/.profile -unalias -a - - -# Load configuration files common to all kinds of shells -[ -f "$HOME/.profile" ] && . "$HOME/.profile" - - -# Ensure `zsh` is running interactively -[[ -o interactive ]] || return - - -# Make `zsh` behave like `bash` for prompts -PS1='%n@%m:%~%(!.#.$) ' - - -# Configure the `history` - -# Set these environment variables here -# to avoid conflict/overlap with `bash` - -export HISTFILE="$XDG_STATE_HOME/zsh/history" -export HISTSIZE=999999 # Number of lines kept in memory -export SAVEHIST=999999 # Number of lines kept in the `$HISTFILE` - -setopt APPEND_HISTORY # Do not overwrite the `$HISTFILE` -setopt INC_APPEND_HISTORY # Write to the `$HISTFILE` immediately -setopt HIST_REDUCE_BLANKS # Remove superfluous blanks from the `history` -setopt HIST_VERIFY # Show expanded `history` before executing - - -# Make `zsh` feel even nicer - -setopt AUTO_CD # Just type the directory to `cd` into it -setopt EXTENDED_GLOB # Advanced globbing patterns -setopt NULL_GLOB # Remove patterns with no matches -setopt CORRECT # Correct spelling of commands -setopt CHECK_JOBS # Show number of running jobs when exiting `zsh` -setopt NO_BEEP # Silence `zsh` - - -stty -ixon # Prevent Ctrl+S from freezing `zsh` - - -# Enable (tab) completions - -autoload -Uz compinit && compinit - -# Enable match highlighting and scrolling through long lists, -# and provide a different style of menu completion -zmodload zsh/complist - -# Include hidden files in tab completion -_comp_options+=(GLOB_DOTS) - -# Make selecting completions nicer with a visual menu -zstyle ':completion:*' menu select - -# Make new executables completable right away -zstyle ':completion:*' rehash true - - -# Configure key bindings - -# VI mode -bindkey -v - -# Use VI keys to navigate the completions in the menu -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 - -# Enable Ctrl-R for reverse history search -bindkey "^R" history-incremental-search-backward diff --git a/LICENSE.txt b/LICENSE.txt index eb196e9..75bb60c 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2022-2025 Alexander Hess [alexander@webartifex.biz] +Copyright (c) 2022 Alexander Hess [alexander@webartifex.biz] Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 92ea970..9edbe50 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,51 @@ # Dotfiles -This repository contains useful (config) files. - -It is structured into two branches: -- [desktop](https://code.webartifex.biz/alexander/dotfiles/src/branch/desktop) -- [main](https://code.webartifex.biz/alexander/dotfiles/src/branch/main) - -`main` contains dotfiles intended to be used on all kinds of machines - and can be thought of as a "minimal" or "server" version. -`desktop` is (re-)based on top of `main` - and adds "desktop" related dotfiles (e.g., GNOME stuff). +This repository contains useful (config) files that I use on my machines. -## Installation +## Initialization -Simply run: +On a freshly set up machine, run: -```sh -curl https://code.webartifex.biz/alexander/dotfiles/raw/branch/main/.local/bin/install-dotfiles > install-dotfiles && . ./install-dotfiles && rm ./install-dotfiles +```bash +curl https://code.webartifex.biz/alexander/dotfiles/raw/branch/main/.local/share/dotfiles/setup.sh \ + > ./setup.sh && source ./setup.sh && rm ./setup.sh ``` -or +This gives you a local copy of the latest version of this repository + (located in `$XDG_DATA_HOME/dotfiles`) + and initializes all the dotfiles provided here on the system. +Further, `zsh` is set up + with [`oh-my-zsh`](https://ohmyz.sh/) and [`zplug`](https://github.com/zplug/zplug) + if it is installed. -``` -wget https://code.webartifex.biz/alexander/dotfiles/raw/branch/main/.local/bin/install-dotfiles -O install-dotfiles && . ./install-dotfiles && rm ./install-dotfiles +**Note**: Log out and in again so that `bash` and `zsh` run as *login* shells. +Otherwise, `~/.profile` is probably *not* sourced. + +**Important**: Don't forget to back up your current dotfiles! + + +### Python Development Environments + +The develop environments for Python are managed via [`pyenv`](https://github.com/pyenv/pyenv). + +To set them up, run: + +```bash +create-or-update-python-envs ``` -This downloads a simple [installation script](.local/bin/install-dotfiles) - and then executes it. -The script has only one dependency, namely [git](https://git-scm.com). -So, it should not be too hard to get this going. +Several Python versions are installed. +Additionally, two `virtualenv`s, called "interactive" and "utils", are also created: + - "interactive" is the default environment, and + - "utils" hosts globally available utilities + (e.g., [youtube-dl](https://github.com/ytdl-org/youtube-dl/)). -Normally, I advice against executing shell scripts from the internet, - but this one is short enough to be read even by beginners. -So, convince yourself that it is not harmful! +Use `pyenv local ...` to specify a particular Python binary for a project. -## Shells +### Private Dotfiles -The config files in this repository are optimized for usage with - [GNU's Bourne again shell](https://man7.org/linux/man-pages/man1/bash.1.html), - or `bash` for short, - and the popular [zsh](https://www.zsh.org/). - - -## Copyright - -This repository and *all* of its contents are open-source - under the [MIT license](./LICENSE.txt). +After setting up the Python environments (i.e., the "utils"), + running `mackup restore` symlinks further dotfiles into `~/`. +This only works for this project's maintainer.