# Customization
Take a look in the `headline.zsh-theme` file to see all the customization variables (they start [around line 60](../headline.zsh-theme#L60)).
See [Example Configurations](#example-configurations).
## Intro
### Setting variables
You can edit the customization variables in the theme file directly, or set them in your `~/.zshrc` after the theme is sourced.
***Note:** You must source the theme before setting customization variables!*
### Associative arrays
Some variables contain a map of key value pairs. These may be set using syntax `VARIABLE=(key1 value1 key2 value2)`. To update an individual entry instead of the whole array, use syntax `VARIABLE[key]=value`.
### Template
A template string includes the template token (`...` by default) which will be replaced by something else. Templates may contain styles.
### Styles
Here the term "styles" refers to [ANSI SGR codes](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters). These are non-printed sequences that specify colors and formatting, assuming your terminal supports them. The beginning of the file has aliases for common SGR codes, so you can use `$red` instead of `$'\e[31m'`.
These styles must be enclosed by the prompt escape characters `%{` and `%}`. Strings with styles should use double quotes.
So to show "apple" in red for example, we write `"%{$red%}apple"`
## Options
### Separator
**`HL_SEP_STYLE`**
Style applied to entire separator line, after other styles.
**`HL_SEP`**
An associative array with the segments of the separator line.
* `_PRE` - Optional string at start of separator line
* `_LINE` - A character that will be repeated to build the separator line
* `_POST` - Optional string at end of separator line
### Layout
**`HL_BASE_STYLE`**
Style applied to all the segments, before other styles.
**`HL_LAYOUT_STYLE`**
Style of the segment layout template... everything besides segment content.
**`HL_LAYOUT_ORDER`**
An array specifying the order of the segments in the prompt. These segments are `_PRE`, `USER`, `HOST`, `VENV`, `PATH`, `_SPACER`, `BRANCH`, `STATUS`, and `_POST`. For guidance on extending the layout, see [Add Segment](#add-segment) below.
**`HL_LAYOUT_TEMPLATE`**
An associative array with a template for each segment. Segments whose names start with an underscore are special and don't have content.
**`HL_LAYOUT_FIRST`**
An associative array with an optional template to use when a segment is first in the layout, which occurs when preceeding segments are removed during truncation.
**`HL_SPACE_CHAR`**
The character used by the `_SPACER` segment to fill space.
### Content
**`HL_CONTENT_TEMPLATE`**
An associative array with a template for each content segment. These templates each contain a unique style (and perhaps a symbol).
**`HL_CONTENT_SOURCE`**
An associative array with a command to produce content for each segment. Enclose commands in single quotes so they may be eval'd later. If a command produces nothing, the associated segment is removed.
### Git Status
**`HL_GIT_COUNT_MODE`**
Choose how to indicate the count of each status.
* `on` - Always show the count (`[3+|1!|2?]`)
* `auto` - Only show the count when it's greater than one (`[3+|!|2?]`)
* `off` - Never show the count (`[+|!|?]`)
**`HL_GIT_SEP_SYMBOL`**
The symbol used to separate each status.
**`HL_GIT_STATUS_ORDER`**
An array specifying the order of the statuses. These statuses are `STAGED`, `CHANGED`, `UNTRACKED`, `BEHIND`, `AHEAD`, `DIVERGED`, `STASHED`, `CONFLICTS`, and `CLEAN`.
**`HL_GIT_STATUS_SYMBOLS`**
An associative array with a symbol to represent each status.
### Truncation
See [Truncation Procedure](#truncation-procedure).
**`HL_COLS_REMOVAL`**
An associative array with an optional minimum width to show segment. The segment is always removed at smaller console widths, regardless of the truncation order.
**`HL_TRUNC_ORDER`**
An array specifying the order to begin truncating and removing segments. Segments not in this list won't be truncated.
**`HL_TRUNC_SYMBOL`**
The symbol to insert when truncating a segment.
**`HL_TRUNC_INITIAL`**
The minimum segment length for the initial round of truncation. Once all segments are at least this short, the removal round may begin.
**`HL_TRUNC_REMOVAL`**
The minimum segment length for the removal round of truncation. If a segment would be shorter than this it is removed.
### Prompt
**`HL_PROMPT`**
The standard prompt where commands are entered.
**`HL_RPROMPT`**
Optional prompt at the right of the console.
### Clock
**`HL_CLOCK_MODE`**
Show the time in `RPROMPT`.
* `on` - Enable the clock
* `off` - Don't show
**`HL_CLOCK_TEMPLATE`**
The template for the clock.
**`HL_CLOCK_SOURCE`**
The command which produces clock content. Enclose command in single quotes so it may be eval'd later.
***Hint:** The clock shows the time that the prompt was printed. If you want the clock to stay current by re-printing every second, add `TMOUT=1; TRAPALRM () { zle reset-prompt }` to your `~/.zshrc`. Note that this only works properly when `HL_PRINT_MODE` is set to the default value `precmd`.*
### Error
**`HL_ERR_MODE`**
Choose how to show non-zero exit codes.
* `on` - Show non-zero exit code
* `detail` - Show non-zero exit code and a guessed meaning
* `off` - Don't show exit code
**`HL_ERR_TEMPLATE`**
The template for the exit code.
**`HL_ERR_DETAIL_TEMPLATE`**
The template for the optional detail. It will be appended to the error template.
***Hint:** To add or change the messages associated with exit codes, edit the `headline-exit-meaning()` function (it's just a switch statement).*
### Printing
**`HL_PRINT_MODE`**
Choose how to print the output.
* `precmd` - Output is printed in a `precmd` hook
* ***Note:** Some terminals may confuse this for the previous command's output*
* `prompt` - Output is assigned to the `PROMPT` variable
* ***Note:** Zsh doesn't always handle multi-line prompts correctly... expect issues when re-printing*
**`HL_SEP_MODE`**
Choose when to print the separator line.
* `on` - Always print the separator line
* `auto` - Print the separator line unless the screen has just been cleared
* `off` - Never print the separator line
**`HL_INFO_MODE`**
Choose when to print the information line.
* `on` - Always print the information line
* `auto` - Print the information line only if it has changed
* `off` - Never print the information line
**`HL_OVERWRITE`**
Press `` with no commands to overwrite previous prompt.
* `on` - Enable prompt overwrite
* `off` - Re-print as normal
### Other
**`HL_TEMPLATE_TOKEN`**
The string to replace in templates (`...` by default).
## Remove Segment
To remove a segment, delete its name from `HL_LAYOUT_ORDER`. Alternatively, set the segment content command to an empty string `HL_CONTENT_SOURCE[key]=''`.
## Add Segment
Because the segment truncation and removal logic is abstracted, it's *relatively* easy to add a new segment. We just need to update a few arrays.
For example, let's add an `OS` segment that displays the name of the operating system.
```sh
# 1. Specify the content source
HL_CONTENT_SOURCE[OS]='uname'
# 2. Specify the content template
HL_CONTENT_TEMPLATE[OS]="%{$bold$yellow%}..."
# 3. Specify the layout template
HL_LAYOUT_TEMPLATE[OS]='[...]'
# 4. Redefine the layout order to position the new segment
HL_LAYOUT_ORDER=(_PRE USER HOST OS VENV PATH _SPACER BRANCH STATUS _POST)
```
Optionally, we may also configure truncation rules.
```sh
# 5. (Optional) Set a minimum console width before segment is removed
HL_COLS_REMOVAL[OS]=60
# 6. (Optional) Redefine the truncation order to enable truncation for this segment
HL_TRUNC_ORDER=(OS HOST USER VENV PATH BRANCH)
```
Explained in words, the `OS` segment obtains content by running the `uname` command. Then that content is styled bold yellow, wrapped in brackets, and inserted just after the `HOST` segment. If the console width is less than 60, the segment is removed. Additionally, it will be the first segment truncated when there's not enough space.
## Truncation Procedure
Intelligent truncation is a primary feature of Headline. The goal is to show as much content as possible while keeping the information on a single line.
The procedure consists of two rounds, which halt as soon as the information line fits within `COLUMNS`:
1. For each segment in `HL_TRUNC_ORDER`, truncate the segment to the initial length specified by `HL_TRUNC_INITIAL`. This shortens excessively long segments.
1. For each segment in `HL_TRUNC_ORDER`, truncate the segment further. Remove the segment if it's shorter than `HL_TRUNC_REMOVAL`.
To disable truncation, set `HL_TRUNC_ORDER` to an empty array `()`.
>
>
> A demonstration of the truncation procedure with `HL_TRUNC_INITIAL=4` and `HL_TRUNC_REMOVAL=1`
## Example Configurations
### Compact
Hides separator line and removes space between info segments.
Show configuration
```sh
HL_SEP_MODE='off'
HL_LAYOUT_TEMPLATE[HOST]='@...'
HL_LAYOUT_TEMPLATE[VENV]='(...)'
HL_LAYOUT_TEMPLATE[PATH]=':...'
HL_LAYOUT_TEMPLATE[_SPACER]='|'
HL_LAYOUT_TEMPLATE[STATUS]='|...'
HL_TRUNC_SYMBOL='…'
```
### Standard
Shows non-zero exit codes, clock, and git status counts. Personal favorite.
Show configuration
```sh
HL_INFO_MODE='auto'
HL_OVERWRITE='on'
HL_GIT_COUNT_MODE='auto'
HL_GIT_SEP_SYMBOL='|'
HL_CLOCK_MODE='on'
HL_ERR_MODE='detail'
```
### Verbose
Shows non-zero exit codes, full time and date, git status counts, content symbols, and words between segments. Clean branch shows green `✔`, conflicting branch shows red `✘`.
Show configuration
```sh
HL_LAYOUT_TEMPLATE=(
_PRE "${IS_SSH+ssh }" # shows "ssh " if this is an ssh session
USER '...'
HOST ' at ...'
VENV ' with ...'
PATH ' in ...'
_SPACER '' # special, only shows when compact, otherwise fill with space
BRANCH ' on ...'
STATUS ' (...)'
_POST ''
)
HL_CONTENT_TEMPLATE=(
USER "%{$bold$red%} ..."
HOST "%{$bold$yellow%} ..."
VENV "%{$bold$green%} ..."
PATH "%{$bold$blue%} ..."
BRANCH "%{$bold$cyan%} ..."
STATUS "%{$bold$magenta%}..."
)
HL_GIT_COUNT_MODE='on'
HL_GIT_SEP_SYMBOL='|'
HL_GIT_STATUS_SYMBOLS[CONFLICTS]="%{$red%}✘"
HL_GIT_STATUS_SYMBOLS[CLEAN]="%{$green%}✔"
HL_CLOCK_MODE='on'
HL_CLOCK_SOURCE="date +%+"
HL_ERR_MODE='detail'
```
### Fancy
Has almost everything in the verbose config and utilizes `_PRE` and `_POST` segments to further decorate the prompt.
Show configuration
```sh
HL_SEP_MODE='on'
HL_INFO_MODE='auto'
HL_OVERWRITE='on'
HL_SEP=(
_PRE '┍' # consider '┌' or '╭'
_LINE '━' # consider '─'
_POST '┑' # consider '┐' or '╮'
)
HL_LAYOUT_STYLE="%{$light_black%}"
HL_LAYOUT_TEMPLATE=(
_PRE "│${IS_SSH+ %{$reset$faint%\}ssh}" # shows " ssh" if this is an SSH session
USER ' ...'
HOST " %{$reset$faint%}at%{$reset$HL_LAYOUT_STYLE%} ..."
VENV " %{$reset$faint%}with%{$reset$HL_LAYOUT_STYLE%} ..."
PATH " %{$reset$faint%}in%{$reset$HL_LAYOUT_STYLE%} ..."
_SPACER ''
BRANCH " %{$reset$faint%}on%{$reset$HL_LAYOUT_STYLE%} ..."
STATUS ' ...'
_POST ' │'
)
HL_LAYOUT_FIRST=(
HOST ' ...'
VENV ' ...'
PATH ' ...'
_SPACER ' '
BRANCH ' ...'
)
HL_CONTENT_TEMPLATE=(
USER "%{$bold$red%} ..."
HOST "%{$bold$yellow%} ..."
VENV "%{$bold$green%} ..."
PATH "%{$bold$blue%} ..."
BRANCH "%{$bold$cyan%} ..."
STATUS "%{$bold$magenta%}..."
)
HL_GIT_SEP_SYMBOL=''
HL_GIT_STATUS_SYMBOLS[CONFLICTS]="%{$red%}✘"
HL_GIT_STATUS_SYMBOLS[CLEAN]="%{$green%}✔"
HL_PROMPT="%{$HL_LAYOUT_STYLE%}╯ %{$reset%}$ "
HL_CLOCK_MODE='on'
HL_CLOCK_TEMPLATE="%{$faint%} ... %{$reset$HL_LAYOUT_STYLE%}╰"
HL_ERR_MODE='on'
```