summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elisp/geiser-impl.el3
-rw-r--r--elisp/geiser-menu.el120
2 files changed, 58 insertions, 65 deletions
diff --git a/elisp/geiser-impl.el b/elisp/geiser-impl.el
index f84f90c..e7fb2f8 100644
--- a/elisp/geiser-impl.el
+++ b/elisp/geiser-impl.el
@@ -115,6 +115,9 @@ determine its scheme flavour."
(setq geiser-active-implementations
(delq impl geiser-active-implementations)))
+(defsubst geiser-impl--active-p (impl)
+ (memq impl geiser-active-implementations))
+
;;; Defining implementations:
diff --git a/elisp/geiser-menu.el b/elisp/geiser-menu.el
index bba6b10..a298092 100644
--- a/elisp/geiser-menu.el
+++ b/elisp/geiser-menu.el
@@ -24,32 +24,47 @@
;;; Top-level menu
-(defmacro geiser-menu--add-items-1 (keymap map keys)
- `(progn ,@(mapcar (lambda (kd)
- (let* ((title (nth 0 kd))
- (binding (nth 1 kd))
- (cmd (nth 2 kd))
- (hlp (nth 3 kd))
- (item (make-symbol title))
- (hlp (and (stringp hlp) (list :help hlp)))
- (rest (or (and hlp (nthcdr 4 kd))
- (nthcdr 3 kd)))
- (binding (if (listp binding)
- binding
- (list binding))))
- `(progn (define-key ,map [,item]
- '(menu-item ,title ,cmd ,@hlp ,@rest))
- ,@(and (car binding)
- `((put ',cmd
- :advertised-binding
- ,(car binding))))
- ,@(mapcar (lambda (b)
- `(define-key ,keymap ,b ',cmd))
- binding))))
- keys)))
+(defmacro geiser-menu--add-item (keymap map kd)
+ (cond ((or (eq '-- kd) (eq 'line kd)) `(geiser-menu--add-line ,map))
+ ((stringp (car kd)) `(geiser-menu--add-basic-item ,keymap ,map ,kd))
+ ((eq 'menu (car kd)) `(geiser-menu--add-submenu ,(cadr kd)
+ ,keymap ,map ,(cddr kd)))
+ ((eq 'custom (car kd)) `(geiser-menu--add-custom ,(nth 1 kd)
+ ,(nth 2 kd)
+ ,keymap
+ ,map))
+ ((eq 'mode (car kd)) `(geiser-menu--mode-toggle ,(nth 1 kd)
+ ,(nth 2 kd)
+ ,(nth 3 kd)
+ ,keymap
+ ,map))
+ (t (error "Bad item form: %s" kd))))
+
+(defmacro geiser-menu--add-basic-item (keymap map kd)
+ (let* ((title (nth 0 kd))
+ (binding (nth 1 kd))
+ (cmd (nth 2 kd))
+ (hlp (nth 3 kd))
+ (item (make-symbol title))
+ (hlp (and (stringp hlp) (list :help hlp)))
+ (rest (or (and hlp (nthcdr 4 kd))
+ (nthcdr 3 kd)))
+ (binding (if (listp binding)
+ binding
+ (list binding))))
+ `(progn (define-key ,map [,item]
+ '(menu-item ,title ,cmd ,@hlp ,@rest))
+ ,@(and (car binding)
+ `((put ',cmd
+ :advertised-binding
+ ,(car binding))))
+ ,@(mapcar (lambda (b)
+ `(define-key ,keymap ,b ',cmd))
+ binding))))
(defmacro geiser-menu--add-items (keymap map keys)
- `(geiser-menu--add-items-1 ,keymap ,map ,(reverse keys)))
+ `(progn ,@(mapcar (lambda (k) (list 'geiser-menu--add-item keymap map k))
+ (reverse keys))))
(defmacro geiser-menu--add-submenu (name keymap map keys)
(let ((ev (make-symbol name))
@@ -57,64 +72,37 @@
`(progn
(let ((,map2 (make-sparse-keymap ,name)))
(define-key ,map [,ev] (cons ,name ,map2))
- (geiser-menu--add-items-1 ,keymap ,map2 ,keys)))))
-
-(put 'geiser-menu--add-submenu 'lisp-indent-function 1)
-(put 'geiser-menu--add-items 'lisp-indent-function 1)
+ (geiser-menu--add-items ,keymap ,map2 ,keys)))))
(defvar geiser-menu--line-counter 0)
-(defun geiser-menu--add-line (&optional keymap)
+(defun geiser-menu--add-line (&optional map)
(let ((line (make-symbol (format "line%s"
(setq geiser-menu--line-counter
(1+ geiser-menu--line-counter))))))
- (define-key (or keymap global-map) `[,line]
+ (define-key (or map global-map) `[,line]
`(menu-item "--single-line"))))
(defmacro geiser-menu--add-custom (title group keymap map)
- `(geiser-menu--add-items ,keymap ,map
- ((,title nil (lambda () (interactive) (customize-group ',group))))))
+ `(geiser-menu--add-item ,keymap ,map
+ (,title nil (lambda () (interactive) (customize-group ',group)))))
(defmacro geiser-menu--mode-toggle (title bindings mode keymap map)
- `(geiser-menu--add-items ,keymap ,map
- ((,title ,bindings ,mode
- :button (:toggle . (and (boundp ',mode) ,mode))))))
-
-(defmacro geiser-menu--defmenu (e keymap &rest keys)
- (let ((fs)
- (mmap (make-symbol "mmap")))
- (dolist (kd keys)
- (setq fs
- (cons (cond ((or (eq '-- kd) (eq 'line kd))
- `(geiser-menu--add-line ,mmap))
- ((stringp (car kd))
- `(geiser-menu--add-items ,keymap ,mmap ,(list kd)))
- ((eq 'menu (car kd))
- `(geiser-menu--add-submenu ,(cadr kd)
- ,keymap ,mmap ,(cddr kd)))
- ((eq 'custom (car kd))
- `(geiser-menu--add-custom ,(nth 1 kd)
- ,(nth 2 kd)
- ,keymap
- ,mmap))
- ((eq 'mode (car kd))
- `(geiser-menu--mode-toggle ,(nth 1 kd)
- ,(nth 2 kd)
- ,(nth 3 kd)
- ,keymap
- ,mmap))
- (t (error "Bad form: %s" kd)))
- fs)))
+ `(geiser-menu--add-item ,keymap ,map
+ (,title ,bindings ,mode :button (:toggle . (and (boundp ',mode) ,mode)))))
+
+(defmacro geiser-menu--defmenu (name keymap &rest keys)
+ (let ((mmap (make-symbol "mmap")))
`(progn
(let ((,mmap (make-sparse-keymap "Geiser")))
- (define-key ,keymap [menu-bar ,e] (cons "Geiser" ,mmap))
+ (define-key ,keymap [menu-bar ,name] (cons "Geiser" ,mmap))
(define-key ,mmap [customize]
(cons "Customize" geiser-menu--custom-customize))
(define-key ,mmap [switch]
(cons "Switch to" geiser-menu--custom-switch))
(define-key ,mmap [Run] (cons "Run" geiser-menu--custom-run))
(geiser-menu--add-line ,mmap)
- ,@fs))))
+ (geiser-menu--add-items ,keymap ,mmap ,keys)))))
(put 'geiser-menu--defmenu 'lisp-indent-function 2)
@@ -140,8 +128,10 @@
(defun geiser-menu--add-impl (name runner switcher)
(let ((title (capitalize (format "%s" name)))
(group (intern (format "geiser-%s" name))))
- (define-key geiser-menu--custom-run `[,name] (cons title runner))
- (define-key geiser-menu--custom-switch `[,name] (cons title switcher))
+ (define-key geiser-menu--custom-run `[,name]
+ `(menu-item ,title ,runner :enable (geiser-impl--active-p ',name)))
+ (define-key geiser-menu--custom-switch `[,name]
+ `(menu-item ,title ,switcher :enable (geiser-repl--get-repl ',name)))
(geiser-menu--add-global-custom title group)))
(geiser-menu--add-global-custom "Geiser" 'geiser)