Concurrent Clean + 日本語 : 単語の範囲選択
次は、ここですね。現在のカーソル位置を含む単語の前後の位置を検索するということです。isCorrectCharでは、現在のカーソル位置と同じ種類の文字であるかどうかをチェックする関数を返しています。findWordが、実際に前後の位置を検索しているところなので、これを書き換えることになります。
< EdMovement.icl > selectWordAt :: !Position -> EditMonad .env Selection selectWordAt {col, row} = IF (col == 0) THEN ( result {start={col=0,row=row},end={col=0,row=row}} ) ELSE ( getText >>>= \text -> let col` = col - 1 (line, _) = getLine row text char = line.[col`] isCorrectChar = if (isWordChar char) isWordChar (if (isFunnyChar char) isFunnyChar (if (isWhiteSpace char) isWhiteSpace (otherChar char))) (leftCol, rightCol) = findWord isCorrectChar col` line in result { start = { col = leftCol, row = row } , end = { col = rightCol, row = row } } ) findWord :: (Char -> Bool) ColumnNr String -> (ColumnNr, ColumnNr) findWord isCorrectChar column line = (findLeft column, findRight column) where findLeft column | column < 0 = 0 | isCorrectChar line.[column] = findLeft (column-1) = column + 1 findRight column | column >= size line = size line | isCorrectChar line.[column] = findRight (column+1) = column isWordChar c = isAlpha c || isDigit c || isMember c ['`_'] isFunnyChar c = isMember c ['~@#$%^?!+-*<>\\/|&=:.'] isWhiteSpace c = isMember c [' \t\r\n\f\b'] otherChar c = (==) c