You can use this to create a functionality which will fit your need the best.
Here's how you can preview your input cell with c
highlighted Red
.
CellPrint[
NotebookRead @ PreviousCell[] /.
"c" -> InterpretationBox[
StyleBox["c", FontColor -> RGBColor[1, 0, 0]],
c
]
]

You can even evaluate such cell.
General solution
works quite well, based on pallete but you can put it as a shortcut ofc:
(*first evaluate `panel` definition, it is at the bottom for post readability*)
CreatePalette[
Button["CellHighlight",
Module[{cell = Quiet[First@SelectedCells[InputNotebook[]]]},
If[MatchQ[cell, _CellObject],
CreateDialog[panel[cell]],
Print["select the cell first"]]
],
Method -> "Queued",
ImageSize -> (3 CurrentValue["DefaultButtonSize"][[;; , 1]])
]
] /. DownValues[panel]
usage
select cell and click the button on palette:

For cases like yours it you will get fully functional code. For more complex cases, with some scoping structures, I don't know. But looks nice ;)

ToDo
- better pattern for extracting valid symbol names
- additional directives
panel definition
panel[cell_] :=
DynamicModule[{color, rule, highlight, data, content, symbols},
data = NotebookRead@cell;
content = data[[1]];
symbols =
Union@Cases[content,
s_String /;
StringMatchQ[
s, _?LowerCaseQ ~~ LetterCharacter ...], \[Infinity]];
color[_] = RGBColor[0, 0, 0];
Panel@Grid[{{
Grid@Table[
With[{sym = sym},
{Style[sym, FontColor -> Dynamic[color[sym]], 15],
ColorSlider[Dynamic[color[sym]]]}
]
,
{sym, symbols}
]
,
Button["PreviewCell",
CreateDocument@List@ReplacePart[data, 1 -> highlight[content]],
Method -> "Queued",
ImageSize -> CurrentValue["DefaultButtonSize"]]
}}, Alignment -> Top]
,
Initialization :> (
rule[symbol_String] := With[{
name = symbol,
col = color[symbol],
val = RawBoxes[symbol]},
(name ->
ToExpression@
MakeBoxes@
InterpretationBox[StyleBox[name, FontColor -> col], val])];
highlight[data_] := data /. (rule /@ symbols);
)
]