You have a few questions, some explicit and some implicit. I'll try to answer them in order:
What Do These Commands Do?
You're running two commands:
highlight DiffChange cterm=none ctermfg=fg ctermbg=Red gui=none guifg=fg guibg=Red
highlight Normal term=none cterm=none ctermfg=White ctermbg=Black gui=none guifg=White guibg=Black
Both of these commands set the colors of highlight groups. A highlight group is how Vim sets the color (and formatting) of an element of the text or editor. The various variables you're setting (
ctermbg=Red for example) are how you tell Vim what colors and formatting you'd like. The variables that end in
fg set the foreground (text) color, the variables that end in
bg set the background color, and the variables without a suffix (
gui) set the formatting (like
Underline, etc.). You can find the list of formatting options with
In this case you set the color of the
DiffChange group and the
You can get help on these like this:
:h hl-DiffChange and
The DiffChange group tells Vim how to highlight lines that have changed in the diff, while the Normal group sets the color of normal text and the background of the editor.
So putting it together you're telling vim I would like white text on a black background, and when I do a diff, I would like you to keep the text color (the foreground) the same color as it is normally (this is what
fg means, will discuss that in the next section) and change the background to Red.
fg Work Initially?
Vim has a few color names that it knows, like
Black, etc. Some of them (the ones understood by the color terminal) are listed with
NR-16 NR-8 COLOR NAME
0 0 Black
1 4 DarkBlue
2 2 DarkGreen
3 6 DarkCyan
4 1 DarkRed
5 5 DarkMagenta
6 3 Brown, DarkYellow
7 7 LightGray, LightGrey, Gray, Grey
8 0* DarkGray, DarkGrey
9 4* Blue, LightBlue
10 2* Green, LightGreen
11 6* Cyan, LightCyan
12 1* Red, LightRed
13 5* Magenta, LightMagenta
14 3* Yellow, LightYellow
15 7* White
Additionally, there are the 'special'
bg colors that reference the color of the text and the background. Vim gets the colors for these from the normal highlight group. The vim help has this to say about them:
When Vim knows the normal foreground and background colors, "fg" and
"bg" can be used as color names. This only works after setting the
colors for the Normal group and for the MS-DOS console. Example, for
:highlight Visual ctermfg=bg ctermbg=fg
Note that the colors are used that are valid at the moment this
command are given. If the Normal group colors are changed later, the
"fg" and "bg" colors will not be adjusted.
The command that you use,
highlight Normal term=none cterm=none ctermfg=White ctermbg=Black gui=none guifg=White guibg=Black, sets the colors for the Normal group to
Black for the backgrounds of the color terminal (
ctermbg) and GUI (
White for the foregrounds (main text color) for the color terminal (
ctermfg) and the GUI (
guifg). After setting that, Vim knows that
Black, but before it doesn't and so you can't use
Why Is All The Text Bold?
This is likely a problem with your terminal and not with Vim. If Vim thinks your terminal can only display 8 colors, than all text will be bold. You should make sure your
$TERM variable in your terminal is set correctly. The exact way to do this depends on your shell, but if for example you're using bash in xterm, its likely your terminal is reporting
TERM="xterm", when it should be
TERM="xterm-256color" if it supports 256 colors (and it should if its a modern version). Some information on this can be found on the vim wikia.
You can check the number of colors vim thinks it can use with
:set t_Co?. If this reports 8 or lower than that is probably your problem. Fixing
$TERM is the right solution, but a hack is to override
t_Co in your
If you let us know what terminal and shell you're running, I can offer more specific advice.
Is There a Better/Simpler Way?
Setting highlight groups in vim is just messy and ugly. Some people have written plugins or scripts to make it "easier" or "cleaner" (for example EasyColour, or this vimscript function), but whether those are preferable is really a personal decision.