From eeb49bf5b0b8b700713e5b91464003cc09d1b44d Mon Sep 17 00:00:00 2001
From: Sir Mobus Gochfulshigan Dorphin Esquire XXIII <celestialtuba@gmail.com>
Date: Tue, 18 Feb 2020 17:04:14 -0500
Subject: [PATCH] systemd: add prompt function to show systemd units' status
 (#7657)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Marc Cornellà <marc.cornella@live.com>
---
 plugins/systemd/README.md          | 41 ++++++++++++++++++++++++++++++
 plugins/systemd/systemd.plugin.zsh | 15 +++++++++++
 2 files changed, 56 insertions(+)

diff --git a/plugins/systemd/README.md b/plugins/systemd/README.md
index d91329290..3fa1d2118 100644
--- a/plugins/systemd/README.md
+++ b/plugins/systemd/README.md
@@ -51,3 +51,44 @@ plugins=(... systemd)
 
 You can use the above aliases as `--user` by using the prefix `scu` instead of `sc`.
 For example: `scu-list-units` will be aliased to `systemctl --user list-units`.
+
+### Unit Status Prompt
+
+You can add a token to your prompt in a similar way to the gitfast plugin. To add the token
+to your prompt, drop `$(systemd_prompt_info [unit]...)` into your prompt (more than one unit
+may be specified).
+
+The plugin will add the following to your prompt for each `$unit`.
+```
+<prefix><unit>:<active|notactive><suffix>
+```
+You can control these parts with the following variables:
+
+- `<prefix>`: Set `$ZSH_THEME_SYSTEMD_PROMPT_PREFIX`.
+
+- `<suffix>`: Set `$ZSH_THEME_SYSTEMD_PROMPT_SUFFIX`.
+
+- `<unit>`: name passed as parameter to the function. If you want it to be in ALL CAPS,
+  you can set the variable `$ZSH_THEME_SYSTEMD_PROMPT_CAPS` to a non-empty string.
+
+- `<active>`: shown if the systemd unit is active.
+  Set `$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE`.
+
+- `<notactive>`: shown if the systemd unit is *not* active.
+  Set `$ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE`.
+
+For example, if your prompt contains `PROMPT='$(systemd_prompt_info dhcpd httpd)'` and you set the following variables:
+
+```
+ZSH_THEME_SYSTEMD_PROMPT_PREFIX="["
+ZSH_THEME_SYSTEMD_PROMPT_SUFFIX="]"
+ZSH_THEME_SYSTEMD_PROMPT_ACTIVE="+"
+ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE="X"
+ZSH_THEME_SYSTEMD_PROMPT_CAPS=1
+```
+
+If `dhcpd` is running, and `httpd` is not, then your prompt will look like this:
+
+```
+[DHCPD: +][HTTPD: X]
+```
diff --git a/plugins/systemd/systemd.plugin.zsh b/plugins/systemd/systemd.plugin.zsh
index 201ffd998..f2d1d6f1c 100644
--- a/plugins/systemd/systemd.plugin.zsh
+++ b/plugins/systemd/systemd.plugin.zsh
@@ -73,3 +73,18 @@ alias sc-mask-now="sc-mask --now"
 alias scu-enable-now="scu-enable --now"
 alias scu-disable-now="scu-disable --now"
 alias scu-mask-now="scu-mask --now"
+
+function systemd_prompt_info {
+  local unit
+  for unit in $@; do
+    echo -n "$ZSH_THEME_SYSTEMD_PROMPT_PREFIX"
+    [[ -n "$ZSH_THEME_SYSTEMD_PROMPT_CAPS" ]] && echo "${(U)unit}:" || echo "$unit:"
+    if systemctl is-active $unit &>/dev/null; then
+        echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE" 
+    else
+        echo -n "$ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE"
+    fi
+    echo -n "$ZSH_THEME_SYSTEMD_PROMPT_SUFFIX"
+  done
+}
+