2

我有一个TextViewwith 分配的 non-empty TextBuffer

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

4

1 回答 1

2

如果你有一个TextBuffer 绑定到变量“buf”,你可以很容易地知道光标在哪里。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
于 2014-05-04T12:30:14.947 回答