Daniel Malea | ac4ce0c | 2013-02-11 17:18:14 +0000 | [diff] [blame^] | 1 | |
| 2 | # Classes responsible for drawing signs in the Vim user interface. |
| 3 | |
| 4 | import vim |
| 5 | |
| 6 | class VimSign(object): |
| 7 | SIGN_TEXT_BREAKPOINT_RESOLVED = "B>" |
| 8 | SIGN_TEXT_BREAKPOINT_UNRESOLVED = "b>" |
| 9 | SIGN_TEXT_PC = "->" |
| 10 | SIGN_HIGHLIGHT_COLOUR_PC = 'darkblue' |
| 11 | |
| 12 | # unique sign id (for ':[sign/highlight] define) |
| 13 | sign_id = 1 |
| 14 | |
| 15 | # unique name id (for ':sign place') |
| 16 | name_id = 1 |
| 17 | |
| 18 | # Map of {(sign_text, highlight_colour) --> sign_name} |
| 19 | defined_signs = {} |
| 20 | |
| 21 | def __init__(self, sign_text, buffer, line_number, highlight_colour=None): |
| 22 | """ Define the sign and highlight (if applicable) and show the sign. """ |
| 23 | |
| 24 | # Get the sign name, either by defining it, or looking it up in the map of defined signs |
| 25 | key = (sign_text, highlight_colour) |
| 26 | if not key in VimSign.defined_signs: |
| 27 | name = self.define(sign_text, highlight_colour) |
| 28 | else: |
| 29 | name = VimSign.defined_signs[key] |
| 30 | |
| 31 | self.show(name, buffer.number, line_number) |
| 32 | pass |
| 33 | |
| 34 | def define(self, sign_text, highlight_colour): |
| 35 | """ Defines sign and highlight (if highlight_colour is not None). """ |
| 36 | sign_name = "sign%d" % VimSign.name_id |
| 37 | if highlight_colour is None: |
| 38 | vim.command("sign define %s text=%s" % (sign_name, sign_text)) |
| 39 | else: |
| 40 | self.highlight_name = "highlight%d" % VimSign.name_id |
| 41 | vim.command("highlight %s ctermbg=%s guibg=%s" % (self.highlight_name, |
| 42 | highlight_colour, |
| 43 | highlight_colour)) |
| 44 | vim.command("sign define %s text=%s linehl=%s texthl=%s" % (sign_name, |
| 45 | sign_text, |
| 46 | self.highlight_name, |
| 47 | self.highlight_name)) |
| 48 | VimSign.defined_signs[(sign_text, highlight_colour)] = sign_name |
| 49 | VimSign.name_id += 1 |
| 50 | return sign_name |
| 51 | |
| 52 | |
| 53 | def show(self, name, buffer_number, line_number): |
| 54 | self.id = VimSign.sign_id |
| 55 | VimSign.sign_id += 1 |
| 56 | vim.command("sign place %d name=%s line=%d buffer=%s" % (self.id, name, line_number, buffer_number)) |
| 57 | pass |
| 58 | |
| 59 | def hide(self): |
| 60 | vim.command("sign unplace %d" % self.id) |
| 61 | pass |
| 62 | |
| 63 | class BreakpointSign(VimSign): |
| 64 | def __init__(self, buffer, line_number, is_resolved): |
| 65 | txt = VimSign.SIGN_TEXT_BREAKPOINT_RESOLVED if is_resolved else VimSign.SIGN_TEXT_BREAKPOINT_UNRESOLVED |
| 66 | super(BreakpointSign, self).__init__(txt, buffer, line_number) |
| 67 | |
| 68 | class PCSign(VimSign): |
| 69 | def __init__(self, buffer, line_number, is_selected_thread): |
| 70 | super(PCSign, self).__init__(VimSign.SIGN_TEXT_PC, |
| 71 | buffer, |
| 72 | line_number, |
| 73 | VimSign.SIGN_HIGHLIGHT_COLOUR_PC if is_selected_thread else None) |