Download
(defgroup selectkey nil
"Select buffers by type with a single key"
:group 'emacs)
(defvar selectkey-select-prefix-map)
(define-prefix-command 'selectkey-select-prefix-map)
(global-set-key [f8] selectkey-select-prefix-map)
(global-set-key [menu] selectkey-select-prefix-map)
(global-set-key [apps] selectkey-select-prefix-map)
(defun selectkey-get-repeat-prefix ()
(let (keys)
(and (setq keys (this-single-command-keys))
(> (length keys) 1)
keys)))
(defun selectkey-repeat-on-last-key (keys)
(setq keys (vconcat keys))
(let ((n (1- (length keys)))
cmd done repeat)
(while (and (not done)
(aset keys n (read-event))
(setq cmd (key-binding keys t)))
(clear-this-command-keys t)
(funcall cmd nil)
(setq last-input-event nil)))
(when last-input-event
(clear-this-command-keys t)
(setq unread-command-events (list last-input-event))))
(defun selectkey-display-select-bindings ()
(interactive)
(describe-bindings [f8]))
(define-key selectkey-select-prefix-map "?" 'selectkey-display-select-bindings)
(defmacro selectkey-define-select-key
(fname-base key &optional buf-form else-form)
"Define a select-key function FNAME-BASE bound on KEY.
If provided, BUF-FORM should be a form which will attempt to return
a buffer to switch to. If it returns nil, ELSE-FORM is evaluated."
(let ((fname (intern (concat "selectkey-select-" (symbol-name fname-base)))))
`(progn
(defun ,fname (arg)
(interactive "P")
(let ((keys (selectkey-get-repeat-prefix)))
(let ((buf
(catch 'found
(ignore
(mapc #'(lambda (buf)
(and (string-match ,buf-form (buffer-name
buf))
(throw 'found buf)))
(cdr (buffer-list)))))))
(if buf
(switch-to-buffer buf)
,else-form))
(if keys
(selectkey-repeat-on-last-key keys))))
(define-key selectkey-select-prefix-map ,key ',fname))))
(put 'selectkey-define-select-key 'lisp-indent-function 2)
(defmacro selectkey-define-select-key-class
(fname-base key regexp &optional default-dir)
`(selectkey-define-select-key
,(intern (concat (symbol-name fname-base) "-file")) ,key
,regexp
(let ((default-directory (or ,default-dir
default-directory)))
(call-interactively #'find-file))))
(selectkey-define-select-key-class C "c" "\\.c\\'")
(selectkey-define-select-key-class Emacs-Lisp "e" "\\.el\\'"
user-emacs-directory)
(selectkey-define-select-key-class HTML "h" "\\.s?html\\'")
(selectkey-define-select-key-class Lisp "l" "\\.\\(lisp\\|lsp\\)\\'")
(selectkey-define-select-key-class LaTeX "t" "\\.tex\\'")
(selectkey-define-select-key-class Makefile "M" "\\(GNU\\)?[Mm]akefile")
(selectkey-define-select-key-class m4 "4" "\\.m4\\'")
(defvar selectkey-dotemacs-file "~/.emacs.d/emacs.el")
(selectkey-define-select-key dotemacs-file "."
selectkey-dotemacs-file
(find-file selectkey-dotemacs-file))
(selectkey-define-select-key home-directory "~"
"\\`~\\'"
(dired "~"))
(define-key selectkey-select-prefix-map "`"
'selectkey-select-home-directory)
(selectkey-define-select-key info "i"
"\\`\\*info\\*\\'"
(info))
(selectkey-define-select-key shell "!"
"\\`\\*eshell\\*\\'"
(eshell))
(selectkey-define-select-key gnus "g"
"\\`\\*Group\\*\\'"
(gnus))
(provide 'selectkey)