2024-01-29 04:00:14 +00:00
|
|
|
{ pkgs, lib, config, osConfig, ... }:
|
|
|
|
|
|
|
|
{
|
|
|
|
programs.zsh = {
|
|
|
|
enable = true;
|
|
|
|
enableCompletion = true;
|
|
|
|
|
|
|
|
dotDir = ".config/zsh";
|
|
|
|
|
|
|
|
initExtraFirst = ''
|
|
|
|
[[ $- != *i* ]] && return
|
|
|
|
'';
|
|
|
|
|
|
|
|
initExtraBeforeCompInit = ''
|
|
|
|
mkdir -p ${config.home.homeDirectory}/.cache/zsh
|
|
|
|
|
|
|
|
zstyle ':completion:*' completer _expand _complete _ignored
|
|
|
|
zstyle ':completion:*' ignore-parents parent pwd .. directory
|
|
|
|
zstyle ':completion:*' max-errors 2
|
|
|
|
zstyle ':completion:*' prompt 'Corrected %e errors'
|
|
|
|
zstyle ':completion:*' squeeze-slashes true
|
|
|
|
zstyle ':completion:*' cache-path ${config.home.homeDirectory}/.cache/zsh/zcompcache
|
|
|
|
zstyle :compinstall filename "${config.home.homeDirectory}/.config/zsh/.zshrc"
|
|
|
|
'';
|
|
|
|
|
|
|
|
completionInit = "autoload -Uz compinit && compinit -d ${config.home.homeDirectory}/.cache/zsh/zcompcache";
|
|
|
|
|
|
|
|
history = {
|
|
|
|
path = "${config.home.homeDirectory}/.local/state/zsh/history";
|
|
|
|
ignoreSpace = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
initExtra = ''
|
|
|
|
typeset -g -A key
|
|
|
|
|
|
|
|
key[Home]="''${terminfo[khome]}"
|
|
|
|
key[End]="''${terminfo[kend]}"
|
|
|
|
key[Insert]="''${terminfo[kich1]}"
|
|
|
|
key[Backspace]="''${terminfo[kbs]}"
|
|
|
|
key[Delete]="''${terminfo[kdch1]}"
|
|
|
|
key[Up]="''${terminfo[kcuu1]}"
|
|
|
|
key[Down]="''${terminfo[kcud1]}"
|
|
|
|
key[Left]="''${terminfo[kcub1]}"
|
|
|
|
key[Right]="''${terminfo[kcuf1]}"
|
|
|
|
key[PageUp]="''${terminfo[kpp]}"
|
|
|
|
key[PageDown]="''${terminfo[knp]}"
|
|
|
|
key[Shift-Tab]="''${terminfo[kcbt]}"
|
|
|
|
key[Control-Left]="''${terminfo[kLFT5]}"
|
|
|
|
key[Control-Right]="''${terminfo[kRIT5]}"
|
|
|
|
|
2024-02-16 19:52:07 +00:00
|
|
|
# Emacs bindings
|
|
|
|
bindkey -e
|
|
|
|
|
2024-01-29 04:00:14 +00:00
|
|
|
# setup key accordingly
|
|
|
|
[[ -n "''${key[Home]}" ]] && bindkey -- "''${key[Home]}" beginning-of-line
|
|
|
|
[[ -n "''${key[End]}" ]] && bindkey -- "''${key[End]}" end-of-line
|
|
|
|
[[ -n "''${key[Insert]}" ]] && bindkey -- "''${key[Insert]}" overwrite-mode
|
|
|
|
[[ -n "''${key[Backspace]}" ]] && bindkey -- "''${key[Backspace]}" backward-delete-char
|
|
|
|
[[ -n "''${key[Delete]}" ]] && bindkey -- "''${key[Delete]}" delete-char
|
|
|
|
[[ -n "''${key[Up]}" ]] && bindkey -- "''${key[Up]}" up-line-or-history
|
|
|
|
[[ -n "''${key[Down]}" ]] && bindkey -- "''${key[Down]}" down-line-or-history
|
|
|
|
[[ -n "''${key[Left]}" ]] && bindkey -- "''${key[Left]}" backward-char
|
|
|
|
[[ -n "''${key[Right]}" ]] && bindkey -- "''${key[Right]}" forward-char
|
|
|
|
[[ -n "''${key[PageUp]}" ]] && bindkey -- "''${key[PageUp]}" beginning-of-buffer-or-history
|
|
|
|
[[ -n "''${key[PageDown]}" ]] && bindkey -- "''${key[PageDown]}" end-of-buffer-or-history
|
|
|
|
[[ -n "''${key[Shift-Tab]}" ]] && bindkey -- "''${key[Shift-Tab]}" reverse-menu-complete
|
|
|
|
[[ -n "''${key[Control-Left]}" ]] && bindkey -- "''${key[Control-Left]}" backward-word
|
|
|
|
[[ -n "''${key[Control-Right]}" ]] && bindkey -- "''${key[Control-Right]}" forward-word
|
|
|
|
|
|
|
|
# Finally, make sure the terminal is in application mode, when zle is
|
|
|
|
# active. Only then are the values from $terminfo valid.
|
|
|
|
if (( ''${+terminfo[smkx]} && ''${+terminfo[rmkx]} )); then
|
|
|
|
autoload -Uz add-zle-hook-widget
|
|
|
|
function zle_application_mode_start { echoti smkx }
|
|
|
|
function zle_application_mode_stop { echoti rmkx }
|
|
|
|
add-zle-hook-widget -Uz zle-line-init zle_application_mode_start
|
|
|
|
add-zle-hook-widget -Uz zle-line-finish zle_application_mode_stop
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Configure prompt
|
|
|
|
setopt prompt_subst
|
|
|
|
PROMPT_COLORS=""
|
|
|
|
PROMPT_PREFIXES=""
|
|
|
|
|
|
|
|
function set_prompt() {
|
|
|
|
local colors=(''${(@s:~:)PROMPT_COLORS})
|
|
|
|
local prefixes=(''${(@s:~:)PROMPT_PREFIXES})
|
|
|
|
|
|
|
|
local prefix=""
|
|
|
|
for i in $(seq 1 "''${#prefixes[@]}"); do
|
2024-02-04 23:05:26 +00:00
|
|
|
prefix+="%F{''${colors[$i]:-255}}''${prefixes[$i]}%f "
|
2024-01-29 04:00:14 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
PROMPT="[''${prefix}%n@%m %1~]%(#.#.$) "
|
|
|
|
}
|
|
|
|
|
|
|
|
typeset -a precmd_functions
|
|
|
|
precmd_functions+=(set_prompt)
|
|
|
|
|
|
|
|
|
|
|
|
# Initialize direnv if it exists
|
|
|
|
if command -v direnv &> /dev/null; then
|
|
|
|
eval "$(direnv hook zsh)"
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
2024-01-30 04:25:16 +00:00
|
|
|
if command -v lf &> /dev/null; then
|
|
|
|
lfcd() {
|
2024-01-30 05:14:01 +00:00
|
|
|
cd "$(command lf -print-last-dir "$@")"
|
2024-01-30 04:25:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bindkey -s '^o' 'lfcd\n'
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
2024-01-29 04:00:14 +00:00
|
|
|
if [ "$TERM" = "xterm-kitty" ]; then
|
|
|
|
alias ssh='kitty +kitten ssh'
|
|
|
|
alias clear='printf "\033c"'
|
|
|
|
fi
|
2024-02-16 19:52:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
BOOKMARKS_DIR="$HOME/bookmarks"
|
|
|
|
mkdir -p "$BOOKMARKS_DIR"
|
|
|
|
export CDPATH="$HOME:$BOOKMARKS_DIR"
|
|
|
|
|
|
|
|
function bookmark() {
|
|
|
|
target="$(pwd)"
|
|
|
|
mark_name="''${1:-$(basename $(pwd))}"
|
|
|
|
|
|
|
|
if [ -e "$BOOKMARKS_DIR/$mark_name" ]; then
|
|
|
|
echo "Bookmark for $mark_name already exists"
|
|
|
|
else
|
|
|
|
ln -s "$target" "$BOOKMARKS_DIR/$mark_name"
|
|
|
|
echo "Created bookmark $mark_name to $target"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function rmbookmark() {
|
|
|
|
if [ -z "$1" ]; then
|
|
|
|
echo "Usage: $0 [mark_name]"
|
|
|
|
else
|
|
|
|
if [ ! -L "$BOOKMARKS_DIR/$1" ]; then
|
|
|
|
echo "No bookmark with name $1"
|
|
|
|
else
|
|
|
|
rm "$BOOKMARKS_DIR/$1"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
2024-01-29 04:00:14 +00:00
|
|
|
'';
|
|
|
|
|
|
|
|
shellAliases = {
|
|
|
|
grep = "grep --color=auto";
|
2024-02-04 23:05:26 +00:00
|
|
|
ls = "eza --icons --group-directories-first";
|
2024-01-29 04:00:14 +00:00
|
|
|
|
|
|
|
nv = "nvim";
|
|
|
|
nvd = "nvim .";
|
2024-01-30 05:14:01 +00:00
|
|
|
nvc = "nvim -c \"edit \\$MYVIMRC\"";
|
2024-01-29 04:00:14 +00:00
|
|
|
nvp = "nvim ${config.home.homeDirectory}/projects";
|
|
|
|
|
|
|
|
c = "clear";
|
|
|
|
e = "echo";
|
|
|
|
pf = "printf";
|
|
|
|
nf = "neofetch";
|
|
|
|
|
|
|
|
x = "exit";
|
|
|
|
":q" = "exit";
|
|
|
|
":wq" = "exit";
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
profileExtra = ''
|
|
|
|
[[ -f ~/.profile ]] && . ~/.profile
|
|
|
|
[[ -f $ZDOTDIR/.zshrc ]] && . $ZDOTDIR/.zshrc
|
|
|
|
|
|
|
|
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
|
|
|
|
export MOZ_ENABLE_WAYLAND=1
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
}
|