2

TextView空でない が割り当てられていますTextBuffer

で現在のカーソル位置を取得する方法はTextView? または、現在のTextIterカーソルを取得する方法は?

4

1 に答える 1

2

変数「buf」にバインドされた TextBuffer がある場合、カーソルの場所を簡単に知ることができます。insertmark <- textBufferGetInsert bufカーソル位置を保持する「挿入」マークを取得する便利な方法です。次に、対応する TextIter: が必要ですcursoriter <- textBufferGetIterAtMark buf insertmark

これで、関数textIterGetOffset cursoriterは TextBuffer 内のカーソルの位置を、バッファー内の最初の文字から開始して指定します。textIterGetChar cursoriterMaybe Char を返すと、その位置にある文字がわかります。

詳細については、Graphics.UI.Gtk.Multiline.TextIter モジュールのドキュメントを参照してください。

iter は、バッファが変更されない限り有効であることに注意してください。バッファの内容が変更された場合は、「挿入」マークを介して iter を再度取得する必要があります。

このコード例は、私のマシンでは問題なく動作します (ただし、テキストを挿入または削除した場合ではなく、矢印キーでカーソルを移動した場合にのみ情報が表示されます)。

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 に答える