153 lines
4.7 KiB
Nix
153 lines
4.7 KiB
Nix
{ config, pkgs, ... }:
|
|
|
|
let
|
|
projectsConfig = import ../config/projects.nix { homeDirectory = config.home.homeDirectory; };
|
|
projectLauncher = "${config.home.homeDirectory}/.config/nix/scripts/project-launcher.sh";
|
|
in
|
|
{
|
|
programs.zsh = {
|
|
enable = true;
|
|
defaultKeymap = "viins";
|
|
enableVteIntegration = true;
|
|
enableCompletion = true;
|
|
autosuggestion.enable = true;
|
|
syntaxHighlighting.enable = true;
|
|
|
|
sessionVariables = {
|
|
COLORTERM = "truecolor";
|
|
EDITOR = "nvim";
|
|
};
|
|
|
|
shellAliases = {
|
|
ll = "ls -alF";
|
|
zi = "z -i"; # Interactive selection with fzf
|
|
preview = "open -a Preview";
|
|
iina = "open -a IINA";
|
|
dict = "open -a 'WordWeb Pro'";
|
|
slide = "open -a SlidePilot";
|
|
ovito = "open -a Ovito";
|
|
appcleaner = "open -a AppCleaner";
|
|
wechat = "open -a WeChat";
|
|
message = "open -a Messages";
|
|
tmeet = "open -a TencentMeeting";
|
|
pixel = "open -a 'Pixelmator Pro'";
|
|
keepass = "open -a KeePassXC";
|
|
inkscape = "open -a Inkscape";
|
|
powerpoint = "open -a 'Microsoft PowerPoint'";
|
|
word = "open -a 'Microsoft Word'";
|
|
excel = "open -a 'Microsoft Excel'";
|
|
|
|
# Nix helpers
|
|
hm = "home-manager";
|
|
hms = "home-manager switch --flake ~/.config/nix#yanlin";
|
|
hms-offline = "home-manager switch --flake ~/.config/nix#yanlin --option substitute false";
|
|
|
|
# Project shortcuts
|
|
proj = "${projectLauncher}";
|
|
};
|
|
|
|
initContent = ''
|
|
# Load Powerlevel10k theme
|
|
if [[ -f ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme ]]; then
|
|
source ${pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k/powerlevel10k.zsh-theme
|
|
fi
|
|
|
|
# Load Powerlevel10k configuration (managed by Nix)
|
|
source ~/.p10k.zsh
|
|
|
|
# Vim mode configuration
|
|
# Reduce delay when switching modes (10ms instead of 400ms)
|
|
export KEYTIMEOUT=1
|
|
|
|
# Cursor shape changes for vim modes
|
|
function zle-keymap-select {
|
|
case $KEYMAP in
|
|
vicmd) echo -ne '\e[1 q';; # block cursor for normal mode
|
|
viins|main) echo -ne '\e[5 q';; # line cursor for insert mode
|
|
esac
|
|
}
|
|
zle -N zle-keymap-select
|
|
|
|
# Ensure we start with line cursor in insert mode
|
|
function zle-line-init {
|
|
echo -ne '\e[5 q'
|
|
}
|
|
zle -N zle-line-init
|
|
|
|
# Fix cursor after each command
|
|
function preexec {
|
|
echo -ne '\e[5 q'
|
|
}
|
|
|
|
# Additional vim-like bindings
|
|
bindkey -M vicmd 'k' history-search-backward
|
|
bindkey -M vicmd 'j' history-search-forward
|
|
bindkey -M vicmd '/' history-incremental-search-backward
|
|
bindkey -M vicmd '?' history-incremental-search-forward
|
|
|
|
# Better word movement in insert mode
|
|
bindkey '^[[1;5C' forward-word # Ctrl+Right
|
|
bindkey '^[[1;5D' backward-word # Ctrl+Left
|
|
|
|
# Fix backspace in vim insert mode
|
|
bindkey '^?' backward-delete-char # Backspace
|
|
bindkey '^H' backward-delete-char # Ctrl+H (alternative backspace)
|
|
|
|
# Prevent Shift+A from triggering autocomplete in vim insert mode
|
|
# Try multiple potential key sequences for Shift+A across different terminals
|
|
bindkey -M viins 'A' self-insert
|
|
bindkey -M viins '^[[1;2A' self-insert
|
|
bindkey -M viins '^[[65;2u' self-insert
|
|
|
|
# Disable expand-or-complete on potential problematic keys in vim insert mode
|
|
bindkey -M viins '^I' expand-or-complete # Keep tab completion but be explicit
|
|
|
|
# Configure autosuggestions to not interfere with vim mode
|
|
ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(vi-add-eol)
|
|
ZSH_AUTOSUGGEST_CLEAR_WIDGETS+=(vi-add-next)
|
|
ZSH_AUTOSUGGEST_ACCEPT_WIDGETS=(end-of-line vi-end-of-line vi-add-eol)
|
|
|
|
# Zoxide configuration - replace cd with z for smart directory jumping
|
|
eval "$(zoxide init zsh --cmd cd)"
|
|
|
|
# Function to cd to directory containing a file selected with fzf
|
|
function cdf() {
|
|
local file
|
|
file=$(fd "$@" ~ | fzf)
|
|
if [[ -n "$file" ]]; then
|
|
if [[ -d "$file" ]]; then
|
|
cd "$file"
|
|
else
|
|
cd "$(dirname "$file")"
|
|
fi
|
|
fi
|
|
}
|
|
'';
|
|
};
|
|
|
|
# Essential packages for enhanced zsh experience
|
|
home.packages = with pkgs; [
|
|
zsh-powerlevel10k
|
|
fzf
|
|
fd
|
|
ripgrep
|
|
bat
|
|
jq
|
|
];
|
|
|
|
programs.fzf = {
|
|
enable = true;
|
|
enableZshIntegration = true;
|
|
};
|
|
|
|
programs.zoxide = {
|
|
enable = true;
|
|
enableZshIntegration = true;
|
|
};
|
|
|
|
# Manage Powerlevel10k configuration
|
|
home.file.".p10k.zsh".source = ../config/p10k.zsh;
|
|
|
|
# Generate projects.json for shell scripts
|
|
home.file.".config/nix/config/projects.json".text = builtins.toJSON projectsConfig;
|
|
}
|