123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- # Register a gdb pretty printer for UGrid instances. Usage:
- #
- # - start gdb
- # - run `source contrib/gdb/nvim-gdb-pretty-printers.py`
- # - when a `UGrid` pointer can be evaluated in the current frame, just print
- # it's value normally: `p *grid` (assuming `grid` is the variable name
- # holding the pointer)
- # - highlighting can be activated by setting the NVIM_GDB_HIGHLIGHT_UGRID
- # environment variable(only xterm-compatible terminals supported). This
- # can be done while gdb is running through the python interface:
- # `python os.environ['NVIM_GDB_HIGHLIGHT_UGRID'] = '1'`
- import os
- import gdb
- import gdb.printing
- SGR0 = '\x1b(B\x1b[m'
- def get_color_code(bg, color_num):
- if color_num < 16:
- prefix = 3
- if color_num > 7:
- prefix = 9
- if bg:
- prefix += 1
- color_num %= 8
- else:
- prefix = '48;5;' if bg else '38;5;'
- return '\x1b[{0}{1}m'.format(prefix, color_num)
- def highlight(attrs):
- fg, bg = [int(attrs['foreground']), int(attrs['background'])]
- rv = [SGR0] # start with sgr0
- if fg != -1:
- rv.append(get_color_code(False, fg))
- if bg != -1:
- rv.append(get_color_code(True, bg))
- if bool(attrs['bold']):
- rv.append('\x1b[1m')
- if bool(attrs['italic']):
- rv.append('\x1b[3m')
- if bool(attrs['undercurl']) or bool(attrs['underline']):
- rv.append('\x1b[4m')
- if bool(attrs['reverse']):
- rv.append('\x1b[7m')
- return ''.join(rv)
- class UGridPrinter(object):
- def __init__(self, val):
- self.val = val
- def to_string(self):
- do_hl = (os.getenv('NVIM_GDB_HIGHLIGHT_UGRID') and
- os.getenv('NVIM_GDB_HIGHLIGHT_UGRID') != '0')
- grid = self.val
- height = int(grid['height'])
- width = int(grid['width'])
- delimiter = '-' * (width + 2)
- rows = [delimiter]
- for row in range(height):
- cols = []
- if do_hl:
- cols.append(SGR0)
- curhl = None
- for col in range(width):
- cell = grid['cells'][row][col]
- if do_hl:
- hl = highlight(cell['attrs'])
- if hl != curhl:
- cols.append(hl)
- curhl = hl
- cols.append(cell['data'].string('utf-8'))
- if do_hl:
- cols.append(SGR0)
- rows.append('|' + ''.join(cols) + '|')
- rows.append(delimiter)
- return '\n' + '\n'.join(rows)
- def display_hint(self):
- return 'hint'
- def pretty_printers():
- pp = gdb.printing.RegexpCollectionPrettyPrinter('nvim')
- pp.add_printer('UGrid', '^ugrid$', UGridPrinter)
- return pp
- gdb.printing.register_pretty_printer(gdb, pretty_printers(), replace=True)
|