The wrapper, w = c.frame.body.wrapper, is a member of c, not of the body. When you select a node, w gets filled with that node's body text. So you have to transfer that modified text back to the node's body before switching to a new node.
On Sunday, July 28, 2024 at 10:40:49 AM UTC-4 jkn wrote: > 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/fd9aa35b-d031-4c79-8e7a-48947805db42n%40googlegroups.com.