Hello everyone.
In editors that I have used before discovering Leo there were commands
for completing a word with similar word either before or after
insertion point. I could not find those commands in Leo so I have
written them. In case that anybody would like to use them here are
copies of those two nodes.
CUT FROM HERE
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet ekr_test?>
<leo_file>
<leo_header file_format="2"/>
<vnodes>
<v t="vitalije.20081125152732.3"><vh>@command complete-previous</vh>
<v t="vitalije.20081125152732.4"><vh>WordCompleter</vh>
<v t="vitalije.20081125152732.5" a="E"><vh>complete_word</vh>
<v t="vitalije.20081125152732.6"><vh>&lt;&lt;backward search&gt;&gt;</
vh>
<v t="vitalije.20081125154636.1"><vh>&lt;&lt;counter check&gt;&gt;</
vh></v>
<v t="vitalije.20081125152732.7"><vh>&lt;&lt;clean up and
exit&gt;&gt;</vh></v>
</v>
<v t="vitalije.20081125152732.8" a="E"><vh>&lt;&lt;forward
search&gt;&gt;</vh>
<v t="vitalije.20081125154636.1"></v>
<v t="vitalije.20081125152732.7"></v>
</v>
</v>
<v t="vitalije.20081125152732.9"><vh>acceptable_word</vh></v>
<v t="vitalije.20081125152732.10"><vh>undo_replacement</vh></v>
<v t="vitalije.20081125152732.11"><vh>redo_replacement</vh></v>
<v t="vitalije.20081125152732.12"><vh>exit</vh></v>
<v t="vitalije.20081125152732.13"><vh>run</vh></v>
<v t="vitalije.20081125152732.14"><vh>adjust</vh></v>
</v>
<v t="vitalije.20081125152732.15"><vh>getCurrentWord</vh></v>
</v>
</vnodes>
<tnodes>
<t tx="vitalije.20081125152732.3">wordsep = u'., -+\n\r[]{}&lt;&gt;=-
+*&amp;[EMAIL PROTECTED]"\'?/\\|^()~`:;'
word_completer_key = 'back_word_completer'
@others
completer = g.app.config.get(c,word_completer_key,'WordCompleter')
if completer is None:
    completer = WordCompleter(p,c,back=True)
    g.app.config.set(c,word_completer_key,'WordCompleter',completer)
    completer.run()
else:
    completer.adjust(p, c.frame.body.getInsertPoint())
    completer.complete_word()
</t>
<t tx="vitalije.20081125152732.4">class WordCompleter:
    def __init__(self, p, c, back=True):
        self.p = p.copy()
        self.c = c
        self.back = back
        self.pos = -1
    @others
</t>
<t tx="vitalije.20081125152732.5">def complete_word(self):
    txt = self.chunk
    word = self.word
    try:
        if self.back:
            &lt;&lt;backward search&gt;&gt;
        else:
            &lt;&lt;forward search&gt;&gt;
    except:
        self.exit()
        g.es_exception()</t>
<t tx="vitalije.20081125152732.6">p = self.search_pos
start = -1
counter = 0
while p:
    &lt;&lt;counter check&gt;&gt;
    i = txt.rfind(word, 0, start)
    if i == -1:
        p.moveToThreadBack()
        if p:self.chunk = txt = p.bodyString()
        start = -1
    else:
        if self.acceptable_word(i, txt, word):
            self.chunk = txt[:i+len(word)-1]
            return
        start = i+len(word)-1
&lt;&lt;clean up and exit&gt;&gt;</t>
<t tx="vitalije.20081125152732.7">if len(self.tried) &gt; 1:
    # there was some tries so we need to restore
    self.c.setBodyString(self.p, self.before+self.word+self.after)
    self.c.frame.body.setInsertPoint(self.pos)
return self.exit()</t>
<t tx="vitalije.20081125152732.8">p = self.search_pos
start = 0
counter = 0
while p:
    &lt;&lt;counter check&gt;&gt;
    i = txt.find(word, start)
    if i == -1:
        p.moveToThreadNext()
        if p:self.chunk = txt = p.bodyString()
        start = 0
    else:
        if self.acceptable_word(i, txt, word):
            self.chunk = txt[i+1:]
            return
        start = i+1
&lt;&lt;clean up and exit&gt;&gt;</t>
<t tx="vitalije.20081125152732.9">@ if found word for the first time
then try it
@c
def acceptable_word(self, i, txt, word):
    if i == 0 or wordsep.find(txt[i-1]) != -1:
        j = i+len(word)
        while j &lt; len(txt) and wordsep.find(txt[j]) &lt; 0:
            j += 1
        nword = txt[i:j]
        if nword not in self.tried:
            self.tried[nword] = 1
            u = self.c.undoer
            bunch = u.createCommonBunch(p)
            bunch.oldBody = p.bodyString()
            bunch.insertPos = self.pos
            # Set the type &amp; helpers.
            bunch.kind = 'node'
            bunch.undoType = 'complete word'
            bunch.undoHelper = self.undo_replacement
            bunch.redoHelper = self.redo_replacement
            bunch.newBody = newBody = self.before+nword+self.after

            self.c.setBodyString(self.p, newBody)
            self.c.frame.body.setInsertPoint(self.pos)

            bunch.dirtyVnodeList = [p.v]
            bunch.newChanged = u.c.isChanged()
            bunch.newDirty = p.isDirty()
            bunch.newMarked = p.isMarked()

            u.pushBead(bunch)

            return True
    return False
