【xyzzy 】リアルタイム検索でかゆい所に手が届く!検索方法を簡単に切替えられるxyzzy lisp

isearch-deco.l

xyzzyに標準装備されている インクリメンタルサーチ機能 isearch.lがあります。 その検索機能を拡張(色付け機能など)しました。

テキストを書くときに、縦横無尽に移動するときに、検索はよく使う手段です。

このプログラムはそんな時に便利になるように、

インタラクティブに素早く検索する方法を多様に用意しました。

 

isearch-deco.lの特徴

kaisya_man-min

すばやく、仕事を処理していると勘違いしているイメージ

isearch機能(リアルタイム検索)を拡張し、複数の検索や操作モードの他、キーワードのカラーリング機能等を付けました。
(emacsやunixの世界ではインクリメンタル検索と良い一文字ごとに検索のフィードバックが帰ってきます)

decoはデコレーションのデコ

デコレーション設定の他に 複数の検索modeを用意してます。検索モードは標準検索、case-fold(大文字小文字区別)、正規表現、曖昧検索、 migemo検索 and検索等があり、isearch中に C-.で切り替えできます。

isearch(インクリメンタルサーチ)とは? 例えば、”keyword”と検索するとします。その時 dの最後まで打ち込んでEnterするのではなく、k, e , y ・・・と1文字打ち込むごとに、インタラクティブに検索し、画面もそれに合わせて再表示される機能です。そのため、途中で状況を確認できたりするので、はっきり覚えてない単語でもファイル内にあるかないか確認しやすく、タイプミスでも長い文字を打つ前に気づくことができます。タイプ中に検索語を広げて入力を省エネすることも可能です(カーソル付近の単語がマッチしていたらその単語になる(C-w))。

Screen Shots

isearch-deco1 isearch-deco2 上図、インクリメンタルサーチに色がついた動作例:左上が現在のカーソルの位置

機能

isearch検索中に、

    • C-. で 検索パターンを 切り替える(順繰り切替 : 正規表現、曖昧検索、コメント検索、行頭検索、migemo(日本語をローマ字のままで検索可能)等 ・・・)
    • 検索語を スペースで区切ると 行内の and/or検索も出来ます(C-.で切り替え)。
    • 検索語生成関数としてisearch-decoをではなく、isearch-decoから好きな関数を設定することができます(*isearch-mode-pattern-func-list*参照)。
    • バッファをまたいで次のバッファも候補に入れることができます。
    • F10 で 検索語をgrep表示&jump(grep dialog 拡張があると多分色がつきます)   occurライクかも
    • バッファ内で検索マッチするの各行を一覧表示[popupちら見機能(C-]) ] ・・・grepよりお気楽に表示する。
    • バッファをまたがなければウインドウをまたいでもキーワードが色づけされます。
    • 検索状況を随時表示する機能(検索数、次のワードの周辺を表示)
    • C-i(ignoreのi)で 色つけを無視したりするのを 切り替える、検索語を検索終了後も色つけたままにする機能(C-eでトグル)など各トグル機能。
    • enter-minibuffer-hook,exit-minibuffer-hook を呼ぶようにした。 (isearch中に imeはoffにして欲しかったので)
    • F1 で 簡単なヘルプを表示[usage表示機能]

参考:mini bufferに入ったとき IME を OFFにするには

migemo検索も使うときは服部さんところを参考に、服部さんところからlispを、本家からdllと辞書をダウンロードしてインストールしておいて下さい。

注意点

    • 検索マッチカレント行は isearch.lの機能なので 標準のxyzzy色つけ設定が影響します。
    • grep検索は grepsetting.l を導入すると色がつくかもしれません。
    • isearch自体は、検索中処理をつかんだまま永久ループして処理してます。普通の操作はいったんisearchを終わらせて行います。
    • あいまい検索とは、isearch-deco上 キーワードのn文字までが過不足または違う文字でも検索対象とする機能です。
    • 正規表現モード等により、popup表示やoccurライクなgrep表示も可能ですが、modeごとのアウトライン表示は こちらをどうぞ

isearch起動中の操作キー

usage(使い方)                      F1

abort(キャンセル)                  C-g
exit(その場で終了)                 RET
delete-char                        Delete

repeat(再サーチ)                   C-r        ←→  C-s
history(検索履歴辿り)              C-p or up  ←→  down or C-n

toggle decoration(色つけON/OFF)    TAB(C-i)
toggle 検索パターン切替            C-.

yank-word                         C-w
(検索キーとしてカーソル位置単語を取り込む) 

検索語grep一覧(occur ライク)       F10
検索ポップアップ                   C-]

導入&設定例

先にisearch.lを読んでおいてからインクリメンタルサーチ機能をONにしておきます。 これ"isearch-deco"は後読みしてください) 以下を.xyzzy に記載すればOKです。 (ためしに *scratch*で評価してみるのも良いかもしれません)

; インクリメンタルサーチ (C-s or C-r)
(load-library "isearch")
(load-library "isearch-deco")

