From 6aabb86c2c78b6d61b81213326754e54e43bfe87 Mon Sep 17 00:00:00 2001 From: Gabe Venberg Date: Wed, 14 May 2025 00:16:40 +0200 Subject: [PATCH] revamp .zshrc a bit. --- zsh/.zshrc | 278 ++++++++++++++++++++++++++++------------------------- 1 file changed, 147 insertions(+), 131 deletions(-) diff --git a/zsh/.zshrc b/zsh/.zshrc index f71a5d5..f2d6094 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -13,25 +13,23 @@ #set important shell variables - #set default editor and pager. - export EDITOR=nvim - export VISUAL=nvim - export PAGER=less - #default options for less - export LESS="-R" - export LESSHISTFILE="/dev/null" - #set the w3m homepage - export WWW_HOME="duckduckgo.com/lite/" - #set ssh-agent to play nice with systemd. - export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket" - export TIMEFMT="%J %*U user %*S system %P cpu %*E total" - export PIPENV_VENV_IN_PROJECT=true - export POETRY_VIRTUALENVS_IN_PROJECT=true - #turns out its ok to have nonexistent paths in $PATH - export PATH="$PATH:$HOME/.local/bin/" - export PATH="$PATH:/opt" - export PATH="$PATH:$HOME/.cargo/bin" - export PATH="$PATH:$HOME/.nix-profile/bin" +#set default editor and pager. +export EDITOR=nvim +export VISUAL=nvim +export PAGER=less +#default options for less +export LESS="-R" +export LESSHISTFILE="/dev/null" +#set ssh-agent to play nice with systemd. +export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket" +export TIMEFMT="%J %*U user %*S system %P cpu %*E total" +export PIPENV_VENV_IN_PROJECT=true +export POETRY_VIRTUALENVS_IN_PROJECT=true +#turns out its ok to have nonexistent paths in $PATH +export PATH="$PATH:$HOME/.local/bin/" +export PATH="$PATH:/opt" +export PATH="$PATH:$HOME/.cargo/bin" +export PATH="$PATH:$HOME/.nix-profile/bin" #prompt setprompt() { @@ -45,7 +43,7 @@ setprompt() { setopt prompt_subst - precmd_vcs() {vcs_info} + precmd_vcs() { vcs_info; } #when not in a repo, show full path to current directory. when in one, show path from base direcory of the repo. zstyle ':vcs_info:*' nvcsformats '%~' @@ -53,9 +51,7 @@ setprompt() { zstyle ':vcs_info:*' actionformats '%r/%S %F{green}[%b] %F{red}<%a>%f' #the precmd function, called just before printing the prompt. - function precmd() { - precmd_vcs - } + function precmd() { precmd_vcs; } #Make the right prompt blank, just to be sure. RPROMPT='' @@ -64,135 +60,155 @@ setprompt() { PROMPT=$'%F{cyan}[%n@%m]%f%F{red}├────┤%f${vcs_info_msg_0_} %F{white}[%D %T]%f\n»' } #starship if its installed, otherwise the prompt we just defined. - command -v starship &> /dev/null && eval "$(starship init zsh)" || setprompt +command -v starship &> /dev/null && eval "$(starship init zsh)" || setprompt #show dots while waiting for tab-completion - expand-or-complete-with-dots() { - # toggle line-wrapping off and back on again - [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti rmam - print -Pn "%{%F{red}......%f%}" - [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti smam +expand-or-complete-with-dots() { + # toggle line-wrapping off and back on again + [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti rmam + print -Pn "%{%F{red}......%f%}" + [[ -n "$terminfo[rmam]" && -n "$terminfo[smam]" ]] && echoti smam - zle expand-or-complete - zle redisplay - } - zle -N expand-or-complete-with-dots - bindkey "^I" expand-or-complete-with-dots + zle expand-or-complete + zle redisplay +} +zle -N expand-or-complete-with-dots +bindkey "^I" expand-or-complete-with-dots # editing stuff - # Enable the ZLE line editor, which is default behavior, but to be sure - setopt ZLE - #Enable vi mode for the ZLE. it should be set by default due to our EDITOR and VISUAL, but this is just to be safe. - bindkey -v - #allow backspacing beyond the point you entered insert mode: - bindkey -v '^?' backward-delete-char - bindkey "^W" backward-kill-word +# Enable the ZLE line editor, which is default behavior, but to be sure +setopt ZLE +#Enable vi mode for the ZLE. it should be set by default due to our EDITOR and VISUAL, but this is just to be safe. +bindkey -v +#allow backspacing beyond the point you entered insert mode: +bindkey -v '^?' backward-delete-char +bindkey "^W" backward-kill-word #misc - # Sends cd commands without the need for 'cd' - setopt AUTO_CD - # Kill all child processes when we exit, dont leave them running - unsetopt NO_HUP - #Allows comments in interactive shell. - setopt INTERACTIVE_COMMENTS - # Ctrl+S and Ctrl+Q usually disable/enable tty input. This disables those inputs - unsetopt FLOW_CONTROL - mkdir -p ~/.cache/zsh - local zshCache=~/.cache/zsh +# Sends cd commands without the need for 'cd' +setopt AUTO_CD +# Turn off terminal beep on autocomplete. +unsetopt BEEP +# Kill all child processes when we exit, dont leave them running +unsetopt NO_HUP +#Allows comments in interactive shell. +setopt INTERACTIVE_COMMENTS +# Ctrl+S and Ctrl+Q usually disable/enable tty input. This disables those inputs +unsetopt FLOW_CONTROL +mkdir -p ~/.cache/zsh +local zshCache=~/.cache/zsh #ZSH history - #make a history file outside our home directory - HISTFILE=$zshCache/history - #save a lot of history - SAVEHIST=1000 - HISTSIZE=1000 - #save more information in history - setopt EXTENDED_HISTORY - #share history among zsh sessions - setopt APPEND_HISTORY - setopt SHARE_HISTORY - #skip dupes when going through history - setopt HIST_FIND_NO_DUPS - #delete dupes first when histsize becomes full - setopt HIST_EXPIRE_DUPS_FIRST - #dont write dupes of the last command to histfile - setopt HIST_IGNORE_DUPS - #write history file as we type - setopt INC_APPEND_HISTORY - #remove extra whitespace from history - setopt HIST_REDUCE_BLANKS +#make a history file outside our home directory +HISTFILE=$zshCache/history +#save a lot of history +SAVEHIST=1000 +HISTSIZE=1000 +#save more information in history +setopt EXTENDED_HISTORY +#share history among zsh sessions +setopt APPEND_HISTORY +setopt SHARE_HISTORY +#skip dupes when going through history +setopt HIST_FIND_NO_DUPS +#delete dupes first when histsize becomes full +setopt HIST_EXPIRE_DUPS_FIRST +#dont write dupes of the last command to histfile +setopt HIST_IGNORE_DUPS +#write history file as we type +setopt INC_APPEND_HISTORY +#remove extra whitespace from history +setopt HIST_REDUCE_BLANKS #autocomplete - autoload -Uz compinit - compinit - #have the menu highlight while we cycle through options - zstyle ':completion:*' menu select - #case insensitive completion - zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' - #allow completion from midword - setopt COMPLETE_IN_WORD - #move cursor to end of word after completing - setopt ALWAYS_TO_END - #complete aliases as well - setopt COMPLETE_ALIASES - #select first item when you press tab the first time. - setopt MENU_COMPLETE +autoload -Uz compinit +compinit +#have the menu highlight while we cycle through options +zstyle ':completion:*' menu select +#case insensitive completion +zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' +#allow completion from midword +setopt COMPLETE_IN_WORD +#move cursor to end of word after completing +setopt ALWAYS_TO_END +#complete aliases as well +setopt COMPLETE_ALIASES +#select first item when you press tab the first time. +setopt MENU_COMPLETE #globbing - #case insensitive globbing - setopt NO_CASE_GLOB - #sort globs that expand to numbers by number rather than alphabeticly - setopt NUMERIC_GLOB_SORT - #allows for some neat globbing. - setopt EXTENDED_GLOB +#case insensitive globbing +setopt NO_CASE_GLOB +#sort globs that expand to numbers by number rather than alphabeticly +setopt NUMERIC_GLOB_SORT +#allows for some neat globbing. +setopt EXTENDED_GLOB #aliases - alias vim="nvim" - alias vimdiff="nvim -d" - alias please='sudo $(fc -ln -1)' - alias la='ls -lha' - alias ll='ls -lh' - alias say='espeak -p 10 -s 150 -a 200 2> /dev/null' - alias tmux='tmux -u' - alias pdfmk='latexmk -lualatex -pvc' - # needs to have a number immediately after it. - alias slideshow='feh --full-screen --randomize --auto-zoom --recursive --slideshow-delay' - # converts all .doc and .docx files in the local directory to pdfs using libreoffice - alias doc2pdf='loffice --convert-to pdf --headless *.docx' - #common options for sshfs - alias sshmnt='sshfs -o idmap=user,compression=no,reconnect,follow_symlinks,dir_cache=yes,ServerAliveInterval=15' - alias pyactivate='source ./.venv/bin/activate' - tre() { command tre "$@" -e && source "/tmp/tre_aliases_$USER" 2>/dev/null; } +alias vim="nvim" +alias vimdiff="nvim -d" +alias please='sudo $(fc -ln -1)' +alias la='ls -lha' +alias ll='ls -lh' +alias say='espeak -p 10 -s 150 -a 200 2> /dev/null' +alias tmux='tmux -u' +alias pdfmk='latexmk -lualatex -pvc' +# needs to have a number immediately after it. +alias slideshow='feh --full-screen --randomize --auto-zoom --recursive --slideshow-delay' +# converts all .doc and .docx files in the local directory to pdfs using libreoffice +alias doc2pdf='loffice --convert-to pdf --headless *.docx' +#common options for sshfs +alias sshmnt='sshfs -o idmap=user,compression=no,reconnect,follow_symlinks,dir_cache=yes,ServerAliveInterval=15' +alias pyactivate='source ./.venv/bin/activate' +tre() { command tre "$@" -e && source "/tmp/tre_aliases_$USER" 2>/dev/null; } #setup grep to be a bit more nice - local GREP_OPTIONS="" - # color grep results - GREP_OPTIONS+=" --color=auto" - # ignore VCS folders (if the necessary grep flags are available) - local VCS_FOLDERS="{.bzr,CVS,.git,.hg,.svn}" - GREP_OPTIONS+=" --exclude-dir=$VCS_FOLDERS" - GREP_OPTIONS+=" --exclude=$VCS_FOLDERS" - # export grep settings - alias grep="grep $GREP_OPTIONS" +local GREP_OPTIONS="" +# color grep results +GREP_OPTIONS+=" --color=auto" +# ignore VCS folders (if the necessary grep flags are available) +local VCS_FOLDERS="{.bzr,CVS,.git,.hg,.svn}" +GREP_OPTIONS+=" --exclude-dir=$VCS_FOLDERS" +GREP_OPTIONS+=" --exclude=$VCS_FOLDERS" +# export grep settings +alias grep="grep $GREP_OPTIONS" #fzf stuff - testPath="/usr/share/fzf/key-bindings.zsh" - [ -f "$testPath" ] && source $testPath - testPath="/usr/share/fzf/completion.zsh" - [ -f "$testPath" ] && source $testPath - #if it was installed using git, can just source the one file: - testPath="$HOME/.fzf.zsh" - [ -f "$testPath" ] && source $testPath +testPath="/usr/share/fzf/key-bindings.zsh" +[ -f "$testPath" ] && source "$testPath" +testPath="/usr/share/fzf/completion.zsh" +[ -f "$testPath" ] && source "$testPath" +#if it was installed using git, can just source the one file: +testPath="$HOME/.fzf.zsh" +[ -f "$testPath" ] && source "$testPath" #zoxide stuff - command -v zoxide &> /dev/null && eval "$(zoxide init zsh)" +command -v zoxide &> /dev/null && eval "$(zoxide init zsh)" -#check for existence of pyenv before setting it up. - if command -v pyenv &> /dev/null; then - export PYENV_ROOT="$HOME/.pyenv" - [[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" - eval "$(pyenv init -)" +#cheat.sh is a wonderful tool, the less typing needed the better. +cheat(){ + for i in "$@"; do + curl cheat.sh/"$i" + done +} +#the tre command has some shell integration. +tre() { command tre "$@" --editor && source "/tmp/tre_aliases_$USER" 2>/dev/null; } +tred() { command tre "$@" --editor=z --directories && source "/tmp/tre_aliases_$USER" 2>/dev/null; } + +#moves a file, leaving a symlink in its place. +mvln(){ + # Check for correct number of arguments + if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 1 + fi + source="$1" destination="$2" + # Check if source exists + if [ ! -e "$source" ]; then + echo "$source does not exist." + exit 1 fi -#fancy way of testing if a command exists -command -v ruby &>/dev/null && export PATH="$PATH:$(ruby -e 'puts Gem.user_dir' 2> /dev/null)/bin/" + mv -- "$source" "$destination" + ln -s -- "$(realpath "$destination/$(basename "$source")")" "$(realpath "$source")" +}