</t>
<t tx="vitalije.20081125152732.10">def undo_replacement(self):
    u = self.c.undoer; c=self.c; p=u.p
    bunch = u.getBead(u.bead)
    c.setBodyString(p, bunch.oldBody)
    c.frame.body.setInsertPoint(bunch.insertPos)</t>
<t tx="vitalije.20081125152732.11">def redo_replacement(self):
    c = self.c; u=c.undoer; bunch=u.getBead(u.bead+1)
    c.setBodyString(bunch.p, bunch.newBody)
    c.frame.body.setInsertPoint(bunch.insertPos)</t>
<t tx="vitalije.20081125152732.12">def exit(self):
    # this was used during experiments
    #g.app.config.set(c,word_completer_key,'WordCompleter',None)
    #g.app.config.set(c,'next_word_completer','WordCompleter',None)
    pass</t>
<t tx="vitalije.20081125152732.13">def run(self):
    self.adjust(self.p, c.frame.body.getInsertPoint())
    self.complete_word()
</t>
<t tx="vitalije.20081125152732.14">def adjust(self, p, pos):
    if p != self.p or pos != self.pos:
        self.p = p.copy()
        self.pos = pos
        bs = p.bodyString()
        word = getCurrentWord(bs, pos)
        self.word = word
        self.before = bs[:pos-len(word)]
        self.after = bs[pos:]
        self.search_pos = p.copy()
        if self.back:
            self.chunk = self.before
        else:
            self.chunk = self.after
        self.tried = {word:1}</t>
<t tx="vitalije.20081125152732.15">def getCurrentWord(s, pos):
    i = pos-1
    while i&gt;0 and wordsep.find(s[i]) &lt; 0:
         i -= 1
    return s[i+1:pos]</t>
<t tx="vitalije.20081125154636.1"># I had troubles with neverending
loop so this is just preventive
counter+=1
if counter &gt; 10000:
    g.es_trace("counter max")
    break</t>
</tnodes>
</leo_file>
CUT TO HERE

and the other one
CUT FROM HERE
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet ekr_test?>
<leo_file>
<leo_header file_format="2"/>
<vnodes>
<v t="vitalije.20081125152732.16"><vh>@command complete-next</vh>
<v t="vitalije.20081125152732.17"><vh>WordCompleter</vh>
<v t="vitalije.20081125152732.18" a="E"><vh>complete_word</vh>
<v t="vitalije.20081125152732.19" a="E"><vh>&lt;&lt;backward
search&gt;&gt;</vh>
<v t="vitalije.20081125152732.20"><vh>&lt;&lt;clean up and
exit&gt;&gt;</vh></v>
</v>
<v t="vitalije.20081125152732.21" a="E"><vh>&lt;&lt;forward
search&gt;&gt;</vh>
<v t="vitalije.20081125152732.20"></v>
</v>
</v>
<v t="vitalije.20081125152732.22"><vh>acceptable_word</vh></v>
<v t="vitalije.20081125152732.23"><vh>undo_replacement</vh></v>
<v t="vitalije.20081125152732.24"><vh>redo_replacement</vh></v>
<v t="vitalije.20081125152732.25"><vh>exit</vh></v>
<v t="vitalije.20081125152732.26"><vh>run</vh></v>
<v t="vitalije.20081125152732.27"><vh>adjust</vh></v>
</v>
<v t="vitalije.20081125152732.28"><vh>getCurrentWord</vh></v>
</v>
</vnodes>
<tnodes>
<t tx="vitalije.20081125152732.16">wordsep = u'., -+\n\r[]{}&lt;&gt;=-
+*&amp;[EMAIL PROTECTED]"\'?/\\|^()~`:;'
word_completer_key = 'next_word_completer'
@others
completer = g.app.config.get(c,word_completer_key,'WordCompleter')
if completer is None:
    completer = WordCompleter(p, c, back=False)
    g.app.config.set(c, word_completer_key, 'WordCompleter',
completer)
    completer.run()
else:
    completer.adjust(p, c.frame.body.getInsertPoint())
    completer.complete_word()

</t>
<t tx="vitalije.20081125152732.17">class WordCompleter:
    def __init__(self, p, c, back=True):
        self.p = p.copy()
        self.c = c
        self.back = back
        self.pos = -1
    @others
