xyzzy
Top Page > Tips > Search


複数ファイルに対する検索・置換

grep、gresreg

M-x grep
xyzzyで開いているすべてのファイルに対して検索
M-x gresreg
xyzzyで開いているすべてのファイルに対して置換

 grepというのは、複数のファイルに対して検索をかけ、検索文字列を含むファイルと行を抜き出して出力することをいいます。gresregは複数のファイルの中身を置換することです。
 grepを実行するとミニバッファで「grep: 」と検索文字列の入力を求められます。gresregを実行すると、同じくミニバッファで、まず「fgresreg: 」と検索文字列の入力を求められ、次いで「with: 」と置換文字列の入力を求められます。
検索結果の表示

ディレクトリ内に対する検索・置換

grep-dialog、gresreg-dialog

 grepやgresregを「指定したディレクトリ以下にあるファイル」に対して行うには、M-x grep-dialogM-x gresreg-dialogを使います。ミニバッファでなくダイアログを使う以外はgrepと同じです。

外部からGrepd・Gresregd
 →MailingList 3894,3902,3907,3908

siteinit.l(追加)
(defun my-grep ()
  (require "grepd")
  (let ((ed::*grep-directory-name-hook*
         #'(lambda ()
             (pop si:*command-line-args*))))
    (declare (special ed::*grep-directory-name-hook*))
    (grep-dialog)))

(defun my-gresreg ()
  (require "gresregd")
  (let ((ed::*gresreg-directory-name-hook*
         #'(lambda ()
             (pop si:*command-line-args*))))
    (declare (special ed::*gresreg-directory-name-hook*))
    (gresreg-dialog)))

commentary

 外部ファイラなどからディレクトリを指定してGrep・Grep置換できるようにします。xyzzyで直接呼び出すわけではないので、特にキーバインドを指定する必要はありません。

外部ファイラなどの設定
~xyzzy\xyzzycli.exe -f my-grep "フルパス"
~xyzzy\xyzzycli.exe -f my-gresreg "フルパス"

commentary

 xyzzycli.exeを起動する際にそれぞれの関数を呼び出すように、外部ファイラの側で設定します。「~xyzzy」はxyzzyがインストールされたディレクトリです。「-f」オプションの後に続くのが、起動する際に呼び出される関数名です。
 「"フルパス"」には、外部ファイラにある「カレントフォルダ名」を示す文字列を入れます。ファイラによって、カーソル位置のフォルダ名やファイル名、拡張子名などを表す文字列が用意されていると思うので、それを指定してください。そういう文字列がないファイラもありますが。

for example...
C:\Program Files\xyzzy\xyzzycli.exe -f my-grep "$P"

 例えば、あふの場合、「$P」でカーソル位置のファイルがあるフォルダ名(フルパス、最後の「\」は付かない)になるので、このように設定します。僕はこれをM-Gに割り当てています。
 同じように、my-grepの部分をmy-gresregにすればGrep置換になるので、これもキーに割り当てます。僕はC-M-Gにしています。

検索結果の表示

Grep等で検索したファイルに飛ぶ

 検索結果は「*compilation*」バッファに表示されます。そのバッファにフォーカスを当てて、目的の検索結果のある行にカーソルを合わせます。そしてF10(first-error)を押すとそのファイルを開き、その行に移動します。2つ目以降の検索結果には、F11(next-error)で飛べます。

Grep結果をダブルクリックで開く
 →Written by xyzzy thread No.7 - 775

siteinit.l(追加)
(defun grep-mouse-left-press ()
  "grep結果をダブルクリックでファイルopen"
  (interactive)
  (let ((click (mod *last-mouse-click-count* 6)))
  (if (= click 2)
  (first-error)
  (mouse-left-press))))

  (defvar *grep-map* nil)
  (unless *grep-map*
  (setq *grep-map* (make-sparse-keymap))
  (define-key *grep-map* #\LBtnDown 'grep-mouse-left-press))
  (add-hook 'ed::*grep-hook* #'(lambda () (use-keymap *grep-map*)))
  (add-hook 'ed::*grepd-hook* #'(lambda () (use-keymap *grep-map*)))

 F10などを押す変わりに目的の行でダブルクリックしてもそのファイルを開けるようにします。

インターネットで検索

選択した単語を検索
 →Written by kazu.y

siteinit.l(追加)
(defun yahoo-dictionary-selection ()
  (interactive)
  (ed::edict-lookup-selection #'jj-dictionary))

(defun jj-dictionary (from to)
  (interactive "r")
  (if (= from to)
      (progn (message "単語を選択してください") (return-from jj-dictionary nil)))
  (long-operation
    (let ((str (substitute-string (buffer-substring from to) " " "%20"))
          url)
      ; アドレス指定
      (setq url (concat "http://dic.yahoo.co.jp/bin/dsearch?t=f&p=" str))
      (popup-navigate url))))

      ; 表示媒体
      (load-library "www/www")
      (defun popup-navigate (url)
      (www::www-open url)
      (rename-buffer "*WWW 検索結果")
      (kill-buffer (concat "*WWW SRC: " url))
      (goto-line 20) (recenter 0) ; 表示の調整
      )

      ; キーバインド
      (global-set-key #\M-e 'yahoo-dictionary-selection)

commentary

 選択部分を検索エンジンなどに渡して開きます。標準のeijiro.lではC-c jとかになっていますが、キーをWindows風に設定しているとコピーになっちゃうので、ここではM-eに割り当てています。

(goto-line [数値]) (recenter 0) ; 表示の調整

 ここで指定した数値分、自動的にスクロールした上で表示してくれます。最初の方に意味のない情報が多い場合はここを指定しておくといいでしょう。

検索エンジンについて

; アドレス指定
(setq url (concat "[Prefix]" str "[Suffix]"))

 この部分で検索エンジンを指定しています。strは渡される文字列(つまり選択部分)、[Prefix]はアドレスのうち検索文字列の前に来る部分、[Suffix]は後に来る部分です。ここをいじることで検索エンジンは自由に指定できます。PrefixSuffixの探し方については、s/oさんのサイトが便利かと。

表示方法について

 ここではWWW-modeを利用してますが、browserex.lを使いたい場合はこのようにします(これもeijiro.lから)。

「; 表示媒体」のところを変更
(load-library "browserex")
(defun popup-navigate (url)
    (interactive)
  (cond
   (t
    (winapi:ShowWindow (get-window-handle) 3)
    (bx::navigate url  :position bx::XPIS_LEFT :size 400))))
▲トップページに戻る▲

grep

grepd

grep-dialog

外部からGrepd・Gresregd

検索結果の表示

キーボード

マウス

internet検索

選択部分を検索