PL/SQL用list-function

http://ohkubo.s53.xrea.com/diary/20040811.htmlから頂いてきたやつをちょこっと改造。
文字列の先頭にfunctionなら[F]、procedureなら[P]、cursorなら[C]を付加。
引数の行が改行されていると認識できないのが課題。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PL/SQL用のlist-function設定
;; http://ohkubo.s53.xrea.com/diary/20040811.html
(in-package "editor")
(defun PL/SQL-build-summary-of-functions ()
  (let (result package-range-alist package begin end func)
    (save-excursion
      ;; search package range
      (goto-char (point-min))
      (while (scan-buffer "^[ \t]*create[ \t]+or[ \t]+replace[ \t]+package[ \t]+body[ \t]+\\([^ \t\r\n]+\\)[ \t\r\n]+is"
                          :regexp t :case-fold t)
        (setq package (match-string 1))
        (push (list (current-line-number) (concat "package " package)) result)
        (setq begin (point))
        (if (scan-buffer (concat "end[ \t\n]+" (regexp-quote package) ";")
                           :regexp t :case-fold t :tail t)
            (setq end (point))
          (setq end (point-max)))
        (push (cons package (cons begin end)) package-range-alist)
        (goto-char end)
        (forward-char))
      (goto-char (point-min))
      ;; search function/procedure/cursor
      (while (scan-buffer "^[ \t]*\\(?:function\\|procedure\\|cursor\\)[ \t]+\\([^ \t\r\n(]+.+?\\)[ \t\r\n]+is"
                          :regexp t :case-fold t)
        (setq func (match-string 1))
        (setq package (car (rassoc-if #'(lambda (range)
                                          (and (< (car range) (point))
                                               (< (point) (cdr range))))
                                      package-range-alist)))
        (when package
;/_/_/_/_/_/_/_/_ MOD START 2009/05/26 _/_/_/_/_/_/_/_/
;;          (setq func (concat package "." func)))

          (cond ((string-equal (nth 0 (split-string (match-string 0) " \t")) "function")  (setq func (concat "[F]" func)))
                ((string-equal (nth 0 (split-string (match-string 0) " \t")) "procedure") (setq func (concat "[P]" func)))
                ((string-equal (nth 0 (split-string (match-string 0) " \t")) "cursor")    (setq func (concat "[C]" func)))
                (t (setq func (concat "[" (nth 0 (split-string (match-string 0) " \t")) "]" func))))
          )
;/_/_/_/_/_/_/_/_ MOD END   2009/05/26 _/_/_/_/_/_/_/_/
        (push (list (current-line-number) func) result)
        (next-line)))
    (stable-sort result #'< :key #'car)))
(add-hook '*sql-mode-hook*
          #'(lambda ()
              (make-local-variable 'build-summary-function)
              (setq build-summary-function 'PL/SQL-build-summary-of-functions)))
(in-package "user")