我有一个TextView
with 分配的 non-empty TextBuffer
。
如何获取当前光标位置TextView
?或者如何获取当前TextIter
光标?
如果你有一个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