I think I forgot that the recommended way to do unto/redo has been changed 
since I wrote that script. Also, you can directly set p.b or p.v.b and 
those changes will stick.  Here's one I found in Leo's code base that does 
that and uses the newer undo system:

def insertBodyTime(self: Self, event: LeoKeyEvent = None) -> None:
    """Insert a time/date stamp at the cursor."""
    c, p, u = self, self.p, self.undoer
    w = c.frame.body.wrapper
    undoType = 'Insert Body Time'
    if g.app.batchMode:
        c.notValidInBatchMode(undoType)
        return
    bunch = u.beforeChangeBody(p)
    w.deleteTextSelection()
    s = self.getTime(body=True)
    i = w.getInsertPoint()
    w.insert(i, s)
    p.v.b = w.getAllText()
    u.afterChangeBody(p, undoType, bunch)

On Sunday, July 28, 2024 at 9:17:45 AM UTC-4 jkn wrote:

> Thanks. Hmm, looks like I was wrong about onBodyChanged being outdated - 
> there seem to be hardly any uses in Leo's source, which perhaps misled me.
>
> I removed my undo code from my example... ;-)
>
>     Regards
>     J^n
>
>
> On Sunday, July 28, 2024 at 1:58:07 PM UTC+1 tbp1...@gmail.com wrote:
>
>> Here's one I use and it works fine.  You should set up for undoing after 
>> an insert, and this script does that too:
>>
>> """Insert a node with id and creation timestamp strings"""
>>
>> c.doCommandByName('insert-node')
>> undoType = 'xx-insert-node'
>> p.moveToNext()
>> w = c.frame.body.wrapper
>>
>> oldSel = w.getSelectionRange()
>> w.deleteTextSelection()
>> w.setInsertPoint(0)
>>
>> id_label = f':id: {p.gnx}\n'
>> time_string = ':created: ' + c.getTime(body=True) + '\n'
>> i = w.getInsertPoint()
>> w.insert(i, f'{id_label}{time_string}')
>>
>> c.frame.body.onBodyChanged(undoType, oldSel=oldSel)
>> c.bodyWantsFocusNow()
>>
>> On Sunday, July 28, 2024 at 8:40:32 AM UTC-4 jkn wrote:
>>
>>> I'm being a bit dim here, but:
>>>
>>> I am writing a simple command to append text to the body of a node. The 
>>> only commands I have written before set the entire body text to some value.
>>>
>>> What do I have to call after using w.insert() etc. to make these changes 
>>> persistent.?
>>>
>>> c.redraw() does not seem to do the trick.
>>>
>>> The (outdated?) scripting miscellany: 
>>> https://leo-editor.github.io/leo-editor/scripting-miscellany.html
>>>
>>> suggests that c.frame.body.onBodyChanged should be called; but it looks 
>>> like this is not longer the case.
>>>
>>> A trivial example (that I do not seem to be able to find) would be 
>>> helpful - thanks.
>>>
>>> w = c.frame.body.wrapper
>>> for line in range(10):
>>>     w.appendText("%d\n" % line)
>>>
>>> # now what?
>>>
>>>     J^n
>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to leo-editor+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/leo-editor/060f649f-5a53-4568-97cf-1321cfb145cen%40googlegroups.com.

Reply via email to