diff options
Diffstat (limited to '.config/zsh')
| -rw-r--r-- | .config/zsh/.zprofile | 5 | ||||
| -rw-r--r-- | .config/zsh/.zshenv | 159 | ||||
| -rw-r--r-- | .config/zsh/.zshrc | 510 |
3 files changed, 674 insertions, 0 deletions
diff --git a/.config/zsh/.zprofile b/.config/zsh/.zprofile new file mode 100644 index 0000000..8ab0499 --- /dev/null +++ b/.config/zsh/.zprofile @@ -0,0 +1,5 @@ +if [[ "$(tty)" = "/dev/tty1" ]]; then + pgrep bspwm || startx "$XDG_CONFIG_HOME/X11/xinitrc" +fi + +#eval "$(gh completion -s zsh)" diff --git a/.config/zsh/.zshenv b/.config/zsh/.zshenv new file mode 100644 index 0000000..b970d2c --- /dev/null +++ b/.config/zsh/.zshenv @@ -0,0 +1,159 @@ + +#export XINITRC="$HOME/.config/X11/.xinitrc" +#export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/X11/.inputrc" +#export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh" +#export XAUTHORITY="$XDG_RUNTIME_DIR/.Xauthority" # This line will break some DMs. +#export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc +#export XAUTHORITY="$XDG_RUNTIME_DIR"/Xauthority + +# Path +#export PATH="$PATH:${$(find ~/.local/bin ~/.local/share/npm/bin -type d -printf %p:)%%:}" +export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local:$HOME/.local/bin:$HOME/.local/bin/scripts:$HOME/Scripts:$HOME/.local/bin/statusbar + + +# Default Programs: +export EDITOR="nvim" +export VISUAL="nvim" +export READER="zathura" +export TERMINAL="wezterm" +export COLORTERM="truecolor" +export TERM="xterm-256color" +export BROWSER="firefox" +export OPENER="xdg-open" +export PAGER="less" +export WM="bspwm" +export XDG_SESSION_TYPE=X11 + +# XDG Paths: +export XDG_CONFIG_HOME=${XDG_CONFIG_HOME:="$HOME/.config"} +#export XDG_DATA_HOME=${XDG_DATA_HOME:="$HOME/.local/share"} +export XDG_DATA_HOME="$HOME/.local/share" +export XDG_CACHE_HOME=${XDG_CACHE_HOME:="$HOME/.cache"} +export XINITRC="$HOME/.config/X11/.xinitrc" +export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/X11/.inputrc" +export ICEAUTHORITY="$XDG_CACHE_HOME"/.ICEauthority +export ZDOTDIR="$XDG_CONFIG_HOME/zsh" +export HISTFILE="$ZDOTDIR/.zhistory" # History filepath +export HISTSIZE=1000000 # Maximum events for internal history +export SAVEHIST=1000000 # Maximum events in history file +export BANG_HIST # Treat the '!' character specially during expansion. +export EXTENDED_HISTORY # Write the history file in the ":start:elapsed;command" format. +export INC_APPEND_HISTORY # Write to the history file immediately, not when the shell exits. +export SHARE_HISTORY # Share history between all sessions. +export HIST_EXPIRE_DUPS_FIRST # Expire duplicate entries first when trimming history. +export HIST_IGNORE_DUPS # Don't record an entry that was just recorded again. +export HIST_IGNORE_ALL_DUPS # Delete old recorded entry if new entry is a duplicate. +export HIST_FIND_NO_DUPS # Do not display a line previously found. +export HIST_IGNORE_SPACE # Don't record an entry starting with a space. +export HIST_SAVE_NO_DUPS # Don't write duplicate entries in the history file. +export HIST_REDUCE_BLANKS # Remove superfluous blanks before recording entry. +export HIST_VERIFY # Don't execute immediately upon history expansion. +export HIST_BEEP # Beep when accessing nonexistent history. + +# Other XDG Paths: +#export NVM_COMPLETION=true +#export NVM_DIR=$HOME/".nvm" +#[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm + +#export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrc +#export NVM_DIR="$XDG_DATA_HOME"/nvm +#export NODE_REPL_HISTORY="$XDG_DATA_HOME"/node_repl_history +export ASPROOT="${XDG_CACHE_HOME:-$HOME/.cache}/asp" +# fixing paths +export XSERVERRC="$XDG_CONFIG_HOME"/X11/xserverrc +#export GEM_PATH="$XDG_DATA_HOME/ruby/gems" +#export GEM_SPEC_CACHE="$XDG_DATA_HOME/ruby/specs" +#export GEM_HOME="$XDG_DATA_HOME/ruby/gems" +#export GOPATH="$XDG_DATA_HOME"/go +export _JAVA_OPTIONS=-Djava.util.prefs.userRoot="$XDG_CONFIG_HOME"/java +export GTK2_RC_FILES="$XDG_CONFIG_HOME"/gtk-2.0/gtkrc +#export CARGO_HOME="$XDG_DATA_HOME"/cargo +#export PATH=$CARGO_HOME/bin:$PATH +export RIPGREP_CONFIG_PATH="$XDG_CONFIG_HOME/ripgrep/ripgreprc" +#export WORKON_HOME="$XDG_DATA_HOME"/virtualenvs +export WGETRC="$XDG_CONFIG_HOME"/wget/wgetrc +export DOCKER_CONFIG="$XDG_CONFIG_HOME"/docker +export IPYTHONDIR="$XDG_CONFIG_HOME"/jupyter, export JUPYTER_CONFIG_DIR="$XDG_CONFIG_HOME"/jupyter +#export CARGO_HOME=$HOME/.cargo +# Rust +export PATH="$HOME/.cargo/bin:$PATH" +#export RUSTUP_HOME=$HOME/.cargo/bin +## RUST +#typeset -U path +#path+=(~/.cargo/bin) +#export RUST_SRC_PATH=$(rustc --print sysroot)/lib/rustlib/src/rust/src +#export RUST_SRC_PATH=$HOME/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/src/rust/src +#export GOPATH=$HOME/go +#export GORACE='' +#export KINDLEGEN_HOME=/Users/adben/Downloads/KindleGen_Mac_i386_v2_9 +#export GOROOT=$GO_HOME +#export PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting +#export PATH=$PATH:$HOME/.local/bin # for stack - haskell +#export PATH=$PATH:/usr/local/lib/ruby/gems/2.6.0/bin + +# xsession start script + +#export USERXSESSION="$XDG_CONFIG_HOME/X11/xsession" +#export USERXSESSIONRC="$XDG_CONFIG_HOME/X11/xsessionrc" +#export ALTUSERXSESSION="$XDG_CONFIG_HOME/X11/Xsession" +#export ERRFILE="$XDG_CONFIG_HOME/X11/xsession-errors" + +# Doesn't seem to work +#export ANDROID_SDK_HOME="$XDG_CONFIG_HOME"/android +#export ANDROID_AVD_HOME="$XDG_DATA_HOME"/android +#export ANDROID_EMULATOR_HOME="$XDG_DATA_HOME"/android +#export ADB_VENDOR_KEY="$XDG_CONFIG_HOME"/android +# Disable files +#export LESSHISTFILE=- + + +# Program settings +#export MOZ_USE_XINPUT2="1" # Mozilla smooth scrolling/touchpads. + + +#export tmux.conf=XDG_CONFIG_HOME/tmux/tmux.conf +#export CARGO_HOME="${XDG_DATA_HOME:-$HOME/.local/share}/cargo" +#export GOPATH="${XDG_DATA_HOME:-$HOME/.local/share}/go" +# Scaling +#export QT_AUTO_SCREEN_SCALE_FACTOR=0 +#export QT_SCALE_FACTOR=1 +#export QT_SCREEN_SCALE_FACTORS="1;1;1" +#export GDK_SCALE=1 +#export GDK_DPI_SCALE=1 + + +#export VIDEO="mpv" +#export IMAGE="sxiv" + +#xbindkeys -f "$XDG_CONFIG_HOME"/xbindkeys/config +# Path +#path=("$HOME/scripts" "$HOME/scripts/alsa" "$HOME/scripts/dragon" "$HOME/scripts/lf" "$HOME/scripts/i3" "$HOME/scripts/pulse" +# "$HOME/scripts/polybar" "$HOME/scripts/bspwm" "$HOME/scripts/lemonbar" "$HOME/scripts/transmission" +# "$HOME/bin/tweetdeck-linux-x64" "$XDG_DATA_HOME/ruby/gems/bin" "$HOME/go/bin" "$HOME/.local/share/cargo/bin" +# "$XDG_DATA_HOME/npm/bin" "$HOME/.local/bin" "$path[@]") +#export PATH + +#typeset -U PATH path +export GTK_IM_MODULE='fcitx' +export QT_IM_MODULE='fcitx' +export SDL_IM_MODULE='fcitx' +export XMODIFIERS='@im=fcitx' + +# Source different environments + + +# Start blinking +#export LESS_TERMCAP_mb=$(tput bold; tput setaf 2) # green +# Start bold +#export LESS_TERMCAP_md=$(tput bold; tput setaf 2) # green +# Start stand out +#export LESS_TERMCAP_so=$(tput bold; tput setaf 3) # yellow +# End standout +#export LESS_TERMCAP_se=$(tput rmso; tput sgr0) +# Start underline +#export LESS_TERMCAP_us=$(tput smul; tput bold; tput setaf 1) # red +# End Underline +#export LESS_TERMCAP_ue=$(tput sgr0) +# End bold, blinking, standout, underline +#export LESS_TERMCAP_me=$(tput sgr0). +#. "$HOME/.cargo/env" diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc new file mode 100644 index 0000000..15f7d29 --- /dev/null +++ b/.config/zsh/.zshrc @@ -0,0 +1,510 @@ + +# ███████╗███████╗██╗ ██╗██████╗ ██████╗ +# ╚══███╔╝██╔════╝██║ ██║██╔══██╗██╔════╝ +# ███╔╝ ███████╗███████║██████╔╝██║ +# ███╔╝ ╚════██║██╔══██║██╔══██╗██║ +# ███████╗███████║██║ ██║██║ ██║╚██████╗ +# ╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ + +export PATH=$HOME/bin:/usr/local/bin:/sbin:/usr/sbin:$PATH +#export PYTHONPATH=/usr/local/bin/python3 +#if [[ ! $(tmux list-sessions) ]]; then +# tmux +#fi + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +# If xset is availabe: +#if xset q &>/dev/null; then +# xset r rate 180 40 # Sane repeat rate +# xset -b # No bell +# xset -dpms # Keep screen on at all times +# xset s off # +# xset m 7/5 0 # Pointer settings +# setxkbmap us -variant altgr-intl +#fi + +# Allow CTRL+D to exit zsh with partial command line (non empty line) +exit_zsh() { exit } +zle -N exit_zsh +bindkey '^D' exit_zsh + +# Some other useful functionalities +setopt autocd # Automatically cd into typed directory. +stty intr '^q' # free Ctrl+C for copy use Ctrl+q instead +stty lnext '^-' # free Ctrl+V for paste use ^- instead +stty stop undef # Disable ctrl-s to freeze terminal. +stty start undef + +export PATH="$HOME/.local/bin:$PATH" +export VIRTUAL_ENV_DISABLE_PROMPT=true +#unsetopt BEEP +# Enable various options +setopt interactive_comments beep extendedglob nomatch notify completeinword prompt_subst + +########## Prompt(s) ########## + +# Enable colors and change prompt: +autoload -U colors && colors # Load colors +#autoload -U promptinit && promptinit +#prompt fade red +# Prompt with Vi insert-mode/normal-mode and blinking '$', note blinking '$' only works on some terminals. +terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1] + +function insert-mode () { echo "-- INSERT --" } +function normal-mode () { echo "-- NORMAL --" } + + +git_branch_test_color() { + local ref=$(git symbolic-ref --short HEAD 2> /dev/null) + if [ -n "${ref}" ]; then + if [ -n "$(git status --porcelain)" ]; then + local gitstatuscolor='%F{196}' + else + local gitstatuscolor='%F{82}' + fi + echo "${gitstatuscolor}${ref}" + else + echo "" + fi +} +#PROMPT='%9c$(git_branch_test_color)%F{none} %# ' + +#echo "${gitstatuscolor} (${ref})" + +autoload -Uz add-zsh-hook vcs_info +zstyle ':vcs_info:*' stagedstr ' +%F{15}staged%f' +zstyle ':vcs_info:*' unstagedstr ' -%F{15}unstaged%f' +zstyle ':vcs_info:*' check-for-changes true +zstyle ':vcs_info:*' actionformats '%F{5}%F{2}%b%F{3}|%F{1}%a%F{5}%f ' +zstyle ':vcs_info:*' formats \ + '%F{208} '$'\uE0A0'' %f$(git_branch_test_color)%f%F{76}%c%F{3}%u%f ' + #'%{-[%F{226}'$'\uE0A0''%f%{%F{76}%b%f%}]%} %F{76}%c%F{3}%u%f' + #'%F{226}'$'\uE0A0''%f%{(%F{76}%b%f)%} %F{76}%c%F{3}%u%f' +zstyle ':vcs_info:git*+set-message:*' hooks git-untracked +zstyle ':vcs_info:*' enable git ++vi-git-untracked() { + if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ + [[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then + hook_com[unstaged]+='%F{196} !%f%F{15}untracked%f' +fi +} +#hook_com[unstaged]+=' %F{15}(%f%F{196}!%f%F{15})untracked%f' + + +#RPROMPT='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_} %f%# ' +#add-zsh-hook +function my_precmd () { + vcs_info + PS1="%{┌─[%F{145}%n%f] %F{39}%0~%f%} ${vcs_info_msg_0_} + %{%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}" +} + +function set-prompt () { + case ${KEYMAP} in + (vicmd) VI_MODE="$(normal-mode)" ;; + (main|viins) VI_MODE="$(insert-mode)" ;; + (*) VI_MODE="$(insert-mode)" ;; + esac + PS1="%{┌─[%F{145}%n%f] %F{39}%0~%f%} ${vcs_info_msg_0_} + %{%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}" +} +add-zsh-hook precmd my_precmd +RPROMPT='%(?..[%F{196}%?%f] )' +#RPROMPT="%K{172}${vcs_info_msg_0_}%k%(?..[%F{196}%?%f] )" + +#autoload -Uz vcs_info +#zstyle ':vcs_info:*' stagedstr 'M' +#zstyle ':vcs_info:*' unstagedstr 'M' +#zstyle ':vcs_info:*' check-for-changes true +#zstyle ':vcs_info:*' actionformats '%{(%F{76}%b%F{3}|%F{1}%a%%f%}) ' +#zstyle ':vcs_info:*' formats \ +# '%{(%F{76}%b%f)%} %F{76}%c%F{3}%u%f' +#zstyle ':vcs_info:git*+set-message:*' hooks git-untracked +#zstyle ':vcs_info:*' enable git +#+vi-git-untracked() { +# if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ +# [[ $(git ls-files --other --directory --exclude-standard | sed q | wc -l | tr -d ' ') == 1 ]] ; then +# hook_com[unstaged]+='%F{1}??%f' +#fi +#} +# +# +##RPROMPT='%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_} %f%# ' +#precmd () { +# print -rP " +#" +# #PS1="┌─[%F{48}%n%f]-[%F{154}%B%m%b%f]-[%F{202}%#%f%F{39}%0~%f] +# PS1="%{┌─[%F{48}%n%f] %F{119}%#%f%F{119}%0~%f%}] ${vcs_info_msg_0_} +# %{%{$terminfo_down_sc$(insert-mode)$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}" +#} && { vcs_info } +# +#function set-prompt () { +# case ${KEYMAP} in +# (vicmd) VI_MODE="$(normal-mode)" ;; +# (main|viins) VI_MODE="$(insert-mode)" ;; +# (*) VI_MODE="$(insert-mode)" ;; +# esac +# PS1="%{┌─[%F{48}%n%f] %F{119}%#%f%F{119}%0~%f%} ${vcs_info_msg_0_} +# %{%{$terminfo_down_sc$VI_MODE$terminfo[rc]%}%{└─%{["%{$(tput setaf 226)%}""%{$(tput blink)%}"%{$%}"%{$(tput sgr0)%}"%{%G]%}%}%}%}" +#} +#PS1="%{┌─[%F{48}%n%f]-[%F{48}%B%m%b%f]-[%F{48}%#%f%F{48}%0~%f]%} +function zle-line-init zle-keymap-select { + set-prompt + zle reset-prompt + case $KEYMAP in + vicmd) echo -ne '\e[1 q';; # block + viins|main) echo -ne '\e[5 q';; # beam + esac +} + +preexec () { print -rn -- $terminfo[el]; echo -ne '\e[5 q' ; } + +zle -N zle-line-init +zle -N zle-keymap-select + +# Load version control information +#autoload -Uz vcs_info +#precmd() { vcs_info } + +# Format the vcs_info_msg_0_ variable +#zstyle ':vcs_info:git:*' formats 'on branch %b' + +# Set up the right-side prompt (with git branch name) and throw conditional error Code + + +## function to return current branch name while suppressing errors. +#function git_branch() { +# branch=$(git symbolic-ref HEAD 2> /dev/null | awk 'BEGIN{FS="/"} {print $NF}') +# if [[ $branch == "" ]]; then +# : +# else +# echo ' (' $branch ') ' +# fi +#} + +#setopt prompt_subst # allow command substitution inside the prompt +#PROMPT='%~ $(git_branch) >' # set the prompt value + +#autoload -Uz add-zsh-hook vcs_info +#setopt prompt_subst +#add-zsh-hook precmd my_precmd +# +#zstyle ':vcs_info:git:*' formats '%b' +# +#function my_precmd { +# local theUser='%B%F{39}%n%f%b' +# local theHost='%B%F{white}@%m%f%b' +# local git1="%F{220}~%f$(git_prompt_info)" +# local rcAndArrow='%(?.%F{white}.%B%F{red}[%?])»%f%b' +# +# vcs_info +# local git2color='cyan' +# [[ "${vcs_info_msg_0_}" == "master" ]] && git2color='196' +# local git2="||%F{${git2color}}${vcs_info_msg_0_}%f||" +# +# psvar[1]="${theUser}${theHost} ${git1} ${rcAndArrow} " +# psvar[2]="${git2}" +#} +# +#PROMPT='${psvar[1]}' +#RPROMPT='${psvar[2]}' + + + +########## Auto-completion ########## + +#autoload -U promptinit && promptinit +autoload -Uz compinit && compinit + +# Accept completion with <tab> or Ctrl+i and go to next/previous suggestions with Vi like keys: Ctrl+n/p +zmodload -i zsh/complist +accept-and-complete-next-history() { + zle expand-or-complete-prefix +} + +zle -N accept-and-complete-next-history +bindkey -M menuselect '^i' accept-and-complete-next-history +bindkey '^n' expand-or-complete +bindkey '^p' reverse-menu-complete +zstyle ':completion:*' menu select=1 + + + +########## Vi mode ########## + +export KEYTIMEOUT=25 +export EDITOR=$VISUAL +export VISUAL=nvim +bindkey -M viins '^?' backward-delete-char +bindkey -M viins '^[[3~' delete-char +bindkey -M vicmd '^[[3~' delete-char +bindkey -r '\e/' +bindkey -M viins 'jj' vi-cmd-mode +bindkey "^W" backward-kill-word +bindkey "^H" backward-delete-char # Control-h also deletes the previous char +bindkey "^U" backward-kill-line + +bindkey "^[j" history-search-forward # or you can bind it to the down key "^[[B" +bindkey "^[k" history-search-backward # or you can bind it to Up key "^[[A" +bindkey '^X' autosuggest-execute +bindkey '^Y' autosuggest-accept + +# Edit line in vim with alt-e +autoload edit-command-line; zle -N edit-command-line +bindkey '^e' edit-command-line +#bindkey '^[e' edit-command-line # alt + e + +########## Useful Commands/Alias ########## + +alias s="systemctl" +alias j="journalctl xe" + +# Enter directory and list contents +cd() { + if [ -n "$1" ]; then + builtin cd "$@" && ls -pvA --color=auto --group-directories-first + else + builtin cd ~ && ls -pvA --color=auto --group-directories-first + fi +} + +# Back up a file. Usage "backupthis <filename>" +backupthis() { + cp -riv $1 ${1}-$(date +%Y%m%d%H%M).backup; +} + +# Let FZF use ripgrep by default +if type rg &> /dev/null; then + export FZF_DEFAULT_COMMAND='rg --files' + export FZF_DEFAULT_OPTS='-m --height 50% --border' +fi +# Setup fzf +# --------- +if [[ ! "$PATH" == */root/.local/share/nvim/plugged/fzf/bin* ]]; then + export PATH="${PATH:+${PATH}:}/root/.local/share/nvim/plugged/fzf/bin" +fi + +# Spawn a clone of current terminal +putstate () { + declare +x >~/environment.tmp + declare -x >>~/environment.tmp + echo cd "$PWD" >>~/environment.tmp +} + +getstate () { + . ~/environment.tmp +} + +# use ctrl-z to toggle in and out of bg +function toggle_fg_bg() { + if [[ $#BUFFER -eq 0 ]]; then + BUFFER="fg" + zle accept-line + else + BUFFER="" + zle clear-screen + fi +} +zle -N toggle_fg_bg +bindkey '^Z' toggle_fg_bg + +# cd using "up n" as a command up as many directories, example "up 3" +up() { + # default parameter to 1 if non provided + declare -i d=${@:-1} + # ensure given parameter is non-negative. Print error and return if it is + (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1; + # remove last d directories from pwd, append "/" in case result is empty + cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/"; +} + +# More history for cd and use "cd -TAB" +setopt AUTO_PUSHD # pushes the old directory onto the stack +zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12' + +# List upto last 10 visited directories using "d" and quickly cd into any specific one +# using just a number from "0" to "9" +alias d="dirs -v | head -10" +alias 0="cd +0" +alias 1="cd +1" +alias 2="cd +2" +alias 3="cd +3" +alias 4="cd +4" +alias 5="cd +5" +alias 6="cd +6" +alias 7="cd +7" +alias 8="cd +8" +alias 9="cd +9" + +# Allow nnn filemanager to cd on quit +nnn() { + declare -x +g NNN_TMPFILE=$(mktemp --tmpdir $0.XXXX) + trap "rm -f $NNN_TMPFILE" EXIT + =nnn $@ + [ -s $NNN_TMPFILE ] && source $NNN_TMPFILE +} + +# Use lf to switch directories and bind it to ctrl-o +#lfcd () { +# tmp="$(mktemp)" +# lf -last-dir-path="$tmp" "$@" +# if [ -f "$tmp" ]; then +# dir="$(cat "$tmp")" +# rm -f "$tmp" >/dev/null +# [ -d "$dir" ] && [ "$dir" != "$(pwd)" ] && cd "$dir" +# fi +#} +#bindkey -s '^o' 'lfcd\n' +#bindkey -s '^a' 'bc -lq\n' +#bindkey -s '^f' 'cd "$(dirname "$(fzf)")"\n' + +# Extract with one command +extract () { + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xjf $1 ;; + *.tar.gz) tar xzf $1 ;; + *.bz2) bunzip2 $1 ;; + *.rar) rar x $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 via extract()" ;; + esac + else + echo "'$1' is not a valid file" + fi +} + + +### Dotfiles +alias config='git --git-dir=$HOME/.cfg --work-tree=$HOME' + +# Set bare dotfiles repository git environment variables dynamically +function set_git_env_vars() { + # Check if the current command is a package manager command + if [[ "${(%)${(z)history[1]}}" =~ ^(pacman|yay|apt|dnf|brew|npm|pip|gem|go|cargo) ]]; then + return + fi + local git_dir="$(git rev-parse --git-dir -C . 2>/dev/null)" + if [[ -n "$git_dir" ]]; then + local is_bare="$(git -C "$git_dir" rev-parse --is-bare-repository 2>/dev/null)" + if [[ "$is_bare" == "true" ]]; then + export GIT_DIR="$HOME/.cfg" + export GIT_WORK_TREE=$(realpath $(eval echo ~)) + else + unset GIT_DIR + unset GIT_WORK_TREE + fi + else + local root_dir="$(git rev-parse --show-toplevel 2>/dev/null)" + if [[ -n "$root_dir" ]]; then + unset GIT_DIR + export GIT_WORK_TREE="$root_dir" + else + export GIT_DIR="$HOME/.cfg" + export GIT_WORK_TREE=$(realpath $(eval echo ~)) + fi + fi +} + +# Define an auto_cd hook to automatically update Git environment variables +function chpwd() { + set_git_env_vars +} +# Call the function to set Git environment variables when the shell starts up +set_git_env_vars + +function gsp +{ + # Config file for subtrees + # + # Format: + # <prefix>;<remote address>;<remote branch> + # # Lines starting with '#' will be ignored + GIT_SUBTREE_FILE="$PWD/.gitsubtrees" + + if [ ! -f $GIT_SUBTREE_FILE ]; then + echo "Nothing to do - file <`basename $GIT_SUBTREE_FILE`> does not exist." + return + fi + + OLD_IFS=$IFS + IFS=$'\n' + for LINE in $(cat $GIT_SUBTREE_FILE); do + + # Skip lines starting with '#'. + if [[ $LINE = \#* ]]; then + continue + fi + + # Parse the current line. + PREFIX=`echo $LINE | cut -d';' -f 1` + REMOTE=`echo $LINE | cut -d';' -f 2` + BRANCH=`echo $LINE | cut -d';' -f 3` + + # Push to the remote. + echo "config subtree pull --prefix=$PREFIX $REMOTE $BRANCH" + config subtree pull --prefix=$PREFIX $REMOTE $BRANCH + done +} + +alias vi='nvim' +alias nv='nvim' +alias trash_restore='gio trash --restore "$(gio trash --list | fzf | cut -f 1)"' +alias ec='$EDITOR $HOME/.config/zsh/.zshrc' +alias sc="source $HOME/.config/zsh/.zshrc" +alias keyname="xev | sed -n 's/[ ]*state.* \([^ ]*\)).*/\1/p'" + +# Print previous command into a file +getlast () { + fc -nl $((HISTCMD - 1)) +} + +alias pp='getlast 2>&1 |&tee -a output.txt' + +# Print output of a command NOTE: Must be used in conjunction but no need for "|" symbol +alias -g cap='2>&1 | tee -a output.txt' + +# confirmation # +alias mv='mv -i' +alias cp='cp -i' +alias ln='ln -i' +alias rm='rm -i' + +# Suspend(sleep)/hibernate and lock screen if using systemctl +alias suspend='systemctl suspend && betterlockscreen --lock dimblur' +alias hibernate='systemctl hibernate' + +# Tmux layout +openSession () { + tmux split-window -h -t + tmux split-window -v -t + tmux resize-pane -U 5 +} + +########## Source Plugins, should be last ########## + +# load zsh-vi-mode +#source /usr/share/zsh/plugins/zsh-vi-mode/zsh-vi-mode.plugin.zsh + +# Load zsh-syntax-highlighting +source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 2>/dev/null + +# Load fzf keybindings and completion +source /usr/share/fzf/key-bindings.zsh +source /usr/share/fzf/completion.zsh +source /usr/share/fzf-marks/fzf-marks.plugin.zsh 2>/dev/null + +# Suggest aliases for commands +source /usr/share/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh 2>/dev/null + +# Load fish like auto suggestions +source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.plugin.zsh +source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh |
