[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
インクリメンタルサーチで現在のバッファを検索することができます.これにより,目的 の場所へ素早く移動することができとても便利です.
しかし,インクリメンタルサーチでは一致箇所を一覧できず,他にどれだけの一致箇所が あるのかは分かりません.
そこで, occur です.M-x occur とすることで,現在のバッファから検索を行い, 検索に一致した行を一覧表示できます.そのため,一致箇所を一目で判断することができ ます.当然,そのバッファでもインクリメンタルサーチができますので,目的の場所へよ り早く移動することができるのです.
また,複数のバッファを対象に検索を行うことができる occur のような機能もあります.
ここでは,この非常に便利な occur やバッファを検索するためのツールを紹介します.
ちなみに,ibuffer にも ibuffer-do-occur という occur が附属しています.それについ ては,ibuffer のところ で紹介していますので,そちらを参照ください.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
occur は現在のバッファから入力された文字を検索し,その一致箇所を一覧表示します.
isearchでバッファから文字を検索できますが,一覧はできずにどこが一致しているかは 見渡せません.
バッファから文字を検索し,その一覧を表示できます.
Meadow の標準機能ですので,そのまままで利用できます.
Meadow の標準機能ですので,そのまままで利用できます.設定も不要です.
M-x occur として実行します.次に検索する文字を入力します.すると,結果が以 下のように表示されます.
251 matches for "検索" in buffer: *w3m* 6:50. バッファの検索― occur (2004/10/21) 9:"MeadowMemo/バッファの検索―occur"へのコメント(無し) 10:検索[](*)全文()Elisp 検索
このように,occur は現在のバッファから入力した文字を検索し,一覧できるのです.ま た,一致箇所は強調して表示されます.
C-u M-x occur とすると,前後数行も含めて表示されます.これにより,どんなと ころが一致したのか分かりやすく便利です.また,C-u 10 M-x occur と指定すると 前後 10 行が表示されます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
occur を使った複数バッファ検索機能を紹介します.
複数バッファを occur で検索できます.
標準機能ですので,そのままで利用できます.
標準機能ですので,インストールや設定は不要です.
M-x multi-occur で起動します.すると,ミニバッファに
First buffer to search: (default *Messages*)
のように表示されます.TAB で補完しながら,検索するバッファを指定します.そ のまま,RET でデフォルト値である現在バッファが検索対象になります.
次に,ミニバッファに
Next buffer to search (RET to end):
と表示されます.そこで,TAB で補完しながら,検索するバッファを指定していき ます.
何も入力せずに,RET を入力すると,バッファの指定が終了になります.
次に,ミニバッファに
List lines matching regexp (default `setq'):
と表示されますので,検索語を入力します.これで,指定したバッファの検索結果がまと めて表示されます.
このようなバッファの指定が面倒な時には,M-x multi-occur-by-filename-regexp が便利です.これを実行すると,ミニバッファに
List lines in buffers whose filename matches regexp:
と表示されます.ここで,例えば,「el」と入力します.次に,ミニバッファに
List lines matching regexp (default `el'):
と表示されますので,検索語を入力します.
すると,ファイル名に「el」を含むバッファを対象に occur による検索が可能になりま す.ただし,ファイルに関連しないバッファは検索対象になりません.また,「auto.+el」 のように正規表現による指定も可能です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
一致した箇所の文字色や出力結果を常に前後数行表示したりするといった occur のカスタ マイズを紹介します.
一致した文字のフェイスは,「 list-matching-lines-face 」で定義されていますので, フェイスの変更方法 を参考に自由に変更できます.
(setq list-matching-lines-face 'region) |
のようにすると,リージョンの色と同じにできます.
C-u 5 M-x occur としなくても,常に前後 5 行の結果を出力したければ
(setq list-matching-lines-default-context-lines 5) |
を .emacs に追加します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
既に occur による検索結果があれば,それを表示し,無ければ occur による検索を実行 できます.
Emacs Wikiから.
通常は occur を起動して,結果から該当箇所へジャンプして編集作業を行います.
すると,occur バッファが奥になってしまい,occur バッファへの切り替えが面倒になり ます.
最初に起動すると,occur による検索を行います.そして,結果バッファが存在する時に, 再度コマンドを実行すると,そのバッファを表示します.
設定していません.
以下を .emacs に追加します.
(defun my-occur (&optional arg) "Switch to *Occur* buffer, or run `occur'. Without a prefix argument, switch to the buffer. With a universal prefix argument, run occur again. With a numeric prefix argument, run occur with NLINES set to that number." (interactive "P") (if (and (not arg) (get-buffer "*Occur*")) (switch-to-buffer "*Occur*") (occur (read-from-minibuffer "Regexp: ") (if (listp arg) 0 arg)))) (global-set-key (kbd " |
M-x my-occur で occur による検索ができます.その後,M-x my-occur とす ると, occur バッファへの切り替えになります.
再度検索したい時には,一度結果バッファを消してから,M-x my-occur とします.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
カーソル付近の単語でoccurを実行
http://pc.2ch.net/test/read.cgi/unix//368
カーソル付近の単語を用いて occur を実行できます.
以下を .emacs に追加します.
(defun occur-at-point() "point のある位置の単語を occur にかける" (interactive) (if (thing-at-point 'word) (occur (thing-at-point 'word)) (call-interactively 'occur))) |
M-x occur-at-point とします.これで,カーソル付近の単語で occur を実行でき ます.カーソル付近に単語がなければ,通常の occur になります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
migemoを利用してローマ字のままで occur による日本語検索ができます.
日本語を検索するためには,漢字変換がありとても面倒です.
migemo を使うと漢字変換しなくてもローマ字のまま検索することができます ( migemo を参照).これを, occur にも利用すると,ローマ字のままバッファ 内の文字を検索できます.
設定していません
以下を .emacs に追加します
(defvar migemo-occur t) (defadvice occur (around migemo-occur activate) (if migemo-occur (setq regexp (migemo-get-pattern regexp)) ()) ad-do-it) |
こうしておくと,いちいち漢字変換せずに検索できるので,非常に便利です.全角英数字 が含まれていても気にしなくていいです.
ただし,正規表現は使用できません.
ただ,これをそのまま適用すると,不都合なこともあります.例えば正規表現を使って occur を呼び出す関数は動きません (texinfo の texinfo-show-structure など) .その ため,挙動が変なものがあれば,
(defadvice texinfo-show-structure (around deactivate-migemo activate) (let ((migemo-occur nil)) ad-do-it)) |
のようにして,その関数では無効にしておく必要があります.
さらに私は
(defvar migemo-occur t) (defadvice occur (around migemo-occur activate) ;; ime を制御するために, read-from-minibuffer の最終引数を変更 ;; ヒストリはカーソルで辿れるので,デフォルトはカーソル付近の単語の方がいい (interactive (list (let* ((default (if (thing-at-point 'word) (thing-at-point 'word) (car regexp-history))) ;;(car regexp-history)) (input (read-from-minibuffer (if default (format "List lines matching regexp (default `%s'): " default) "List lines matching regexp: ") nil nil nil 'regexp-history default nil))) (and (equal input "") default (setq input default)) input) current-prefix-arg)) (if migemo-occur (if nlines ;; 引数があれば migemo は使わない () (if (< 3 (string-width regexp)) (setq regexp (migemo-get-pattern regexp)) ()) ;; 3 文字よりも短かければ migemo は使わない ())) ;; C-u のデフォルト値は 4 なので, C-u M-x occur とすると ;; 前後 4 行も出てしまう (if (and (listp nlines) nlines (= (car nlines) 4)) (setq nlines list-matching-lines-default-context-lines)) ad-do-it) |
のようにしておいて,C-u M-x occur とすると migemo を使わないようにしてい ます.これなら正規表現も使えます.
さらに, IME を使っていると occur 時に IME の状態がそのまま継承されてしまうので, 上のようにして, occur 時には必ず OFF になるようにしています.さらに, occur の デフォルトをカーソル付近に単語があれば,その単語にしています.
最近では,color-moccur による M-x occur-by-moccur を愛 用しています.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
occur の結果で keep-line を行い,結果を絞り込むことができる.
occur はとても便利なのですが,結果が多いと結局全体が見えずによく分かりません.
occur の結果で keep-line や flush-lines を行うことができます.
つまり,occur の結果バッファにおいて,入力した文字に一致した行を含む(あるいは含 まない)行だけを削除することができるのです.
以下を .emacs に追加します.
;;;Occur - Kin Cho |
occur の結果で,F とすると,文字の入力を求められます.そこで,入力すると, その文字を含む行が削除されます(flush-lines が実行される).
同様に,K として,文字を入力すると,その文字を含む行だけが残ります (keep-lines が実行される).
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
occur の結果バッファでカーソルを移動するだけで,別ウィンドウに該当行を表示するこ とができます.
バージョンによってはうまく動作しないことがあります.古い Meadow/Emacs では 動作しません
最近は専ら color-moccur を利用しており,こちらの開発はあまりしていません. このため,Meadow/Emacs のバージョンが上がっていくと,動作しなくなってくる可能性も あります
occur は便利な機能ではあるんですが,検索して該当行へのジャンプしかできず,使い勝 手はあまりよくありません.
と書いていたら,最新の Meadow/Emacs ではカーソル移動に連動して別ウィンドウに該当 行を表示する機能が実装されました(50.1 occurの基本機能 - バッファの検索 (2008/08/13) を参照).
これを使うと, occur バッファでカーソルを移動すると,別ウィンドウにファイルのバッ ファも移動して該当箇所が分かりやすくなります.
スクリーンショット
下が occur のバッファ.上が,このページを w3m で表示しているところです.上下のバッ ファの同じ行に下線が引かれていることが分かりますか? こんな風に occur バッファとファ イルバッファが連動して表示されるので,前後の内容も分かり使いやすくなります.
color-occur.el をダウンロードし, ロードパスの通ったところへ置きます.
以下を .emacs に追加します.
(require 'color-occur) |
普通に M-x occur とすると, 検索に一致した文字に色がつきます.さらに,今カー ソルのある行の該当箇所が別ウィンドウに表示されますので,前後が分かり非常に便利で す.しかも,カーソルを移動するだけで自動的に表示してくれます.
以下,追加したキーバインド
この変数が t の時,*Occur* バッファで q で終了すると,*Occur* バッファをキ ルします.
moccur で紹介する color-moccur を使うとすべてのバッファを occur することができます.
この color-moccur は
(setq moccur-split-word t) |
としてあると,「検索 moccur 」のようにスペースで検索後を区切ると,両方の単語を含 む行のみを一覧できます.
この機能が,普通の文章を検索する時に非常に便利なので, color-moccur の M-x occur-by-moccur を M-x occur のかわりに使ってます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
カーソル以降である単語を含む (含まない) 行を一気に削除できるコマンド
大きなファイルから関数名だけを抜き出したい.データを整理するためにある数字を含む 行だけを抜き出したい.
このように,膨大な行の中からある文字を含む行(あるいは含まない行)だけに絞り込みた い時があります.
しかし,それをインクリメンタルサーチで検索して,削除してを繰り返していては大変面 倒です.
1つのコマンドで簡単に,ある文字を含む行(あるいは含まない行)だけに絞り込むことが できます.
Meadow/Emacs の標準機能なので,そのままで利用できます.
バッファ編集コマンドとして,M-x flush-lines,M-x keep-lines というも のがあります.
M-x flush-lines とすると,カーソル位置以降で検索に一致した文字を含む行を削 除することができます.
逆に,M-x keep-lines とすると,検索に一致した行だけが残り,それ以外の行が 削除されます.
例えば M-x flush-lines ^$ とすると,空行の削除ができるため,便利です.ただ し,カーソル以降が対象なので,バッファ全体の空行を消したければ,M-< として から利用する必要があります.
通常はカーソル移行が対象になりますが,常にバッファ全体を対象にしたければ
(defadvice flush-lines (before beginning-of-buffer-before-flush-lines activate) (beginning-of-buffer)) (defadvice keep-lines (before beginning-of-buffer-before-keep-lines activate) (beginning-of-buffer)) |
と設定しておきます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
すべてのバッファを対象に occur を実施できる.また,lisp だけで grep や grep-find と同等の機能を実現できる.
このページは章毎にファイルを分けて書いています.今では,ファイルが 60 個以上もあ ります.そのため,「確かこれはどこかに書いたはず」と思っても探し出すのはかなり面 倒です.もはや微かな記憶だけを頼りにしていては,探し出すことができません.
そこで, color-moccur を使って全バッファを検索してしまえば,どこにあるかがすぐに 分かります.
最早これがないとこのページを編集できません (-_-;)
color-moccur のデモ を作ってみました.
moccur という Elisp があります.これ は,すべてのバッファを対象に occur をするものです.しかし,普通の occur であるた め,非常に使いにくいものです.
そこで, moccur を改造した color-moccur が便利です.これなら, moccur 同様すべて のバッファを対象に occur ができるだけでなく,使い勝手も非常にいいものになっていま す.
私が moccur をもとにして改造したものなので,バグってるかもしれませんが...しか も、手前味噌だし...
個人的に愛用している理由は以下です.ただし,デフォルトの状態で以下がすべて使える とは限りません.
複数の単語が含まれる行を検索するのにどうしてますか?
grep で正規表現を考えて検索というのが,普通でしょうか.
でも,これがいつも通用するとは限りません.なぜなら,普通の文章でどっちの単語が先 かなんて分かりませんからね.プログラムならどっちの単語が先かはある程度予想できま す.でも,メモでは,複数の単語をどういう順番で書くなんて気にしませんよね.こうい う複数の単語がどういう順番ででてくるか分からない行を検索するというのは,正規表現 では面倒なものです.
でも,color-moccurなら,そんなのは気にする必要はありません.「setq moccur」のよう に,スペースで区切るだけで指定した単語をすべて含む行を検索できます (設定が必要) .順序は関係ありません.これで,「setq」と「moccur」の単語を含む行を検索できるの です.
このため,例えば,「setq moccur-split-word」という行であろうと, 「moccur-buffer-name-exclusion-list を setq で以下のように設定しておくと」なんて メモの行でも一致するわけです.
こういった検索に,いちいち正規表現を作るなんて面倒で私にはやってられません.
検索したいディレクトリというのは限られるものです.
だって,今作っているプログラムやドキュメント,自分の Web サイトのファイルを検索す る機会が当然多いわけですからね.しかも,検索したいファイルは拡張子が el だけなど, 検索したいファイルも限定されるものです.
それなのに,C-x C-f ~/config/meadow/mylisp/*.el M-x moccur とするなんて, 面倒ですね.少なくとも私にはやってられません.
color-moccur なら M-x dmoccur config だけですみます.深いディレクトリのファ イルでもすぐに検索でき便利です(あらかじめディレクトリの設定などは必要です).
検索結果でカーソルを移動したら該当行が別ウィンドウに表示されるのは当然(標準の occur だけではこれさえできないけど).さらに,SPC と b で一致したファ イルのバッファをスクロールもできます.ちょっと前後を確認したいという時に, color-moccur なら C-c C-c C-x o などとしてそのバッファへカーソルを移動する 必要はありません.
日本語を検索する時には, migemo を使うことができるとすごく便利です. color-moccur では migemo を利用した検索が可能です.
しかし,migemo には欠点もあります.それは,正規表現もすべて変換してしまうために, 普通に migemo を使うようにすると,正規表現を使えなくなってしまうのです.
そこで,color-moccur では少し工夫をしてあります.これにより,検索語に正規表現らし き文字を入れると, 正規表現であると判断し,その文字に関しては migemo を使いません. このため,正規表現もそのまま利用できるのです.
当然,正規表現でない検索語は migemo で変換され,英数字の入力で日本語の検索が可能 になります(この辺の判断ルーチンはミスもあるかもしれませんけど)
このサイトの各章には更新日が入っています.情報を新しく保つために,更新日が古いも のを探したいということがあります.例えば,今から1年前の日付けを探したいなどです ね.
従来の検索方法ではこういう場合,その都度,正規表現や検索語を考えなければなりませ ん.
でも,color-moccur では関数を使った検索も可能です.つまり,今から1年前の日付けな どを生成する関数を作っておくことで,簡単にその語を検索できる機能もあるのです.
grep や grep-find はとても便利な機能です.でも,悲しいかな.Windows では,grep や find が利用できるとは限りません.しかも,日本語に対応した grep となると...入っ ていても,複数の文字コードでは検索できないことも多々あります.結果,grep や grep-find がまともに利用できる保証はありません.
でも,color-moccur を使えば,Elispだけで,grep や grep-find のような機能を実現で きるのです.
grep などのコマンドは全く必要ありません. Meadow と color-moccur だけでいいのです. もちろん,日本語も検索できますし, Meadow で開いて表示できるのであれば,どんな文字 コードでも検索できます.
xdoc2txt に対応していますので,xdoc2txt がインストー ルされていれば,Word や Excel,PDF などのファイルも grep のように検索することが できます.
color-moccur は moccur に比べて以下の点で優れています.
似たようなものとして, multi-occur があります.これは, Meadow/Emacs に標準で付属している replace.el に入っています (古いものには入ってい ません).これは, moccur とほぼ同じ機能を持ちますが,検索するバッファ名をいちいち 指定する必要があり,使い勝手は moccur にさえ劣ります(私見ですが...).
自分で言うのも何ですが, color-moccur は moccur よりもずっと使い勝手がいいです.
それでは,以降でインストールや設定を紹介していきます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
複数バッファを検索できる moccur のインストールと使い方
設定済み Meadow には moccur を元にした,color-moccur が入っています.
moccur を より探すか, moccur.el からダウンロードします.
.emacs に以下を追加します.
(load "moccur")
|
実行は M-x moccur とします.すると,ミニバッファに
List lines matching regexp:
と表示されますので,検索語を入力します.すると,結果が表示されます.そして,適当 な候補で C-c C-c とすると,該当行へ飛ぶことができます.
例えばこんな風になります.
Lines matching setq Buffer: color-moccur.elFile: d:/home/mylisp/color-moccur.el 87 ;; a few descriptive words like "setq gnus" hit the 'enter' key. 124 ;; (setq dmoccur-list 162 ;; (setq *moccur-buffer-name-exclusion-list* 165 ;; (setq moccur-split-word t) 166 ;; (setq dmoccur-use-list t)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
color-moccur のインストール方法です.
インストールと設定済みですので,何もしなくても使用できます.
color-moccur.el をダウンロード して,ロードパスの通ったところへ置きます.
以下を .emacs に追加します.
(require 'color-moccur) |
color-moccur では以下のコマンドを実行できます.
それでは,順番に説明していきます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
color-moccurで実行できる検索機能などの基本的な機能を紹介します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
color-moccur による検索の基本的な使い方
起動方法は moccur と同じで,M-x moccur とします.そうすると
Lines matching defcustom Buffer: smiley.elFile: e:/unix/Meadow2/1.99a6/site-lisp/t-gnus/smiley.el 47 (defcustom smiley-data-directory (nnheader-find-etc-directory "smilies") 53 (defcustom smiley-regexp-alist 132 (defcustom gnus-smiley-file-types Buffer: sieve-mode.el File: e:/unix/Meadow2/1.99a6/site-lisp/t-gnus/sieve-mode.el 61 (defcustom sieve-mode-hook nil
という風にファイルバッファを対象に検索結果が表示されます (基本的な画面は moccur と同じです) .
このバッファで カーソルを移動させると,別ウィンドウにはバッファの該当行が表示され ます.
ただし,M-x moccur で検索されるバッファはファイルに関連したバッファのみとな ります.このため,*scratch* バッファなどは検索されません.すべてのバッファを対象 にしたい時には C-u M-x moccur として検索を行います.
M-x moccur で検索した結果で使用できるキーバインドです.
いろいろありますが,細かいことは覚えなくても,上下のカーソルキーでカーソル移動, q で終了,RET で該当行へジャンプぐらいで十分利用できます.
一応,全キーバインドを挙げておきます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
指定したディレクトリを対象に moccur を実行する.
M-x moccur で既に開いているファイルを対象に検索を実行できます.
しかし,
設定ファイルやメモなど,よく検索するディレクトリは決まっているものです.
moccur で検索するために,手動で全部のファイルを開くのも大変ですよね.
使い方は簡単で,dmoccur とします.すると,ディレクトリを尋ねられますので, 入力します.すると,指定したディレクトリ下のファイルを開き,検索してくれます.
さらに,C-u M-x dmoccur とすると,あらかじめ指定しておいたディレクトリのファ イルを検索することができます.このお気に入りにメモなどのディレクトリを設定してお くと,検索するディレクトリの指定を簡単にすることができます (設定方法は 50.5.3.3 dmoccur で指定ディレクトリを検索) .
しかし,これを使用すると,バッファが氾濫してしまいます.そこで,必要に応じて M-x clean-dmoccur-buffers とすると,不要なバッファを簡単に kill できます.
dmoccur は結局は occur なので,ファイルを必ずすべて開きます.また,開くファイルの 拡張子などは固定です.そのため, grep に慣れていると,ちょっと使いにくいかもしれ ません.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
あらかじめ指定しておいたディレクトリのファイルを簡単に検索できます.
よく検索するディレクトリは決まってるのに,毎回ディレクトリを指定するのは面倒なも のです.
あらかじめ指定しておいたディレクトリのファイルを簡単に検索できるようになります.
使うためには変数 dmoccur-list を設定する必要があります.
'( ("dir" "~/" (".*") dir) ) |
例えば
(setq dmoccur-list '( ("dir" default-directory (".*") dir) ("soft" "~/www/soft/" ("\\.texi$") nil) ("config" "~/mylisp/" ("\\.js" "\\.el$") nil) ("1.99" "e:/unix/Meadow2/1.99a6/" (".*") sub) ("node" "~/www/soft/" ("\\.texi$") nil (nil t) "\\(@cha\\|@sec\\)") ("old-node" "~/www/soft/" ("\\.texi$") nil (nil nil) meadowmemo-search-old-node-name) ("test" default-directory (".*") dir nil "set") )) |
のように指定します.指定する必須項目は順番に「名前 デフォルトのディレクトリ 検索 するファイル オプション」になります.さらに,その後に 2 つ設定できる項目がありま すが,これはなくても構いません.
カスタマイズでも設定できます.
dmoccur-list の設定項目を順番に説明していきます.
これは何でもかまいません.補完入力がしやすいよう,英数字で入力しておくと便利です.
好きなディレクトリを指定する.「 default-directory 」にすると,今編集しているファ イルのあるディレクトリになる.
検索したいファイルを正規表現で指定する.ただし,「 dmoccur-exclusion-mask 」で指 定したものは検索されない.「 dmoccur-mask 」の設定は無視されます.あくまで,ここ の設定が優先されます.
普通は nil でいい.
ここを「 dir 」にすると,M-x dmoccur 時と同様にディレクトリを補完入力で指定 できます.デフォルトは先に設定した「デフォルトのディレクトリ」になります.上記の 「 dir 」の例のように設定すると,「M-x dmoccur」と全く同じ動作になります.
「 dir 」を「 sub 」にすると,サブディレクトリ 1 階層に限り指定できます.
これ以降はオプション項目になります.無くても構いません.ただし,付けるのであれば, 2 個セットで設定してください.
(nil t) となっているところ (5 番目の項目) に (nil t) のように設定すると,このお気 に入りに限っては
(setq moccur-use-migemo nil) (setq moccur-split-word t) |
と設定したのと同じことになります.普段は migemo を使いたいが,あるディレクトリだ け migemo を使いたくないという時に指定しておくと便利です.
nil にしておくと,デフォルトの設定を使用します.
最後の項目がデフォルトの検索語になります.定型的な検索の場合にはここに正規表現や 検索語を指定しておくと,毎回入力する必要がなくなります.特に無ければ, nil で構い ません.
また,
(defun my-dmoccur-word () (message "d) ate w) ord") (let ((c (char-to-string (read-char))) (co)) (cond ((string-match "d" c) (format-time-string "%Y/%m/%d")) ((string-match "w" c) (read-from-minibuffer "Input word: ")) (t (message "Illegal char") (sleep-for 1) ;; 再入力をうながす (my-dmoccur-word))))) (setq dmoccur-list '( ("test" default-directory (".*") dir nil my-dmoccur-word) )) |
のように関数を指定することもできます.指定する関数は検索語を返す関数であれば何で も構いません.
これにより,今日の日付けで検索するということも簡単に行うことができます.
C-u M-x dmoccur(dmoccur-use-list が t なら M-x dmoccur) として実行し ます.
すると,ミニバッファに
dmoccur name (default mlisp) :
と表示されますので,ここで指定した名前を入力します.続いて,設定によってディレク トリの指定や検索語の指定となりますので,順番に入力します.
これで,検索が実行できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x occur-by-moccur とします.これで occur と同様,現在のバッファのみを対 象に検索できます.
color-moccur なら該当する行が自動的に表示されますし,他の機能も利用できます.
ちょっと拡張された occur としていかがでしょうか.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
C-s で検索中に,M-o とします.これで,現在検索中の単語で occur-by-moccur を実行できます.
検索語を入力し直す必要がなく,便利です.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x moccur では,開いているバッファが多いと時間がかかってしまいます.
そこで,C-x C-b でバッファリストを出し,m で検索したいバッファに印を つけます.その後,M-x Buffer-menu-moccur とすると,印をつけたバッファのみ を対象に occur を行うことができます.
これなら,検索対象を絞ることができ,検索も短時間で済みます.
dmoccur でディレクトリ以下のファイルを検索できますが,ファイルが多いディレクトリ ではファイルを開くのに時間がかかります.
そこで, dired で指定したファイルのみを検索する dired-do-moccur が便利です.
まず,C-x d で dired を表示し,検索したいファイルに m でマークをつけ ます.そして,M-x dired-do-moccur を実行します.
すると,マークをつけたファイルのみを moccur で検索できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
moccur の結果が表示されたバッファで s とします.これで,検索に一致したバッ ファだけを対象に moccur を実行できます.
また,moccur の結果が表示されたバッファで u とすると,一つ前の条件で moccur を実行できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x grep-buffers で開いているファイルに対して grep を実行できます.
M-x search-buffers とするとバッファの全文検索ができます.スペースで区切って 検索すると,そのすべての単語があったバッファの一覧が表示されます. google には遠 く及びませんが,あんな風に簡単な要約も出ます.
例えばこんな風に...
Search interactive Buffer: color-moccur.el File: d:/akihisa/mylisp/plisp/color-moccur.el within `current-buffer'." (interactive) (let ((case-fold-search is ... Buffer: pukiwiki-mode.el File: d:/akihisa/mylisp/plisp/pukiwiki-mode.el n pukiwiki-mode-version () (interactive) (message (format "pukiwiki ... |
この結果バッファで RET とすると,そのバッファに対して occur-by-moccur を実 行します.
つまり,指定した単語が含まれるバッファを絞りこみ,そのバッファに対してさらにその 単語で検索ができるわけです.
M-x search-buffers でファイルのバッファ,C-u M-x search-buffers です べてのバッファが対象です.この機能は半分はお遊びなので,実用性は求めないように.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
moccur を grep の代替として使うことで Cygwin が無い環境でも grep や grep-find を 利用できます.もちろん,日本語も検索できます.
Cygwin を入れれば,様々な grep コマンドを便利に利用できます.しかし, Cygwin を入れ ることができない場合もあります.そんな場合に moccur-grep を使えば, grep の代替と して利用できます.
また,ファイル名が日本語でも Emacs で開くことのできるファイルであれば,問題なく検 索できます.
grep や grep-find と同じようなことができます.
つまり,ファイルを対象に検索を実行できます (find-file でファイルを開かないので, バッファは作成しません).find-file でファイルを開くことをしないので,dmoccur より もはやく検索できますし,バッファが氾濫することもありません.
また,サブディレクトリのファイルまで検索させることもできます.
M-x moccur-grep とすると起動できます.そうすると,ミニバッファに
Directory: d:/home/
と表示されます.ここで,ディレクトリを指定します.次にミニバッファに
Input Regexp and FileMask:
と表示されます.ここでは,正規表現とファイルマスクを入力します.例えば
Input Regexp and FileMask: [0-9]+ .
のように入力します.
スペース区切りで,一番最後に書いた正規表現をファイルマスクと認識します.この場合 であれば,「.」の正規表現に一致する文字を含むファイル(つまりすべてのファイル)を対 象に,[0-9]+ という正規表現で検索するということになります.
普通の grep と違い,ファイルマスクが普通の正規表現であることに注意してください.
特にファイルマスクを指定しなければ,全ファイルが対象になります.
例えば
Input Regexp and FileMask: [0-9]+ el$
とすると,ファイル名が el で終わるファイルのみが検索対象になります.
同じように,M-x moccur-grep-find でサブディレクトリのファイルも対象に含めて 検索を実行できます.
ファイルが多くて時間がかかる時には C-g で途中で中断できます.中断時点での 結果も表示されますので,それを参考に絞り込むといいでしょう.
検索には moccur で用いている関数をそのまま利用しています。
そのため、後で紹介する拡張機能による検索も利用できます.例えば,migemo による検索 (moccur-use-migemo) やスペース区切りの単語による検索(moccur-split-word) なども可 能です。
もちろん,Meadow/Emacs が認識できる文字コードであれば,どんな文字コードのファイ ルであっても検索できます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
さて,基本的な機能は紹介しましたので,次は拡張機能やカスタマイズについて紹介しま しょう.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
設定済み Meadow では以下のような設定で使っています. とりあえず一例ということで.
(setq moccur-split-word t) (setq moccur-use-migemo t) (setq color-moccur-default-ime-status nil) (autoload 'moccur-grep "color-moccur" nil t) (autoload 'moccur-grep-find "color-moccur" nil t) (autoload 'isearch-moccur "color-moccur" nil t) (autoload 'isearch-moccur-all "color-moccur" nil t) (autoload 'occur-by-moccur "color-moccur" nil t) (autoload 'moccur "color-moccur" nil t) (autoload 'dmoccur "color-moccur" nil t) (autoload 'dired-do-moccur "color-moccur" nil t) (autoload 'Buffer-menu-moccur "color-moccur" nil t) (autoload 'moccur-narrow-down "color-moccur" nil t) (autoload 'grep-buffers "color-moccur" nil t) (autoload 'search-buffers "color-moccur" nil t) (autoload 'gresreg "gresreg" nil t) (eval-after-load "color-moccur" '(require 'moccur-edit)) (eval-after-load "ibuffer" '(require 'color-moccur)) (setq *moccur-buffer-name-exclusion-list* '(".+TAGS.+" "*Completions*" "*Messages*" "newsrc.eld" " *migemo*" ".bbdb")) (add-hook 'dired-mode-hook '(lambda () (local-set-key "O" 'dired-do-moccur))) (define-key Buffer-menu-mode-map "O" 'Buffer-menu-moccur) ;;(global-set-key "\M-f" 'grep-buffers) (global-set-key "\M-o" 'occur-by-moccur) (global-set-key "\C-c\C-x\C-o" 'moccur) ;;(global-set-key "\C-c\C-o" 'search-buffers) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
設定できる項目を以下で説明します.
ただし, moccur での検索を行った場合には以前の結果バッファはこの変数の値に関わらず 消えます.
ただし,完全一致でなければなりません.このため,"el"を指定しても駄目です. ".+el"のように指定する必要があります.
デフォルトは「 '("[^ ].*")」となってます.つまりスペースで始まるバッファは検索し ないようになってます.
t にすると migemo を利用して検索ができます.Meadow で migemo が利用できるようになっ ていれば,例えば「 setumei 」で「説明」を検索できるようになります.
ただし,「.+ 」のような正規表現があると,そのまま正規表現として認識します.この ため,「 setumei. 」のように「句読点」を含む場合, migemo は使われません.
t にすると,複数の検索語を指定できます.
例えば,
(defun news-agent (status) (news-agent 'online)
という文があって,「 agent 」で検索すると,両方とも引っかかります.これが,今まで の検索方法です.
この方法では, defun の方だけを検索しようとすると,「 defun.+agent 」などと正規表 現を用いる必要があります.これは非常に面倒ですし,普通の文章のように,どちらの単 語が先に来るか分からないような場合には検索できません.
例えば,「news-agent の前に defun がありますね.このようにすることで関数を定義し ているのです」という文章は「 defun.+agent 」では検索できません.
しかし, moccur-split-word が t なら「 defun agent 」という風にスペースで区切るだ けで,「 defun 」と「 agent 」の両方がある行を検索できます.この例なら, 「 (defun news-agent (status) 」だけが一致します.
確か,関数でこんな文字を含んでいたはずなんだけど,,,といった曖昧な記憶を頼りに 検索する時に非常に役立ちます(もちろん正規表現でやってもいいですが,,,).
ついでに,これが t になっていると,「 b:バッファ名」で検索するバッファを絞り込む ことができます.例えば,「 b:gnus 」とするとバッファ名に「 gnus 」を含むバッファ のみが検索対象になります(詳しくは50.5.4.3 コメントだけを検索 (2007/12/19)で紹介します).
ちなみに,単語をスペースで区切る時に,正規表現として正しいか確認を行っています. このため「 [a-z ]+ 」のようにスペースを含む正規表現でも正しく検索できます.ただし, 正規表現中にスペースが 2 個以上連続しても 1 個とみなされますので注意ください.
nil だと,検索する時にミニバッファへカーソルが移動した時に, IME をオフにする.t なら,何もしない.
migemo を使うのであれば, IME を使う必要はないので, nil にすると便利です.
t だと,検索結果をeeを使って表示できる.
これにより,
+ Buffer: admini.texiFile: d:/akihisa/www/soft/admini.texi - Buffer: basic_know.texiFile: d:/akihisa/www/soft/basic_know.texi 53 ミニバッファはファイルを開く時,文字を検索する時などにユーザの入力を 184 C-s:文字列を下方向に検索する (ただし日本語を検索するには工夫が必要). 187 C-r:文字列を上方向に検索する (ただし日本語を検索するには工夫が必要). + Buffer: buf-list.texiFile: d:/akihisa/www/soft/buf-list.texi
のように不要な部分を閉じて表示できる.ただし,検索結果が多い場合には, ee を使う と激遅になります.
また, allout を使っていると, moccur-use-ee を t にしても表示は変わりません. allout は outline の関数を書き換えてしまうため,動作不良になるためです.
デフォルトは 500 .
moccur の結果バッファには色が付きます.この色は moccur-maximum-displayed-with-color で設定した数に達すると,それ以降は色がつかな くなります.つまり,デフォルトであれば,色がつくのは 500 箇所までです.
検索結果が多い場合に,無制限に色付けを行うと遅くなるため,ある程度で制限しておく のがお勧めです.
nil で無制限になります.お勧めはしませんけど....
デフォルトは t .
moccur の結果バッファで RET で飛ぶと結果バッファ(*moccur*バッファ)を kill します. nil なら,kill せずに残したままにします.
デフォルトは nil .
t ならキーワードによる検索を行うことができる.例えば,「 url 」で 「 https://bookshelf.jp/soft/meadow.html 」に一致などが可能になる.
moccur-use-keyword が t の時に展開するリスト.
例えば,url で http で始まる URL らしき文字を検索するなどが,あらかじめ指定して おくことで,その都度正規表現を考えなくても検索できるようになります.
デフォルトは
(defcustom moccur-search-keyword-alist '(("url" . "[fht]*ttp://[-_.!~*'() a-zA-Z0-9;/?:@&=+$,%#]+") ("mail" . "[^][<>@ \n]+@[-_.!~*'() a-zA-Z0-9?@&=+$,%#]+")) "*Alist of KEYWORD and REGEXP." |
キーワードと正規表現とのリスト.デフォルトは url と mail でそれぞれ URL ,メール アドレスに一致させることができる.
t なら,dired から moccur を起動して,moccur の結果バッファを終了した時,開いた バッファを閉じます.
並び順を変えたい時はこの関数を参考に関数を作って指定してください.
xdoc2txt がインストールされていて,この変数が t なら Word などのファイルも moccur-grep(-find) で検索できます.
moccur-grep(-find) で検索した時に該当するバッファを別ウィンドウに表示するかどう かを制御できます.nil なら表示しません.
t であれば,カーソル付近の単語をデフォルトの検索語とします.
50.5.4.3 コメントだけを検索 (2007/12/19) 50.5.4.4 dmoccur をカスタマイズ (2007/12/19) 50.5.4.5 moccur-grep をカスタマイズ (2010/05/06) 50.5.4.6 その他のカスタマイズ (2005/02/18)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
コメントや関数名だけを検索することで絞り込むことができます.
color-moccur は多くのバッファを検索します.そのため,どうしても一致箇所が多くなり, そこから一致して欲しかった部分を探すのが面倒になります.
例えば,コメントだけを探したい時には,コメント以外の部分を読み飛ばさなくてはなり ません.
color-moccur では
(setq moccur-split-word t) |
の設定があれば,複数の検索語を指定できます.
この時 1 番目の検索語に特別な意味を持たせることができます.
例えば,「; setq 」で検索すると,その部分がコメントどうかを確認させることができる のです.
以下を .emacs に追加します.
(setq moccur-split-word t) |
普通に moccur や dmoccur を利用するだけです.
その時,検索語の 1 語目に「"」「! 」「;」を指定すると,それぞれ,「文字列」「関数 名」「コメント」のみを対象に検索できます.
条件を追加するためには, Emacs lisp の知識が必要です.
まず, moccur の検索と条件の確認は以下のような順序で実行されます.
検索する前の準備のために,初期化関数を実行します.
「" moccur 」なら font-lock で強制的に色を付けさせています.
ヘッダなど余計な部分を読み飛ばすようにすることもできます.
実際に検索します.一致すると,カーソルは検索に一致した単語の後に移動します. moccur-split-word が t の時には,一番最後の単語の後に移動します.
つまり,
(defun moccur-search (regexp arg buffers)
を「 search moccur arg 」で検索すると,カーソルは arg の後に移動します.「 moccur 」な らば,カーソルは「-」の部分に移動します.
ここで,条件に合うかどうかを確認するために,確認用の関数を実行します.
「" moccur 」ならば,カーソルの 1 個前の文字がコメントのフェイスであるかどうかを 確認しています.
条件に合っていれば,その行は一致したものとして扱います.条件に合わなければ,無視 されます,
以後,バッファの最後になるまで繰り返します.
このように確認しています.したがって,設定すべき項目は
「"」や「! 」などです.別に 1 文字である必要はなく,「 function 」などでも構いま せん.
無ければ, nil でも構いません.
条件に合っていれば t (non-nil) を返すような関数名を指定します.
最初の方を読み飛ばすだけで,確認は不要であれば nil でも構いません.
になります.デフォルトでは以下のように設定されています.
(defvar moccur-special-word-list '( (";" moccur-face-initialization moccur-comment-check) ("\"" moccur-face-initialization moccur-string-check) ("!" moccur-face-initialization moccur-function-check))) |
設定項目は順に「特別な語」「初期化関数」「確認用関数」になっています.
関数さえ用意すれば,自由に条件を追加することができます.
適当に確認しているだけなので,
(if (get-buffer "*Search*") ; there ought to be just one of these
のような行を「; buffer search one 」で検索すると,この行に一致します.しかし,「; buffer one search 」で検索すると一致しません.
つまり,一番最後の検索語がコメントかどうかしか確認していないのです.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
M-x dmoccur に関連したカスタマイズを紹介します.
ちなみに私は以下のような設定で使っています.
(setq dmoccur-use-list t) (setq dmoccur-list '( ("dir" default-directory (".*") dir) ("soft" "~/www/soft/" ("\\.texi$") nil) ("config" "~/mylisp/" ("\\.js" "\\.el$") nil) ("1.99" "d:/unix/Meadow2/1.99a6/" (".*") sub) )) |
設定できるオプションを詳しく説明します.
M-x dmoccur 時に開くファイルを正規表現で指定します.
例えば,
(setq dmoccur-mask '("\\.el$" "\\.cpp$")) |
と指定すると,拡張子が「 el 」と「 cpp 」のファイルのみ検索します.
M-x dmoccur 時に開くファイルサイズを指定します.
dmoccur-maximum-size で指定されたファイルサイズより小さいファイルだけが開かれま す.単位は kB です.
大きなファイルを開くのには時間がかかりますから,適当な値にしておくといいでしょう.
M-x dmoccur 時に開かないファイルを正規表現で指定する.
画像ファイルやバイナリファイルなど検索する必要のないファイルを正規表現で指定して おきます.
t なら M-x dmoccur 時にディレクトリ下を再帰的に検索する (サブディレクトリの ファイルも検索する) .お気に入りでも再帰的な検索になるので,ファイルの開きすぎに 注意してください.
デフォルトは nil
t なら,C-u M-x dmoccur としなくても,M-x dmoccur でお気に入りから検 索できます.
dmoccur で検索すると,現在のバッファが最近どのお気に入りで検索されたかが記録され ます.
nil なら dmoccur で検索するお気に入りを常に指定できます.
t なら, dmoccur でお気に入りの名前を聞かずに,検索時に保存されたお気に入りで検索 します.連続して, dmoccur で検索する時に煩わしい入力がなくなり,いきなり検索文字 を入力できるので便利です.ただし,他のお気に入りを選ぶことはできませんので,他の お気に入りを選びたい時には適当にバッファを変える必要があります.
@subsubsubsection dmoccur のディレクトリ指定 (2005/02/18)
dmoccur のカスイタマイズ で基本的な設定方法は紹介しました.
しかし,
といったこともあります.
color-moccur ではこういったこともできます.ただし,それだけ設定は増えるので,少し 複雑になります.
dmoccur のカスタマイズ の説明では
(setq dmoccur-list '( ("soft" "~/www/soft/" ("\\.texi$") nil))) |
のように指定すると説明しました.この「"~/www/soft/"」の部分を
(setq dmoccur-list '( ("soft" ( ("~/www/soft/" t ("gnus.texi")) ("~/mylisp/" nil ("elisp.texi")) ) ("\\.texi$") nil))) |
のように変えます.このように複数のディレクトリを指定することができるのです.
("~/www/soft/" t ("gnus.texi")) |
の指定項目は順に
検索するディレクトリ 再帰検索するか (t ならする) 検索しないファイルのリスト |
になります. 2 番目以降はオプションで無ければ nil になります.したがって,単に複 数のディレクトリを設定したいだけであれば,
(setq dmoccur-list '( ("soft" ( ("~/www/soft/") ("~/mylisp/") ) ("\\.texi$") nil))) |
のように指定できます.
以下,参考にサンプルです.
(setq dmoccur-list '( ;; 再帰的に検索する場合は、このように設定する ;; オプションが dir や sub なら 1 個しか指定できない ("dir-recursive" ((default-directory t)) (".*") dir) ;; オプションが nil なら、何個でもディレクトリを指定できる ("test" (("~/mylisp") ("~/user")) (".*") nil) ;; 再帰的に検索するかどうかも指定できる ("test-recursive" (("~/mylisp" t) ;; このディレクトリは再帰的に検索 ("~/user")) (".*") nil) ;; ("ignore-txt" ;; mylisp 下は再帰的に検索する ;; ただし,拡張子が txt のファイルは検索したくない (("~/mylisp" t (".+.txt")) ;; user 下は再帰的に検索しない ("~/user")) (".*") nil) )) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
moccur-grepに関連したカスタマイズを紹介しています.
パッチをいただきました.ありがとうございます.
以下のように設定します.これにより,M-x moccur-grep を実行するだけで,カー ソル付近の単語をデフォルトに追加したり,マスクを自動記入したりできます.
;; カーソル付近の単語をデフォルトの検索文字列とする (setq moccur-grep-default-word-near-point t) ;; *.c 編集中のデフォルトファイルマスク: \.[HhCc]$ (add-hook 'c-mode-common-hook '(lambda () (setq moccur-grep-default-mask "\\.\[HhCc\]$"))) |
デフォルトでは,カーソル移動だけで,該当箇所を別ウィンドウに表示しますが,以下を 設定することで無効化することができます.
(setq moccur-grep-following-mode-toggle nil) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
デフォルトは nil .
t なら, dired から moccur で検索し, moccur を q で抜けると,開いたファイ ルをすべて kill します.ただし,元から存在していたバッファは消しません.
これにより,バッファが氾濫することを防ぐことができます.
この機能はフォームから投稿していただきました.ありがとうございました.
お好きなようにどうぞ.
私はこんな風にしてます.
(define-key dired-mode-map "O" 'dired-do-moccur) (define-key Buffer-menu-mode-map "O" 'Buffer-menu-moccur) (global-set-key "\C-c\C-x\C-o" 'moccur) (global-set-key "\C-c\C-o" 'search-buffers) |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
color-moccur を使っていると,いろいろな場面で color-moccur が使いたいなという時 があります.ここでは,自分好みの moccur を作る方法を簡単に紹介します.
moccur にしても dmoccur にしても検索は moccur-search という関数で行なっています. どのバッファを検索するかを指定する方法が違うだけです.
例えば occur と同等のことをするのであれば,
(defun my-occur (regexp arg) ;; moccur-regexp-read-from-minibuf は moccur で使っている ;; 文字を受け取る関数 (interactive (list (moccur-regexp-read-from-minibuf) current-prefix-arg)) ;; おまじない (moccur-setup) (let ((buffers (list (current-buffer)))) (moccur-search regexp t buffers) ;; 引数は正規表現 全バッファ バッファのリスト ;; 全バッファとは全バッファを検索するかどうかです ;; nil ならファイルバッファのみになります )) |
とするだけでできます.複数のバッファを検索したければ, buffers にそのバッファのリ ストを指定すればいいのです.
例えば, navi2ch で mo でマークのついたスレを検索したいなら,以下のようにし てできます.
(defun navi2ch-bm-display-mark-moccur (regexp arg) (interactive (list (moccur-regexp-read-from-minibuf) current-prefix-arg)) (let ((navi2ch-article-max-buffers 10000) (buffers nil) (navi2ch-offline t)) (setq buffers (navi2ch-article-buffer-list)) (while buffers (if (buffer-live-p (car buffers)) (kill-buffer (car buffers))) (setq buffers (cdr buffers))) (navi2ch-bm-exec-subr 'navi2ch-bm-display-article) (setq buffers (navi2ch-article-buffer-list)) (moccur-setup) (moccur-search regexp t buffers) )) (add-hook 'navi2ch-article-load-hook (lambda () (define-key navi2ch-bm-mode-map "mo" 'navi2ch-bm-display-mark-moccur))) |
同じようにすると,バッファの検索を行う Elisp を簡単に実現できます.
50.5.5.1 namazu と moccur を組み合わせる (2003/11/27)
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
namazu で検索語に一致しそうなファイルを絞り, moccur で実際に検索して結果を表示 できます.
moccur はあまり大量の文書を検索するのには向いていません.それは検索するために, ファイルを開く必要があるからです.
一方で, namazu は大量の文書を検索するのに向いていますが, 1 個 1 個の検索結果の 表示は要約が出るだけで,便利とはいえません.
namazu で検索し,一致したファイルに対して moccur を行うことができます.
namazu.el と color-moccur.el が動作することが必要です.
以下を.emacs に追加します.
(defun nmoccur (&optional page-num namazu-dir key) "namazu + moccur" (interactive (list 0 (if (or (and (not namazu-always-query-index-directory) current-prefix-arg) (and namazu-always-query-index-directory (not current-prefix-arg))) (read-from-minibuffer "Namazu index directory: " nil namazu-minibuffer-map nil 'namazu-index-history) nil) (read-from-minibuffer "Enter Keyword: " nil namazu-minibuffer-field-map nil 'namazu-keyword-history))) (setq namazu-filename-list nil) (let ((dir (or namazu-dir (progn (or namazu-default-dir (setq namazu-default-dir (namazu-get-default-index-dir))) (expand-file-name namazu-default-dir)))) (arg-list (list "-all" key))) (if (and dir (not (string= dir "")) (string-match "[^ \t]" dir)) (setq arg-list (append arg-list (namazu-split-dir (namazu-expand-dir-alias dir))))) (message "Namazu running ...") (let ((default-process-coding-system (cons namazu-cs-read namazu-cs-write)) (process-input-coding-system namazu-cs-read) (process-output-coding-system namazu-cs-write) (coding-system-for-read namazu-cs-read) (coding-system-for-write namazu-cs-write)) (with-temp-buffer (apply (function call-process) namazu-command nil t nil arg-list) (goto-char (point-min)) (setq namazu-filename-list (split-string (buffer-substring-no-properties (point-min) (point-max)) "\n"))))) (message "done!") (setq namazu-filename-list (mapcar '(lambda (file) (if (string-match "^/\\([a-zA-Z]\\)|/\\(.+\\)$" file) (concat (match-string 1 file) ":/" (match-string 2 file)) file)) namazu-filename-list)) (if (> (length namazu-filename-list) namazu-search-num) (setq namazu-filename-list (reverse (nthcdr (- (length namazu-filename-list) namazu-search-num) (reverse namazu-filename-list))))) (moccur-setup) (setq moccur-last-command 'dired-do-moccur) (let ((buffers (moccur-add-files-to-search-list namazu-filename-list "~/" t nil)) (moccur-split-word t) (regexp key)) (while (string-match " " regexp nil) (setq regexp (replace-match "\\\\|" nil nil regexp))) (moccur-search regexp nil buffers) (when kill-buffer-after-dired-do-moccur (while buffers (setq buff (car buffers)) (if (memq buff moccur-match-buffers) () (if (memq buff moccur-buffers-before-moccur) (delq buff buffers) (kill-buffer buff))) (setq buffers (cdr buffers)))))) |
M-x nmoccur で検索できます.そうすると, namazu で検索した後で, moccur に より個々のファイルを検索してくれます.ファイルを多く開きますが, kill-buffer-after-dired-do-moccur が t であれば, moccur を q で終了した時 に,すべてのバッファを閉じます.
ただし,検索するファイル数は namazu-search-num で設定した数になります.
検索語はスペースで区切って入れてください. and や or などには対応していません.
思いつきで作ったもの.実用性はあまりないかも.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
もう少し詳しい経緯は Wiki にあります.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
color-moccur の検索結果をそのまま編集することで,多数のファイルを簡単に置換した りできる.
moccuredit のデモ を作ってみました.参考にどうぞ.
スクリプトの#!/usr/bin/perl など,編集中のファイルの中のある文字を置換したい場合 どうしてますか?
1 個や 2 個であれば手でもできますが,たくさんのファイルになると 1 個 1 個,手で置 換するのは非常に面倒です. color-moccur を使えば,一覧を出すことができるのでちょっ とは楽ですが,バッファの切換えを何度もする必要があり,やはり面倒です.
color-moccur を前に紹介 しました.これを使って検索すると,
Lines matching defcustom Buffer: sieve-mode.elFile: e:/Meadow2/1.99a6/site-lisp/t-gnus/sieve-mode.el 61 (defcustom sieve-mode-hook nil
という風に検索結果を表示してくれます.
ここまで表示してくれるんだったら, color-moccur のバッファを直接編集してしまった 方が見通しがいいと思いませんか?
これを可能にするものが, moccur-edit です.
これを使えば,検索して,結果画面で M-% を使い,一気に置換することができます. 置換だけでなく,結果バッファを編集し,その変更をファイルに適用することもできます.
当然ですが, color-moccur がないと動きませんので,先に入れておいてください.
その後で,moccur-edit.el をダ ウンロードし,ロードパスの通ったところへ置きます.
以下を.emacs に追加します.
(load "moccur-edit")
|
まず普通に, moccur をし,一覧を表示します.
そして,以下のように操作します.
dmoccur や moccur , moccur-grep , moccur-grep-find などで検索して結果を表示させます.
結果が表示されたところで,r(あるいはC-c C-i か C-x C-q でもい い) とします.すると,バッファが編集できるようになります.
後は編集するだけです.編集すると,編集した箇所には色がつきます.
C-x C-s (あるいは C-c C-c か C-c C-f でも可能) とすると,色がつ いている変更のみが適用されます.
バッファの保存はしませんので,各ファイルを確認してから保存してください.変更した 行には色がつきますので,比較的発見しやすいと思います.
適用したくない部分をリージョンで選択し,C-c C-r とします.そうすると,色が 消えて,この変更は適用されなくなります.
すべての変更を適用したくない時には,C-x k(あるいは C-c C-k か C-c k か C-c C-u でも可能) とします.これで,すべての変更は無効にな ります.
t なら,各バッファで変更が適用された行に色がつけられます.
デフォルトでは,moccur-edit-highlight-edited-text が t の時には,変更を適用した後 で,*moccur*バッファを q で抜けても各バッファで変更された箇所には色が残りま す,変更箇所を確認しやすくするためです.
これが邪魔な時には,この変数を t にします.すると,*moccur*バッファを q で 抜けた時に色を消します.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
XEDIT というテキストエディタには all というコマンドがあります.
これは, occur のように検索をして,その検索結果バッファをファイルのように編集で きるコマンドです.
ファイルの行数が長い場合などに,必要な行のみを表示して編集できるので,見通しがい いのです.
このような操作を Meadow で実現するのが all.el です.
all.el をダウンロードし,ロードパスの 通ったところへ置きます.
.emacs に以下を追加します.
(autoload 'all "all" nil t)
|
M-x allとすればカレントバッファを検索し,一致した文字が含まれている行のみ が別バッファに表示されます.後は,そのままそのバッファを編集すれば,その変更が即 座にファイルに適用されます.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
検索する文字を入力するたびに更新される occur.
gnu-emacs-sourcesから.
occur は便利なのですが,ある単語を検索しても思いの外,多くの行が一致してしまうこ とがあります.
例えば,「def」で検索すると,Emacs-lisp ならたくさん一致することでしょう.そんな 時に,すぐに「un」と入力すれば,即座に「defun」での検索結果に変化します.
入ってません.
http://mercurial.intuxication.org/hg/ioccur からダウンロードしてロードパ スの通ったところへ置きます.
以下を .emacs に追加します.
;; This buffer is for notes you don't want to save, and for Lisp evaluation. ;; If you want to create a file, visit that file with C-x C-f, ;; then enter the text in that file's own buffer. (when (and (boundp 'emacs-major-version) (< emacs-major-version 23)) (defmacro characterp (form) (list (quote numberp) form)) (require 'ioccur)) |
M-x ioccur として起動します.後は,入力すれば,自動的に結果が更新されます.
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |