その3

プログラミング用のエディタを作るのですが使い慣れた機能は継承したいです。
(オートインデント、Home/Endキーの動作etc.)
その中の「ダブルクリックでキーワード抽出」をやります。


まずセパレータとなる文字を決めて、二つのセパレータ間の部分がキーワードとなります。
VC++式だと


const char* sep = " \t\"'{}();:<>[],.$%&\\|^~!?+-/*=";

まず行のテキストを取得します。
セパレータを見つけたら、その位置を随時記録していきます。
その際に既にキャレット位置を越えていればそのセパレータが終端、記録した最新のセパレータが始端となります。

    bool bFound = false;    // キャレット位置が見付かったらその後のセパレータが終端
    nStart = nPos;          // 行の先頭から出発

    for(int i=0; i<nSize+1; ++i) {
        // キャレット位置に達した(現在調べているのが目標のブツ)
        if (i==nCaret2) {
            bFound = true;
        }
        // セパレータ検索
        if (CStringParser::Find(sep, p[i])!=-1) {
            if (bFound) {
                nEnd = nPos + i;    // 終端
                return ;
            }
            nStart = nPos + i + 1;      // 次からスタート
            continue;
        }
        // 2バイト文字
        if (CStringParser::Is2byte(p[i])) {
            ++i;
            continue;
        }
    }

    // 行の終端がセパレータ
    nEnd = nPos + nSize;


あとは計算した位置をEM_SETSELするだけです。