indeed, I could do "get current body text/append to it /set new body text". 
But I am trying to learn the way that Leo does it, ie. the 'cleanest' way.

On Sunday, July 28, 2024 at 3:18:43 PM UTC+1 tbp1...@gmail.com wrote:

> "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/9ef342b5-37ab-4db6-8e27-5aea9cf6e212n%40googlegroups.com.

Reply via email to