From 3c8857b1f6b5b60fd1b1ec194752b3162ec13546 Mon Sep 17 00:00:00 2001 From: Fernando Schauenburg Date: Sat, 27 Jul 2024 20:35:38 +0200 Subject: [PATCH] zsh: major refactor of .zshrc --- config/zsh/.zprofile | 2 +- config/zsh/.zshrc | 519 +++++++++++++++++- config/zsh/aliases.zsh | 48 -- config/zsh/broot.zsh | 22 - config/zsh/completion.zsh | 73 --- config/zsh/eza.zsh | 106 ---- config/zsh/functions/functions | 1 + ...ne-editor-fzf.zsh => fzf-key-bindings.zsh} | 0 config/zsh/fzf.zsh | 43 -- config/zsh/history.zsh | 8 - config/zsh/line-editor.zsh | 91 --- config/zsh/man-pages.zsh | 69 --- 12 files changed, 498 insertions(+), 484 deletions(-) delete mode 100644 config/zsh/aliases.zsh delete mode 100644 config/zsh/broot.zsh delete mode 100644 config/zsh/completion.zsh delete mode 100644 config/zsh/eza.zsh create mode 100644 config/zsh/functions/functions rename config/zsh/{line-editor-fzf.zsh => fzf-key-bindings.zsh} (100%) delete mode 100644 config/zsh/fzf.zsh delete mode 100644 config/zsh/history.zsh delete mode 100644 config/zsh/line-editor.zsh delete mode 100644 config/zsh/man-pages.zsh diff --git a/config/zsh/.zprofile b/config/zsh/.zprofile index df2d615..35f721c 100644 --- a/config/zsh/.zprofile +++ b/config/zsh/.zprofile @@ -1,5 +1,5 @@ have() { - command -v "$1" >/dev/null 2>&1 + type -p "$1" >/dev/null } # Prepend $2 to variable $1 using $3 as separator, but only if $2 is not already diff --git a/config/zsh/.zshrc b/config/zsh/.zshrc index d1c4900..00647d1 100644 --- a/config/zsh/.zshrc +++ b/config/zsh/.zshrc @@ -1,30 +1,503 @@ -# Make ctrl-q and ctrl-s available to terminal applications. -stty start undef stop undef +setup_terminal() { + # Make ctrl-q and ctrl-s available to terminal applications. + stty start undef stop undef +} -# Set up zsh for interactive use (options, prompt, aliases, etc.) -source "$ZDOTDIR/aliases.zsh" -source "$ZDOTDIR/completion.zsh" -source "$ZDOTDIR/history.zsh" -source "$ZDOTDIR/line-editor.zsh" -source "$ZDOTDIR/man-pages.zsh" -source "$ZDOTDIR/prompt.zsh" +setup_aliases() { + # ls: make `ls` group directories first if supported. + # lsc: force `ls` to use color output (e.g. for piping into `less`). -# Additional setup for programs, if they are installed. -command -v broot >/dev/null 2>&1 && source "$ZDOTDIR/broot.zsh" -command -v eza >/dev/null 2>&1 && source "$ZDOTDIR/eza.zsh" -command -v fzf >/dev/null 2>&1 && source "$ZDOTDIR/fzf.zsh" + # Precendence of program to back the `ls` alias: + # 1. `eza`, if installed. + # 2. GNU ls + # 3. BSD ls (e.g. macOS) + if type -p eza >/dev/null; then + alias ls="eza --classify --group-directories-first --group --links --smart-group" + alias la="ls --all" + alias lt="ls --long --tree --ignore-glob='.git'" + alias lta="lt --all" + alias lsc="ls --color=always" + alias ltc="lt --color=always" + elif ls --group-directories-first --color=auto >/dev/null 2>&1; then + alias ls="ls --classify --human-readable --group-directories-first --color=auto" + alias la="ls --almost-all" + alias lt="tree --dirsfirst -FI '.git|Spotlight-V100|.fseventsd'" + alias lsc="ls --color=always" + alias ltc="tree -C --dirsfirst -FI '.git'" + else + alias ls="ls -hF -G" + alias la="ls -A" + alias lt="tree --dirsfirst -FI '.git|Spotlight-V100|.fseventsd'" + alias lsc="/usr/bin/env CLICOLOR_FORCE=1 ls" + alias ltc="tree -C --dirsfirst -FI '.git'" + fi + + alias ll="ls -l" + alias lla="la -l" + alias ltl="lt -L" + + alias dots="cd ~/.dotfiles" + + alias grep="grep --color=auto" + alias egrep="egrep --color=auto" + alias fgrep="fgrep --color=auto" + + if type -p nvim >/dev/null; then + alias v="nvim" + alias vi="nvim" + alias vim="nvim" + alias vimdiff="nvim -d" + fi +} + +# source "$ZDOTDIR/completion.zsh" +setup_completion() { + # Enable additional completions from packages in `/usr/local`. + local vendor="/usr/local/share/zsh/vendor-completions" + [ -d "$vendor" ] && fpath=("$vendor" $fpath) + + zmodload zsh/complist + autoload -Uz compinit + compinit -d "$XDG_CACHE_HOME/zsh/.zcompdump" + + # Include hidden files when completing. + _comp_options+=(globdots) + + # Completion context pattern: + # :completion::::: + + # Which completion functions to use. + zstyle ':completion:*' completer _extensions _complete + + # Match case-insensitively and on partial words. + # TODO: perhaps implement something like nvim's smartcase? + zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' + + # Activate caching for completions that may use it. + zstyle ':completion:*' use-cache true + zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache" + + # List files in a format similar to `ls -l`. + zmodload zsh/stat # required for `file-list all` + disable stat # don't shadow external `stat` executable + zstyle ':completion:*' file-list all + + # Don't complete on all path components, which would complete /u/b/z to /usr/bin/zsh. + zstyle ':completion:*' path-completion false + + # Use tags as the group names. + zstyle ':completion:*' group-name '' + + # Custom order for words in the command position. + zstyle ':completion:*:*:-command-:*:*' group-order builtins aliases functions commands + + # Colors! + zstyle ':completion:*:*:*:*:descriptions' format '%F{green}❯❯ %d%f' + zstyle ':completion:*:*:*:*:corrections' format '%F{yellow}❯❯ %d%f' + zstyle ':completion:*:*:*:*:original' format '%F{yellow}❯❯ %d%f' + zstyle ':completion:*:*:*:*:messages' format '%F{cyan}❯❯ %d%f' + zstyle ':completion:*:*:*:*:warnings' format '%F{red}❯❯ no matches%f' + zstyle ':completion:*:*:*:*:default' list-colors true + + ################## + # Menu selection # + ################## + zstyle ':completion:*' menu select + zstyle ':completion:*:*:*:*:default' select-prompt '%K{yellow}%F{black}%l (%p)%f%k' + + # Navigate the list with `hjkl`. + bindkey -M menuselect 'h' vi-backward-char + bindkey -M menuselect 'j' vi-down-line-or-history + bindkey -M menuselect 'k' vi-up-line-or-history + bindkey -M menuselect 'l' vi-forward-char + + # Accept selected match and keep menu open. + bindkey -M menuselect 'p' accept-and-hold + + # Accept selected match and restart completion (allows drilling down directories). + bindkey -M menuselect '\t' accept-and-infer-next-history + + # Remove previously inserted matches. + bindkey -M menuselect 'u' undo + + # Jump to first/last line. + bindkey -M menuselect 'g' beginning-of-history + bindkey -M menuselect 'G' end-of-history + + # Page down/up. + bindkey -M menuselect 'f' vi-forward-word + bindkey -M menuselect 'b' vi-backward-word +} + +setup_history() { + setopt APPEND_HISTORY # Append history rather than overwrite. + setopt EXTENDED_HISTORY # Save beginning timestamp and duration. + setopt INC_APPEND_HISTORY # Don't wait until shell exits to save history. + setopt HIST_IGNORE_ALL_DUPS # Don't add duplicates to history. + + HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/history" + HISTSIZE=1000000 + SAVEHIST=1000000 +} + +setup_zle() { + bindkey -v # Use vi mode for line editing. + export KEYTIMEOUT=1 # 10ms delay for to switch to command mode. + + ############################# + # ZLE Widgets + ############################# + + set-cursor-shape() { + local block='\e[1 q' # blinking block + local underline='\e[3 q' # blinking underline, 4 for steady + local bar='\e[5 q' # blinkind bar, 6 for steady + if [[ -n "$ITERM_SESSION_ID" && -z "$TMUX" ]] { + block='\e]1337;CursorShape=0\a' + bar='\e]1337;CursorShape=1\a' + underline='\e]1337;CursorShape=2\a' + } + + case "$1" in + block) echo -n $block ;; + bar) echo -n $bar ;; + underline) echo -n $underline ;; + esac + } + + # Start new prompts with bar shaped cursor. + zle-line-init() { set-cursor-shape bar; } + zle -N zle-line-init + + # Switch cursor shape depending on editing mode. + zle-keymap-select() { + case $KEYMAP in + vicmd) set-cursor-shape block ;; + viins|main) set-cursor-shape bar ;; + esac + } + zle -N zle-keymap-select + + # Clear completion menus and other status line text. + zle-clear-status-line() { zle -R -c; } + zle -N zle-clear-status-line + + # Change root directory of the current git repository, if in one. + zle-cd-git-root() { + local top_level="$(git rev-parse --show-toplevel 2>/dev/null)" + [[ -z "$top_level" ]] && return 1 + zle push-line + BUFFER="builtin cd -- ${(q)top_level}" + zle accept-line + } + zle -N zle-cd-git-root + + autoload edit-command-line && zle -N edit-command-line # from zshcontrib + + ############################# + # Key mappings + ############################# + + # -------------- CTRL ------------------------------- + bindkey -M viins '^a' vi-beginning-of-line + bindkey -M viins '^e' vi-end-of-line + bindkey -M viins '^g' zle-cd-git-root + bindkey -M viins '^j' history-beginning-search-forward + bindkey -M viins '^k' history-beginning-search-backward + bindkey -M viins '^l' clear-screen + bindkey -M viins '^q' zle-clear-status-line + # ^r history search using fzf + # ^t paste file/directory using fzf + bindkey -M viins '^u' kill-whole-line + bindkey -s '^v' '^unvim\r' + bindkey -M viins '^x^e' edit-command-line + bindkey -M viins '^y' yank + + # -------------- ALT ------------------------------- + bindkey -M viins '^[.' insert-last-word + bindkey -M viins '^[b' vi-backward-word + # ^[c cd using fzf + bindkey -M viins '^[f' vi-forward-word + + # --------- Command mode ------------------------------- + bindkey -M vicmd ' ' edit-command-line + + ############################# + # fzf + ############################# + + if type -p fzf >/dev/null; then + local fzf_config="$ZDOTDIR/fzf-key-bindings.zsh" + [ -r "$fzf_config" ] && source "$fzf_config" + export FZF_CTRL_T_OPTS=--border-label='" Select file(s) "' + export FZF_CTRL_R_OPTS=--border-label='" History search "' + export FZF_ALT_C_OPTS=--border-label='" Change directory "' + else + # Fall back to incremental search + bindkey -M viins '^r' history-incremental-search-backward + bindkey -M isearch '^j' history-incremental-search-forward + bindkey -M isearch '^k' history-incremental-search-backward + bindkey -M isearch '^y' accept-search + fi +} + +# Colorful man pages. +setup_man_pages() { + # Foreground colors + typeset -A fg + fg[black]='\e[30m' + fg[red]='\e[31m' + fg[green]='\e[32m' + fg[yellow]='\e[33m' + fg[blue]='\e[34m' + fg[magenta]='\e[35m' + fg[cyan]='\e[36m' + fg[white]='\e[37m' + fg[br_black]='\e[90m' + fg[br_red]='\e[91m' + fg[br_green]='\e[92m' + fg[br_yellow]='\e[93m' + fg[br_blue]='\e[94m' + fg[br_magenta]='\e[95m' + fg[br_cyan]='\e[96m' + fg[br_white]='\e[97m' + + # Background colors + typeset -A bg + bg[black]='\e[40m' + bg[red]='\e[41m' + bg[green]='\e[42m' + bg[yellow]='\e[43m' + bg[blue]='\e[44m' + bg[magenta]='\e[45m' + bg[cyan]='\e[46m' + bg[white]='\e[47m' + bg[br_black]='\e[100m' + bg[br_red]='\e[101m' + bg[br_green]='\e[102m' + bg[br_yellow]='\e[103m' + bg[br_blue]='\e[104m' + bg[br_magenta]='\e[105m' + bg[br_cyan]='\e[106m' + bg[br_white]='\e[107m' + + # Other modifiers + local reset='\e[0m' + local bold='\e[1m' + local faint='\e[2m' + local italic='\e[3m' + local underline='\e[4m' + + ####################### + # Customize man pages # + ####################### + + # bold (md) and blink (mb) + export LESS_TERMCAP_md="$(printf %b $fg[blue])" + export LESS_TERMCAP_mb="$LESS_TERMCAP_md" + export LESS_TERMCAP_me="$(printf %b $reset)" + + # underline + export LESS_TERMCAP_us="$(printf %b $fg[br_blue] $italic $underline)" + export LESS_TERMCAP_ue="$(printf %b $reset)" + + # search + export LESS_TERMCAP_so="$(printf %b $fg[black] $bg[yellow] $bold)" + export LESS_TERMCAP_se="$(printf %b $reset)" + + # Tell `groff` to not emit SGR sequences, since we are telling `less` to + # generate them as per the configurations above. + export GROFF_NO_SGR=1 +} + +setup_prompt() { + source "$ZDOTDIR/prompt.zsh" +} + +setup_eza() { + type -p eza >/dev/null || return + + local black=30 + local red=31 + local green=32 + local yellow=33 + local blue=34 + local magenta=35 + local cyan=36 + local white=37 + + local br_black=90 + local br_red=91 + local br_green=92 + local br_yellow=93 + local br_blue=94 + local br_magenta=95 + local br_cyan=96 + local br_white=97 + + local colors=( + di=$blue # directories + ex=$green # executable files + # fi # regular files + # pi # named pipes + # so # sockets + # bd # block devices + # cd # character devices + # ln # symlinks + # or # symlinks with no target + # oc # the permissions displayed as octal + ur=$yellow # the user-read permission bit + uw=$red # the user-write permission bit + ux=$green # the user-execute permission bit for regular files + ue=$green # the user-execute for other file kinds + # gr # the group-read permission bit + # gw # the group-write permission bit + # gx # the group-execute permission bit + # tr # the others-read permission bit + # tw # the others-write permission bit + # tx # the others-execute permission bit + # su # setuid, setgid, and sticky permission bits for files + # sf # setuid, setgid, and sticky for other file kinds + # xa # the extended attribute indicator + # sn # the numbers of a file’s size (sets nb, nk, nm, ng and nt) + # nb # the numbers of a file’s size if it is lower than 1 KB/Kib + nk=$green # the numbers of a file’s size if it is between 1 KB/KiB and 1 MB/MiB + # nm # the numbers of a file’s size if it is between 1 MB/MiB and 1 GB/GiB + # ng # the numbers of a file’s size if it is between 1 GB/GiB and 1 TB/TiB + # nt # the numbers of a file’s size if it is 1 TB/TiB or higher + # sb # the units of a file’s size (sets ub, uk, um, ug and ut) + # ub # the units of a file’s size if it is lower than 1 KB/Kib + # uk # the units of a file’s size if it is between 1 KB/KiB and 1 MB/MiB + # um # the units of a file’s size if it is between 1 MB/MiB and 1 GB/GiB + # ug # the units of a file’s size if it is between 1 GB/GiB and 1 TB/TiB + # ut # the units of a file’s size if it is 1 TB/TiB or higher + # df # a device’s major ID + # ds # a device’s minor ID + uu=$br_black # a user that’s you + uR=$red # a user that’s root + un=$yellow # a user that’s someone else + gu=$br_black # a group that you belong to + gR=$red # a group related to root + gn=$yellow # a group you aren’t a member of + lc=$red # a number of hard links + # lm # a number of hard links for a regular file with at least two + # ga # a new flag in Git + # gm # a modified flag in Git + # gd # a deleted flag in Git + # gv # a renamed flag in Git + # gt # a modified metadata flag in Git + # gi # an ignored flag in Git + # gc # a conflicted flag in Git + # Gm # main branch of repo + # Go # other branch of repo + # Gc # clean branch of repo + # Gd # dirty branch of repo + # xx # “punctuation”, including many background UI elements + # da # a file’s date + # in # a file’s inode number + # bl # a file’s number of blocks + # hd # the header row of a table + # lp # the path of a symlink + # cc # an escaped character in a filename + # bO # the overlay style for broken symlink paths + # sp # special (not file, dir, mount, exec, pipe, socket, block device, char device, or link) + # mp # a mount point + # im # a regular file that is an image + # vi # a regular file that is a video + # mu # a regular file that is lossy music + # lo # a regular file that is lossless music + # cr # a regular file that is related to cryptography (ex: key or certificate) + # do # a regular file that is a document (ex: office suite document or PDF) + # co # a regular file that is compressed + # tm # a regular file that is temporary (ex: a text editor’s backup file) + # cm # a regular file that is a compilation artifact (ex: Java class file) + bu=$yellow # a regular file that is used to build a project (ex: Makefile) + sc=$yellow # a regular file that is source code + # Sn # No security context on a file + # Su # SELinux user + # Sr # SELinux role + # St # SELinux type + # Sl # SELinux level + # ff # BSD file flags + ) + + export EZA_COLORS="${(pj.:.)colors}" +} + +setup_fzf() { + type -p fzf >/dev/null || return + + local colors=( + fg:bright-black + fg+:bright-white:bold + bg+:-1 + hl:yellow:regular + hl+:bright-yellow:bold + query:bright-white:regular + info:blue:regular + border:bright-black + scrollbar:white + separator:bright-black + label:yellow:bold + prompt:blue + pointer:red:bold + marker:green + spinner:yellow + ) + + local bindings=( + ctrl-f:page-down + ctrl-b:page-up + ctrl-o:toggle-up + ctrl-t:toggle-all + ctrl-x:deselect-all + ) + + local defaults=( + --reverse + --border=rounded + --scrollbar=┃ + --prompt='"❯ "' + --pointer='" "' + --marker='"󰄴 "' + --color="${(pj/,/)colors}" + --bind="${(pj/,/)bindings}" + ) + + export FZF_DEFAULT_OPTS="${(pj/ /)defaults}" +} # Set up autoload for custom functions. -fpath=("$ZDOTDIR/functions" $fpath) -for filepath in $ZDOTDIR/functions/*; do - autoload "${filepath##*/}" -done -unset filepath +setup_functions() { + fpath=("$ZDOTDIR/functions" $fpath) + local filepath + for filepath in $ZDOTDIR/functions/*; do + autoload "${filepath##*/}" + done +} # Load additional local configuration if present. -local_config="$HOME/.local/etc/zsh/zshrc" -[ -r "$local_config" ] && source "$local_config" -unset local_config +setup_local_config() { + local config="$HOME/.local/etc/zsh/zshrc" + [ -r "$config" ] && source "$config" || true +} -# Allow comments in interactive use. -setopt INTERACTIVE_COMMENTS +# Set up zsh for interactive use (options, prompt, aliases, etc.) +setup_zsh_interactive() { + setopt INTERACTIVE_COMMENTS # Allow comments in interactive use. + setup_terminal + setup_aliases + setup_completion + setup_history + setup_zle + setup_man_pages + setup_prompt + setup_functions + setup_eza + setup_fzf + setup_local_config +} + +# zmodload zsh/zprof +setup_zsh_interactive +# zprof diff --git a/config/zsh/aliases.zsh b/config/zsh/aliases.zsh deleted file mode 100644 index fba756a..0000000 --- a/config/zsh/aliases.zsh +++ /dev/null @@ -1,48 +0,0 @@ -# ls: make `ls` group directories first if supported. -# lsc: force `ls` to use color output (e.g. for piping into `less`). -if command -v eza >/dev/null 2>&1; then - # Prefer eza if installed - alias \ - ls="eza --classify --group-directories-first --group --links --smart-group" \ - la="ls --all" \ - lt="ls --long --tree --ignore-glob='.git'" \ - lta="lt --all" \ - lsc="ls --color=always" \ - ltc="lt --color=always" -elif ls --group-directories-first --color=auto >/dev/null 2>&1; then - # GNU ls - alias \ - ls="ls --classify --human-readable --group-directories-first --color=auto" \ - la="ls --almost-all" \ - lt="tree --dirsfirst -FI '.git|Spotlight-V100|.fseventsd'" \ - lsc="ls --color=always" \ - ltc="tree -C --dirsfirst -FI '.git'" -else - # BSD ls (e.g. macOS) - alias \ - ls="ls -hF -G" \ - la="ls -A" \ - lt="tree --dirsfirst -FI '.git|Spotlight-V100|.fseventsd'" \ - lsc="/usr/bin/env CLICOLOR_FORCE=1 ls" \ - ltc="tree -C --dirsfirst -FI '.git'" -fi - -alias \ - ll="ls -l" \ - lla="la -l" \ - ltl="lt -L" - -alias dots="cd ~/.dotfiles" - -alias \ - grep="grep --color=auto" \ - egrep="egrep --color=auto" \ - fgrep="fgrep --color=auto" - -if command -v nvim >/dev/null 2>&1; then - alias \ - v="nvim" \ - vi="nvim" \ - vim="nvim" \ - vimdiff="nvim -d" -fi diff --git a/config/zsh/broot.zsh b/config/zsh/broot.zsh deleted file mode 100644 index 413dc52..0000000 --- a/config/zsh/broot.zsh +++ /dev/null @@ -1,22 +0,0 @@ -# This function was automatically generated by the broot program -# More information can be found in https://github.com/Canop/broot -# This function starts broot and executes the command -# it produces, if any. -# It's needed because some shell commands, like `cd`, -# have no useful effect if executed in a subshell. -function br { - local cmd cmd_file code - cmd_file=$(mktemp) - if broot --outcmd "$cmd_file" "$@"; then - cmd=$(<"$cmd_file") - command rm -f "$cmd_file" - eval "$cmd" - else - code=$? - command rm -f "$cmd_file" - return "$code" - fi -} - -# Shortcut to start neovim. -bindkey -s '^b' '^ubr\r' diff --git a/config/zsh/completion.zsh b/config/zsh/completion.zsh deleted file mode 100644 index 3574220..0000000 --- a/config/zsh/completion.zsh +++ /dev/null @@ -1,73 +0,0 @@ -# Enable additional completions from packages in `/usr/local`. -[ -d "/usr/local/share/zsh/vendor-completions" ] \ - && fpath=("/usr/local/share/zsh/vendor-completions" $fpath) - -zmodload zsh/complist -autoload -Uz compinit -compinit -d "$XDG_CACHE_HOME/zsh/.zcompdump" - -# Include hidden files when completing. -_comp_options+=(globdots) - -# Completion context pattern: -# :completion::::: - -zstyle ':completion:*' completer _extensions _complete - -# Match case-insensitively and on partial words. -zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' - -# Activate caching for completions that may use it. -zstyle ':completion:*' use-cache true -zstyle ':completion:*' cache-path "$XDG_CACHE_HOME/zsh/.zcompcache" - -# List files in a format similar to `ls -l`. -zmodload zsh/stat # required for `file-list all` -disable stat # don't shadow external `stat` executable -zstyle ':completion:*' file-list all - -# Don't complete on all path components, which would complete /u/b/z to /usr/bin/zsh. -zstyle ':completion:*' path-completion false - -# Use tags as the group names. -zstyle ':completion:*' group-name '' - -# Custom order for words in the command position. -zstyle ':completion:*:*:-command-:*:*' group-order builtins aliases functions commands - -# Colors! -zstyle ':completion:*:*:*:*:descriptions' format '%F{green}❯❯ %d%f' -zstyle ':completion:*:*:*:*:corrections' format '%F{yellow}❯❯ %d%f' -zstyle ':completion:*:*:*:*:original' format '%F{yellow}❯❯ %d%f' -zstyle ':completion:*:*:*:*:messages' format '%F{cyan}❯❯ %d%f' -zstyle ':completion:*:*:*:*:warnings' format '%F{red}❯❯ no matches%f' -zstyle ':completion:*:*:*:*:default' list-colors true - -################## -# Menu selection # -################## -zstyle ':completion:*' menu select -zstyle ':completion:*:*:*:*:default' select-prompt '%K{yellow}%F{black}%l (%p)%f%k' - -# Navigate the list with `hjkl`. -bindkey -M menuselect 'h' vi-backward-char -bindkey -M menuselect 'j' vi-down-line-or-history -bindkey -M menuselect 'k' vi-up-line-or-history -bindkey -M menuselect 'l' vi-forward-char - -# Accept selected match and keep menu open. -bindkey -M menuselect 'p' accept-and-hold - -# Accept selected match and restart completion (allows drilling down directories). -bindkey -M menuselect '\t' accept-and-infer-next-history - -# Remove previously inserted matches. -bindkey -M menuselect 'u' undo - -# Jump to first/last line. -bindkey -M menuselect 'g' beginning-of-history -bindkey -M menuselect 'G' end-of-history - -# Page down/up. -bindkey -M menuselect 'f' vi-forward-word -bindkey -M menuselect 'b' vi-backward-word diff --git a/config/zsh/eza.zsh b/config/zsh/eza.zsh deleted file mode 100644 index d544250..0000000 --- a/config/zsh/eza.zsh +++ /dev/null @@ -1,106 +0,0 @@ -black=30 -red=31 -green=32 -yellow=33 -blue=34 -magenta=35 -cyan=36 -white=37 - -br_black=90 -br_red=91 -br_green=92 -br_yellow=93 -br_blue=94 -br_magenta=95 -br_cyan=96 -br_white=97 - -colors=( - di=$blue # directories - ex=$green # executable files - # fi # regular files - # pi # named pipes - # so # sockets - # bd # block devices - # cd # character devices - # ln # symlinks - # or # symlinks with no target - # oc # the permissions displayed as octal - ur=$yellow # the user-read permission bit - uw=$red # the user-write permission bit - ux=$green # the user-execute permission bit for regular files - ue=$green # the user-execute for other file kinds - # gr # the group-read permission bit - # gw # the group-write permission bit - # gx # the group-execute permission bit - # tr # the others-read permission bit - # tw # the others-write permission bit - # tx # the others-execute permission bit - # su # setuid, setgid, and sticky permission bits for files - # sf # setuid, setgid, and sticky for other file kinds - # xa # the extended attribute indicator - # sn # the numbers of a file’s size (sets nb, nk, nm, ng and nt) - # nb # the numbers of a file’s size if it is lower than 1 KB/Kib - nk=$green # the numbers of a file’s size if it is between 1 KB/KiB and 1 MB/MiB - # nm # the numbers of a file’s size if it is between 1 MB/MiB and 1 GB/GiB - # ng # the numbers of a file’s size if it is between 1 GB/GiB and 1 TB/TiB - # nt # the numbers of a file’s size if it is 1 TB/TiB or higher - # sb # the units of a file’s size (sets ub, uk, um, ug and ut) - # ub # the units of a file’s size if it is lower than 1 KB/Kib - # uk # the units of a file’s size if it is between 1 KB/KiB and 1 MB/MiB - # um # the units of a file’s size if it is between 1 MB/MiB and 1 GB/GiB - # ug # the units of a file’s size if it is between 1 GB/GiB and 1 TB/TiB - # ut # the units of a file’s size if it is 1 TB/TiB or higher - # df # a device’s major ID - # ds # a device’s minor ID - uu=$br_black # a user that’s you - uR=$red # a user that’s root - un=$yellow # a user that’s someone else - gu=$br_black # a group that you belong to - gR=$red # a group related to root - gn=$yellow # a group you aren’t a member of - lc=$red # a number of hard links - # lm # a number of hard links for a regular file with at least two - # ga # a new flag in Git - # gm # a modified flag in Git - # gd # a deleted flag in Git - # gv # a renamed flag in Git - # gt # a modified metadata flag in Git - # gi # an ignored flag in Git - # gc # a conflicted flag in Git - # Gm # main branch of repo - # Go # other branch of repo - # Gc # clean branch of repo - # Gd # dirty branch of repo - # xx # “punctuation”, including many background UI elements - # da # a file’s date - # in # a file’s inode number - # bl # a file’s number of blocks - # hd # the header row of a table - # lp # the path of a symlink - # cc # an escaped character in a filename - # bO # the overlay style for broken symlink paths - # sp # special (not file, dir, mount, exec, pipe, socket, block device, char device, or link) - # mp # a mount point - # im # a regular file that is an image - # vi # a regular file that is a video - # mu # a regular file that is lossy music - # lo # a regular file that is lossless music - # cr # a regular file that is related to cryptography (ex: key or certificate) - # do # a regular file that is a document (ex: office suite document or PDF) - # co # a regular file that is compressed - # tm # a regular file that is temporary (ex: a text editor’s backup file) - # cm # a regular file that is a compilation artifact (ex: Java class file) - bu=$yellow # a regular file that is used to build a project (ex: Makefile) - sc=$yellow # a regular file that is source code - # Sn # No security context on a file - # Su # SELinux user - # Sr # SELinux role - # St # SELinux type - # Sl # SELinux level - # ff # BSD file flags -) - -export EZA_COLORS="${(pj.:.)colors}" -unset colors diff --git a/config/zsh/functions/functions b/config/zsh/functions/functions new file mode 100644 index 0000000..5923884 --- /dev/null +++ b/config/zsh/functions/functions @@ -0,0 +1 @@ +print "${(k)functions}" | sed 's/ \+/\n/g' | sed '/^_/d' | sort diff --git a/config/zsh/line-editor-fzf.zsh b/config/zsh/fzf-key-bindings.zsh similarity index 100% rename from config/zsh/line-editor-fzf.zsh rename to config/zsh/fzf-key-bindings.zsh diff --git a/config/zsh/fzf.zsh b/config/zsh/fzf.zsh deleted file mode 100644 index c2378ac..0000000 --- a/config/zsh/fzf.zsh +++ /dev/null @@ -1,43 +0,0 @@ -fzf_colors=( - fg:bright-black - fg+:bright-white:bold - bg+:-1 - hl:yellow:regular - hl+:bright-yellow:bold - query:bright-white:regular - info:blue:regular - border:bright-black - scrollbar:white - separator:bright-black - label:yellow:bold - prompt:blue - pointer:red:bold - marker:green - spinner:yellow -) - -fzf_bindings=( - ctrl-f:page-down - ctrl-b:page-up - ctrl-o:toggle-up - ctrl-t:toggle-all - ctrl-x:deselect-all -) - -fzf_defaults=( - --reverse - --border=rounded - --scrollbar=┃ - --prompt='"❯ "' - --pointer='" "' - --marker='"󰄴 "' - --color="${(pj/,/)fzf_colors}" - --bind="${(pj/,/)fzf_bindings}" -) - -export FZF_DEFAULT_OPTS="${(pj/ /)fzf_defaults}" -export FZF_CTRL_T_OPTS=--border-label='" Select file(s) "' -export FZF_CTRL_R_OPTS=--border-label='" History search "' -export FZF_ALT_C_OPTS=--border-label='" Change directory "' - -unset fzf_colors fzf_bindings fzf_defaults diff --git a/config/zsh/history.zsh b/config/zsh/history.zsh deleted file mode 100644 index 9d2983a..0000000 --- a/config/zsh/history.zsh +++ /dev/null @@ -1,8 +0,0 @@ -setopt APPEND_HISTORY # Append history rather than overwrite. -setopt EXTENDED_HISTORY # Save beginning timestamp and duration. -setopt INC_APPEND_HISTORY # Don't wait until shell exits to save history. -setopt HIST_IGNORE_ALL_DUPS # Don't add duplicates to history. - -HISTFILE="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/history" -HISTSIZE=1000000 -SAVEHIST=1000000 diff --git a/config/zsh/line-editor.zsh b/config/zsh/line-editor.zsh deleted file mode 100644 index 5c7e363..0000000 --- a/config/zsh/line-editor.zsh +++ /dev/null @@ -1,91 +0,0 @@ -set_cursor_shape() { - local block='\e[1 q' # blinking block - local underline='\e[3 q' # blinking underline, 4 for steady - local bar='\e[5 q' # blinkind bar, 6 for steady - if [[ -n "$ITERM_SESSION_ID" && -z "$TMUX" ]] { - block='\e]1337;CursorShape=0\a' - bar='\e]1337;CursorShape=1\a' - underline='\e]1337;CursorShape=2\a' - } - - case "$1" in - block) echo -n $block ;; - bar) echo -n $bar ;; - underline) echo -n $underline ;; - esac -} - -# Start new prompts with bar shaped cursor. -zle-line-init() { - set_cursor_shape bar -} -zle -N zle-line-init - -# Switch cursor shape depending on editing mode. -zle-keymap-select() { - case $KEYMAP in - vicmd) set_cursor_shape block ;; - viins|main) set_cursor_shape bar ;; - esac -} -zle -N zle-keymap-select - -# Use vi mode for line editing. -bindkey -v -export KEYTIMEOUT=1 - -# Restore some common and useful emacs mode shortcuts. -bindkey -M viins '^a' vi-beginning-of-line -bindkey -M viins '^e' vi-end-of-line -bindkey -M viins '^l' clear-screen -bindkey -M viins '^u' kill-whole-line -bindkey -M viins '^y' yank -bindkey -M viins '^[.' insert-last-word - -# Search through history in insert mode. -bindkey -M viins '^j' history-beginning-search-forward -bindkey -M viins '^k' history-beginning-search-backward - -# Move word-wise with Alt. -bindkey -M viins '^[b' vi-backward-word -bindkey -M viins '^[f' vi-forward-word - -# Edit current command line in $EDITOR. -autoload edit-command-line && zle -N edit-command-line -bindkey -M viins '^x^e' edit-command-line -bindkey -M vicmd ' ' edit-command-line - -clear-status-line() { - zle -R -c - # zle -R hello world and the rest -} -zle -N clear-status-line -bindkey -M viins '^q' clear-status-line - -# Shortcut to start neovim. -bindkey -s '^v' '^unvim\r' - -# cd to the root of the git repository (if within one). -cd-git-root() { - local top_level="$(git rev-parse --show-toplevel 2>/dev/null)" - [[ -z "$top_level" ]] && return 1 - zle push-line - BUFFER="builtin cd -- ${(q)top_level}" - zle accept-line -} -zle -N cd-git-root -bindkey -M viins '^g' cd-git-root - -if command -v fzf >/dev/null 2>&1; then - # Add `fzf` key bindings if it's installed: - # - CTRL-T: paste the selected file path(s) into the command line - # - ALT-C: cd into the selected directory - # - CTRL-R: paste the selected command from history into the command line - source "$ZDOTDIR/line-editor-fzf.zsh" -else - # Fall back to incremental search - bindkey -M viins '^r' history-incremental-search-backward - bindkey -M isearch '^j' history-incremental-search-forward - bindkey -M isearch '^k' history-incremental-search-backward - bindkey -M isearch '^y' accept-search -fi diff --git a/config/zsh/man-pages.zsh b/config/zsh/man-pages.zsh deleted file mode 100644 index 65b819e..0000000 --- a/config/zsh/man-pages.zsh +++ /dev/null @@ -1,69 +0,0 @@ -customize_man_pages() { - # Foreground colors - typeset -A fg - fg[black]='\e[30m' - fg[red]='\e[31m' - fg[green]='\e[32m' - fg[yellow]='\e[33m' - fg[blue]='\e[34m' - fg[magenta]='\e[35m' - fg[cyan]='\e[36m' - fg[white]='\e[37m' - fg[br_black]='\e[90m' - fg[br_red]='\e[91m' - fg[br_green]='\e[92m' - fg[br_yellow]='\e[93m' - fg[br_blue]='\e[94m' - fg[br_magenta]='\e[95m' - fg[br_cyan]='\e[96m' - fg[br_white]='\e[97m' - - # Background colors - typeset -A bg - bg[black]='\e[40m' - bg[red]='\e[41m' - bg[green]='\e[42m' - bg[yellow]='\e[43m' - bg[blue]='\e[44m' - bg[magenta]='\e[45m' - bg[cyan]='\e[46m' - bg[white]='\e[47m' - bg[br_black]='\e[100m' - bg[br_red]='\e[101m' - bg[br_green]='\e[102m' - bg[br_yellow]='\e[103m' - bg[br_blue]='\e[104m' - bg[br_magenta]='\e[105m' - bg[br_cyan]='\e[106m' - bg[br_white]='\e[107m' - - # Other modifiers - local reset='\e[0m' - local bold='\e[1m' - local faint='\e[2m' - local italic='\e[3m' - local underline='\e[4m' - - ####################### - # Customize man pages # - ####################### - - # bold (md) and blink (mb) - export LESS_TERMCAP_md="$(printf %b $fg[blue])" - export LESS_TERMCAP_mb="$LESS_TERMCAP_md" - export LESS_TERMCAP_me="$(printf %b $reset)" - - # underline - export LESS_TERMCAP_us="$(printf %b $fg[br_blue] $italic $underline)" - export LESS_TERMCAP_ue="$(printf %b $reset)" - - # search - export LESS_TERMCAP_so="$(printf %b $fg[black] $bg[yellow] $bold)" - export LESS_TERMCAP_se="$(printf %b $reset)" - - # Tell `groff` to not emit SGR sequences, since we are telling `less` to - # generate them as per the configurations above. - export GROFF_NO_SGR=1 -} - -customize_man_pages