話題(スレッド): PrevWordStart,PrevWordEndの挙動について

PrevWordStart,PrevWordEndの挙動について (2015-10-21 06:01, INABA, #77048)

はじめまして、

Azukiコントロールを使用して入力補完機能(インテリセンス)っぽい物を試行錯誤しています。

その際に現在入力中の単語(例えばAzukiと打とうとしてAzuまで入力した状態)を認識させる必要があり、DefaultWordProcクラスのPrevWordStart,PrevWordEndメソッドが使えると思い試しているのですが目論見通りの動作になりません。

Case1
ABC|
※|はキャレット

、、と入力した状態で、

Dim DWC As New Sgry.Azuki.DefaultWordProc
Dim wdStart As Integer =DWC.PrevWordStart(Me.AzukiControl1.Document, Me.AzukiControl1.Document.CaretIndex)
Dim wdEnd As Integer = DWC.PrevWordEnd(Me.AzukiControl1.Document, Me.AzukiControl1.Document.CaretIndex)

を実行するとwdStart=3 wdEnd=3

Case2
AB|C
※|はキャレット

、、、の状態で再び実行するとwdStart=0 wdEnd=0、、となります。


Case2はともかくCase1はwdStart=0 wdEnd=2となってほしいのですがPrevWordStart,PrevWordEndの理解、もしくは使い方に間違いがございますでしょうか?

またこのような現在入力中の単語を抽出する方法などございましたら教えていただけますでしょうか?

よろしくお願いします。

メッセージ #77048 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: PrevWordStart,PrevWordEndの挙動について (2015-10-21 22:41, sekibun, #77050)

カーソルのある位置の単語を取得したいのでしたら,次のコードで良いと思います.
Me.AzukiControl1.Document.GetWordAt(Me.AzukiControl1.Document.CaretIndex)

>PrevWordStart,PrevWordEndの理解、もしくは使い方に間違いがございますでしょうか?
うまく説明できないのですが,PrevWordEndとNextWordStartの間の文字列が(ほぼ)現在の位置の単語になります
#77048 への返信

メッセージ #77050 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: PrevWordStart,PrevWordEndの挙動について (2015-10-24 15:13, sgry, #77067)

INABAさん

うーん、ご指摘のDefaultWordProcの動作はメソッド単位で見れば不自然ですね…。DefaultWordProc (IWordProc)自体、キャレット(カーソル)移動先を計算するための実装(インタフェース)なので、現在のAzukiの標準キーバインドでは「一つ前の単語の終端にカーソルを移動」する操作は定義されていません。そのためこのメソッドはテストが甘く、変な動作を起こしているようです。すみません…。

入力中の単語を抽出する、ということ自体はsekibunさんご指摘のDocument.GetWordAtメソッドが良いです。ただし、単語の開始インデックスと終了インデックスも返す方のオーバーロードを利用されると良いと思います。こちらは「Ctrl+マウスクリック」等での単語選択でも使用している処理ですので、正常に動作するはずです。まずはこちらをお試しいただければ幸いです。

To: sekibunさん。ご支援ありがとうございます。

以上、よろしくお願いします。
#77048 への返信

メッセージ #77067 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: PrevWordStart,PrevWordEndの挙動について (2015-10-30 18:30, INABA, #77094)

Sekibunさま、sgryさま、疑問に答えて頂きありがとうございました。

GetWordAtメソッドを使用する事で単語そのものの取得が出来ました。

この件について一点疑問なのですが、ピリオドやコロンで単語が区切られてしまうようです。 

区切りのルール(どの文字を区切りとするか)はどこかで設定可能な項目なのでしょうか?

ご存じでしたら回答頂けると幸いです。

INABA
#77067 への返信

メッセージ #77094 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: PrevWordStart,PrevWordEndの挙動について (2015-11-13 12:59, sgry, #77169)

INABAさん

山本(sgry)です。返信が遅くなり申し訳ありません。

恐縮ですが、GetWordAtメソッドの挙動を細かく制御するのは基本的に不可能です。
内部ではDocument.WordProcのPrevWordStart, NextWordEndを使って単語の範囲を認識しているので、
IWordProcインタフェースを実装した自前のクラスを実装し、Document.WordProcに設定すれば
GetWordAtメソッドの挙動も変更できます。ただ、入力補完のためにこれをやるのは、やりすぎだと思います。

結局のところ、INABAさん自身で補完対象とする単語の範囲を切り出す処理を実装するのが
ベストだと思います。入力補完というモノ自体、何をもって「単語」とするかは
編集中ドキュメントの言語などによって変わるかもしれませんし、そういったことが後で
判明した場合にも対処がしやすいでしょうから。

自前で実装するのが時間等の理由で難しい場合、AzukiのDefaultWordProcのコードを
コピー&カスタマイズして使っていただいても良いかと思います。
Azukiのライセンス的にはソース中の著作権表示を消したり改ざんしなければOKです。
ただし、DefaultWordProcは単語間のキャレット移動を実現するために作った経緯があるため
あまり良い見本ではありません。ここはご注意いただければと思います。

よろしくお願いします。
#77094 への返信

メッセージ #77169 への返信×

ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする