User Tools

Site Tools


command_history

commandline history implemented as a plugin for the python event-manager. Supports simple searching but not saving nor multi-stage-bindings. Possibly more up to date version can be found at git://github.com/keis/uzbl.git branch “history”.

example bindings:

@bind <Up>                 = request HISTORY_PREV
@bind <Down>               = request HISTORY_NEXT
@bind <Ctrl>p              = request HISTORY_PREV
@bind <Ctrl>n              = request HISTORY_NEXT
@bind <Ctrl>r  <search:>_  = request HISTORY_SEARCH %s

the code:

__export__ = ['get_history']
UZBLS = {}

import random

shared_history = []

class History(object):
    def __init__(self):
        self._temporary = []
        self.cursor = None
        self.__temp_tail = False
        self.search_key = None

    def prev(self):
        if self.cursor is None:
            self.cursor = len(self) - 1
        else:
            self.cursor -= 1

        if self.search_key:
            while self.cursor >= 0 and self.search_key not in self[self.cursor]:
                self.cursor -= 1

        if self.cursor < 0 or len(self) == 0:
            self.cursor = -1
            return random.choice(end_messages)

        return self[self.cursor]

    def next(self):
        if self.cursor is None:
            return ''

        self.cursor += 1

        if self.search_key:
            while self.cursor < len(self) and self.search_key not in self[self.cursor]:
                self.cursor += 1

        if self.cursor >= len(shared_history):
            self.cursor = None
            self.search_key = None

            if self._temporary:
                print 'popping temporary'
                return self._temporary.pop()
            return ''

        return self[self.cursor]

    def search(self, key):
        self.search_key = key
        return self.prev()

    def add(self, cmd):
        if self._temporary:
            self._temporary.pop()

        shared_history.append(cmd)
        self.cursor = None
        self.search_key = None

    def add_temporary(self, cmd):
        assert not self._temporary

        self._temporary.append(cmd)
        self.cursor = len(self) - 1

        print 'adding temporary', self

    def __getitem__(self, i):
        if i < len(shared_history):
            return shared_history[i]
        return self._temporary[i-len(shared_history)+1]

    def __len__(self):
        return len(shared_history) + len(self._temporary)

    def __str__(self):
        return "(History %s)" % (self.cursor)

def get_history(uzbl):
    return UZBLS[uzbl]

def add_instance(uzbl, *args):
    UZBLS[uzbl] = History()

def del_instance(uzbl, *args):
    if uzbl in UZBLS:
        del UZBLS[uzbl]

def keycmd_exec(uzbl, keylet):
    history = get_history(uzbl)
    cmd = keylet.get_keycmd()
    if cmd:
        history.add(cmd)

def history_prev(uzbl, _x):
    history = get_history(uzbl)
    cmd = uzbl.get_keylet().get_keycmd()
    if history.cursor is None and cmd:
        history.add_temporary(cmd)

    uzbl.set_keycmd(history.prev())
    print 'PREV', history

def history_next(uzbl, _x):
    history = get_history(uzbl)
    cmd = uzbl.get_keylet().get_keycmd()

    uzbl.set_keycmd(history.next())
    print 'NEXT', history

def history_search(uzbl, key):
    history = get_history(uzbl)
    uzbl.set_keycmd(history.search(key))
    print 'SEARCH', history

end_messages = ('Look behind you, A three-headed monkey!', 'error #4: static from nylon underwear.', 'error #5: static from plastic slide rules.', 'error #6: global warming.', 'error #9: doppler effect.', 'error #16: somebody was calculating pi on the server.', 'error #19: floating point processor overflow.', 'error #21: POSIX compliance problem.', 'error #25: Decreasing electron flux.', 'error #26: first Saturday after first full moon in Winter.', 'error #64: CPU needs recalibration.', 'error #116: the real ttys became pseudo ttys and vice-versa.', 'error #229: wrong polarity of neutron flow.', 'error #330: quantum decoherence.', 'error #388: Bad user karma.', 'error #407: Route flapping at the NAP.', 'error #435: Internet shut down due to maintenance.')

def init(uzbl):
    connects = {'INSTANCE_START': add_instance,
        'INSTANCE_EXIT': del_instance,
        'KEYCMD_EXEC': keycmd_exec,
        'HISTORY_PREV': history_prev,
        'HISTORY_NEXT': history_next,
        'HISTORY_SEARCH': history_search
    }

    uzbl.connect_dict(connects)
command_history.txt · Last modified: 2016/08/31 14:10 (external edit)