NixOS-Configuration/common/users/cameron/home-manager/zsh.nix

181 lines
5.1 KiB
Nix
Raw Normal View History

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
'';
};
}