Compare commits

...

No commits in common. "main" and "main-old" have entirely different histories.

85 changed files with 5860 additions and 647 deletions

8
.bash_login Normal file
View file

@ -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

View file

@ -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"

10
.bash_profile Normal file
View file

@ -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

193
.bashrc
View file

@ -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='... '

View file

@ -0,0 +1,44 @@
[General]
confirmExternalStorage=true
crashReporter=false
desktopEnterpriseChannel=daily
isVfsEnabled=false
launchOnSystemStartup=true
monoIcons=true
moveToTrash=false
newBigFolderSizeLimit=10000
notifyExistingFoldersOverLimit=true
optionalServerNotifications=false
promptDeleteAllFiles=true
showCallNotifications=false
stopSyncingExistingFoldersOverLimit=false
useNewBigFolderSizeLimit=true
[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

View file

@ -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

View file

@ -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

View file

@ -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

7
.config/bpython/config Normal file
View file

@ -0,0 +1,7 @@
[general]
# Make `bpython` and `python` share their history
hist_file = ~/.python_history
# No limit
hist_length = 0

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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
#

View file

@ -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 / < <file>`.
It is important to always load them in anchored at the root (i.e., `/`).

View file

@ -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

View file

@ -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'

View file

@ -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.

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -0,0 +1,318 @@
# Unify all key bindings in this file to conveniently keep them consistent
[org/gnome/desktop/wm/keybindings]
# <Super><Shift>q is i3wm's default
close=['<Super>Q', '<Super><Shift>Q', '<Primary><Shift>Q', '<Alt>F4']
maximize=@as []
unmaximize=@as []
toggle-maximized=['<Super>M']
minimize=@as []
switch-applications=['<Super>Tab', '<Primary>Tab']
switch-applications-backward=['<Super><Shift>Tab', '<Primary><Shift>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 []
# - <Super><Primary>Left/Right is the default to move left/right => <Super><Primary>1-5
# - <Super>1-5 is i3wm's default way
switch-to-workspace-1=['<Super>1', '<Super><Primary>1']
switch-to-workspace-2=['<Super>2', '<Super><Primary>2']
switch-to-workspace-3=['<Super>3', '<Super><Primary>3']
switch-to-workspace-4=['<Super>4', '<Super><Primary>4']
switch-to-workspace-5=['<Super>5', '<Super><Primary>5']
switch-to-workspace-6=['<Super>6', '<Super><Primary>6']
switch-to-workspace-7=['<Super>7', '<Super><Primary>7']
switch-to-workspace-8=['<Super>8', '<Super><Primary>8']
switch-to-workspace-9=['<Super>9', '<Super><Primary>9']
switch-to-workspace-10=['<Super>0', '<Super><Primary>0']
switch-to-workspace-last=['<Super>End', '<Super><Primary>End']
switch-to-workspace-left=['<Super><Primary>Left']
switch-to-workspace-right=['<Super><Primary>Right']
# <Super><Shift>1-5 is i3wm's default
move-to-workspace-1=['<Super><Shift>1', '<Primary><Shift>1']
move-to-workspace-2=['<Super><Shift>2', '<Primary><Shift>2']
move-to-workspace-3=['<Super><Shift>3', '<Primary><Shift>3']
move-to-workspace-4=['<Super><Shift>4', '<Primary><Shift>4']
move-to-workspace-5=['<Super><Shift>5', '<Primary><Shift>5']
move-to-workspace-6=['<Super><Shift>6', '<Primary><Shift>6']
move-to-workspace-7=['<Super><Shift>7', '<Primary><Shift>7']
move-to-workspace-8=['<Super><Shift>8', '<Primary><Shift>8']
move-to-workspace-9=['<Super><Shift>9', '<Primary><Shift>9']
move-to-workspace-10=['<Super><Shift>0', '<Primary><Shift>0']
move-to-workspace-last=['<Super><Shift>End', '<Primary><Shift>End']
move-to-workspace-left=['<Super><Shift>Left', '<Primary><Shift>Left']
move-to-workspace-right=['<Super><Shift>Right', '<Primary><Shift>Right']
[org/gnome/mutter/keybindings]
toggle-tiled-left=@as []
toggle-tiled-right=@as []
[org/gnome/settings-daemon/plugins/media-keys]
email=['<Super>E']
help=@as []
home=['<Super>F']
search=['<Super>slash']
terminal=@as []
www=['<Super>B']
screensaver=['<Super>Escape']
logout=@as []
# Besides the numkeys, we use "/", ".", and "," to control the media
play=['<Primary><Alt>Slash']
next=['<Primary><Alt>Right']
previous=['<Primary><Alt>Left']
# Note: I often type "m" for "mute" intuitively
volume-mute=['<Primary><Alt>M']
volume-up=['<Primary><Alt>Up']
volume-down=['<Primary><Alt>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='<Primary><Alt>Home'
command='gnome-session-quit --reboot'
name='Reboot Machine'
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1]
binding='<Primary><Alt>End'
command='gnome-session-quit --power-off'
name='Shutdown Machine'
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2]
binding='<Primary><Alt>Delete'
command='gnome-session-quit --logout'
name='Log out (1)'
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3]
binding='<Primary><Alt>BackSpace'
command='gnome-session-quit --logout'
name='Log out (2)'
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4]
binding='<Super>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='<Super>Return'
command='alacritty'
name='Terminal (1)'
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom6]
# Faster than the default <Primary><Alt>t
binding='<Super>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='<Primary><Alt>T'
command='alacritty'
name='Terminal (3)'
[org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom8]
binding='<Primary><Alt>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='<Primary><Alt>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='<Primary><Alt>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='<Primary><Alt>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='<Primary><Alt>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='<Super>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=['<Super><Shift>Y']
window-toggle-float=@as []
window-toggle-always-float=['<Super>Y']
window-focus-up=['<Super>Up']
window-focus-down=['<Super>Down']
window-focus-left=['<Super>Left']
window-focus-right=['<Super>Right']
window-move-up=['<Super><Shift>Up']
window-move-down=['<Super><Shift>Down']
window-move-left=['<Super><Shift>Left']
window-move-right=['<Super><Shift>Right']
window-swap-up=['<Super><Primary>Up']
window-swap-down=['<Super><Primary>Down']
window-swap-left=['<Super><Primary>Left']
window-swap-right=['<Super><Primary>Right']
window-swap-last-active=['<Super><Primary>Return']
window-resize-top-increase=['<Super><Alt>Up']
window-resize-top-decrease=['<Super><Alt><Primary>Down']
window-resize-bottom-increase=['<Super><Alt>Down']
window-resize-bottom-decrease=['<Super><Alt><Primary>Up']
window-resize-left-increase=['<Super><Alt>Left']
window-resize-left-decrease=['<Super><Alt><Primary>Right']
window-resize-right-increase=['<Super><Alt>Right']
window-resize-right-decrease=['<Super><Alt><Primary>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=['<Primary><Alt>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=['<Super>Y']
toggle-tiling=['<Super><Shift>Y']
focus-up=['<Super>Up']
focus-down=['<Super>Down']
focus-left=['<Super>Left']
focus-right=['<Super>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=['<Super><Primary><Shift>Up', '<Super><Shift>Up', '<Primary><Shift>Up']
pop-monitor-down=['<Super><Primary><Shift>Down', '<Super><Shift>Down', '<Primary><Shift>Down']
pop-monitor-left=['<Super><Primary><Shift>Left']
pop-monitor-right=['<Super><Primary><Shift>Right']
pop-workspace-down=@as []
pop-workspace-up=@as []
# <Super><Shift>Return instead of the default <Super>Return
# so that <Super>Return opens terminal (like i3wm) above
tile-enter=['<Primary><Shift>Return', '<Super><Shift>Return']
tile-accept=['Return']
tile-move-up=['Up']
tile-move-down=['Down']
tile-move-left=['Left']
tile-move-right=['Right']
tile-resize-up=['<Shift>Down']
tile-resize-down=['<Shift>Up']
tile-resize-left=['<Shift>Left']
tile-resize-right=['<Shift>Right']
tile-swap-up=['<Primary>Up']
tile-swap-down=['<Primary>Down']
tile-swap-left=['<Primary>Left']
tile-swap-right=['<Primary>Right']
[org/gnome/shell/keybindings]
focus-active-notification=@as []
open-application-menu=@as []
# Disable Gnome's default behavior of opening "favorite" apps
# with <Super>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='<Primary>W'
close-window='<Primary>Q'
find='<Primary>F'
find-clear='<Primary>J'
find-next='<Primary>N'
find-previous='<Primary>H'
new-tab='<Primary>T'
new-window='<Primary>N'
zoom-in='<Primary><Shift>Plus'
# default: zoom-out='<Primary>minus'

View file

@ -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'

View file

@ -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

View file

@ -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 []

View file

@ -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 <Super>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=['<Primary><Alt>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

16
.config/mackup/README.md Normal file
View file

@ -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.

View file

@ -0,0 +1,5 @@
[application]
name = Cisco's AnyConnect
[configuration_files]
.anyconnect

5
.config/mackup/gnupg.cfg Normal file
View file

@ -0,0 +1,5 @@
[application]
name = gnupg
[configuration_files]
.local/share/gnupg/trustdb.gpg

View file

@ -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

35
.config/mackup/mackup.cfg Normal file
View file

@ -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

View file

@ -0,0 +1,5 @@
[application]
name = Gnome Files a.k.a. Nautilus
[xdg_configuration_files]
gtk-3.0/bookmarks

View file

@ -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

View file

@ -0,0 +1,5 @@
[application]
name = private SSH (config) files
[configuration_files]
.ssh/config

View file

@ -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`

View file

@ -0,0 +1,3 @@
{
"bookmarks" : [ ]
}

View file

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<Mediathek>
<system>
<Abo-Mindestdauer-Minuten></Abo-Mindestdauer-Minuten>
<Abos-sofort-suchen>true</Abos-sofort-suchen>
<Ansicht-Set-lang></Ansicht-Set-lang>
<Blacklist-auch-Abo></Blacklist-auch-Abo>
<Blacklist-ausgeschaltet>false</Blacklist-ausgeschaltet>
<Blacklist-Filmlaenge>0</Blacklist-Filmlaenge>
<Blacklist-ist-Whitelist></Blacklist-ist-Whitelist>
<Blacklist-Start-ausgeschaltet>false</Blacklist-Start-ausgeschaltet>
<Blacklist-Zukunft-nicht-anzeigen></Blacklist-Zukunft-nicht-anzeigen>
<Dialog-Download-D-Starten>true</Dialog-Download-D-Starten>
<download-error-msg>true</download-error-msg>
<Download-Ordner-oeffnen></Download-Ordner-oeffnen>
<Download-sofort-starten>false</Download-sofort-starten>
<Eigenschaften-Tabellen-Abos></Eigenschaften-Tabellen-Abos>
<Eigenschaften-Tabellen-Downloads>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||</Eigenschaften-Tabellen-Downloads>
<Eigenschaften-Tabellen-Filme>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||</Eigenschaften-Tabellen-Filme>
<Ersetzungstabelle-verwenden>true</Ersetzungstabelle-verwenden>
<FARBE_BUTTON_SET_ABSPIELEN></FARBE_BUTTON_SET_ABSPIELEN>
<FARBE_DOWNLOAD_ANSEHEN></FARBE_DOWNLOAD_ANSEHEN>
<FARBE_DOWNLOAD_DATEINAME_ALT></FARBE_DOWNLOAD_DATEINAME_ALT>
<FARBE_DOWNLOAD_DATEINAME_EXISTIERT></FARBE_DOWNLOAD_DATEINAME_EXISTIERT>
<FARBE_DOWNLOAD_DATEINAME_NEU></FARBE_DOWNLOAD_DATEINAME_NEU>
<FARBE_DOWNLOAD_FEHLER></FARBE_DOWNLOAD_FEHLER>
<FARBE_DOWNLOAD_FEHLER_SEL></FARBE_DOWNLOAD_FEHLER_SEL>
<FARBE_DOWNLOAD_FERTIG></FARBE_DOWNLOAD_FERTIG>
<FARBE_DOWNLOAD_FERTIG_SEL></FARBE_DOWNLOAD_FERTIG_SEL>
<FARBE_DOWNLOAD_IST_ABO></FARBE_DOWNLOAD_IST_ABO>
<FARBE_DOWNLOAD_IST_DIREKTER_DOWNLOAD></FARBE_DOWNLOAD_IST_DIREKTER_DOWNLOAD>
<FARBE_DOWNLOAD_RUN></FARBE_DOWNLOAD_RUN>
<FARBE_DOWNLOAD_RUN_SEL></FARBE_DOWNLOAD_RUN_SEL>
<FARBE_DOWNLOAD_WAIT></FARBE_DOWNLOAD_WAIT>
<FARBE_DOWNLOAD_WAIT_SEL></FARBE_DOWNLOAD_WAIT_SEL>
<FARBE_FILM_BOOKMARKED></FARBE_FILM_BOOKMARKED>
<FARBE_FILM_GEOBLOCK_BACKGROUND></FARBE_FILM_GEOBLOCK_BACKGROUND>
<FARBE_FILM_GEOBLOCK_BACKGROUND_SEL></FARBE_FILM_GEOBLOCK_BACKGROUND_SEL>
<FARBE_FILM_HISTORY></FARBE_FILM_HISTORY>
<FARBE_FILM_LIVESTREAM></FARBE_FILM_LIVESTREAM>
<FARBE_FILM_NEU></FARBE_FILM_NEU>
<FARBE_FILMLISTE_LADEN_AKTIV></FARBE_FILMLISTE_LADEN_AKTIV>
<FARBE_FILTER_REGEX></FARBE_FILTER_REGEX>
<FARBE_FILTER_REGEX_FEHLER></FARBE_FILTER_REGEX_FEHLER>
<Hinweis-Nr-angezeigt></Hinweis-Nr-angezeigt>
<Meldungsfenster-Playermeldungen></Meldungsfenster-Playermeldungen>
<Meldungsfenster-Systemmeldungen></Meldungsfenster-Systemmeldungen>
<nur-ascii>false</nur-ascii>
<Pfade-zum-Speichern></Pfade-zum-Speichern>
<pfad-ffmpeg>/usr/bin/ffmpeg</pfad-ffmpeg>
<pfad-vlc>/usr/bin/vlc</pfad-vlc>
<Player-zum-Abspielen></Player-zum-Abspielen>
<Programm-Linux-Shutdown></Programm-Linux-Shutdown>
<Programm-Url-oeffnen></Programm-Url-oeffnen>
<system-import-url-manuell></system-import-url-manuell>
<system-tab-abo-icon-anzeigen>true</system-tab-abo-icon-anzeigen>
<system-tab-abo-icon-klein>true</system-tab-abo-icon-klein>
<system-tab-download-filter-vis>true</system-tab-download-filter-vis>
<system-tab-download-icon-anzeigen>true</system-tab-download-icon-anzeigen>
<system-tab-download-icon-klein>true</system-tab-download-icon-klein>
<system-tab-download-linebreak>false</system-tab-download-linebreak>
<system-tab-filme-icon-anzeigen>true</system-tab-filme-icon-anzeigen>
<system-tab-filme-icon-klein>true</system-tab-filme-icon-klein>
<system-tab-filme-linebreak>false</system-tab-filme-linebreak>
<update-filme>2</update-filme>
<Version-Programmset>6</Version-Programmset>
</system>
<Programmset>
<Name>Linux Speichern</Name>
<Praefix>http</Praefix>
<Suffix>mp4,mp3,m4v,flv,m4a</Suffix>
<Zielpfad>/home/alexander/downloads/mediathek-view</Zielpfad>
<Zieldateiname>%t-%T-%z</Zieldateiname>
<Thema-anlegen>true</Thema-anlegen>
<Abspielen>false</Abspielen>
<Speichern>true</Speichern>
<Button>true</Button>
<Abo>true</Abo>
<Laenge>false</Laenge>
<Laenge-Feld>false</Laenge-Feld>
<max-Laenge>25</max-Laenge>
<Aufloesung>normal</Aufloesung>
<Beschreibung>Standardset zum Speichern der Filme</Beschreibung>
<Infodatei>false</Infodatei>
<Spotlight>false</Spotlight>
<Untertitel>false</Untertitel>
</Programmset>
<Programm>
<Programmname>ffmpeg</Programmname>
<Zieldateiname>%t-%T-%Z.mp4</Zieldateiname>
<Programmpfad>/usr/bin/ffmpeg</Programmpfad>
<Programmschalter>-i %f -c copy -bsf:a aac_adtstoasc **</Programmschalter>
<Praefix>http</Praefix>
<Suffix>m3u8</Suffix>
<Restart>false</Restart>
<Downloadmanager>false</Downloadmanager>
</Programm>
<Programm>
<Programmname>VLC</Programmname>
<Zieldateiname>%t-%T-%Z.ts</Zieldateiname>
<Programmpfad>/usr/bin/vlc</Programmpfad>
<Programmschalter>%f :sout=#standard{access=file,mux=ts,dst=**} -I dummy --play-and-exit</Programmschalter>
<Restart>false</Restart>
<Downloadmanager>false</Downloadmanager>
</Programm>
<Programmset>
<Name>Linux Abspielen</Name>
<Thema-anlegen>true</Thema-anlegen>
<Abspielen>true</Abspielen>
<Speichern>false</Speichern>
<Button>true</Button>
<Abo>false</Abo>
<Laenge>false</Laenge>
<Laenge-Feld>false</Laenge-Feld>
<max-Laenge>25</max-Laenge>
<Aufloesung>normal</Aufloesung>
<Beschreibung>Standardset zum direkten Abspielen der Filme</Beschreibung>
<Infodatei>false</Infodatei>
<Spotlight>false</Spotlight>
<Untertitel>false</Untertitel>
</Programmset>
<Programm>
<Programmname>Vlc</Programmname>
<Programmpfad>/usr/bin/vlc</Programmpfad>
<Programmschalter>%f --play-and-exit</Programmschalter>
<Restart>false</Restart>
<Downloadmanager>false</Downloadmanager>
</Programm>
<Ersetzungstabelle><von> </von><nach>_</nach></Ersetzungstabelle>
</Mediathek>

View file

@ -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"

View file

@ -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

View file

@ -0,0 +1,3 @@
[virtualenvs]
create = true
in-project = true

38
.config/python/pythonrc Normal file
View file

@ -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)

