nix-config/modules/home-manager/terminal/zsh.nix

111 lines
3.6 KiB
Nix

{
config,
pkgs,
lib,
...
}: {
options.user.zsh.enable = lib.mkEnableOption "enable zsh";
config = lib.mkIf config.user.zsh.enable {
programs = {
starship.enableZshIntegration = true;
fzf.enableZshIntegration = true;
zoxide.enableZshIntegration = true;
yazi.enableZshIntegration = true;
eza.enableZshIntegration = true;
direnv.enableZshIntegration = true;
kitty.shellIntegration.enableZshIntegration = true;
carapace.enableZshIntegration = false;
zsh = {
enable = true;
enableCompletion = true;
initExtra = lib.mkMerge [
''
#have the menu highlight while we cycle through options
zstyle ':completion:*' menu select
#case insensitive completion
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
#allow completion from midword
setopt COMPLETE_IN_WORD
#move cursor to end of word after completing
setopt ALWAYS_TO_END
#complete aliases as well
setopt COMPLETE_ALIASES
#select first item when you press tab the first time.
setopt MENU_COMPLETE
#case insensitive globbing
setopt NO_CASE_GLOB
#sort globs that expand to numbers by number rather than alphabeticly
setopt NUMERIC_GLOB_SORT
#allows for some neat globbing.
setopt EXTENDED_GLOB
#allow backspacing beyond the point you entered insert mode:
bindkey -v '^?' backward-delete-char
bindkey "^W" backward-kill-word
#cheat.sh is a wonderful tool, the less typing needed the better.
cheat(){
for i in $*; do;
curl cheat.sh/$i
done
}
''
(lib.mkIf (!config.programs.starship.enable) ''
autoload -U promptinit
promptinit
autoload -U colors
colors
#stuff to show git things.
autoload -Uz vcs_info
setopt prompt_subst
precmd_vcs() {vcs_info}
#when not in a repo, show full path to current directory. when in one, show path from base direcory of the repo.
zstyle ':vcs_info:*' nvcsformats '%~'
zstyle ':vcs_info:*' formats '%r/%S %F{green}[%b]%f'
zstyle ':vcs_info:*' actionformats '%r/%S %F{green}[%b] %F{red}<%a>%f'
#the precmd function, called just before printing the prompt.
function precmd() {
precmd_vcs
}
#Make the right prompt blank, just to be sure.
RPROMPT=""
#on the top line, show a whole bunch of info. botton line should be as minimal as possilbe (just a single char to input next to...)
PROMPT=$'%F{cyan}[%n@%m]%f%F{red}%f$${vcs_info_msg_0_} %F{white}[%D %T]%f\n»'
'')
];
autocd = true;
autosuggestion.enable = true;
defaultKeymap = "viins";
history = {
ignoreAllDups = true;
extended = true;
};
shellAliases = {
ll = "ls -lh";
la = "ls -lha";
please = "sudo $(fc -ln -1)";
pyactivate = "source ./.venv/bin/activate";
};
syntaxHighlighting = {
enable = true;
highlighters = [
"main"
"brackets"
"pattern"
"regexp"
"root"
"line"
];
};
};
};
services.gpg-agent.enableZshIntegration = true;
home.packages = with pkgs; [
curl
];
};
}