From ee9b799b45d9015395dcaab3732ca0cc702e8ef1 Mon Sep 17 00:00:00 2001
From: Michael Lazar
Date: Sat, 9 Dec 2017 21:12:49 -0500
Subject: [PATCH] Updating readme for themes
---
README.md | 14 +-
THEMES.md | 228 ++++++++++++++++++++++----------
resources/iterm_preferences.png | Bin 0 -> 113966 bytes
resources/terminal_colors.png | Bin 0 -> 33418 bytes
resources/theme_modifiers.png | Bin 0 -> 56599 bytes
resources/theme_modifiers_2.png | Bin 0 -> 56467 bytes
6 files changed, 161 insertions(+), 81 deletions(-)
create mode 100644 resources/iterm_preferences.png
create mode 100644 resources/terminal_colors.png
create mode 100644 resources/theme_modifiers.png
create mode 100644 resources/theme_modifiers_2.png
diff --git a/README.md b/README.md
index 62d38b0..9daa60c 100644
--- a/README.md
+++ b/README.md
@@ -176,19 +176,9 @@ List installed themes with ``--list-themes`` flag, and select one using ``--them
$ rtv --theme=papercolor
```
-You can also use the F2 & F3 keys to cycle through available themes:
+You can also use the F2 & F3 keys for a live preview of the available themes.
-
-
-
Default
-
-
-
-
Monochrome
-
-
-
Solarized Dark
@@ -211,7 +201,7 @@ You can also use the F2 & F3 keys to cycle through availab
-See [THEMES.md](THEMES.md) for instructions on how to create your own theme.
+For instructions on writing and installing your own themes, see [THEMES.md](THEMES.md).
## FAQ
diff --git a/THEMES.md b/THEMES.md
index aef5db7..aee276c 100644
--- a/THEMES.md
+++ b/THEMES.md
@@ -1,85 +1,65 @@
# Themes
-Different themes can be used to customize the look and feel of RTV.
-They control the color and special attributes (bold, underline, etc.) of
-every text element drawn on the screen.
+## A quick primer on ANSI colors
-## Usage
+Color support on modern terminals can be split into 4 categories:
-Use the ``--theme`` flag to select a theme:
+1. No support for colors
+2. 8 system colors - Black, Red, Green, Yellow, Blue, Magenta,
+ Cyan, and White
+3. 16 system colors - Everything above + bright variations
+4. 256 extended colors - Everything above + 6x6x6 color palette + 24 greyscale colors
-```bash
-$ rtv --theme=papercolor
+
+
+ The 256 terminal color codes, image from
+ https://github.com/eikenb/terminal_colors
+
+
+The 16 system colors, along with the default foreground and background,
+can usually be customized through your terminal's profile settings. The
+6x6x6 color palette and grayscale colors are constant RGB values across
+all terminals. RTV's default theme only uses the 8 primary system colors,
+which is why it matches the "look and feel" of the terminal that you're
+running it in.
+
+
+
+ Setting the system colors in iTerm preferences
+
+
+The curses library determines your terminal's color support by reading your
+environment's ``$TERM`` variable, and looking up your terminal's
+capabilities in the [terminfo](https://linux.die.net/man/5/terminfo)
+database. You can emulate this behavior by using the ``tput`` command:
+
+```
+bash$ export TERM=xterm
+bash$ tput colors
+8
+bash$ export TERM=xterm-256color
+bash$ tput colors
+256
+bash$ export TERM=vt220
+bash$ tput colors
+-1
```
-You can also view a list of built-in and installed themes by using the ``--list-themes`` flag:
+In general you should not be setting your ``$TERM`` variable manually,
+it will be set automatically by you terminal. Often, problems with
+terminal colors can be traced back to somebody hardcoding
+``TERM=xterm-256color`` in their .bashrc file.
-```bash
-$ rtv --list-themes
+## Understanding RTV Themes
-Installed (~/.config/rtv/themes/):
- (empty)
-
-Presets:
- molokai [requires 256 colors]
- papercolor [requires 256 colors]
- solarized-dark [requires 256 colors]
- solarized-light [requires 256 colors]
-
-Built-in:
- default [requires 8 colors]
- monochrome [requires 0 colors]
-```
-
-Custom themes can be installed by copying them into the **{HOME}/.config/rtv/themes/** folder.
-
-The F2 & F3 keys can be used to cycle through themes from within RTV.
-
-## Preview
-
-
-
-
-
Default
- Uses the terminal's preset 16 color palette
-
-
-
-
Monochrome
- Fallback for terminals that don't support colors
-
-
-
-
-
-
Solarized Dark
-
-
-
-
Solarized Light
-
-
-
-
-
-
Papercolor
-
-
-
-
Molokai
-
-
-
-
-
-## Designing a theme
+Here's an example of what an RTV theme file looks like:
```
[theme]
; =
-Normal = default default -
-Selected = - - -
-SelectedCursor = - - reverse
+Normal = default default normal
+Selected = default default normal
+SelectedCursor = default default reverse
TitleBar = cyan - bold+reverse
OrderBar = yellow - bold
@@ -126,3 +106,113 @@ Link = blue - underline
LinkSeen = magenta - underline
UserFlair = yellow - bold
```
+
+Every piece of text drawn on the screen is assigned to an ````,
+which has three properties:
+
+- ````: The text color
+- ````: The background color
+- ````: Additional text attributes, like bold or underlined
+
+### Colors
+
+The ```` and ```` properties can be set to any the following values:
+
+- ``default``, which means use the terminal's default foreground or background color.
+- The 16 system colors:
+
+
+
black
dark_gray
+
red
bright_red
+
green
bright_green
+
yellow
bright_yellow
+
blue
bright_blue
+
magenta
bright_magenta
+
cyan
bright_cyan
+
light_gray
white
+
+
+- ``ansi_{n}``, where n is between 0 and 255. These will map to their
+ corresponding ANSI colors (see the figure above).
+- Hex RGB codes, like ``#0F0F0F``, which will be converted to their nearest
+ ANSI color. This is generally not recommended because the conversion process
+ downscales the color resolution and the resulting colors will look "off".
+
+### Attributes
+
+The ```` property can be set to any of the following values:
+
+- ``normal``, ``bold``, ``underline``, or ``standout``.
+- ``reverse`` will swap the foreground and background colors.
+
+Attributes can be mixed together using the + symbol. For example,
+ ``bold+underline`` will make the text bold and underlined.
+
+### Modifiers
+
+RTV themes use special "modifer" elements to define the default
+application style. This allows you to do things like set the default
+background color without needing to set ```` on every
+single element. The three modifier elements are:
+
+- ``Normal`` - The default modifier that applies to all text elements.
+- ``Selected`` - Applies to text elements that are highlighted on the page.
+- ``SelectedCursor`` - Like ``Selected``, but only applies to ``CursorBlock``
+ and ``CursorBar{n}`` elements.
+
+When an element is marked with a ``-`` token, it means inherit the
+attribute value from the relevant modifier. This is best explained
+through an example:
+
+```
+[theme]
+; =
+Normal = ansi_241 ansi_230 normal
+Selected = ansi_241 ansi_254 normal
+SelectedCursor = ansi_241 ansi_254 bold+reverse
+
+Link = ansi_33 - underline
+```
+
+
+
+ The default solarized-light theme
+
+
+In the snippet above, the ``Link`` element has it's background color set
+to the ``-`` token. This means that it will inherit it's background
+from either the ``Normal`` (light yellow) or the ``Selected`` (light grey)
+element, depending on if it's selected or not.
+
+Compare this to with what happens when the ``Link`` background is explicitly set:
+
+```
+[theme]
+; =
+Normal = ansi_241 ansi_230 normal
+Selected = ansi_241 ansi_254 normal
+SelectedCursor = ansi_241 ansi_254 bold+reverse
+
+Link = ansi_33 ansi_230 underline
+```
+
+
+
+ A modified solarized-light theme, with the Link background set to ansi_230
+
+
+In this case, the ``Link`` background stays ansi_230 (yellow) even the link is
+selected by the cursor.
+
+## Installing Themes
+
+You can install custom themes by copying them into your **~/.config/rtv/themes/**
+directory. The name of the theme will match the name of the file.
+
+```
+$ cp my-custom-theme.cfg ~/.config/rtv/themes/
+$ rtv --theme my-custom-theme
+```
+
+If you've created a cool theme and would like to share it with the community,
+please submit a pull request!
\ No newline at end of file
diff --git a/resources/iterm_preferences.png b/resources/iterm_preferences.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e535853c3d7def648387c9e1e21259ab6c846fd
GIT binary patch
literal 113966
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