188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea# Classes responsible for drawing signs in the Vim user interface. 388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaimport vim 588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaclass VimSign(object): 788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea SIGN_TEXT_BREAKPOINT_RESOLVED = "B>" 888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea SIGN_TEXT_BREAKPOINT_UNRESOLVED = "b>" 988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea SIGN_TEXT_PC = "->" 1088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea SIGN_HIGHLIGHT_COLOUR_PC = 'darkblue' 1188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 1288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea # unique sign id (for ':[sign/highlight] define) 1388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea sign_id = 1 1488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 1588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea # unique name id (for ':sign place') 1688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea name_id = 1 1788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 1888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea # Map of {(sign_text, highlight_colour) --> sign_name} 1988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea defined_signs = {} 2088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 2188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea def __init__(self, sign_text, buffer, line_number, highlight_colour=None): 2288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea """ Define the sign and highlight (if applicable) and show the sign. """ 2388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 2488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea # Get the sign name, either by defining it, or looking it up in the map of defined signs 2588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea key = (sign_text, highlight_colour) 2688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea if not key in VimSign.defined_signs: 2788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea name = self.define(sign_text, highlight_colour) 2888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea else: 2988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea name = VimSign.defined_signs[key] 3088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 3188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea self.show(name, buffer.number, line_number) 3288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea pass 3388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 3488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea def define(self, sign_text, highlight_colour): 3588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea """ Defines sign and highlight (if highlight_colour is not None). """ 3688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea sign_name = "sign%d" % VimSign.name_id 3788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea if highlight_colour is None: 3888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea vim.command("sign define %s text=%s" % (sign_name, sign_text)) 3988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea else: 4088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea self.highlight_name = "highlight%d" % VimSign.name_id 4188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea vim.command("highlight %s ctermbg=%s guibg=%s" % (self.highlight_name, 4288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea highlight_colour, 4388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea highlight_colour)) 4488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea vim.command("sign define %s text=%s linehl=%s texthl=%s" % (sign_name, 4588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea sign_text, 4688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea self.highlight_name, 4788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea self.highlight_name)) 4888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea VimSign.defined_signs[(sign_text, highlight_colour)] = sign_name 4988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea VimSign.name_id += 1 5088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea return sign_name 5188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 5288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 5388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea def show(self, name, buffer_number, line_number): 5488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea self.id = VimSign.sign_id 5588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea VimSign.sign_id += 1 5688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea vim.command("sign place %d name=%s line=%d buffer=%s" % (self.id, name, line_number, buffer_number)) 5788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea pass 5888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 5988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea def hide(self): 6088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea vim.command("sign unplace %d" % self.id) 6188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea pass 6288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 6388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaclass BreakpointSign(VimSign): 6488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea def __init__(self, buffer, line_number, is_resolved): 6588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea txt = VimSign.SIGN_TEXT_BREAKPOINT_RESOLVED if is_resolved else VimSign.SIGN_TEXT_BREAKPOINT_UNRESOLVED 6688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea super(BreakpointSign, self).__init__(txt, buffer, line_number) 6788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea 6888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaclass PCSign(VimSign): 6988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea def __init__(self, buffer, line_number, is_selected_thread): 7088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea super(PCSign, self).__init__(VimSign.SIGN_TEXT_PC, 7188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea buffer, 7288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea line_number, 7388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea VimSign.SIGN_HIGHLIGHT_COLOUR_PC if is_selected_thread else None) 74