aboutsummaryrefslogtreecommitdiffhomepage
path: root/examples/data/plugins/history.py
blob: f42f86f1631fdb7caf703244f91ba2d43f627e6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import random

shared_history = {'':[]}

class History(object):
    def __init__(self, uzbl):
        self.uzbl = uzbl
        self._temporary = []
        self.prompt = ''
        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.prompt]):
            self.cursor = None
            self.search_key = None

            if self._temporary:
                return self._temporary.pop()
            return ''

        return self[self.cursor]

    def change_prompt(self, prompt):
        self.prompt = prompt
        self._temporary = []
        self.__temp_tail = False
        if prompt not in shared_history:
            shared_history[prompt] = []

    def search(self, key):
        self.search_key = key
        self.cursor = None

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

        shared_history[self.prompt].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

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

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

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

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

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

    uzbl.set_keycmd(uzbl.history.prev())
    uzbl.logger.debug('PREV %s' % uzbl.history)

def history_next(uzbl, _x):
    cmd = uzbl.keylet.get_keycmd()

    uzbl.set_keycmd(uzbl.history.next())
    uzbl.logger.debug('NEXT %s' % uzbl.history)

def history_search(uzbl, key):
    uzbl.history.search(key)
    uzbl.send('event HISTORY_PREV')
    uzbl.logger.debug('SEARCH %s %s' % (key, uzbl.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.')

# plugin init hook
def init(uzbl):
    connect_dict(uzbl, {
        'KEYCMD_EXEC': keycmd_exec,
        'HISTORY_PREV': history_prev,
        'HISTORY_NEXT': history_next,
        'HISTORY_SEARCH': history_search
    })

    export_dict(uzbl, {
        'history' : History(uzbl)
    })

# plugin after hook
def after(uzbl):
    uzbl.on_set('keycmd_prompt', lambda uzbl, k, v: uzbl.history.change_prompt(v))

# vi: set et ts=4: