iTerm 2 ZSH colors/themes not showed correctly

I have a clean installed mac, running OS X 10.11.4.
I have installed iTerm 2, and set it up to use oh-my-zsh.

I'm trying to set up a theme for my iTerm. I am trying to use the avit theme.

It's supposed to look like this: enter image description here

But what I get is:

enter image description here

Vim is also hurt by this, i expect:

enter image description here

What I get:

enter image description here

Here's my preferences:

enter image description here

I have played around with the Report Terminal Type, but this is the one working the best, as the others are even more off.

My .zshrc looks like this: http://pastebin.com/ixe72yjP
Note the pastebin says kardan theme, however, it doesn't work with any theme

EDIT
It seems like the colors of iTerm is overwriting the colors defined in the themes. Is this expected behavior?


Solution 1:

There are two layers of settings/themes at work here:

  • The terminal or terminal emulator, in your case iTerm2

    Depending on the terminal only a limited color palette is supported. "Traditionally" there have been 16 colors: 8 Normal and 8 Light/Bright. They are assigned the code 0 to 7 and 8 to 15, respectively. They also have names, with the codes n and n+8 sharing the same name:

    • 0 and 8: black
    • 1 and 9: red
    • 2 and 10: green
    • 3 and 11: yellow
    • 4 and 12: blue
    • 5 and 13: magenta
    • 6 and 14: cyan
    • 7 and 15: white

    While the names are well defined, the exact color values are not and vary greatly even in the default settings for different terminals. (For examples have a look at the Colors section on the Wikipedia page on ANSI escape code). Most terminal emulators allow for these 16 colors to be freely configured by the user (Have a look at the Colors tab in the iTerm preferences).

    Many (if not most) modern terminal emulators support a 256 color palette, which consists of the 16 colors mentioned above, 216 colors on a 6x6x6 RGB color cube and 32 grayscale colors. Aside from the first 16 colors these colors seem to be the same for most terminal emulators (See my answer on a question regarding this on SO for more details).

    There is even growing support for 24bit true color. According to this Gist iTerm2 already supports this in the beta builds. (You can check this with for a in {0..255}; printf "\x1b[48;2;255;${a};0m \x1b[0m". It should print a smooth gradient from red to yellow.)

    In short: A terminal (iTerm2) theme is only color palette which maps indices to true color RGB values. Some terminals (at least on Linux; I do not know about OS X and iTerm2 in particular) actually implement switchable color themes.

  • The shell or application, in your case zsh with oh-my-zsh configuration framework and vim:

    As 24bit true color is not yet widely supported, themes usually set colors by the index number on the terminal palette or even by name. For example

    print -P '%F{yellow}yellow %F{2}green %1Fred %F{117}light blue' 
    

    print -P interprets the string like it would be in the prompt. %F changes the foreground color.

    Although most terminals support 256 colors there are still quite a few themes that only utilize (the first) 16 colors. There are several reasons for that:

    • It will work "everywhere" (older machines, misconfigured terminals).
    • For most terminal emulators, the colors can be easily modified to taste by the user.
    • Some themes may even predate the wide availability of 256-color terminals.

    That is not to say that there are no themes that utilize 256 colors, on the contrary. I just seems that the one you chose is not one of them.

    In short: A terminal (or application) theme can only assign to color codes not true color RGB values. The actual colors depend on the terminal settings. If the color is changed in the terminal, it affects all applications running in it.

So the difference between the screenshots of the expected result and what you actually get is due the difference in the color settings of the terminals. To solve this you can:

  • modify the iTerm2 settings to fit the colors on the screenshots
  • use another theme, which makes only use of the colors 16-256 (which are largely fixed)
  • use true color enabled software (e.g. iTerm2 beta (it may soon be in the release version, if not already) and neovim) and themes (neovim seems to use the GUI settings when true color is enabled). the Gist mentioned above has a list.