View file

@ -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)

View file

@ -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).

View file

@ -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

View file

@ -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.

View file

@ -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'

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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"

49
.config/shell/init.sh Normal file
View file

@ -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

View file

@ -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

1
.config/shell/logout.sh Normal file
View file

@ -0,0 +1 @@
# This file is sourced by a login shell upon logout

View file

@ -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.

View file

@ -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"
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}

View file

@ -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 ""

8
.config/user-dirs.dirs Normal file
View file

@ -0,0 +1,8 @@
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOCUMENTS_DIR="$HOME/Cloud"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_MUSIC_DIR="$HOME/Cloud/Gallery/Music"
XDG_PICTURES_DIR="$HOME/Cloud/Gallery"
XDG_PUBLICSHARE_DIR="$HOME/Cloud/Shared/Public"
XDG_TEMPLATES_DIR="$HOME/Cloud/Templates"
XDG_VIDEOS_DIR="$HOME/Cloud/Gallery/Videos"

View file

@ -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

1622
.config/zsh/.p10k.zsh Normal file

File diff suppressed because it is too large Load diff

3
.config/zsh/.zlogout Normal file
View file

@ -0,0 +1,3 @@
# Executed by zsh when a login shell exits
source "$HOME/.config/shell/logout.sh"

5
.config/zsh/.zprofile Normal file
View file

@ -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"

40
.config/zsh/.zshenv Normal file
View file

@ -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 <Up> 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"

View file

@ -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

View file

@ -1,3 +0,0 @@
# `zsh`-related Configurations
This folder contains files that are sourced by `zsh`.

4
.hidden Normal file
View file

@ -0,0 +1,4 @@
LICENSE.txt
R
README.md
Screenshots

View file

@ -1,3 +0,0 @@
# User-local Executables
This folder contains executable files that are on the `$PATH`.

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 MiB

112
.local/share/dotfiles/setup.sh Executable file
View file

@ -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

View file

View file

View file

108
.profile
View file

@ -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

1
.selected_editor Normal file
View file

@ -0,0 +1 @@
SELECTED_EDITOR="/usr/bin/vim"

View file

@ -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)

View file

@ -1,3 +0,0 @@
#!/bin/zsh
. "$XDG_CONFIG_HOME/shell/logout"

80
.zshrc
View file

@ -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

View file

@ -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

View file

@ -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.