grep
というのは、複数のファイルに対して検索をかけ、検索文字列を含むファイルと行を抜き出して出力することをいいます。gresreg
は複数のファイルの中身を置換することです。
grep
を実行するとミニバッファで「grep: 」と検索文字列の入力を求められます。gresreg
を実行すると、同じくミニバッファで、まず「fgresreg: 」と検索文字列の入力を求められ、次いで「with: 」と置換文字列の入力を求められます。
→検索結果の表示
grepやgresregを「指定したディレクトリ以下にあるファイル」に対して行うには、M-x grep-dialogやM-x gresreg-dialogを使います。ミニバッファでなくダイアログを使う以外はgrepと同じです。
(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)))
外部ファイラなどからディレクトリを指定してGrep・Grep置換できるようにします。xyzzyで直接呼び出すわけではないので、特にキーバインドを指定する必要はありません。
~xyzzy\xyzzycli.exe -f my-grep "フルパス" ~xyzzy\xyzzycli.exe -f my-gresreg "フルパス"
xyzzycli.exeを起動する際にそれぞれの関数を呼び出すように、外部ファイラの側で設定します。「~xyzzy」はxyzzyがインストールされたディレクトリです。「-f」オプションの後に続くのが、起動する際に呼び出される関数名です。
「"フルパス"」には、外部ファイラにある「カレントフォルダ名」を示す文字列を入れます。ファイラによって、カーソル位置のフォルダ名やファイル名、拡張子名などを表す文字列が用意されていると思うので、それを指定してください。そういう文字列がないファイラもありますが。
C:\Program Files\xyzzy\xyzzycli.exe -f my-grep "$P"
例えば、あふの場合、「$P」でカーソル位置のファイルがあるフォルダ名(フルパス、最後の「\」は付かない)になるので、このように設定します。僕はこれをM-Gに割り当てています。
同じように、my-grep
の部分をmy-gresreg
にすればGrep置換になるので、これもキーに割り当てます。僕はC-M-Gにしています。
検索結果は「*compilation*」バッファに表示されます。そのバッファにフォーカスを当てて、目的の検索結果のある行にカーソルを合わせます。そしてF10(first-error
)を押すとそのファイルを開き、その行に移動します。2つ目以降の検索結果には、F11(next-error
)で飛べます。
(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などを押す変わりに目的の行でダブルクリックしてもそのファイルを開けるようにします。
(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)
選択部分を検索エンジンなどに渡して開きます。標準のeijiro.lではC-c jとかになっていますが、キーをWindows風に設定しているとコピーになっちゃうので、ここではM-eに割り当てています。
(goto-line [数値]) (recenter 0) ; 表示の調整
ここで指定した数値分、自動的にスクロールした上で表示してくれます。最初の方に意味のない情報が多い場合はここを指定しておくといいでしょう。
; アドレス指定 (setq url (concat "[Prefix]" str "[Suffix]"))
この部分で検索エンジンを指定しています。str
は渡される文字列(つまり選択部分)、[Prefix]
はアドレスのうち検索文字列の前に来る部分、[Suffix]
は後に来る部分です。ここをいじることで検索エンジンは自由に指定できます。Prefix
とSuffix
の探し方については、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))))