haskell - 如何在gtk2hs中获取TextView中的光标位置?

标签 haskell gtk2hs

我有一个 TextView,并分配了非空 TextBuffer

如何获取TextView中当前光标位置? 或者如何获取光标当前的TextIter

最佳答案

如果您有一个绑定(bind)到变量“buf”的 TextBuffer,您可以轻松知道光标在哪里。 insertmark <- textBufferGetInsert buf是获取“插入”标记的便捷方法,该标记保存光标位置。然后,需要对应的TextIter:cursoriter <- textBufferGetIterAtMark buf insertmark .

现在,函数textIterGetOffset cursoriter将给出 TextBuffer 中光标的位置,从缓冲区中的第一个字符开始。 textIterGetChar cursoriter它返回 Maybe Char,会告诉你该位置有什么字符。

请参阅 Graphics.UI.Gtk.Multiline.TextIter 模块的文档以了解更多信息。

请注意,迭代器仅在缓冲区保持不变时才有效。如果缓冲区内容发生变化,则必须再次通过“插入”标记获取迭代器。

此示例代码在我的机器上运行良好(但它仅在您使用箭头键移动光标时显示信息,而不是在插入或删除文本时显示信息):

module Main where

import Graphics.UI.Gtk

main = do
    initGUI
    w <- windowNew
    windowSetDefaultSize w 640 400
    on w objectDestroy mainQuit
    h <- vBoxNew False 8
    b <- textBufferNew Nothing
    t <- textViewNewWithBuffer b
    l <- labelNew Nothing
    on t moveCursor $ showInfo b l
    boxPackStart h t PackGrow 0
    boxPackStart h l PackNatural 0
    containerAdd w h
    widgetShowAll w
    mainGUI

showInfo b l movementStep steps flag = do
    i <- textBufferGetInsert b >>= textBufferGetIterAtMark b
    p <- textIterGetOffset i
    c <- textIterGetChar i
    let cc = case c of
                Nothing -> ""
                Just ch -> [ch]
        info = "Position: " ++ show p ++ "\nMovement step: " ++ show movementStep ++
            "\nSteps: " ++ show steps ++ "\nExtends selection: " ++ show flag ++
            "\nCharacter at cursor: " ++ cc
    labelSetText l info

关于haskell - 如何在gtk2hs中获取TextView中的光标位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325894/

相关文章:

haskell - Haskell 中惯用的有状态循环

unix - 杀死一个 Haskell 二进制文件

haskell - gtksourceview2 : implement completion provider

haskell - 如何处理 Gtk2Hs 中的应用程序状态

haskell - 小村庄模板中的 $forall 问题

haskell - Hakyll 未更新新路线

haskell - 我们怎么知道应用程序不能是 Monad?

haskell - 是否可以在 gtk2hs 中使用 Glade 创建的菜单?

haskell - gtk2hs:删除小部件后请求重新计算窗口大小

haskell - 在 Gtk2hs 中,为什么 TreeModelIface 函数有时采用 Iter,有时采用 Maybe Iter