import keyinput
from mode import Fundamental
from method import Method

class PipeInsertChr(Method):
    _is_method = False
    args = []
    def __init__(self, i):
        self.name   = "pipe-insert-chr-%s" % i
        self.help   = "Insert chr(%d) into the current pipe." % i
        self.string = chr(i)
    def _execute(self, w, **vargs):
        w.buffer.pipe_write(self.string)

class PipeInsertEsc(PipeInsertChr):
    def __init__(self, i):
        self.name   = "pipe-insert-esc-%s" % i
        self.help   = "Insert ESC + chr(%d) into the current pipe." % i
        self.string = chr(27) + chr(i)

class Pipe(Fundamental):
    name = 'pipe'
    def __init__(self, w):
        Fundamental.__init__(self, w)

        keys = self.bindings.keys()

        # page-up/page-down/goto-start/goto-end, C-x and M-x should still work
        for key in keys:
            if key.startswith('C-x'):
                continue
            if key in ('M-x', 'C-v', 'M-v', 'M-<', 'M->'):
                continue
            del self.bindings[key]

        for i in range(0, 128):
            if i in (22, 24, 27):
                continue
            sym = keyinput.MAP.get(i, chr(i))
            obj = PipeInsertChr(i)
            w.application.methods[obj.name] = obj
            self.add_binding(obj.name, sym)

            if i not in (ord('x'), ord('v'), ord('>'), ord('<')):
                sym2 = 'M-%s' % sym
                obj2 = PipeInsertEsc(i)
                w.application.methods[obj2.name] = obj2
                self.add_binding(obj2.name, sym2)

install = Pipe.install