forked from OSchip/llvm-project
74 lines
2.8 KiB
Python
74 lines
2.8 KiB
Python
|
|
# Classes responsible for drawing signs in the Vim user interface.
|
|
|
|
import vim
|
|
|
|
class VimSign(object):
|
|
SIGN_TEXT_BREAKPOINT_RESOLVED = "B>"
|
|
SIGN_TEXT_BREAKPOINT_UNRESOLVED = "b>"
|
|
SIGN_TEXT_PC = "->"
|
|
SIGN_HIGHLIGHT_COLOUR_PC = 'darkblue'
|
|
|
|
# unique sign id (for ':[sign/highlight] define)
|
|
sign_id = 1
|
|
|
|
# unique name id (for ':sign place')
|
|
name_id = 1
|
|
|
|
# Map of {(sign_text, highlight_colour) --> sign_name}
|
|
defined_signs = {}
|
|
|
|
def __init__(self, sign_text, buffer, line_number, highlight_colour=None):
|
|
""" Define the sign and highlight (if applicable) and show the sign. """
|
|
|
|
# Get the sign name, either by defining it, or looking it up in the map of defined signs
|
|
key = (sign_text, highlight_colour)
|
|
if not key in VimSign.defined_signs:
|
|
name = self.define(sign_text, highlight_colour)
|
|
else:
|
|
name = VimSign.defined_signs[key]
|
|
|
|
self.show(name, buffer.number, line_number)
|
|
pass
|
|
|
|
def define(self, sign_text, highlight_colour):
|
|
""" Defines sign and highlight (if highlight_colour is not None). """
|
|
sign_name = "sign%d" % VimSign.name_id
|
|
if highlight_colour is None:
|
|
vim.command("sign define %s text=%s" % (sign_name, sign_text))
|
|
else:
|
|
self.highlight_name = "highlight%d" % VimSign.name_id
|
|
vim.command("highlight %s ctermbg=%s guibg=%s" % (self.highlight_name,
|
|
highlight_colour,
|
|
highlight_colour))
|
|
vim.command("sign define %s text=%s linehl=%s texthl=%s" % (sign_name,
|
|
sign_text,
|
|
self.highlight_name,
|
|
self.highlight_name))
|
|
VimSign.defined_signs[(sign_text, highlight_colour)] = sign_name
|
|
VimSign.name_id += 1
|
|
return sign_name
|
|
|
|
|
|
def show(self, name, buffer_number, line_number):
|
|
self.id = VimSign.sign_id
|
|
VimSign.sign_id += 1
|
|
vim.command("sign place %d name=%s line=%d buffer=%s" % (self.id, name, line_number, buffer_number))
|
|
pass
|
|
|
|
def hide(self):
|
|
vim.command("sign unplace %d" % self.id)
|
|
pass
|
|
|
|
class BreakpointSign(VimSign):
|
|
def __init__(self, buffer, line_number, is_resolved):
|
|
txt = VimSign.SIGN_TEXT_BREAKPOINT_RESOLVED if is_resolved else VimSign.SIGN_TEXT_BREAKPOINT_UNRESOLVED
|
|
super(BreakpointSign, self).__init__(txt, buffer, line_number)
|
|
|
|
class PCSign(VimSign):
|
|
def __init__(self, buffer, line_number, is_selected_thread):
|
|
super(PCSign, self).__init__(VimSign.SIGN_TEXT_PC,
|
|
buffer,
|
|
line_number,
|
|
VimSign.SIGN_HIGHLIGHT_COLOUR_PC if is_selected_thread else None)
|