Module: Rvim::Highlights

Defined in:
lib/rvim/highlights.rb

Defined Under Namespace

Classes: Attr

Constant Summary collapse

COLOR_CODES =
{
  'black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33,
  'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'white' => 37,
  'darkblue' => 34, 'darkred' => 31, 'darkgreen' => 32, 'darkyellow' => 33,
  'darkmagenta' => 35, 'darkcyan' => 36, 'darkgray' => 90, 'darkgrey' => 90,
  'gray' => 37, 'grey' => 37, 'lightgray' => 37, 'lightgrey' => 37,
  'default' => 39, 'none' => 39,
}.freeze
DEFAULT_THEME =
{
  'Normal'       => Attr.new,
  'Comment'      => Attr.new(fg: 'cyan'),
  'String'       => Attr.new(fg: 'green'),
  'Number'       => Attr.new(fg: 'red'),
  'Keyword'      => Attr.new(fg: 'magenta'),
  'Constant'     => Attr.new(fg: 'blue'),
  'Identifier'   => Attr.new(fg: 'yellow'),
  'Statement'    => Attr.new(fg: 'magenta'),
  'Type'         => Attr.new(fg: 'blue'),
  'Special'      => Attr.new(fg: 'yellow'),
  'PreProc'      => Attr.new(fg: 'magenta'),
  'Symbol'       => Attr.new(fg: 'yellow'),
  'Title'        => Attr.new(fg: 'magenta', bold: true),
  'Bold'         => Attr.new(bold: true),
  'Italic'       => Attr.new(italic: true),
  'Link'         => Attr.new(fg: 'cyan', underline: true),
  'LineNr'       => Attr.new(fg: 'darkgray'),
  'CursorLineNr' => Attr.new(fg: 'yellow', bold: true),
  'StatusLine'   => Attr.new(reverse: true),
  'Folded'       => Attr.new(fg: 'darkgray'),
  'DiffAdd'      => Attr.new(bg: 'green'),
  'DiffDelete'   => Attr.new(bg: 'red'),
  'DiffChange'   => Attr.new(bg: 'yellow'),
  'DiffText'     => Attr.new(bg: 'red', bold: true),
  'Search'       => Attr.new(reverse: true),
  'IncSearch'    => Attr.new(reverse: true),
  'Visual'       => Attr.new(reverse: true),
  'Error'        => Attr.new(fg: 'red', bold: true),
  'Todo'         => Attr.new(fg: 'yellow', bold: true),
  'NonText'      => Attr.new(fg: 'darkgray'),
  'SpellBad'     => Attr.new(fg: 'red'),
  'ColorColumn'  => Attr.new(bg: 'darkred'),
  'CursorColumn' => Attr.new(bg: 'darkgray'),
}.freeze

Class Method Summary collapse

Class Method Details

.ansi_prefix(name) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/rvim/highlights.rb', line 81

def ansi_prefix(name)
  attr = get(name) or return ''

  parts = +''
  parts << "\e[1m" if attr.bold
  parts << "\e[3m" if attr.italic
  parts << "\e[4m" if attr.underline
  parts << "\e[7m" if attr.reverse
  if attr.fg
    code = COLOR_CODES[attr.fg.to_s.downcase] || 39
    parts << "\e[#{code}m"
  end
  if attr.bg
    fg_code = COLOR_CODES[attr.bg.to_s.downcase] || 49
    # Background = fg_code + 10 for the basic 8/16 set
    bg_code = fg_code >= 90 ? fg_code + 10 : fg_code + 10
    parts << "\e[#{bg_code}m"
  end
  parts
end

.ansi_suffix(name) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/rvim/highlights.rb', line 102

def ansi_suffix(name)
  attr = get(name) or return ''

  parts = +''
  parts << "\e[39m" if attr.fg
  parts << "\e[49m" if attr.bg
  parts << "\e[22m" if attr.bold
  parts << "\e[23m" if attr.italic
  parts << "\e[24m" if attr.underline
  parts << "\e[27m" if attr.reverse
  parts
end

.clear(name) ⇒ Object



73
74
75
# File 'lib/rvim/highlights.rb', line 73

def clear(name)
  groups[name.to_s] = Attr.new
end

.get(name) ⇒ Object



69
70
71
# File 'lib/rvim/highlights.rb', line 69

def get(name)
  groups[name.to_s]
end

.groupsObject



53
54
55
# File 'lib/rvim/highlights.rb', line 53

def groups
  @groups ||= DEFAULT_THEME.transform_values(&:dup)
end

.reset_to_defaults!Object



77
78
79
# File 'lib/rvim/highlights.rb', line 77

def reset_to_defaults!
  @groups = DEFAULT_THEME.transform_values(&:dup)
end

.set(name, fg: nil, bg: nil, bold: nil, italic: nil, underline: nil, reverse: nil) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/rvim/highlights.rb', line 57

def set(name, fg: nil, bg: nil, bold: nil, italic: nil, underline: nil, reverse: nil)
  cur = groups[name] || Attr.new
  groups[name] = Attr.new(
    fg: fg.nil? ? cur.fg : fg,
    bg: bg.nil? ? cur.bg : bg,
    bold: bold.nil? ? cur.bold : bold,
    italic: italic.nil? ? cur.italic : italic,
    underline: underline.nil? ? cur.underline : underline,
    reverse: reverse.nil? ? cur.reverse : reverse,
  )
end

.wrap(name, text) ⇒ Object



115
116
117
# File 'lib/rvim/highlights.rb', line 115

def wrap(name, text)
  "#{ansi_prefix(name)}#{text}#{ansi_suffix(name)}"
end