印刷
カテゴリ: テキストエディタ作成
参照数: 278

やっと。。。検索まで来た 笑 検索その4からの続き

検索に関しては、単純な検索(文字列比較)と正規表現の二種類用意することにして、

単純な検索は std::search で行う。

正規表現検索は、なんと目的にぴったりのテンプレートライブラリを Nozomu Katoo さんが

公開してくださってるので、それをありがたく利用させてもらうことに。

SRELL〜C++用正規表現テンプレートライブラリ〜C++用正規表現テンプレートライブラリ

 

 で、これらを利用するにあたりテキスト丸ごと走査できるイテレータを作成。

最初の一文字目から最後の行の最終文字まで ++ で移動できるやつ。

行と文字位置を指定すると対応するイテレータを返すようにもしてある。

こうしとくと改行をまたいだ検索もできて良い感じじゃないだろか。

 

使い方は、

	if (m_search.regex){
		// 正規表現検索
		srell::u32regex u32re(m_search.string);
		srell::match_results u32cm;

		editor::CTextEdit::iterator it = m_client->edit->begin();
		editor::CTextEdit::iterator eit = m_client->edit->at(0, m_search.endline);
		while (srell::regex_search(it, eit, u32cm, u32re)){
			srell::match_results::iterator i;
			for (i = u32cm.begin(); i != u32cm.end(); i++){
				search_result_t result;
				result.start.column = i->first.column();
				result.start.line = i->first.line();
				result.end.column = i->second.column();
				result.end.line = i->second.line();
				m_search_result.push_back(result);
				for (editor::bsize_t line = result.start.line; line <= result.end.line; line++){
					update_line(line);
				}
			}
			// 続きを検索
			i--;
			if (it == i->second){
				// 同じ位置を検索なら終了
				break;
			}
			it = i->second;
		}
	} else {
		// 単純検索
		editor::CTextEdit::iterator it = m_client->edit->begin();
		editor::CTextEdit::iterator eit = m_client->edit->at(0, m_search.endline);
		editor::CTextEdit::iterator rit;
		while ((rit = std::search(it, eit, m_search.string.begin(), m_search.string.end())) != eit){
			search_result_t result;
			result.start.column = rit.column();
			result.start.line = rit.line();
			rit = (rit + m_search.string.size());
			result.end.column = rit.column();
			result.end.line = rit.line();
			m_search_result.push_back(result);
			for (editor::bsize_t line = result.start.line; line <= result.end.line; line++){
				update_line(line);
			}
			it = (rit + 1);
		}
	}

 

こんな風。合ってるかな。m_client->edit がテキスト管理クラス。

最初は画面内に収まる分だけ検索するようにしてある。

 

あとは画面表示だけど、これはほとんど選択範囲を表示するのと変わらない。

しっかしまぁなんというか凄い世の中になったなぁ。。と時代を感じつつ。。

 

折角だから記念に実行ファイル置いとこ 笑

テキストエディタ + サンプルテキスト』OSX版。

落とす人はまずいないと思うけど、現状では以下のような状態です。

 

メニュー類は全く動作しないので、ファイルの読み込みはドラッグアンドドロップで行います。

ファイルの保存も編集もできません。眺めることしかできません。エディットできないエディタです。ビューワじゃないか。

スクロールバーも動作しません。画面の移動はカーソルキーもしくはページ移動キーのみ(私の環境だと fn + カーソルキー)。

マウスでの範囲選択はできるけど、それだけです。

検索入力部分に文字列を入れると検索。Enter を押下すると発見した検索位置にカーソルを移動します。

現在は検索文字列の先頭が『/』だった場合、正規表現検索が指定されたとみなします。

通常検索

スクリーンショット 2019 03 28 5.46.02

 

 正規表現検索 

スクリーンショット 2019 03 28 6.51.20