我有一个 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/