xyzzy用のoccurを作った。

occurが見つからないので作った。(同じ挙動じゃないけど)
とりあえず、以下を満たせばいいことにした。

  • 呼び出すときに正規表現を入力する
  • 関数実行後bufferが2つに分割される。
  • 片方のbufferには与えた正規表現を含む行の内容が出力されている。

カーソルの近くの言葉がdefault値として渡される?それとも、以前調べた言葉がdefaultになる?忘れてしまいました><。調べるのが面倒なのであとで直すかもしれません。とりあえず、今回は履歴が残るようにしてみました。

(defmacro number-to-string (int)
  "number -> string"
  `(format nil "~A" ,int))

(defvar last-occur-word ""
  "履歴が残っているとうれしい")

(defun occur (re) (interactive "sregexp:" :default0 last-occur-word)
  "渡された正規表現を含む行を『行番号:行の内容』という形で表示する(上から下だと出力の向きが逆さになるので下から上に走査する。)"
  (setq last-occur-word re)
  (let* ((occur "*occur*")
	 (buf (progn (when (find-buffer occur)
		       (delete-buffer occur))
		(get-buffer-create occur))))
    (save-excursion
      (let ((start (point-min)))
	(goto-char (point-max))
	(while (< start (point))
	  (let ((line (buffer-substring (progn (goto-bol) (point))
					(progn (end-of-line) (point)))))
	    (when (string-match re line)
	      (with-output-to-buffer ((find-buffer occur))
		(print (concat (number-to-string (current-line-number))
			       ":" line))))
	    (previous-line)))))
    (switch-to-buffer-other-window occur))
  (unless (selected-buffer) (other-window)))