"you" here is code in Leo's core. It's not mine.  I think the code is 
changing text in the wrapper, w, and then retrieving all the text from the 
wrapper and assigning it to p.b.  It seems a little strange to me too.  I 
will say that I have never had text vanish when I assign it directly to p.b 
so maybe that's the idea here.

With that in mind you could also get p.b and do insertions on it using 
ordinary string methods, then assign it back to p.b:

i = 12  # insertion point
original = p.b
s = 'this is the insert'
tail = original[i:]
head = original[:i]
new = head + s + tail
p.b = new

There's some difference regarding updating between assigning to p.b and 
p.v.b but I forget what it is. It's mentioned somewhere in the docs.  
Edward will probably chime in here with more definitive information.

On Sunday, July 28, 2024 at 9:59:09 AM UTC-4 jkn wrote:

> well ... yes, I have previously just totally **set** the body text (ie. I 
> am creating a totally new node), and as you say this 'sticks'. For this new 
> command, I want to add to any body text which is already there.
>
> But I am puzzled about what seems to be a mixture in this example:
>
> - you get the insertion point and then use w.insert() to write your text 
> to ... the wrapper for the body?? 
> - but then you do p.v.b = w.getAllText() to ... set the body text to ... 
> that which you have just set for the body wrapper?
>
> I am missing something in the paradigm here...
>
>     J^n
>
>
> On Sunday, July 28, 2024 at 2:52:47 PM UTC+1 tbp1...@gmail.com wrote:
>
>> 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/6194b92a-8414-4863-a1a8-2275515633c2n%40googlegroups.com.

Reply via email to