OK, I found a way to do it using TextMarks
. The function I was looking for was textBufferGetIterAtMark
.
textBufferReplaceSelection
∷ TextBufferClass self ⇒ self → String → IO ()
textBufferReplaceSelection buffer text = do
-- Create marks so I can "remember" where the selection was
(startIter, stopIter) <- textBufferGetSelectionBounds buffer
startMark <- textBufferCreateMark buffer (Just "start") startIter False
stopMark <- textBufferCreateMark buffer (Just "stop") stopIter True
-- Delete the currently selected text
textBufferDeleteSelection buffer True True
-- now startIter and stopIter are no longer valid
-- Insert the new text
startIter2 <- textBufferGetIterAtMark buffer startMark
textBufferInsert buffer startIter2 text
-- now startIter2 is no longer valid
-- Select the new text
startIter3 <- textBufferGetIterAtMark buffer startMark
stopIter3 <- textBufferGetIterAtMark buffer stopMark
textBufferSelectRange buffer startIter3 stopIter3