gpt4 book ai didi

haskell - 修改插入到 GTK TextBuffer 中的文本

转载 作者:行者123 更新时间:2023-12-03 09:43:19 25 4
gpt4 key购买 nike

我有一个 TextView,我想自动将所有键入、粘贴等文本转换为大写,这可能吗?我尝试添加一个 bufferInsertText 处理程序并自己从那里插入文本,但此错误消息不断弹出:

Gtk-WARNING **: Invalid text buffer iterator: either the iterator
is uninitialized, or the characters/pixbufs/widgets in the buffer
have been modified since the iterator was created.
You must use marks, character numbers, or line numbers to preserve
a position across buffer modifications.
You can apply tags and insert marks without invalidating your
iterators, but any mutation that affects 'indexable' buffer contents
(contents that can be referred to by character offset) will
invalidate all outstanding iterators

最佳答案

首先,让我们从 TextView 获取 TextBuffer:

buffer ← G.get textView textViewBuffer

现在,使用 IORef,我们可以获得我们将连接到的 bufferInsertText 信号的 ID,因为我们稍后需要它:

sigInsertIdRef ← newIORef undefined
sigInsertId ← buffer `on` bufferInsertText $
handler buffer sigInsertIdRef
writeIORef sigInsertIdRef sigInsertId

文本的实际插入发生在 TextBuffer 的默认处理程序中,该处理程序在我们的处理程序之后触发。因此,我们应该在处理程序中执行以下操作:

  • 暂时禁用自定义处理程序(我们可以使用它的ConnectId)。
  • 要求缓冲区插入我们修改后的文本,现在将直接进入默认处理程序。
  • 再次启用自定义处理程序。
  • 阻止原始信号进一步传输链并触发默认处理程序。

下面是执行此操作的代码:

handler :: TextBuffer → IORef → TextIter → String → IO ()
handler buffer sigIdRef iter str = do
sigId ← readIORef sigIdRef
signalBlock sigId
textBufferInsert buffer iter (map toUpper str)
signalUnblock sigId
signalStopEmission buffer "insert-text"

关于haskell - 修改插入到 GTK TextBuffer 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24837844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com