From 5334240444459b76cd61a6eb9b0dbfdba8de1aa3 Mon Sep 17 00:00:00 2001 From: Rikuoh Date: Thu, 24 Oct 2024 10:52:15 +0900 Subject: [PATCH] all everforested --- .alacritty.toml | 80 ++-- .tmux.conf | 26 +- .zshrc | 12 +- colors-rofi.rasi | 18 +- config | 56 +-- dunstrc | 22 +- init.lua | 10 +- laptop/.alacritty.toml | 48 +-- laptop/colors-rofi.rasi | 18 +- laptop/config | 58 +-- laptop/dunstrc | 23 +- monotone.json | 50 +-- prompt_pure_setup | 897 ++++++++++++++++++++++++++++++++++++++++ 13 files changed, 1090 insertions(+), 228 deletions(-) create mode 100644 prompt_pure_setup diff --git a/.alacritty.toml b/.alacritty.toml index 511d970..43131b9 100644 --- a/.alacritty.toml +++ b/.alacritty.toml @@ -1,58 +1,28 @@ -[colors.bright] -black = "0x5b5858" -blue = "0x3fc4de" -cyan = "0x6be4e6" -green = "0x3fdaa4" -magenta = "0xf075b5" -red = "0xec6a88" -white = "0xd5d8da" -yellow = "0xfbc3a7" - -[colors.cursor] -cursor = "0x00ff00" - -[colors.normal] -black = "0x16161c" -blue = "0x26bbd9" -cyan = "0x59e1e3" -green = "0x29d398" -magenta = "0xee64ac" -red = "0xe95678" -white = "0xd5d8da" -yellow = "0xfab795" - [colors.primary] -background = "0x1c1e26" -foreground = "0xe0e0e0" +background = '#272E33' +foreground = '#d3c6aa' -[colors.vi_mode_cursor] -cursor = "0x00ff00" +# Normal colors +[colors.normal] +black = '#414B50' +red = '#e67e80' +green = '#a7c080' +yellow = '#dbbc7f' +blue = '#7fbbb3' +magenta = '#d699b6' +cyan = '#83c092' +white = '#d3c6aa' -# [colors.primary] -# background = '#2d353b' -# foreground = '#d3c6aa' -# -# # Normal colors -# [colors.normal] -# black = '#475258' -# red = '#e67e80' -# green = '#a7c080' -# yellow = '#dbbc7f' -# blue = '#7fbbb3' -# magenta = '#d699b6' -# cyan = '#83c092' -# white = '#d3c6aa' -# -# # Bright colors -# [colors.bright] -# black = '#475258' -# red = '#e67e80' -# green = '#a7c080' -# yellow = '#dbbc7f' -# blue = '#7fbbb3' -# magenta = '#d699b6' -# cyan = '#83c092' -# white = '#d3c6aa' +# Bright colors +[colors.bright] +black = '#414B50' +red = '#e67e80' +green = '#a7c080' +yellow = '#dbbc7f' +blue = '#7fbbb3' +magenta = '#d699b6' +cyan = '#83c092' +white = '#d3c6aa' [cursor] blink_interval = 470 @@ -84,14 +54,16 @@ style = "Italic" family = "UDEV Gothic 35NFLG" style = "Regular" -[shell] +[terminal.shell] args = ["--login"] program = "/usr/bin/zsh" [window] dynamic_padding = false -opacity = 0.95 +opacity = 0.97 [window.padding] x = 0 y = 0 + +[terminal] diff --git a/.tmux.conf b/.tmux.conf index f28f4b3..408cb49 100644 --- a/.tmux.conf +++ b/.tmux.conf @@ -34,9 +34,9 @@ bind -n M-H switch-client -p ## tmux-fzf TMUX_FZF_LAUNCH_KEY="a" TMUX_FZF_OPTIONS="-p 20% --preview 'echo {}' --preview-window=border-sharp,hidden --bind '?:toggle-preview' --multi --ansi --no-separator --no-scrollbar --reverse --border=none \ ---color=bg+:#1c1e26,bg:#1c1e26,spinner:#ee64ac,hl:#e95678 \ ---color=fg:#d5d8da,header:#e95678,info:#e95678,pointer:#ee64ac \ ---color=marker:#ee64ac,fg+:#d5d8da,prompt:#e95678,hl+:#e95678" +--color=bg+:#272e33,bg:#272e33,spinner:#a7c080,hl:#a7c080 \ +--color=fg:#d3c6aa,header:#a7c080,info:#a7c080,pointer:#a7c080 \ +--color=marker:#a7c080,fg+:#d3c6aa,prompt:#dbbc7f,hl+:#a7c080" TMUX_FZF_PREVIEW=0 # ƒEƒCƒ“ƒhƒE‘€ì @@ -99,21 +99,21 @@ set-option -g status-position "top" set -g status-justify "left" set -g status "on" set -g status-left-style "none" -set -g message-command-style "fg=#c5cdd9,bg=#414550" +set -g message-command-style "fg=#d3c6aa,bg=#374145" set -g status-right-style "none" -set -g pane-active-border-style "fg=#a0c980" -set -g status-style "none,bg=#33353f" -set -g message-style "fg=#c5cdd9,bg=#414550" -set -g pane-border-style "fg=#414550" +set -g pane-active-border-style "fg=#a7c080" +set -g status-style "none,bg=#272e33" +set -g message-style "fg=#d3c6aa,bg=#374145" +set -g pane-border-style "fg=#374145" set -g status-right-length "100" set -g status-left-length "100" -set-window-option -g window-status-activity-style "none,fg=#a0c980,bg=#33353f" +set-window-option -g window-status-activity-style "none,fg=#a7c080,bg=#272e33" set-window-option -g window-status-separator "" -set-window-option -g window-status-style "none,fg=#c5cdd9,bg=#33353f" -set -g status-left "#[fg=#2c2e34,bg=#a0c980] #S #[fg=#a0c980,bg=#33353f,nobold,nounderscore,noitalics]" +set-window-option -g window-status-style "none,fg=#d3c6aa,bg=#272e33" +set -g status-left "#[fg=#272e33,bg=#a7c080] #S #[fg=#a7c080,bg=#272e33,nobold,nounderscore,noitalics]" set -g status-right "" -set-window-option -g window-status-format "#[fg=#33353f,bg=#33353f,nobold,nounderscore,noitalics]#[default] #I #W #[fg=#33353f,bg=#33353f,nobold,nounderscore,noitalics]" -set-window-option -g window-status-current-format "#[fg=#33353f,bg=#414550,nobold,nounderscore,noitalics]#[fg=#c5cdd9,bg=#414550] #I #W #[fg=#414550,bg=#33353f,nobold,nounderscore,noitalics]" +set-window-option -g window-status-format "#[fg=#272e33,bg=#272e33,nobold,nounderscore,noitalics]#[default] #I #W #[fg=#272e33,bg=#272e33,nobold,nounderscore,noitalics]" +set-window-option -g window-status-current-format "#[fg=#272e33,bg=#374145,nobold,nounderscore,noitalics]#[fg=#d3c6aa,bg=#374145] #I #W #[fg=#374145,bg=#272e33,nobold,nounderscore,noitalics]" ## ƒŠƒtƒŒƒbƒVƒ…‚ÌŠÔŠu‚ðÝ’è‚·‚é set -g status-interval 1 diff --git a/.zshrc b/.zshrc index 2e9af85..bd59832 100644 --- a/.zshrc +++ b/.zshrc @@ -34,9 +34,9 @@ alias gr="git rebase" alias gl="git log" # ezaã‚’ls代ã‚ã‚Šã«ã™ã‚‹ -alias ls="eza --icons -a" -alias lsl="eza --icons -la" -alias lsa="eza --icons -T -a" +alias ls="eza -a" +alias lsl="eza -la" +alias lsa="eza -T -a" # batã‚’catã®ä»£ã‚ã‚Šã«ã™ã‚‹ alias cat="bat --color=always --style=plain" @@ -65,9 +65,9 @@ export FZF_TMUX_OPTS="-p 50%" export FZF_CTRL_R_OPTS="--reverse --preview 'echo {}' --preview-window=border-sharp,down:3:hidden:wrap --bind '?:toggle-preview'" export FZF_DEFAULT_COMMAND="rg --files --hidden 2> /dev/null --follow --glob '!.git/*'" export FZF_DEFAULT_OPTS="--ansi --no-separator --no-scrollbar --reverse --border=none \ ---color=bg+:#1c1e26,bg:#1c1e26,spinner:#ee64ac,hl:#e95678 \ ---color=fg:#d5d8da,header:#e95678,info:#e95678,pointer:#ee64ac \ ---color=marker:#ee64ac,fg+:#d5d8da,prompt:#e95678,hl+:#e95678" + --color=bg+:#272e33,bg:#272e33,spinner:#a7c080,hl:#a7c080 \ +--color=fg:#d3c6aa,header:#a7c080,info:#a7c080,pointer:#a7c080 \ +--color=marker:#a7c080,fg+:#d3c6aa,prompt:#dbbc7f,hl+:#a7c080" export FZF_CTRL_T_COMMAND="rg --files --hidden 2> /dev/null --follow --glob '!.git/*'" export FZF_CTRL_T_OPTS="--preview 'bat --color=always --style=plain --line-range :100 {}' --preview-window=border-sharp,right:60%" export FZF_ALT_C_COMMAND="fd -t d --hidden" diff --git a/colors-rofi.rasi b/colors-rofi.rasi index 16a8a36..5e9d445 100644 --- a/colors-rofi.rasi +++ b/colors-rofi.rasi @@ -1,9 +1,9 @@ * { - active-background: #68DDC4; - active-foreground: @foreground; + active-background: #A7C080; + active-foreground: @background; normal-background: @background; normal-foreground: @foreground; - urgent-background: #D95882; + urgent-background: #E67E80; urgent-foreground: @foreground; alternate-active-background: @background; @@ -13,17 +13,17 @@ alternate-urgent-background: @background; alternate-urgent-foreground: @foreground; - selected-active-background: #D95882; + selected-active-background: #E67E80; selected-active-foreground: @foreground; - selected-normal-background: #f08080; + selected-normal-background: #E67E80; selected-normal-foreground: @background; - selected-urgent-background: #D95882; + selected-urgent-background: #E67E80; selected-urgent-foreground: @foreground; background-color: @background; - background: #1C1E27; - foreground: #cacacc; - border-color: #E8AEAA; + background: #272E33; + foreground: #D3C6AA; + border-color: #E69875; spacing: 4; } diff --git a/config b/config index 1dc2f36..0190832 100644 --- a/config +++ b/config @@ -156,17 +156,17 @@ mode "SHUTDOWN SEQUENCE"{ } # ステータスãƒãƒ¼ã®è‰² -set $background #2B303B -set $foreground #C0C5CE -set $lightred #BF616A -set $lightgreen #A3BE8C -set $lightyellow #EBCB8B -set $lightblue #8FA1B3 -set $lightmagenta #B48EAD -set $lightcyan #96B5B4 -set $lightwhite #C0C5CE +set $background #272E33 +set $foreground #D3C6AA +set $lightred #E67E80 +set $lightgreen #A7C080 +set $lightyellow #DBBC7F +set $lightblue #83C092 +set $lightmagenta #D699B6 +set $lightcyan #7FBBB3 +set $lightwhite #D3C6AA set $pink #FFB6C1 -set $orange #F08080 +set $orange #E69875 # ステータスãƒãƒ¼é–¢é€£ bar { @@ -183,7 +183,7 @@ bar { statusline $lightred focused_statusline $lightred # å·¦ã‹ã‚‰border, bg, fg - focused_workspace $orange $orange $background + focused_workspace $red $red $background active_workspace $background $background $foreground inactive_workspace $background $background $foreground urgent_workspace $green $green $background @@ -194,26 +194,26 @@ bar { } # i3wm全体ã®è‰² -set $bg #1C1E27 -set $fg #CACACC -set $darkred #D95882 -set $red #E4436F -set $darkgreen #68DDC4 -set $green #24E39D -set $darkyellow #E8AEAA -set $yellow #EDA685 -set $darkblue #64A4BF -set $blue #2095B4 -set $darkmagenta #B382CF -set $darkcyan #54AEB8 -set $cyan #00A5AF -set $darkwhite #CACACC -set $white #CACACA -set $darkgrey #6C6F93 +set $bg #272E33 +set $fg #D3C6AA +set $darkred #E69875 +set $red #E67E80 +set $darkgreen #A7C080 +set $green #A7C080 +set $darkyellow #DBBC7F +set $yellow #DBBC7F +set $darkblue #83C092 +set $blue #7FBBB3 +set $darkmagenta #D699B6 +set $darkcyan #7FBBB3 +set $cyan #7FBBB3 +set $darkwhite #D3C6AA +set $white #D3C6AA +set $darkgrey #9DA9AD # フォーカスカラー # class border background text indicator child_border -client.focused $bg $darkgrey $fg $yellow $darkyellow +client.focused $bg $darkgrey $fg $yellow $orange client.unfocused $bg $bg $fg $yellow $bg # ウインドウã®æž ã®å¤ªã• diff --git a/dunstrc b/dunstrc index 0f03560..cb72fb8 100644 --- a/dunstrc +++ b/dunstrc @@ -1,5 +1,5 @@ [global] -font = Noto Sans CJK JP 12 +font = UDEV Gothic 35NFLG 12 # Allow a small subset of html markup: # bold @@ -143,7 +143,7 @@ max_icon_size = 80 icon_path = /usr/share/icons/Qogir/symbolic/status frame_width = 1 -frame_color = "#a3be8c" +frame_color = "#a7c080" [shortcuts] @@ -169,23 +169,23 @@ context = ctrl+shift+period [urgency_low] # IMPORTANT: colors have to be defined in quotation marks. # Otherwise the "#" and following would be interpreted as a comment. -frame_color = "#2b303b" -foreground = "#c0c5ce" -background = "#2b303b" +frame_color = "#272e33" +foreground = "#d3c6aa" +background = "#272e33" #background = "#2B313C" timeout = 3 [urgency_normal] -frame_color = "#a3be8c" -foreground = "#c0c5ce" -background = "#2b303b" +frame_color = "#a7c080" +foreground = "#d3c6aa" +background = "#272e33" #background = "#2B313C" timeout = 3 [urgency_critical] -frame_color = "#f08080" -foreground = "#c0c5ce" -background = "#2b303b" +frame_color = "#e67e80" +foreground = "#d3c6aa" +background = "#272e33" #background = "#2B313C" timeout = 5 diff --git a/init.lua b/init.lua index 1e7e0cd..df269c9 100644 --- a/init.lua +++ b/init.lua @@ -323,7 +323,7 @@ require("telescope").setup({ treesitter = false, }, borderchars = { "─", "│", "─", "│", "┌", "â”", "┘", "â””" }, - color_devicons = true, + color_devicons = false, file_ignore_patterns = { "node_modules", ".git", ".cache", ".svg", ".npm", "go" }, mappings = { i = { @@ -386,7 +386,7 @@ end --LSP require("lspsaga").setup({ symbol_in_winbar = { - enable = true, + enable = false, }, ui = { border = "single", @@ -1013,21 +1013,19 @@ vim.api.nvim_set_keymap( { noremap = true, silent = true } ) - --COLORSCHEME vim.keymap.set("n", "8", "colorscheme edge", { noremap = true, silent = true }) vim.keymap.set("n", "7", "colorscheme everforest", { noremap = true, silent = true }) vim.keymap.set("n", "6", "colorscheme gruvbox-material", { noremap = true, silent = true }) require("gruvbox-material").setup({ - contrast = "hard", + contrast = "medium", }) require("everforest").setup({ - background = "hard", + background = "hard", }) vim.cmd("colorscheme everforest") - --OTHER SETTINGS diff --git a/laptop/.alacritty.toml b/laptop/.alacritty.toml index 55286dd..a50a249 100644 --- a/laptop/.alacritty.toml +++ b/laptop/.alacritty.toml @@ -1,32 +1,28 @@ -[colors.bright] -black = "0x5b5858" -blue = "0x3fc4de" -cyan = "0x6be4e6" -green = "0x3fdaa4" -magenta = "0xf075b5" -red = "0xec6a88" -white = "0xd5d8da" -yellow = "0xfbc3a7" -[colors.cursor] -cursor = "0x00ff00" +background = '#272E33' +foreground = '#d3c6aa' +# Normal colors [colors.normal] -black = "0x16161c" -blue = "0x26bbd9" -cyan = "0x59e1e3" -green = "0x29d398" -magenta = "0xee64ac" -red = "0xe95678" -white = "0xd5d8da" -yellow = "0xfab795" +black = '#414B50' +red = '#e67e80' +green = '#a7c080' +yellow = '#dbbc7f' +blue = '#7fbbb3' +magenta = '#d699b6' +cyan = '#83c092' +white = '#d3c6aa' -[colors.primary] -background = "0x1c1e26" -foreground = "0xe0e0e0" - -[colors.vi_mode_cursor] -cursor = "0x00ff00" +# Bright colors +[colors.bright] +black = '#414B50' +red = '#e67e80' +green = '#a7c080' +yellow = '#dbbc7f' +blue = '#7fbbb3' +magenta = '#d699b6' +cyan = '#83c092' +white = '#d3c6aa' [cursor] blink_interval = 470 @@ -59,7 +55,7 @@ style = "Italic" family = "UDEV Gothic 35NFLG" style = "Regular" -[shell] +[terminal.shell] args = ["--login"] program = "/usr/bin/zsh" diff --git a/laptop/colors-rofi.rasi b/laptop/colors-rofi.rasi index 8ff70ea..905f187 100644 --- a/laptop/colors-rofi.rasi +++ b/laptop/colors-rofi.rasi @@ -1,9 +1,9 @@ * { - active-background: #68DDC4; - active-foreground: @foreground; + active-background: #A7C080; + active-foreground: @background; normal-background: @background; normal-foreground: @foreground; - urgent-background: #D95882; + urgent-background: #E67E80; urgent-foreground: @foreground; alternate-active-background: @background; @@ -13,17 +13,17 @@ alternate-urgent-background: @background; alternate-urgent-foreground: @foreground; - selected-active-background: #D95882; + selected-active-background: #E67E80; selected-active-foreground: @foreground; - selected-normal-background: #f08080; + selected-normal-background: #E67E80; selected-normal-foreground: @background; - selected-urgent-background: #D95882; + selected-urgent-background: #E67E80; selected-urgent-foreground: @foreground; background-color: @background; - background: #1C1E27; - foreground: #cacacc; - border-color: #E8AEAA; + background: #272E33; + foreground: #D3C6AA; + border-color: #E69875; spacing: 4; } diff --git a/laptop/config b/laptop/config index 5b1aacd..896e94e 100644 --- a/laptop/config +++ b/laptop/config @@ -157,17 +157,17 @@ mode "SHUTDOWN SEQUENCE"{ } # ステータスãƒãƒ¼ã®è‰² -set $background #2B303B -set $foreground #C0C5CE -set $lightred #BF616A -set $lightgreen #A3BE8C -set $lightyellow #EBCB8B -set $lightblue #8FA1B3 -set $lightmagenta #B48EAD -set $lightcyan #96B5B4 -set $lightwhite #C0C5CE +set $background #272E33 +set $foreground #D3C6AA +set $lightred #E67E80 +set $lightgreen #A7C080 +set $lightyellow #DBBC7F +set $lightblue #83C092 +set $lightmagenta #D699B6 +set $lightcyan #7FBBB3 +set $lightwhite #D3C6AA set $pink #FFB6C1 -set $orange #F08080 +set $orange #E69875 # ステータスãƒãƒ¼é–¢é€£ bar { @@ -184,37 +184,37 @@ bar { statusline $lightred focused_statusline $lightred # å·¦ã‹ã‚‰border, bg, fg - focused_workspace $orange $orange $background + focused_workspace $red $red $background active_workspace $background $background $foreground inactive_workspace $background $background $foreground urgent_workspace $green $green $background binding_mode $green $green $background } - status_command /usr/bin/bumblebee-status -m playerctl pasink pasource datetime battery \ + status_command /usr/bin/bumblebee-status -m playerctl datetime \ -p playerctl.hide="true" playerctl.format="{{artist}} - {{title}}" playerctl.layout="playerctl.song" datetime.format="%m/%d %H:%M" -t monotone } # i3wm全体ã®è‰² -set $bg #1C1E27 -set $fg #cacacc -set $darkred #D95882 -set $red #E4436F -set $darkgreen #68DDC4 -set $green #24e39d -set $darkyellow #E8AEAA -set $yellow #EDA685 -set $darkblue #64A4BF -set $blue #2095B4 -set $darkmagenta #B382CF -set $darkcyan #54AEB8 -set $cyan #00A5AF -set $darkwhite #cacacc -set $white #cacaca -set $darkgrey #6C6F93 +set $bg #272E33 +set $fg #D3C6AA +set $darkred #E69875 +set $red #E67E80 +set $darkgreen #A7C080 +set $green #A7C080 +set $darkyellow #DBBC7F +set $yellow #DBBC7F +set $darkblue #83C092 +set $blue #7FBBB3 +set $darkmagenta #D699B6 +set $darkcyan #7FBBB3 +set $cyan #7FBBB3 +set $darkwhite #D3C6AA +set $white #D3C6AA +set $darkgrey #9DA9AD # フォーカスカラー # class border background text indicator child_border -client.focused $bg $darkgrey $fg $yellow $darkyellow +client.focused $bg $darkgrey $fg $yellow $orange client.unfocused $bg $bg $fg $yellow $bg # ウインドウ枠ã®å¤ªã• diff --git a/laptop/dunstrc b/laptop/dunstrc index b576d52..27cf264 100644 --- a/laptop/dunstrc +++ b/laptop/dunstrc @@ -1,5 +1,5 @@ [global] -font = Noto Sans CJK JP 11 +font = UDEV Gothic 35NFLG 11 # Allow a small subset of html markup: # bold @@ -143,7 +143,7 @@ max_icon_size = 100 icon_path = /usr/share/icons/Qogir/symbolic/status frame_width = 2 -frame_color = "#a3be8c" +frame_color = "#a7c080" [shortcuts] @@ -169,27 +169,26 @@ context = ctrl+shift+period [urgency_low] # IMPORTANT: colors have to be defined in quotation marks. # Otherwise the "#" and following would be interpreted as a comment. -frame_color = "#2b303b" -foreground = "#c0c5ce" -background = "#2b303b" +frame_color = "#272e33" +foreground = "#d3c6aa" +background = "#272e33" #background = "#2B313C" timeout = 3 [urgency_normal] -frame_color = "#a3be8c" -foreground = "#c0c5ce" -background = "#2b303b" +frame_color = "#a7c080" +foreground = "#d3c6aa" +background = "#272e33" #background = "#2B313C" timeout = 3 [urgency_critical] -frame_color = "#f08080" -foreground = "#c0c5ce" -background = "#2b303b" +frame_color = "#e67e80" +foreground = "#d3c6aa" +background = "#272e33" #background = "#2B313C" timeout = 5 - # Every section that isn't one of the above is interpreted as a rules to # override settings for certain messages. # Messages can be matched by "appname", "summary", "body", "icon", "category", diff --git a/monotone.json b/monotone.json index bc97c4c..30bfb69 100644 --- a/monotone.json +++ b/monotone.json @@ -1,66 +1,66 @@ { "icons": [ "awesome-fonts" ], "colors": [{ - "red": "#BF616A", - "orange": "#F08080", - "yellow": "#EBCB8B", - "green": "#A3BE8C" + "red": "#E67E80", + "orange": "#E69875", + "yellow": "#DBBC7F", + "green": "#A7C080" }], "defaults": { "separator-block-width": 0, "separator": "", "warning": { - "fg": "#2B303B", - "bg": "#f08080" + "fg": "#272E33", + "bg": "#E69875" }, "critical": { - "fg": "#2B303B", - "bg": "#BF616A" + "fg": "#272E33", + "bg": "#E67E80" } }, "cycle": [ - { "fg": "#C0C5CE", "bg": "#2B303B"} + { "fg": "#D3C6AA", "bg": "#272E33"} ], "dnf": { "good": { - "fg": "#A3BE8C", - "bg": "#2B303B" + "fg": "#A7C080", + "bg": "#272E33" } }, "apt": { "good": { - "fg": "#A3BE8C", - "bg": "#2B303B" + "fg": "#A7C080", + "bg": "#272E33" } }, "pacman": { "good": { - "fg": "#A3BE8C", - "bg": "#2B303B" + "fg": "#A7C080", + "bg": "#272E33" } }, "battery": { "charged": { - "fg": "#2B303B", - "bg": "#A3BE8C" + "fg": "#272E33", + "bg": "#A7C080" }, "charging": { - "fg": "#2B303B", - "bg": "#A3BE8C" + "fg": "#272E33", + "bg": "#A7C080" } }, "pomodoro": { "paused": { - "fg": "#2B303B", - "bg": "#F08080" + "fg": "#272E33", + "bg": "#E67E80" }, "work": { - "fg": "#2B303B", - "bg": "#EBCB8B" + "fg": "#272E33", + "bg": "#DBBC7F" }, "break": { - "fg": "#A3BE8C", - "bg": "#2B303B" + "fg": "#A7C080", + "bg": "#272E33" } } diff --git a/prompt_pure_setup b/prompt_pure_setup new file mode 100644 index 0000000..ed0b03a --- /dev/null +++ b/prompt_pure_setup @@ -0,0 +1,897 @@ +# Pure +# by Sindre Sorhus +# https://github.com/sindresorhus/pure +# MIT License + +# For my own and others sanity +# git: +# %b => current branch +# %a => current action (rebase/merge) +# prompt: +# %F => color dict +# %f => reset color +# %~ => current path +# %* => time +# %n => username +# %m => shortname host +# %(?..) => prompt conditional - %(condition.true.false) +# terminal codes: +# \e7 => save cursor position +# \e[2A => move cursor 2 lines up +# \e[1G => go to position 1 in terminal +# \e8 => restore cursor position +# \e[K => clears everything after the cursor on the current line +# \e[2K => clear everything on the current line + + +# Turns seconds into human readable time. +# 165392 => 1d 21h 56m 32s +# https://github.com/sindresorhus/pretty-time-zsh +prompt_pure_human_time_to_var() { + local human total_seconds=$1 var=$2 + local days=$(( total_seconds / 60 / 60 / 24 )) + local hours=$(( total_seconds / 60 / 60 % 24 )) + local minutes=$(( total_seconds / 60 % 60 )) + local seconds=$(( total_seconds % 60 )) + (( days > 0 )) && human+="${days}d " + (( hours > 0 )) && human+="${hours}h " + (( minutes > 0 )) && human+="${minutes}m " + human+="${seconds}s" + + # Store human readable time in a variable as specified by the caller + typeset -g "${var}"="${human}" +} + +# Stores (into prompt_pure_cmd_exec_time) the execution +# time of the last command if set threshold was exceeded. +prompt_pure_check_cmd_exec_time() { + integer elapsed + (( elapsed = EPOCHSECONDS - ${prompt_pure_cmd_timestamp:-$EPOCHSECONDS} )) + typeset -g prompt_pure_cmd_exec_time= + (( elapsed > ${PURE_CMD_MAX_EXEC_TIME:-5} )) && { + prompt_pure_human_time_to_var $elapsed "prompt_pure_cmd_exec_time" + } +} + +prompt_pure_set_title() { + setopt localoptions noshwordsplit + + # Emacs terminal does not support settings the title. + (( ${+EMACS} || ${+INSIDE_EMACS} )) && return + + case $TTY in + # Don't set title over serial console. + /dev/ttyS[0-9]*) return;; + esac + + # Show hostname if connected via SSH. + local hostname= + if [[ -n $prompt_pure_state[username] ]]; then + # Expand in-place in case ignore-escape is used. + hostname="${(%):-(%m) }" + fi + + local -a opts + case $1 in + expand-prompt) opts=(-P);; + ignore-escape) opts=(-r);; + esac + + # Set title atomically in one print statement so that it works when XTRACE is enabled. + print -n $opts $'\e]0;'${hostname}${2}$'\a' +} + +prompt_pure_preexec() { + if [[ -n $prompt_pure_git_fetch_pattern ]]; then + # Detect when Git is performing pull/fetch, including Git aliases. + local -H MATCH MBEGIN MEND match mbegin mend + if [[ $2 =~ (git|hub)\ (.*\ )?($prompt_pure_git_fetch_pattern)(\ .*)?$ ]]; then + # We must flush the async jobs to cancel our git fetch in order + # to avoid conflicts with the user issued pull / fetch. + async_flush_jobs 'prompt_pure' + fi + fi + + typeset -g prompt_pure_cmd_timestamp=$EPOCHSECONDS + + # Shows the current directory and executed command in the title while a process is active. + prompt_pure_set_title 'ignore-escape' "$PWD:t: $2" + + # Disallow Python virtualenv from updating the prompt. Set it to 12 if + # untouched by the user to indicate that Pure modified it. Here we use + # the magic number 12, same as in `psvar`. + export VIRTUAL_ENV_DISABLE_PROMPT=${VIRTUAL_ENV_DISABLE_PROMPT:-12} +} + +# Change the colors if their value are different from the current ones. +prompt_pure_set_colors() { + local color_temp key value + for key value in ${(kv)prompt_pure_colors}; do + zstyle -t ":prompt:pure:$key" color "$value" + case $? in + 1) # The current style is different from the one from zstyle. + zstyle -s ":prompt:pure:$key" color color_temp + prompt_pure_colors[$key]=$color_temp ;; + 2) # No style is defined. + prompt_pure_colors[$key]=$prompt_pure_colors_default[$key] ;; + esac + done +} + +prompt_pure_preprompt_render() { + setopt localoptions noshwordsplit + + unset prompt_pure_async_render_requested + + # Set color for Git branch/dirty status and change color if dirty checking has been delayed. + local git_color=$prompt_pure_colors[git:branch] + local git_dirty_color=$prompt_pure_colors[git:dirty] + [[ -n ${prompt_pure_git_last_dirty_check_timestamp+x} ]] && git_color=$prompt_pure_colors[git:branch:cached] + + # Initialize the preprompt array. + local -a preprompt_parts + + # Suspended jobs in background. + if ((${(M)#jobstates:#suspended:*} != 0)); then + preprompt_parts+='%F{$prompt_pure_colors[suspended_jobs]}✦' + fi + + # Username and machine, if applicable. + [[ -n $prompt_pure_state[username] ]] && preprompt_parts+=($prompt_pure_state[username]) + + # Set the path. + preprompt_parts+=('%F{${prompt_pure_colors[path]}}%~%f') + + # Git branch and dirty status info. + typeset -gA prompt_pure_vcs_info + if [[ -n $prompt_pure_vcs_info[branch] ]]; then + preprompt_parts+=("%F{$git_color}"'${prompt_pure_vcs_info[branch]}'"%F{$git_dirty_color}"'${prompt_pure_git_dirty}%f') + fi + # Git action (for example, merge). + if [[ -n $prompt_pure_vcs_info[action] ]]; then + preprompt_parts+=("%F{$prompt_pure_colors[git:action]}"'$prompt_pure_vcs_info[action]%f') + fi + # Git pull/push arrows. + if [[ -n $prompt_pure_git_arrows ]]; then + preprompt_parts+=('%F{$prompt_pure_colors[git:arrow]}${prompt_pure_git_arrows}%f') + fi + # Git stash symbol (if opted in). + if [[ -n $prompt_pure_git_stash ]]; then + preprompt_parts+=('%F{$prompt_pure_colors[git:stash]}${PURE_GIT_STASH_SYMBOL:-≡}%f') + fi + + # Execution time. + [[ -n $prompt_pure_cmd_exec_time ]] && preprompt_parts+=('%F{$prompt_pure_colors[execution_time]}${prompt_pure_cmd_exec_time}%f') + + local cleaned_ps1=$PROMPT + local -H MATCH MBEGIN MEND + if [[ $PROMPT = *$prompt_newline* ]]; then + # Remove everything from the prompt until the newline. This + # removes the preprompt and only the original PROMPT remains. + cleaned_ps1=${PROMPT##*${prompt_newline}} + fi + unset MATCH MBEGIN MEND + + # Construct the new prompt with a clean preprompt. + local -ah ps1 + ps1=( + ${(j. .)preprompt_parts} # Join parts, space separated. + $prompt_newline # Separate preprompt and prompt. + $cleaned_ps1 + ) + + PROMPT="${(j..)ps1}" + + # Expand the prompt for future comparision. + local expanded_prompt + expanded_prompt="${(S%%)PROMPT}" + + if [[ $1 == precmd ]]; then + # Initial newline, for spaciousness. + print + elif [[ $prompt_pure_last_prompt != $expanded_prompt ]]; then + # Redraw the prompt. + prompt_pure_reset_prompt + fi + + typeset -g prompt_pure_last_prompt=$expanded_prompt +} + +prompt_pure_precmd() { + setopt localoptions noshwordsplit + + # Check execution time and store it in a variable. + prompt_pure_check_cmd_exec_time + unset prompt_pure_cmd_timestamp + + # Shows the full path in the title. + prompt_pure_set_title 'expand-prompt' '%~' + + # Modify the colors if some have changed.. + prompt_pure_set_colors + + # Perform async Git dirty check and fetch. + prompt_pure_async_tasks + + # Check if we should display the virtual env. We use a sufficiently high + # index of psvar (12) here to avoid collisions with user defined entries. + psvar[12]= + # Check if a Conda environment is active and display its name. + if [[ -n $CONDA_DEFAULT_ENV ]]; then + psvar[12]="${CONDA_DEFAULT_ENV//[$'\t\r\n']}" + fi + # When VIRTUAL_ENV_DISABLE_PROMPT is empty, it was unset by the user and + # Pure should take back control. + if [[ -n $VIRTUAL_ENV ]] && [[ -z $VIRTUAL_ENV_DISABLE_PROMPT || $VIRTUAL_ENV_DISABLE_PROMPT = 12 ]]; then + psvar[12]="${VIRTUAL_ENV:t}" + export VIRTUAL_ENV_DISABLE_PROMPT=12 + fi + + # Nix package manager integration. If used from within 'nix shell' - shell name is shown like so: + # ~/Projects/flake-utils-plus master + # flake-utils-plus ⯠+ if zstyle -T ":prompt:pure:environment:nix-shell" show; then + if [[ -n $IN_NIX_SHELL ]]; then + psvar[12]="${name:-nix-shell}" + fi + fi + + # Make sure VIM prompt is reset. + prompt_pure_reset_prompt_symbol + + # Print the preprompt. + prompt_pure_preprompt_render "precmd" + + if [[ -n $ZSH_THEME ]]; then + print "WARNING: Oh My Zsh themes are enabled (ZSH_THEME='${ZSH_THEME}'). Pure might not be working correctly." + print "For more information, see: https://github.com/sindresorhus/pure#oh-my-zsh" + unset ZSH_THEME # Only show this warning once. + fi +} + +prompt_pure_async_git_aliases() { + setopt localoptions noshwordsplit + local -a gitalias pullalias + + # List all aliases and split on newline. + gitalias=(${(@f)"$(command git config --get-regexp "^alias\.")"}) + for line in $gitalias; do + parts=(${(@)=line}) # Split line on spaces. + aliasname=${parts[1]#alias.} # Grab the name (alias.[name]). + shift parts # Remove `aliasname` + + # Check alias for pull or fetch. Must be exact match. + if [[ $parts =~ ^(.*\ )?(pull|fetch)(\ .*)?$ ]]; then + pullalias+=($aliasname) + fi + done + + print -- ${(j:|:)pullalias} # Join on pipe, for use in regex. +} + +prompt_pure_async_vcs_info() { + setopt localoptions noshwordsplit + + # Configure `vcs_info` inside an async task. This frees up `vcs_info` + # to be used or configured as the user pleases. + zstyle ':vcs_info:*' enable git + zstyle ':vcs_info:*' use-simple true + # Only export four message variables from `vcs_info`. + zstyle ':vcs_info:*' max-exports 3 + # Export branch (%b), Git toplevel (%R), action (rebase/cherry-pick) (%a) + zstyle ':vcs_info:git*' formats '%b' '%R' '%a' + zstyle ':vcs_info:git*' actionformats '%b' '%R' '%a' + + vcs_info + + local -A info + info[pwd]=$PWD + info[branch]=${vcs_info_msg_0_//\%/%%} + info[top]=$vcs_info_msg_1_ + info[action]=$vcs_info_msg_2_ + + print -r - ${(@kvq)info} +} + +# Fastest possible way to check if a Git repo is dirty. +prompt_pure_async_git_dirty() { + setopt localoptions noshwordsplit + local untracked_dirty=$1 + local untracked_git_mode=$(command git config --get status.showUntrackedFiles) + if [[ "$untracked_git_mode" != 'no' ]]; then + untracked_git_mode='normal' + fi + + # Prevent e.g. `git status` from refreshing the index as a side effect. + export GIT_OPTIONAL_LOCKS=0 + + if [[ $untracked_dirty = 0 ]]; then + command git diff --no-ext-diff --quiet --exit-code + else + test -z "$(command git status --porcelain -u${untracked_git_mode})" + fi + + return $? +} + +prompt_pure_async_git_fetch() { + setopt localoptions noshwordsplit + + local only_upstream=${1:-0} + + # Sets `GIT_TERMINAL_PROMPT=0` to disable authentication prompt for Git fetch (Git 2.3+). + export GIT_TERMINAL_PROMPT=0 + # Set SSH `BachMode` to disable all interactive SSH password prompting. + export GIT_SSH_COMMAND="${GIT_SSH_COMMAND:-"ssh"} -o BatchMode=yes" + + # If gpg-agent is set to handle SSH keys for `git fetch`, make + # sure it doesn't corrupt the parent TTY. + # Setting an empty GPG_TTY forces pinentry-curses to close immediately rather + # than stall indefinitely waiting for user input. + export GPG_TTY= + + local -a remote + if ((only_upstream)); then + local ref + ref=$(command git symbolic-ref -q HEAD) + # Set remote to only fetch information for the current branch. + remote=($(command git for-each-ref --format='%(upstream:remotename) %(refname)' $ref)) + if [[ -z $remote[1] ]]; then + # No remote specified for this branch, skip fetch. + return 97 + fi + fi + + # Default return code, which indicates Git fetch failure. + local fail_code=99 + + # Guard against all forms of password prompts. By setting the shell into + # MONITOR mode we can notice when a child process prompts for user input + # because it will be suspended. Since we are inside an async worker, we + # have no way of transmitting the password and the only option is to + # kill it. If we don't do it this way, the process will corrupt with the + # async worker. + setopt localtraps monitor + + # Make sure local HUP trap is unset to allow for signal propagation when + # the async worker is flushed. + trap - HUP + + trap ' + # Unset trap to prevent infinite loop + trap - CHLD + if [[ $jobstates = suspended* ]]; then + # Set fail code to password prompt and kill the fetch. + fail_code=98 + kill %% + fi + ' CHLD + + # Do git fetch and avoid fetching tags or + # submodules to speed up the process. + command git -c gc.auto=0 fetch \ + --quiet \ + --no-tags \ + --recurse-submodules=no \ + $remote &>/dev/null & + wait $! || return $fail_code + + unsetopt monitor + + # Check arrow status after a successful `git fetch`. + prompt_pure_async_git_arrows +} + +prompt_pure_async_git_arrows() { + setopt localoptions noshwordsplit + command git rev-list --left-right --count HEAD...@'{u}' +} + +prompt_pure_async_git_stash() { + git rev-list --walk-reflogs --count refs/stash +} + +# Try to lower the priority of the worker so that disk heavy operations +# like `git status` has less impact on the system responsivity. +prompt_pure_async_renice() { + setopt localoptions noshwordsplit + + if command -v renice >/dev/null; then + command renice +15 -p $$ + fi + + if command -v ionice >/dev/null; then + command ionice -c 3 -p $$ + fi +} + +prompt_pure_async_init() { + typeset -g prompt_pure_async_inited + if ((${prompt_pure_async_inited:-0})); then + return + fi + prompt_pure_async_inited=1 + async_start_worker "prompt_pure" -u -n + async_register_callback "prompt_pure" prompt_pure_async_callback + async_worker_eval "prompt_pure" prompt_pure_async_renice +} + +prompt_pure_async_tasks() { + setopt localoptions noshwordsplit + + # Initialize the async worker. + prompt_pure_async_init + + # Update the current working directory of the async worker. + async_worker_eval "prompt_pure" builtin cd -q $PWD + + typeset -gA prompt_pure_vcs_info + + local -H MATCH MBEGIN MEND + if [[ $PWD != ${prompt_pure_vcs_info[pwd]}* ]]; then + # Stop any running async jobs. + async_flush_jobs "prompt_pure" + + # Reset Git preprompt variables, switching working tree. + unset prompt_pure_git_dirty + unset prompt_pure_git_last_dirty_check_timestamp + unset prompt_pure_git_arrows + unset prompt_pure_git_stash + unset prompt_pure_git_fetch_pattern + prompt_pure_vcs_info[branch]= + prompt_pure_vcs_info[top]= + fi + unset MATCH MBEGIN MEND + + async_job "prompt_pure" prompt_pure_async_vcs_info + + # Only perform tasks inside a Git working tree. + [[ -n $prompt_pure_vcs_info[top] ]] || return + + prompt_pure_async_refresh +} + +prompt_pure_async_refresh() { + setopt localoptions noshwordsplit + + if [[ -z $prompt_pure_git_fetch_pattern ]]; then + # We set the pattern here to avoid redoing the pattern check until the + # working tree has changed. Pull and fetch are always valid patterns. + typeset -g prompt_pure_git_fetch_pattern="pull|fetch" + async_job "prompt_pure" prompt_pure_async_git_aliases + fi + + async_job "prompt_pure" prompt_pure_async_git_arrows + + # Do not perform `git fetch` if it is disabled or in home folder. + if (( ${PURE_GIT_PULL:-1} )) && [[ $prompt_pure_vcs_info[top] != $HOME ]]; then + zstyle -t :prompt:pure:git:fetch only_upstream + local only_upstream=$((? == 0)) + async_job "prompt_pure" prompt_pure_async_git_fetch $only_upstream + fi + + # If dirty checking is sufficiently fast, + # tell the worker to check it again, or wait for timeout. + integer time_since_last_dirty_check=$(( EPOCHSECONDS - ${prompt_pure_git_last_dirty_check_timestamp:-0} )) + if (( time_since_last_dirty_check > ${PURE_GIT_DELAY_DIRTY_CHECK:-1800} )); then + unset prompt_pure_git_last_dirty_check_timestamp + # Check check if there is anything to pull. + async_job "prompt_pure" prompt_pure_async_git_dirty ${PURE_GIT_UNTRACKED_DIRTY:-1} + fi + + # If stash is enabled, tell async worker to count stashes + if zstyle -t ":prompt:pure:git:stash" show; then + async_job "prompt_pure" prompt_pure_async_git_stash + else + unset prompt_pure_git_stash + fi +} + +prompt_pure_check_git_arrows() { + setopt localoptions noshwordsplit + local arrows left=${1:-0} right=${2:-0} + + (( right > 0 )) && arrows+=${PURE_GIT_DOWN_ARROW:-⇣} + (( left > 0 )) && arrows+=${PURE_GIT_UP_ARROW:-⇡} + + [[ -n $arrows ]] || return + typeset -g REPLY=$arrows +} + +prompt_pure_async_callback() { + setopt localoptions noshwordsplit + local job=$1 code=$2 output=$3 exec_time=$4 next_pending=$6 + local do_render=0 + + case $job in + \[async]) + # Handle all the errors that could indicate a crashed + # async worker. See zsh-async documentation for the + # definition of the exit codes. + if (( code == 2 )) || (( code == 3 )) || (( code == 130 )); then + # Our worker died unexpectedly, try to recover immediately. + # TODO(mafredri): Do we need to handle next_pending + # and defer the restart? + typeset -g prompt_pure_async_inited=0 + async_stop_worker prompt_pure + prompt_pure_async_init # Reinit the worker. + prompt_pure_async_tasks # Restart all tasks. + + # Reset render state due to restart. + unset prompt_pure_async_render_requested + fi + ;; + \[async/eval]) + if (( code )); then + # Looks like async_worker_eval failed, + # rerun async tasks just in case. + prompt_pure_async_tasks + fi + ;; + prompt_pure_async_vcs_info) + local -A info + typeset -gA prompt_pure_vcs_info + + # Parse output (z) and unquote as array (Q@). + info=("${(Q@)${(z)output}}") + local -H MATCH MBEGIN MEND + if [[ $info[pwd] != $PWD ]]; then + # The path has changed since the check started, abort. + return + fi + # Check if Git top-level has changed. + if [[ $info[top] = $prompt_pure_vcs_info[top] ]]; then + # If the stored pwd is part of $PWD, $PWD is shorter and likelier + # to be top-level, so we update pwd. + if [[ $prompt_pure_vcs_info[pwd] = ${PWD}* ]]; then + prompt_pure_vcs_info[pwd]=$PWD + fi + else + # Store $PWD to detect if we (maybe) left the Git path. + prompt_pure_vcs_info[pwd]=$PWD + fi + unset MATCH MBEGIN MEND + + # The update has a Git top-level set, which means we just entered a new + # Git directory. Run the async refresh tasks. + [[ -n $info[top] ]] && [[ -z $prompt_pure_vcs_info[top] ]] && prompt_pure_async_refresh + + # Always update branch, top-level and stash. + prompt_pure_vcs_info[branch]=$info[branch] + prompt_pure_vcs_info[top]=$info[top] + prompt_pure_vcs_info[action]=$info[action] + + do_render=1 + ;; + prompt_pure_async_git_aliases) + if [[ -n $output ]]; then + # Append custom Git aliases to the predefined ones. + prompt_pure_git_fetch_pattern+="|$output" + fi + ;; + prompt_pure_async_git_dirty) + local prev_dirty=$prompt_pure_git_dirty + if (( code == 0 )); then + unset prompt_pure_git_dirty + else + typeset -g prompt_pure_git_dirty="*" + fi + + [[ $prev_dirty != $prompt_pure_git_dirty ]] && do_render=1 + + # When `prompt_pure_git_last_dirty_check_timestamp` is set, the Git info is displayed + # in a different color. To distinguish between a "fresh" and a "cached" result, the + # preprompt is rendered before setting this variable. Thus, only upon the next + # rendering of the preprompt will the result appear in a different color. + (( $exec_time > 5 )) && prompt_pure_git_last_dirty_check_timestamp=$EPOCHSECONDS + ;; + prompt_pure_async_git_fetch|prompt_pure_async_git_arrows) + # `prompt_pure_async_git_fetch` executes `prompt_pure_async_git_arrows` + # after a successful fetch. + case $code in + 0) + local REPLY + prompt_pure_check_git_arrows ${(ps:\t:)output} + if [[ $prompt_pure_git_arrows != $REPLY ]]; then + typeset -g prompt_pure_git_arrows=$REPLY + do_render=1 + fi + ;; + 97) + # No remote available, make sure to clear git arrows if set. + if [[ -n $prompt_pure_git_arrows ]]; then + typeset -g prompt_pure_git_arrows= + do_render=1 + fi + ;; + 99|98) + # Git fetch failed. + ;; + *) + # Non-zero exit status from `prompt_pure_async_git_arrows`, + # indicating that there is no upstream configured. + if [[ -n $prompt_pure_git_arrows ]]; then + unset prompt_pure_git_arrows + do_render=1 + fi + ;; + esac + ;; + prompt_pure_async_git_stash) + local prev_stash=$prompt_pure_git_stash + typeset -g prompt_pure_git_stash=$output + [[ $prev_stash != $prompt_pure_git_stash ]] && do_render=1 + ;; + esac + + if (( next_pending )); then + (( do_render )) && typeset -g prompt_pure_async_render_requested=1 + return + fi + + [[ ${prompt_pure_async_render_requested:-$do_render} = 1 ]] && prompt_pure_preprompt_render + unset prompt_pure_async_render_requested +} + +prompt_pure_reset_prompt() { + if [[ $CONTEXT == cont ]]; then + # When the context is "cont", PS2 is active and calling + # reset-prompt will have no effect on PS1, but it will + # reset the execution context (%_) of PS2 which we don't + # want. Unfortunately, we can't save the output of "%_" + # either because it is only ever rendered as part of the + # prompt, expanding in-place won't work. + return + fi + + zle && zle .reset-prompt +} + +prompt_pure_reset_prompt_symbol() { + prompt_pure_state[prompt]=${PURE_PROMPT_SYMBOL:-â¯} +} + +prompt_pure_update_vim_prompt_widget() { + setopt localoptions noshwordsplit + prompt_pure_state[prompt]=${${KEYMAP/vicmd/${PURE_PROMPT_VICMD_SYMBOL:-â®}}/(main|viins)/${PURE_PROMPT_SYMBOL:-â¯}} + + prompt_pure_reset_prompt +} + +prompt_pure_reset_vim_prompt_widget() { + setopt localoptions noshwordsplit + prompt_pure_reset_prompt_symbol + + # We can't perform a prompt reset at this point because it + # removes the prompt marks inserted by macOS Terminal. +} + +prompt_pure_state_setup() { + setopt localoptions noshwordsplit + + # Check SSH_CONNECTION and the current state. + local ssh_connection=${SSH_CONNECTION:-$PROMPT_PURE_SSH_CONNECTION} + local username hostname + if [[ -z $ssh_connection ]] && (( $+commands[who] )); then + # When changing user on a remote system, the $SSH_CONNECTION + # environment variable can be lost. Attempt detection via `who`. + local who_out + who_out=$(who -m 2>/dev/null) + if (( $? )); then + # Who am I not supported, fallback to plain who. + local -a who_in + who_in=( ${(f)"$(who 2>/dev/null)"} ) + who_out="${(M)who_in:#*[[:space:]]${TTY#/dev/}[[:space:]]*}" + fi + + local reIPv6='(([0-9a-fA-F]+:)|:){2,}[0-9a-fA-F]+' # Simplified, only checks partial pattern. + local reIPv4='([0-9]{1,3}\.){3}[0-9]+' # Simplified, allows invalid ranges. + # Here we assume two non-consecutive periods represents a + # hostname. This matches `foo.bar.baz`, but not `foo.bar`. + local reHostname='([.][^. ]+){2}' + + # Usually the remote address is surrounded by parenthesis, but + # not on all systems (e.g. busybox). + local -H MATCH MBEGIN MEND + if [[ $who_out =~ "\(?($reIPv4|$reIPv6|$reHostname)\)?\$" ]]; then + ssh_connection=$MATCH + + # Export variable to allow detection propagation inside + # shells spawned by this one (e.g. tmux does not always + # inherit the same tty, which breaks detection). + export PROMPT_PURE_SSH_CONNECTION=$ssh_connection + fi + unset MATCH MBEGIN MEND + fi + + hostname='%F{$prompt_pure_colors[host]}@%m%f' + # Show `username@host` if logged in through SSH. + [[ -n $ssh_connection ]] && username='%F{$prompt_pure_colors[user]}%n%f'"$hostname" + + # Show `username@host` if inside a container and not in GitHub Codespaces. + [[ -z "${CODESPACES}" ]] && prompt_pure_is_inside_container && username='%F{$prompt_pure_colors[user]}%n%f'"$hostname" + + # Show `username@host` if root, with username in default color. + [[ $UID -eq 0 ]] && username='%F{$prompt_pure_colors[user:root]}%n%f'"$hostname" + + typeset -gA prompt_pure_state + prompt_pure_state[version]="1.22.0" + prompt_pure_state+=( + username "$username" + prompt "${PURE_PROMPT_SYMBOL:-â¯}" + ) +} + +# Return true if executing inside a Docker, OCI, LXC, or systemd-nspawn container. +prompt_pure_is_inside_container() { + local -r cgroup_file='/proc/1/cgroup' + local -r nspawn_file='/run/host/container-manager' + [[ -r "$cgroup_file" && "$(< $cgroup_file)" = *(lxc|docker)* ]] \ + || [[ "$container" == "lxc" ]] \ + || [[ "$container" == "oci" ]] \ + || [[ -r "$nspawn_file" ]] +} + +prompt_pure_system_report() { + setopt localoptions noshwordsplit + + local shell=$SHELL + if [[ -z $shell ]]; then + shell=$commands[zsh] + fi + print - "- Zsh: $($shell --version) ($shell)" + print -n - "- Operating system: " + case "$(uname -s)" in + Darwin) print "$(sw_vers -productName) $(sw_vers -productVersion) ($(sw_vers -buildVersion))";; + *) print "$(uname -s) ($(uname -r) $(uname -v) $(uname -m) $(uname -o))";; + esac + print - "- Terminal program: ${TERM_PROGRAM:-unknown} (${TERM_PROGRAM_VERSION:-unknown})" + print -n - "- Tmux: " + [[ -n $TMUX ]] && print "yes" || print "no" + + local git_version + git_version=($(git --version)) # Remove newlines, if hub is present. + print - "- Git: $git_version" + + print - "- Pure state:" + for k v in "${(@kv)prompt_pure_state}"; do + print - " - $k: \`${(q-)v}\`" + done + print - "- zsh-async version: \`${ASYNC_VERSION}\`" + print - "- PROMPT: \`$(typeset -p PROMPT)\`" + print - "- Colors: \`$(typeset -p prompt_pure_colors)\`" + print - "- TERM: \`$(typeset -p TERM)\`" + print - "- Virtualenv: \`$(typeset -p VIRTUAL_ENV_DISABLE_PROMPT)\`" + print - "- Conda: \`$(typeset -p CONDA_CHANGEPS1)\`" + + local ohmyzsh=0 + typeset -la frameworks + (( $+ANTIBODY_HOME )) && frameworks+=("Antibody") + (( $+ADOTDIR )) && frameworks+=("Antigen") + (( $+ANTIGEN_HS_HOME )) && frameworks+=("Antigen-hs") + (( $+functions[upgrade_oh_my_zsh] )) && { + ohmyzsh=1 + frameworks+=("Oh My Zsh") + } + (( $+ZPREZTODIR )) && frameworks+=("Prezto") + (( $+ZPLUG_ROOT )) && frameworks+=("Zplug") + (( $+ZPLGM )) && frameworks+=("Zplugin") + + (( $#frameworks == 0 )) && frameworks+=("None") + print - "- Detected frameworks: ${(j:, :)frameworks}" + + if (( ohmyzsh )); then + print - " - Oh My Zsh:" + print - " - Plugins: ${(j:, :)plugins}" + fi +} + +prompt_pure_setup() { + # Prevent percentage showing up if output doesn't end with a newline. + export PROMPT_EOL_MARK='' + + prompt_opts=(subst percent) + + # Borrowed from `promptinit`. Sets the prompt options in case Pure was not + # initialized via `promptinit`. + setopt noprompt{bang,cr,percent,subst} "prompt${^prompt_opts[@]}" + + if [[ -z $prompt_newline ]]; then + # This variable needs to be set, usually set by promptinit. + typeset -g prompt_newline=$'\n%{\r%}' + fi + + zmodload zsh/datetime + zmodload zsh/zle + zmodload zsh/parameter + zmodload zsh/zutil + + autoload -Uz add-zsh-hook + autoload -Uz vcs_info + autoload -Uz async && async + + # The `add-zle-hook-widget` function is not guaranteed to be available. + # It was added in Zsh 5.3. + autoload -Uz +X add-zle-hook-widget 2>/dev/null + + # Set the colors. + typeset -gA prompt_pure_colors_default prompt_pure_colors + prompt_pure_colors_default=( + execution_time "#DBBC7F" + git:arrow "#A7C080" + git:stash "#A7C080" + git:branch "#7A8478" + git:branch:cached "#E67E80" + git:action "#DBBC7F" + git:dirty "#D699B6" + host "#9DA9A0" + path "#A7C080" + prompt:error "#E67E80" + prompt:success "#D3C6AA" + prompt:continuation "#9DA9A0" + suspended_jobs "#E67E80" + user "#9DA9A0" + user:root "default" + virtualenv "#9DA9A0" + ) + prompt_pure_colors=("${(@kv)prompt_pure_colors_default}") + + add-zsh-hook precmd prompt_pure_precmd + add-zsh-hook preexec prompt_pure_preexec + + prompt_pure_state_setup + + zle -N prompt_pure_reset_prompt + zle -N prompt_pure_update_vim_prompt_widget + zle -N prompt_pure_reset_vim_prompt_widget + if (( $+functions[add-zle-hook-widget] )); then + add-zle-hook-widget zle-line-finish prompt_pure_reset_vim_prompt_widget + add-zle-hook-widget zle-keymap-select prompt_pure_update_vim_prompt_widget + fi + + # If a virtualenv is activated, display it in grey. + PROMPT='%(12V.%F{$prompt_pure_colors[virtualenv]}%12v%f .)' + + # Prompt turns red if the previous command didn't exit with 0. + local prompt_indicator='%(?.%F{$prompt_pure_colors[prompt:success]}.%F{$prompt_pure_colors[prompt:error]})${prompt_pure_state[prompt]}%f ' + PROMPT+=$prompt_indicator + + # Indicate continuation prompt by … and use a darker color for it. + PROMPT2='%F{$prompt_pure_colors[prompt:continuation]}… %(1_.%_ .%_)%f'$prompt_indicator + + # Store prompt expansion symbols for in-place expansion via (%). For + # some reason it does not work without storing them in a variable first. + typeset -ga prompt_pure_debug_depth + prompt_pure_debug_depth=('%e' '%N' '%x') + + # Compare is used to check if %N equals %x. When they differ, the main + # prompt is used to allow displaying both filename and function. When + # they match, we use the secondary prompt to avoid displaying duplicate + # information. + local -A ps4_parts + ps4_parts=( + depth '%F{yellow}${(l:${(%)prompt_pure_debug_depth[1]}::+:)}%f' + compare '${${(%)prompt_pure_debug_depth[2]}:#${(%)prompt_pure_debug_depth[3]}}' + main '%F{blue}${${(%)prompt_pure_debug_depth[3]}:t}%f%F{242}:%I%f %F{242}@%f%F{blue}%N%f%F{242}:%i%f' + secondary '%F{blue}%N%f%F{242}:%i' + prompt '%F{242}>%f ' + ) + # Combine the parts with conditional logic. First the `:+` operator is + # used to replace `compare` either with `main` or an ampty string. Then + # the `:-` operator is used so that if `compare` becomes an empty + # string, it is replaced with `secondary`. + local ps4_symbols='${${'${ps4_parts[compare]}':+"'${ps4_parts[main]}'"}:-"'${ps4_parts[secondary]}'"}' + + # Improve the debug prompt (PS4), show depth by repeating the +-sign and + # add colors to highlight essential parts like file and function name. + PROMPT4="${ps4_parts[depth]} ${ps4_symbols}${ps4_parts[prompt]}" + + # Guard against Oh My Zsh themes overriding Pure. + unset ZSH_THEME + + # Guard against (ana)conda changing the PS1 prompt + # (we manually insert the env when it's available). + export CONDA_CHANGEPS1=no +} + +prompt_pure_setup "$@"