</t>
<t tx="vitalije.20081125152732.18">def complete_word(self):
    txt = self.chunk
    word = self.word
    try:
        if self.back:
            &lt;&lt;backward search&gt;&gt;
        else:
            &lt;&lt;forward search&gt;&gt;
    except:
        self.exit()
        g.es_exception()</t>
<t tx="vitalije.20081125152732.19">p = self.search_pos
start = -1
counter = 0
while p:
    counter+=1
    if counter &gt; 10000:
        g.es_trace("counter max")
        break
    i = txt.rfind(word, 0, start)
    if i == -1:
        p.moveToThreadBack()
        if p:self.chunk = txt = p.bodyString()
        start = -1
    else:
        if self.acceptable_word(i, txt, word):
            self.chunk = txt[:i+len(word)-1]
            return
        start = i+len(word)-1
&lt;&lt;clean up and exit&gt;&gt;</t>
<t tx="vitalije.20081125152732.20">if len(self.tried) &gt; 1:
    # there was some tries so we need to restore
    self.c.setBodyString(self.p, self.before+self.word+self.after)
    self.c.frame.body.setInsertPoint(self.pos)
return self.exit()</t>
<t tx="vitalije.20081125152732.21">p = self.search_pos
start = 0
counter = 0
while p:
    counter += 1
    if counter &gt; 10000:
        g.es_trace("counter max")
        break
    i = txt.find(word, start)
    if i == -1:
        p.moveToThreadNext()
        if p:self.chunk = txt = p.bodyString()
        start = 0
    else:
        if self.acceptable_word(i, txt, word):
            self.chunk = txt[i+1:]
            return
        start = i+1
&lt;&lt;clean up and exit&gt;&gt;</t>
<t tx="vitalije.20081125152732.22">@ if found word for the first time
then try it
@c
def acceptable_word(self, i, txt, word):
    if i == 0 or wordsep.find(txt[i-1]) != -1:
        j = i+len(word)
        while j &lt; len(txt) and wordsep.find(txt[j]) &lt; 0:
            j += 1
        nword = txt[i:j]
        if nword not in self.tried:
            self.tried[nword] = 1
            u = self.c.undoer
            bunch = u.createCommonBunch(p)
            bunch.oldBody = p.bodyString()
            bunch.insertPos = self.pos
            # Set the type &amp; helpers.
            bunch.kind = 'node'
            bunch.undoType = 'complete word'
            bunch.undoHelper = self.undo_replacement
            bunch.redoHelper = self.redo_replacement
            bunch.newBody = newBody = self.before+nword+self.after

            self.c.setBodyString(self.p, newBody)
            self.c.frame.body.setInsertPoint(self.pos)

            bunch.dirtyVnodeList = [p.v]
            bunch.newChanged = u.c.isChanged()
            bunch.newDirty = p.isDirty()
            bunch.newMarked = p.isMarked()

            u.pushBead(bunch)

            return True
    return False
</t>
<t tx="vitalije.20081125152732.23">def undo_replacement(self):
    u = self.c.undoer; c=self.c; p=u.p
    bunch = u.getBead(u.bead)
    c.setBodyString(p, bunch.oldBody)
    c.frame.body.setInsertPoint(bunch.insertPos)</t>
<t tx="vitalije.20081125152732.24">def redo_replacement(self):
    c = self.c; u=c.undoer; bunch=u.getBead(u.bead+1)
    c.setBodyString(bunch.p, bunch.newBody)
    c.frame.body.setInsertPoint(bunch.insertPos)</t>
<t tx="vitalije.20081125152732.25">def exit(self):
    #g.app.config.set(c,word_completer_key,'WordCompleter',None)
    #g.app.config.set(c,'next_word_completer','WordCompleter',None)
    pass</t>
<t tx="vitalije.20081125152732.26">def run(self):
    self.adjust(self.p, c.frame.body.getInsertPoint())
    self.complete_word()
</t>
<t tx="vitalije.20081125152732.27">def adjust(self, p, pos):
    if p != self.p or pos != self.pos:
        self.p = p.copy()
        self.pos = pos
        bs = p.bodyString()
        word = getCurrentWord(bs, pos)
        self.word = word
        self.before = bs[:pos-len(word)]
        self.after = bs[pos:]
        self.search_pos = p.copy()
        if self.back:
            self.chunk = self.before
        else:
            self.chunk = self.after
        self.tried = {word:1}</t>
<t tx="vitalije.20081125152732.28">def getCurrentWord(s, pos):
    i = pos-1
    while i&gt;0 and wordsep.find(s[i]) &lt; 0:
         i -= 1
    return s[i+1:pos]</t>
</tnodes>
</leo_file>
CUT TO HERE

I have placed those two nodes in myLeoSettings.leo in @commands node,
and also I have created two shortcuts
Alt-, = command-complete-previous
Alt-. = command-complete-next

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To post to this group, send email to leo-editor@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/leo-editor?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to