(defun Buffer-menu-grep-match (str) (interactive "P") (call-interactively 'ibuffer) (save-excursion (goto-char (point-min)) (let (lines) (forward-line 2) (setq lines (buffer-substring (point-min) (point))) (while (re-search-forward str nil t) (let ((bol (progn (beginning-of-line) (point))) (eol (progn (forward-line) (point)))) (setq lines (concat lines (buffer-substring bol eol))))) (let ((buffer-read-only nil)) (erase-buffer) (insert lines))))) (defun Buffer-menu-grep-reject (str) (interactive "P") (call-interactively 'ibuffer) (save-excursion (goto-char (point-min)) (let (lines) (forward-line 2) (setq lines (buffer-substring (point-min) (point))) (forward-line 1) (while (re-search-forward ".+$" (line-end-position) t) (let ((bol (progn (beginning-of-line) (point))) (eol (progn (forward-line) (point)))) (if (not (string-match str (buffer-substring bol eol))) (setq lines (concat lines (buffer-substring bol eol)))))) (let ((buffer-read-only nil)) (erase-buffer) (insert lines))))) (defun Buffer-menu-grep-texi () (Buffer-menu-grep-match "texi")) (defun Buffer-menu-grep-el () (Buffer-menu-grep-match "\\(scratch\\|\\.el\\)")) (defun Buffer-menu-grep-2ch () (Buffer-menu-grep-match "navi2ch")) (defun Buffer-menu-grep-default () (Buffer-menu-grep-reject "\\(texi\\|navi2ch\\)")) (defvar my-buffer-menu-list '( ("\.texi" . Buffer-menu-grep-texi) ("navi2ch" . Buffer-menu-grep-2ch) ("\.el" . Buffer-menu-grep-el) ("." . Buffer-menu-grep-default) )) (defun my-buffer-menu (arg) (interactive "P") (if arg ;;(call-interactively 'buffer-menu) (call-interactively 'ibuffer) (let ((alist my-buffer-menu-list) (case-fold-search t) (buffer-menu-com nil) (name (buffer-name (current-buffer)))) (while (and (not buffer-menu-com) alist) (if (string-match (car (car alist)) name) (setq buffer-menu-com (cdr (car alist)))) (setq alist (cdr alist))) (if buffer-menu-com (funcall buffer-menu-com) (call-interactively 'ibuffer))))) (global-set-key "\C-x\C-b" 'my-buffer-menu)