;これ以降はお好きな設定で(例)
(setq *coloring-pattern-min-word-length* 3);1,2文字のときは処理しない(速度改善用)。
(setq *coloring-pattern-hilight-match* '(:bold t :underline t :foreground 0 :background 1))
(setq *isearch-visible-error* nil);default t になっていますが、shake window を使うときに設定してください(自作lispです)。検索失敗すると windowを揺らしてユーザに伝えます。

設定例 詳細版

(load-library "isearch")
(require "migemo");migemoも使うとき
(load-library "isearch-deco")

;装飾や色など
(setq *coloring-pattern-hilight-match* '(:bold t :underline t :foreground 0 :background 1))

;色つけに対してマッチした検索文字列の無視する長さ
(setq *coloring-pattern-min-word-length* 3)

;強調表示する方向を考えるか
(setq *coloring-consider-direction* t)

;max limit of search and decorate match strings.
;ある程度以上マッチしたらいちいち色つけ無い 数
(setq *coloring-number-limit* 20)
;ある程度以上マッチしたらいちいち数えない
(setq *isearch-number-limit* 500)

;色つけ処理しない。
(setq *isearch-deco-ignore* nil)

;色つけ処理しない バッファーサイズ(一定サイズ以上)。
(setq *isearch-deco-ignore-buffer-size* (* 1024 500))

;カーソル(キャレット)の側で検索情報を表示させるか *isearch-deco-ignore* が nil の時作用
(setq *coloring-popup* t)

;isearch-decoで正規表現で検索しない
(setq ed::*isearch-regexp* nil)

;独自検索関数を使いたいときは、検索語を渡すと、検索パターンが返ってくるように関数を作ればOK
;設定は下記参照
(defvar *isearch-mode-pattern-func-list*
(list
;(list "label"  regexp  case convert-func )
(list "normal" nil  nil nil )
(list "case-fold" nil  t nil )
(list "regexp" t nil nil)
(list "ambiguous" t nil 'convert-ambiguous-pattern)
(list "migemo" t nil 'migemo-query);migemo.lインストール後 migemo-offのまま使ってください。
(list "isearch-scanner-hook" t nil nil) ; listの最後はこれ
))

(defvar *ambiguous-size* 2);曖昧度

※ 細かい設定は lisp本文の最初のほうに定義が書かれているのでそこを見てみてください。

検索パターン

参考例として以下の検索パターンを実装しています。

(setq *isearch-mode-pattern-func-list*
(list
;e.g. (list "label"  regexp  case convert-func )
(list "normal" nil  nil nil )
(list "case-fold" nil  t nil )
(list "regexp" t nil nil)
(list "ambiguous" t nil 'convert-ambiguous-pattern);あいまい検索
(list "migemo" t nil 'migemo-query);migemo.lインストール後 migemo-offのまま使ってください。
(list "and search" t nil 'isearch-and-query)
(list "or search" t nil 'isearch-or-query)
(list "top-indent" t nil 'isearch-top-level-query);行頭がスペースでないものだけ対象
(list "oneline-comment" t nil 'isearch-comment-query);1行コメントのみ
(list "isearch-scanner-hook" t nil nil) ; listの最後はこれ
))
;関数は検索語を渡すと、検索パターンが返ってくればOK

ソース

ページの上のタイトルのところにあります。

解析

ざっくり構成

isearch-decoランチ: isearch-repeat-forward/backward (isearch.lの関数) ->isearch-scanner (isearch-decoで置き換えた関数) -> *isearch-mode-pattern-func-list*の関数で検索語生成 -> *isearch-scanner-post-hook*に登録されているcoloring関数で、色付け

関連ページ

競合Lisp達

こんなのがありますので、isearch-deco以外にも合うものを選んでください。 silog - script/igsearch/comment ふかふか tips/検索結果をダイアログボックスで表示する - XyzzyWiki

http://xyzzy.s53.xrea.com/wiki/index.php?tips%2F%B8%A1%BA%F7%B7%EB%B2%CC%A4%F2%A5%C0%A5%A4%A5%A2%A5%ED%A5%B0%A5%DC%A5%C3%A5%AF%A5%B9%A4%C7%C9%BD%BC%A8%A4%B9%A4%EB

isearch 記事

isearch-decoとigsearchの比較 - himadatenodeの日記

履歴

(01/16/2005) level-back 関数追加

(01/12/2005) grep と 連携 (単純に)

(12/31/2004) 速度改善、処理改善,描画ルーチン改善、 処理に一定時間かかったら切り上げる

(12/30/2004) HOME キーで 次の buffer も あやしく 検索対象に(仮) (もしかしたら、iseach-exit , isearch-abort , isearch-delete-char の間違ってた処理が直ったかも)

(12/29/2004) bufferサイズが一定サイズ以上なら 色つけ処理はしないようにした。

(12/28/2004) C-i で 色つけを無視したりするのを 切り替えるようにした。(ignore) C-c で Case fold(大文字/小文字) 切り替えるようにした。 C-a で 正規表現を 切り替えるように C-u で 簡単なヘルプを表示(usage) HOME で 他のbuffer も検索対象に(test中) ; popup stringバグ対応 ; packageミス対応 ; 一文字消去やhistoryの色つけに対応 ; C-gをちょっと変更

Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket

2,831 views.



One thought on “【xyzzy 】リアルタイム検索でかゆい所に手が届く!検索方法を簡単に切替えられるxyzzy lisp

  1. 2013/08/12 at 16:16

    xyzzy のisearchでグラフィカルに

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です