Developer's Guide - Powerlevel9k/powerlevel9k GitHub Wiki

Developers' Guide

Branches

Our stable branch is master, and our development branch is next. The general rule of thumb is that bug fixes can be submitted against master, but that all new development should be submitted to next.

If you are ever uncertain, submitting your PR against next is the safe bet!

Basic Knowledge

Our main entry point are the PROMPT and RPROMPT variables, which are interpreted by zsh itself. All that this (and any other) theme does is filling these two variables with control instructions (like defining colors, etc.) and ready-to-use data. So within this theme we collect a whole bunch of information to put in that variables. You can find PROMPT and RPROMPT at the very end of the powerlevel9k.zsh-theme.

This simple diagram may explain the invoking order better:

# Once on ZSH-Startup
           +-----+
           | Zsh |
           +-----+
              |
              v
+-----------------------------+
| prompt_powerlevel9k_setup() |
+-----------------------------+
              |
              v
    +---------------------+    +------------+  +---------------------+
    | build_left_prompt() |--->| prompt_*() |->| $1_prompt_segment() |
    +---------------------+    +------------+  +---------------------+
               ^                                         |
               |                                         v
 +--------------------------------+                 +---------+     +-----------------+
 | powerlevel9k_prepare_prompts() |                 | $PROMPT |<····| Zsh (Rendering) |
 +--------------------------------+                 +---------+     +-----------------+
                 ^
                 |
              +-----+
              | Zsh | # On every Render
              +-----+
Adding Segments

Feel free to add your own segments. Every segment gets called with an orientation as first parameter (left or right), so we can figure out on which side we should draw the segment. This information is used at the time we call the actual segment-drawing function: $1_prompt_segment. To make the magic color-overwrite mechanism to work, we have to pass our function name as first argument. Usually this is just $0. Second parameter is the array index of the current segment. This is an internal value, to correctly determine if we need to glue segments together. This index is already given as second parameter to your function (from build_left_prompt or build_right_prompt). Third parameter is a default background color, fourth the default foreground color. Fifth parameter is our content. And finally we pass an "visual identifier" (here just a hash; but it could be a unicode codepoint, string, etc.). The visual identifier is, for left segments, displayed at the beginning, for right segments it is displayed at the end. So our function could look somewhat like this:

prompt_echo() {
    local content='Hello World!'
    $1_prompt_segment "$0" "$2" "blue" "red" "$content" "#"
}

At this point we can overwrite our blue-on-red segment by putting

POWERLEVEL9K_ECHO_FOREGROUND="200"
POWERLEVEL9K_ECHO_BACKGROUND="040"

in our ~/.zshrc. We now have a pink-on-green segment. Yay!