From 910dcff43a0cce41d83f2e00eaca3eaaebd57a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20R=C3=B6ger?= Date: Thu, 18 Apr 2024 11:25:06 +0200 Subject: [PATCH] 42 current 2024-04-18 11:24:58 23.11.20240405.72da83d 6.1.84 * --- home/jonas/home.nix | 31 +--- .../static/omz_custom/themes/bureau.zsh-theme | 133 ++++++++++++++++++ home/jonas/zsh.nix | 43 ++++++ 3 files changed, 177 insertions(+), 30 deletions(-) create mode 100644 home/jonas/static/omz_custom/themes/bureau.zsh-theme create mode 100644 home/jonas/zsh.nix diff --git a/home/jonas/home.nix b/home/jonas/home.nix index ce9d8bd..2c3aeae 100644 --- a/home/jonas/home.nix +++ b/home/jonas/home.nix @@ -9,6 +9,7 @@ ./plasma.nix ./ssh.nix ./yubikey.nix + ./zsh.nix ]; # Home Manager needs a bit of information about you and the paths it should @@ -80,34 +81,4 @@ key = "4000EB35E1AE0F07"; }; }; - - # Zsh - programs.zsh = { - enable = true; - enableCompletion = true; - syntaxHighlighting.enable = true; - - shellAliases = { - ll = "ls -l"; - update = "sudo nixos-rebuild switch"; - }; - history.size = 10000; - history.path = "${config.xdg.dataHome}/zsh/history"; - oh-my-zsh = { - enable = true; - plugins = [ - "docker" - "docker-compose" - "emacs" - "fzf" - "git" - "pass" - "poetry" - "python" - "rust" - "thefuck" - ]; - theme = "bureau"; - }; - }; } diff --git a/home/jonas/static/omz_custom/themes/bureau.zsh-theme b/home/jonas/static/omz_custom/themes/bureau.zsh-theme new file mode 100644 index 0000000..e87a594 --- /dev/null +++ b/home/jonas/static/omz_custom/themes/bureau.zsh-theme @@ -0,0 +1,133 @@ +# oh-my-zsh Bureau Theme + +### NVM + +ZSH_THEME_NVM_PROMPT_PREFIX="%B⬡%b " +ZSH_THEME_NVM_PROMPT_SUFFIX="" + +### Git [±master ▾●] + +ZSH_THEME_GIT_PROMPT_PREFIX="[%{$fg_bold[green]%}±%{$reset_color%}%{$fg_bold[white]%}" +ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}]" +ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}✓%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_AHEAD="%{$fg[cyan]%}▴%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[magenta]%}▾%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_STAGED="%{$fg_bold[green]%}●%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg_bold[yellow]%}●%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg_bold[red]%}●%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_STASHED="(%{$fg_bold[blue]%}✹%{$reset_color%})" + +bureau_git_info () { + local ref + ref=$(command git symbolic-ref HEAD 2> /dev/null) || \ + ref=$(command git rev-parse --short HEAD 2> /dev/null) || return + echo "${ref#refs/heads/}" +} + +bureau_git_status() { + local result gitstatus + gitstatus="$(command git status --porcelain -b 2>/dev/null)" + + # check status of files + local gitfiles="$(tail -n +2 <<< "$gitstatus")" + if [[ -n "$gitfiles" ]]; then + if [[ "$gitfiles" =~ $'(^|\n)[AMRD]. ' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_STAGED" + fi + if [[ "$gitfiles" =~ $'(^|\n).[MTD] ' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_UNSTAGED" + fi + if [[ "$gitfiles" =~ $'(^|\n)\\?\\? ' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_UNTRACKED" + fi + if [[ "$gitfiles" =~ $'(^|\n)UU ' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_UNMERGED" + fi + else + result+="$ZSH_THEME_GIT_PROMPT_CLEAN" + fi + + # check status of local repository + local gitbranch="$(head -n 1 <<< "$gitstatus")" + if [[ "$gitbranch" =~ '^## .*ahead' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_AHEAD" + fi + if [[ "$gitbranch" =~ '^## .*behind' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_BEHIND" + fi + if [[ "$gitbranch" =~ '^## .*diverged' ]]; then + result+="$ZSH_THEME_GIT_PROMPT_DIVERGED" + fi + + # check if there are stashed changes + if command git rev-parse --verify refs/stash &> /dev/null; then + result+="$ZSH_THEME_GIT_PROMPT_STASHED" + fi + + echo $result +} + +bureau_git_prompt() { + # ignore non git folders and hidden repos (adapted from lib/git.zsh) + if ! command git rev-parse --git-dir &> /dev/null \ + || [[ "$(command git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then + return + fi + + # check git information + local gitinfo=$(bureau_git_info) + if [[ -z "$gitinfo" ]]; then + return + fi + + # quote % in git information + local output="${gitinfo:gs/%/%%}" + + # check git status + local gitstatus=$(bureau_git_status) + if [[ -n "$gitstatus" ]]; then + output+=" $gitstatus" + fi + + echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${output}${ZSH_THEME_GIT_PROMPT_SUFFIX}" +} + + +_PATH="%{$fg_bold[white]%}%~%{$reset_color%}" + +if [[ $EUID -eq 0 ]]; then + _USERNAME="%{$fg_bold[red]%}%n" + _LIBERTY="%{$fg[red]%}#" +else + _USERNAME="%{$fg_bold[white]%}%n" + _LIBERTY="%{$fg[green]%}$" +fi +_USERNAME="$_USERNAME%{$reset_color%}@%m" +_LIBERTY="$_LIBERTY%{$reset_color%}" + + +get_space () { + local STR=$1$2 + local zero='%([BSUbfksu]|([FB]|){*})' + local LENGTH=${#${(S%%)STR//$~zero/}} + local SPACES=$(( COLUMNS - LENGTH - ${ZLE_RPROMPT_INDENT:-1} )) + + (( SPACES > 0 )) || return + printf ' %.0s' {1..$SPACES} +} + +_1LEFT="$_USERNAME $_PATH" +_1RIGHT="[%*]" + +bureau_precmd () { + _1SPACES=`get_space $_1LEFT $_1RIGHT` + print + print -rP "$_1LEFT$_1SPACES$_1RIGHT" +} + +setopt prompt_subst +PROMPT='> $_LIBERTY ' +RPROMPT='$(nvm_prompt_info) $(bureau_git_prompt)' + +autoload -U add-zsh-hook +add-zsh-hook precmd bureau_precmd diff --git a/home/jonas/zsh.nix b/home/jonas/zsh.nix new file mode 100644 index 0000000..8ca75df --- /dev/null +++ b/home/jonas/zsh.nix @@ -0,0 +1,43 @@ +{ + config, + pkgs, + ... +}: let + omz_custom = "${config.home.homeDirectory}/.config/omz_custom"; +in { + home.file."${omz_custom}" = { + source = ./static/omz_custom; + recursive = true; + }; + + # Zsh + programs.zsh = { + enable = true; + enableCompletion = true; + syntaxHighlighting.enable = true; + + shellAliases = { + ll = "ls -l"; + update = "sudo nixos-rebuild switch"; + }; + history.size = 10000; + history.path = "${config.xdg.dataHome}/zsh/history"; + oh-my-zsh = { + enable = true; + plugins = [ + "docker" + "docker-compose" + "emacs" + "fzf" + "git" + "pass" + "poetry" + "python" + "rust" + "thefuck" + ]; + theme = "bureau"; + custom = omz_custom; + }; + }; +}