From b7fc209c937fcf246beb331a349d020c1669aa51 Mon Sep 17 00:00:00 2001 From: Pratik Tripathy Date: Fri, 28 Jun 2024 18:34:43 +0530 Subject: [PATCH] ZSH config overhaul - .zshrc: Use zinit package manager - .zshrc: Reorg - remove comments, ZSH, zinit, configs batched together - .zshrc: Better completions - .zshrc: More plugins: colored-man-pages, command-not-found, kitty, podman, rust, timer, fd, systemd - .profile: Autoload brew applications on MacOs - p10k: Transient prompt + dotted lines --- common/.config/shell/p10k.zsh | 20 ++--- common/.profile | 1 + common/.zshrc | 141 ++++++++++++++++------------------ 3 files changed, 77 insertions(+), 85 deletions(-) diff --git a/common/.config/shell/p10k.zsh b/common/.config/shell/p10k.zsh index 1bc012f..9fc22f9 100644 --- a/common/.config/shell/p10k.zsh +++ b/common/.config/shell/p10k.zsh @@ -1,8 +1,8 @@ -# Generated by Powerlevel10k configuration wizard on 2024-01-15 at 21:46 IST. +# Generated by Powerlevel10k configuration wizard on 2024-06-28 at 15:57 IST. # Based on romkatv/powerlevel10k/config/p10k-lean.zsh, checksum 43791. -# Wizard options: nerdfont-complete + powerline, small icons, unicode, lean, 24h time, -# 2 lines, solid, left frame, darkest-ornaments, compact, many icons, concise, -# instant_prompt=quiet. +# Wizard options: nerdfont-complete + powerline, small icons, unicode, lean, 12h time, +# 2 lines, dotted, left frame, darkest-ornaments, sparse, many icons, concise, +# transient_prompt, instant_prompt=verbose. # Type `p10k configure` to generate another config. # # Config for Powerlevel10k with lean prompt style. Type `p10k configure` to generate @@ -135,7 +135,7 @@ typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true # Add an empty line before each prompt. - typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true # Connect left prompt lines with these symbols. typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%238F╭─' @@ -164,7 +164,7 @@ # the number of prompt lines. You'll probably want to set POWERLEVEL9K_SHOW_RULER=false # if using this. You might also like POWERLEVEL9K_PROMPT_ADD_NEWLINE=false for more compact # prompt. - typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR='─' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR='·' if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then # The color of the filler. typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=238 @@ -788,7 +788,7 @@ # # These variables correspond to the last line of the output of `todo.sh -p ls`: # - # todo: 24 of 42 tasks shown + # TODO: 24 of 42 tasks shown # # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. # @@ -1499,7 +1499,7 @@ # Current time color. typeset -g POWERLEVEL9K_TIME_FOREGROUND=66 # Format for the current time: 09:51:02. See `man 3 strftime`. - typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' + typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%I:%M:%S %p}' # If set to true, time will update when you hit enter. This way prompts for the past # commands will contain the start times of their commands as opposed to the default # behavior where they contain the end times of their preceding commands. @@ -1548,7 +1548,7 @@ # - always: Trim down prompt when accepting a command line. # - same-dir: Trim down prompt when accepting a command line unless this is the first command # typed after changing current working directory. - typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=off + typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always # Instant prompt mode. # @@ -1560,7 +1560,7 @@ # - verbose: Enable instant prompt and print a warning when detecting console output during # zsh initialization. Choose this if you've never tried instant prompt, haven't # seen the warning, or if you are unsure what this all means. - typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet + typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload diff --git a/common/.profile b/common/.profile index 92c883b..d1eda69 100644 --- a/common/.profile +++ b/common/.profile @@ -1,6 +1,7 @@ #!/bin/sh [ ! -f "/home/linuxbrew/.linuxbrew/bin/brew" ] || eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" +[ ! -f "/opt/homebrew/bin/brew" ] || eval "$(/opt/homebrew/bin/brew shellenv)" # set PATH so it includes user's private bin if it exists [ ! -d "$HOME/bin" ] || PATH="$HOME/bin:$PATH" diff --git a/common/.zshrc b/common/.zshrc index 3f2e47b..e0f4c60 100644 --- a/common/.zshrc +++ b/common/.zshrc @@ -2,6 +2,31 @@ # I'm not using a separate .zprofile; reuse the .profile instead [[ ! -f "$HOME/.profile" ]] || source "$HOME/.profile" +# ZSH Options +bindkey -v # enable vi-mode +setopt +o nomatch + +ZSH_THEME="powerlevel10k/powerlevel10k" +CASE_SENSITIVE="true" +DISABLE_UPDATE_PROMPT="true" +COMPLETION_WAITING_DOTS="true" +HIST_STAMPS="dd.mm.yyyy" # see 'man strftime' for details. +VI_MODE_SET_CURSOR=true +VI_MODE_CURSOR_INSERT=3 + +# ZSH History +export HISTSIZE=10000000 +export SAVEHIST=$HISTSIZE +export HISTFILE="$XDG_STATE_HOME/shell/zsh_history" +setopt appendhistory # Append rather than overwriting +setopt sharehistory # Share history between all sessions. +setopt extended_history # Write the history file in the ":start:elapsed;command" format. +setopt inc_append_history # Write to the history file immediately, not when the shell exits. +setopt hist_reduce_blanks # Remove superfluous blanks before recording entry. +setopt hist_verify # Don't execute immediately upon history expansion. +setopt hist_ignore_space # Don't add commands that start with whitespace to history +setopt hist_find_no_dups # Don't show duplicate commands when searching history + # Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. # Initialization code that may require console input (password prompts, [y/n] # confirmations, etc.) must go above this block; everything else may go below. @@ -9,97 +34,59 @@ if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]] source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" fi -# Path to your oh-my-zsh installation. -export ZSH="$XDG_DATA_HOME/shell/oh-my-zsh" -export ZSH_CUSTOM="$ZSH/custom" -source "${ZSH_CUSTOM}/themes/powerlevel10k/powerlevel10k.zsh-theme" +# Zinit ZSH Plugin Manager +ZINIT_HOME="${XDG_DATA_HOME}/shell/zinit/zinit.git" +if [[ ! -d "$ZINIT_HOME" ]]; then + mkdir -p "$(dirname $ZINIT_HOME)" + git clone https://github.com/zdharma-continuum/zinit.git "$ZINIT_HOME" +fi +source "${ZINIT_HOME}/zinit.zsh" -ZSH_THEME="powerlevel10k/powerlevel10k" +# Zinit Plugins +zinit ice depth=1; zinit light romkatv/powerlevel10k +zinit light zdharma-continuum/fast-syntax-highlighting +zinit light zsh-users/zsh-completions +zinit light zsh-users/zsh-autosuggestions -# Uncomment the following line to use case-sensitive completion. -CASE_SENSITIVE="true" +# Oh-my-zsh plugins +zi snippet OMZP::colored-man-pages +zi snippet OMZP::command-not-found +zi snippet OMZP::gitignore +zi snippet OMZP::kitty +zi snippet OMZP::podman +zi snippet OMZP::rust +zi snippet OMZP::sudo +zi snippet OMZP::systemd +zi snippet OMZP::timer +zi snippet OMZP::vi-mode +zi snippet https://github.com/ohmyzsh/ohmyzsh/blob/master/plugins/per-directory-history/per-directory-history.zsh -# Uncomment the following line to use hyphen-insensitive completion. -# Case-sensitive completion must be off. _ and - will be interchangeable. -# HYPHEN_INSENSITIVE="true" +zi ice as"completion" +zi snippet OMZP::fd/_fd -# Uncomment the following line to automatically update without prompting. -DISABLE_UPDATE_PROMPT="true" - -# Uncomment the following line if pasting URLs and other text is messed up. -# DISABLE_MAGIC_FUNCTIONS="true" - -# Uncomment the following line to enable command auto-correction. -# ENABLE_CORRECTION="true" - -# Uncomment the following line to display red dots whilst waiting for completion. -COMPLETION_WAITING_DOTS="true" - -# Uncomment the following line if you want to disable marking untracked files -# under VCS as dirty. This makes repository status check for large repositories -# much, much faster. -# DISABLE_UNTRACKED_FILES_DIRTY="true" - -# "mm/dd/yyyy"|"dd.mm.yyyy"|"yyyy-mm-dd" -# see 'man strftime' for details. -HIST_STAMPS="dd.mm.yyyy" - -# Standard plugins can be found in $ZSH/plugins/ -# Custom plugins may be added to $ZSH_CUSTOM/plugins/ -plugins=( - git - gitignore - docker - docker-compose - per-directory-history - sudo - vi-mode - dotnet - exercism -) -VI_MODE_SET_CURSOR=true -VI_MODE_CURSOR_INSERT=3 HISTORY_BASE="$XDG_STATE_HOME/shell/per-directory-history" +TIMER_PRECISION=3; TIMER_FORMAT='[%d]' -# NOTE: Should be exported before sourcing oh-my-zsh, to avoid the dumpfiles on $HOME -export ZSH_COMPDUMP="$XDG_CACHE_HOME/zsh/zcompdump-$HOST" +# ZSH Auto-completion settings +autoload -Uz compinit +compinit -d "$XDG_CACHE_HOME/zsh/zcompdump-$ZSH_VERSION" +_comp_options+=(globdots) # Include hidden files +zmodload zsh/complist +zinit cdreplay -q -source "$ZSH/oh-my-zsh.sh" - -source "$(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh" -source "$(brew --prefix)/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" +# Completion styling +zstyle ':completion::complete:*' gain-privileges 1 menu select cache-path "$XDG_CACHE_HOME/zsh/zcompcache" +zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' # Case INsensitive completion match +zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" # Add color to completion suggestions # To customize prompt, run `p10k configure` [[ ! -f "$XDG_CONFIG_HOME/shell/p10k.zsh" ]] || source "$XDG_CONFIG_HOME/shell/p10k.zsh" # User configuration -setopt +o nomatch - -# Higher History -export HISTSIZE=10000000 -export SAVEHIST=10000000 -export HISTFILE="$XDG_STATE_HOME/shell/zsh_history" -setopt EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format. -setopt INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. -setopt SHARE_HISTORY # Share history between all sessions. -setopt HIST_REDUCE_BLANKS # Remove superfluous blanks before recording entry. -setopt HIST_VERIFY # Don't execute immediately upon history expansion. -setopt HIST_IGNORE_SPACE # Don't add commands that start with whitespace to history - -# enable vi-mode -bindkey -v - # Add brew provided autocompletions to path [[ ! -d "/home/linuxbrew/.linuxbrew/share/zsh/site-functions" ]] || FPATH="/home/linuxbrew/.linuxbrew/share/zsh/site-functions:$FPATH" -# Auto/tab completions -autoload -Uz compinit -zstyle ':completion::complete:*' gain-privileges 1 menu select cache-path "$XDG_CACHE_HOME/zsh/zcompcache" -zmodload zsh/complist -compinit -d "$XDG_CACHE_HOME/zsh/zcompdump-$ZSH_VERSION" -_comp_options+=(globdots) # Include hidden files - # [ctrl+r]: Search command history # [ctrl+t]: fzf & over the files & directories under the current one & paste it to prompt # [alt+c] : fzf & cd into a directory under the current one @@ -110,6 +97,10 @@ command -v zoxide >/dev/null && eval "$(zoxide init --cmd cd zsh)" # Source aliases and shell functions for alias_file in "$XDG_CONFIG_HOME"/shell/*.sh; do source "$alias_file"; done +# Keybindings +bindkey '^f' autosuggest-accept # +bindkey '^p' history-search-backward # Ctrl+p gets the last history match +bindkey '^n' history-search-forward # Ctrl+n gets the next history match # TIP: Following should be executed AFTER the aliases are sourced command -v op >/dev/null && bindkey -s '^o' ' op\n' # Fuzzyfind projects and open in nvim command -v pnew >/dev/null && bindkey -s '^[o' ' pnew\n' # Create a new project quickly