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.