* Quick key reference
Triple chords ending in a single letter <x> accept also C-<x> (e.g.
- C-cC-eC-r is the same as C-cC-er).
+ C-c C-e C-r is the same as C-c C-e r).
*** In factor source files:
| C-c C-d p | find words containing given substring (fuel-apropos) |
| C-c C-d v | show words in current file (with prefix, ask for vocab) |
|--------------------+------------------------------------------------------------|
- | C-c M-<, C-c C-d < | show callers of word or vocabulary at point |
+ | C-c M-< | show callers of word or vocabulary at point |
| | (fuel-show-callers, fuel-vocab-usage) |
- | C-c M->, C-c C-d> | show callees of word or vocabulary at point |
+ | C-c M-> | show callees of word or vocabulary at point |
| | (fuel-show-callees, fuel-vocab-uses) |
|--------------------+------------------------------------------------------------|
| C-c C-x s | extract innermost sexp (up to point) as a separate word |
;;; factor-mode.el -- mode for editing Factor source
-;; Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz
+;; Copyright (C) 2008, 2009, 2010 Jose Antonio Ortega Ruiz
;; See http://factorcode.org/license.txt for BSD license.
;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
(define-key map [?\]] 'factor-mode--insert-and-indent)
(define-key map [?}] 'factor-mode--insert-and-indent)
(define-key map "\C-m" 'newline-and-indent)
- (define-key map "\C-co" 'factor-mode-visit-other-file)
(define-key map "\C-c\C-o" 'factor-mode-visit-other-file)
map))
;;; fuel-debug.el -- debugging factor code
-;; Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz
+;; Copyright (C) 2008, 2009, 2010 Jose Antonio Ortega Ruiz
;; See http://factorcode.org/license.txt for BSD license.
;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
(require 'fuel-eval)
(require 'fuel-popup)
(require 'fuel-font-lock)
+(require 'fuel-menu)
(require 'fuel-base)
\f
(defvar fuel-debug-mode-map
(let ((map (make-keymap)))
(suppress-keymap map)
- (define-key map "g" 'fuel-debug-goto-error)
- (define-key map "\C-c\C-c" 'fuel-debug-goto-error)
- (define-key map "n" 'next-line)
- (define-key map "p" 'previous-line)
- (define-key map "u" 'fuel-debug-update-usings)
(dotimes (n 9)
(define-key map (vector (+ ?1 n))
`(lambda () (interactive)
`(lambda () (interactive) (fuel-debug-show--compiler-info ,(car ci)))))
map))
+(fuel-menu--defmenu fuel-debug fuel-debug-mode-map
+ ("Go to error" ("g" "\C-c\C-c") fuel-debug-goto-error)
+ ("Next line" "n" next-line)
+ ("Previous line" "p" previous-line)
+ ("Update USINGs" "u" fuel-debug-update-usings))
+
(defun fuel-debug-mode ()
"A major mode for displaying Factor's compilation results and
invoking restarts as needed.
(require 'fuel-syntax)
(require 'fuel-font-lock)
(require 'fuel-popup)
+(require 'fuel-menu)
(require 'fuel-base)
(require 'button)
(let ((map (make-sparse-keymap)))
(suppress-keymap map)
(set-keymap-parent map button-buffer-map)
- (define-key map "a" 'fuel-apropos)
- (define-key map "ba" 'fuel-help-bookmark-page)
- (define-key map "bb" 'fuel-help-display-bookmarks)
- (define-key map "bd" 'fuel-help-delete-bookmark)
- (define-key map "c" 'fuel-help-clean-history)
- (define-key map "e" 'fuel-help-edit)
- (define-key map "h" 'fuel-help)
- (define-key map "k" 'fuel-help-kill-page)
- (define-key map "n" 'fuel-help-next)
- (define-key map "l" 'fuel-help-previous)
- (define-key map "p" 'fuel-help-previous)
- (define-key map "r" 'fuel-help-refresh)
- (define-key map "v" 'fuel-help-vocab)
- (define-key map (kbd "SPC") 'scroll-up)
- (define-key map (kbd "S-SPC") 'scroll-down)
- (define-key map "\M-." 'fuel-edit-word-at-point)
- (define-key map "\C-c\C-z" 'run-factor)
map))
+(fuel-menu--defmenu fuel-help fuel-help-mode-map
+ ("Help on word..." "h" fuel-help)
+ ("Help on vocab..." "v" fuel-help-vocab)
+ ("Apropos..." "a" fuel-apropos)
+ --
+ ("Bookmark this page" "ba" fuel-help-bookmark-page)
+ ("Delete bookmark" "bd" fuel-help-delete-bookmark)
+ ("Show bookmarks..." "bb" fuel-help-display-bookmarks)
+ ("Clean browsing history" "c" fuel-help-clean-history)
+ --
+ ("Edit word at point" "\M-." fuel-edit-word-at-point)
+ ("Edit help file" "e" fuel-help-edit)
+ --
+ ("Next page" "n" fuel-help-next)
+ ("Previous page" ("p" "l") fuel-help-previous)
+ ("Refresh page" "r" fuel-help-refresh)
+ ("Kill page" "k" fuel-help-kill-page)
+ --
+ ("Scroll page up" ((kbd "SPC")) scroll-up)
+ ("Scroll page down" ((kbd "S-SPC")) scroll-down)
+ --
+ ("Switch to listener" "\C-c\C-z" run-factor))
+
\f
;;; IN: support
(require 'fuel-eval)
(require 'fuel-connection)
(require 'fuel-syntax)
+(require 'fuel-menu)
(require 'fuel-base)
(require 'comint)
(comint-write-input-ring)
(when (buffer-name (current-buffer))
(insert "\nBye bye. It's been nice listening to you!\n")
- (insert "Press C-cz to bring me back.\n" ))))))
+ (insert "Press C-c C-z to bring me back.\n" ))))))
(defun fuel-listener--history-setup ()
(set (make-local-variable 'comint-input-ring-file-name)
(fuel-listener--setup-completion)
(fuel-listener--setup-stack-mode))
-(define-key fuel-listener-mode-map "\C-c\C-z" 'run-factor)
(define-key fuel-listener-mode-map "\C-a" 'fuel-listener--bol)
-(define-key fuel-listener-mode-map "\C-c\C-a" 'fuel-autodoc-mode)
-(define-key fuel-listener-mode-map "\C-c\C-w" 'fuel-help)
-(define-key fuel-listener-mode-map "\C-c\C-r" 'fuel-refresh-all)
-(define-key fuel-listener-mode-map "\C-c\C-s" 'fuel-stack-mode)
-(define-key fuel-listener-mode-map "\C-c\C-p" 'fuel-apropos)
-(define-key fuel-listener-mode-map "\M-." 'fuel-edit-word-at-point)
-(define-key fuel-listener-mode-map "\C-c\C-v" 'fuel-edit-vocabulary)
-(define-key fuel-listener-mode-map "\C-c\C-k" 'fuel-run-file)
-(define-key fuel-listener-mode-map (kbd "TAB")
- 'fuel-completion--complete-symbol)
+
+(fuel-menu--defmenu listener fuel-listener-mode-map
+ ("Complete symbol" ((kbd "TAB") (kbd "M-TAB"))
+ fuel-completion--complete-symbol :enable (symbol-at-point))
+ ("Edit word definition" "\M-." fuel-edit-word-at-point
+ :enable (symbol-at-point))
+ ("Edit vocabulary" "\C-c\C-v" fuel-edit-vocabulary)
+ --
+ ("Word help" "\C-c\C-w" fuel-help)
+ ("Apropos" "\C-c\C-p" fuel-apropos)
+ (mode "Autodoc mode" "\C-c\C-a" fuel-autodoc-mode)
+ (mode "Show stack mode" "\C-c\C-s" fuel-stack-mode)
+ --
+ ("Run file" "\C-c\C-k" fuel-run-file)
+ ("Refresh vocabs" "\C-c\C-r" fuel-refresh-all))
+
+(define-key fuel-listener-mode-map [menu-bar completion] 'undefined)
\f
(provide 'fuel-listener)
--- /dev/null
+;;; fuel-menu.el -- menu utilities
+
+;; Copyright (c) 2010 Jose Antonio Ortega Ruiz
+;; See http://factorcode.org/license.txt for BSD license.
+
+;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
+;; Keywords: languages, fuel, factor
+;; Start date: Sat Jun 12, 2010 03:01
+\f
+
+(require 'fuel-base)
+
+\f
+;;; Top-level menu
+
+(defmacro fuel-menu--add-item (keymap map kd)
+ (cond ((or (eq '-- kd) (eq 'line kd)) `(fuel-menu--add-line ,map))
+ ((stringp (car kd)) `(fuel-menu--add-basic-item ,keymap ,map ,kd))
+ ((eq 'menu (car kd)) `(fuel-menu--add-submenu ,(cadr kd)
+ ,keymap ,map ,(cddr kd)))
+ ((eq 'custom (car kd)) `(fuel-menu--add-custom ,(nth 1 kd)
+ ,(nth 2 kd)
+ ,keymap
+ ,map))
+ ((eq 'mode (car kd)) `(fuel-menu--mode-toggle ,(nth 1 kd)
+ ,(nth 2 kd)
+ ,(nth 3 kd)
+ ,keymap
+ ,map))
+ (t (error "Bad item form: %s" kd))))
+
+(defmacro fuel-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 fuel-menu--add-items (keymap map keys)
+ `(progn ,@(mapcar (lambda (k) (list 'fuel-menu--add-item keymap map k))
+ (reverse keys))))
+
+(defmacro fuel-menu--add-submenu (name keymap map keys)
+ (let ((ev (make-symbol name))
+ (map2 (make-symbol "map2")))
+ `(progn
+ (let ((,map2 (make-sparse-keymap ,name)))
+ (define-key ,map [,ev] (cons ,name ,map2))
+ (fuel-menu--add-items ,keymap ,map2 ,keys)))))
+
+(defvar fuel-menu--line-counter 0)
+
+(defun fuel-menu--add-line (&optional map)
+ (let ((line (make-symbol (format "line%s"
+ (setq fuel-menu--line-counter
+ (1+ fuel-menu--line-counter))))))
+ (define-key (or map global-map) `[,line]
+ `(menu-item "--single-line"))))
+
+(defmacro fuel-menu--add-custom (title group keymap map)
+ `(fuel-menu--add-item ,keymap ,map
+ (,title nil (lambda () (interactive) (customize-group ',group)))))
+
+(defmacro fuel-menu--mode-toggle (title bindings mode keymap map)
+ `(fuel-menu--add-item ,keymap ,map
+ (,title ,bindings ,mode
+ :button (:toggle . (and (boundp ',mode) ,mode)))))
+
+(defmacro fuel-menu--defmenu (name keymap &rest keys)
+ (let ((mmap (make-symbol "mmap")))
+ `(progn
+ (let ((,mmap (make-sparse-keymap "FUEL")))
+ (define-key ,keymap [menu-bar ,name] (cons "FUEL" ,mmap))
+ (define-key ,mmap [customize]
+ (cons "Customize FUEL"
+ `(lambda () (interactive) (customize-group 'fuel))))
+ (fuel-menu--add-line ,mmap)
+ (fuel-menu--add-items ,keymap ,mmap ,keys)
+ ,mmap))))
+
+(put 'fuel-menu--defmenu 'lisp-indent-function 2)
+
+
+\f
+(provide 'fuel-menu)
+;;; fuel-menu.el ends here
+
(require 'fuel-font-lock)
(require 'fuel-edit)
(require 'fuel-syntax)
+(require 'fuel-menu)
(require 'fuel-base)
\f
(fuel-scaffold--maybe-insert))))
\f
-;;; Keys:
-
-(defun fuel-mode--key-1 (k c)
- (define-key fuel-mode-map (vector '(control ?c) `(control ,k)) c))
-
-(defun fuel-mode--key (p k c)
- (define-key fuel-mode-map (vector '(control ?c) `(control ,p) k) c)
- (define-key fuel-mode-map (vector '(control ?c) `(control ,p) `(control ,k)) c))
-
-(fuel-mode--key-1 ?k 'fuel-run-file)
-(fuel-mode--key-1 ?l 'fuel-run-file)
-(fuel-mode--key-1 ?r 'fuel-refresh-all)
-(fuel-mode--key-1 ?t 'fuel-test-vocab)
-(fuel-mode--key-1 ?z 'run-factor)
-(fuel-mode--key-1 ?s 'fuel-switch-to-buffer)
-(define-key fuel-mode-map "\C-x4s" 'fuel-switch-to-buffer-other-window)
-(define-key fuel-mode-map "\C-x5s" 'fuel-switch-to-buffer-other-frame)
-
-(define-key fuel-mode-map "\C-\M-x" 'fuel-eval-definition)
-(define-key fuel-mode-map "\C-\M-r" 'fuel-eval-extended-region)
-(define-key fuel-mode-map "\M-." 'fuel-edit-word-at-point)
-(define-key fuel-mode-map "\M-," 'fuel-edit-pop-edit-word-stack)
-(define-key fuel-mode-map "\C-c\M-<" 'fuel-show-callers)
-(define-key fuel-mode-map "\C-c\M->" 'fuel-show-callees)
-(define-key fuel-mode-map (kbd "M-TAB") 'fuel-completion--complete-symbol)
-
-(fuel-mode--key ?e ?d 'fuel-edit-word-doc-at-point)
-(fuel-mode--key ?e ?e 'fuel-eval-extended-region)
-(fuel-mode--key ?e ?k 'fuel-run-file)
-(fuel-mode--key ?e ?l 'fuel-load-usings)
-(fuel-mode--key ?e ?r 'fuel-eval-region)
-(fuel-mode--key ?e ?u 'fuel-update-usings)
-(fuel-mode--key ?e ?v 'fuel-edit-vocabulary)
-(fuel-mode--key ?e ?w 'fuel-edit-word)
-(fuel-mode--key ?e ?x 'fuel-eval-definition)
-
-(fuel-mode--key ?x ?a 'fuel-refactor-extract-article)
-(fuel-mode--key ?x ?i 'fuel-refactor-inline-word)
-(fuel-mode--key ?x ?g 'fuel-refactor-make-generic)
-(fuel-mode--key ?x ?r 'fuel-refactor-extract-region)
-(fuel-mode--key ?x ?s 'fuel-refactor-extract-sexp)
-(fuel-mode--key ?x ?v 'fuel-refactor-extract-vocab)
-(fuel-mode--key ?x ?w 'fuel-refactor-rename-word)
-
-(fuel-mode--key ?d ?> 'fuel-show-callees)
-(fuel-mode--key ?d ?< 'fuel-show-callers)
-(fuel-mode--key ?d ?v 'fuel-show-file-words)
-(fuel-mode--key ?d ?a 'fuel-autodoc-mode)
-(fuel-mode--key ?d ?p 'fuel-apropos)
-(fuel-mode--key ?d ?d 'fuel-help)
-(fuel-mode--key ?d ?e 'fuel-stack-effect-sexp)
-(fuel-mode--key ?d ?s 'fuel-help-short)
+;;; Keys and menu:
+
+(fuel-menu--defmenu fuel fuel-mode-map
+ ("Complete symbol" ((kbd "M-TAB"))
+ fuel-completion--complete-symbol :enable (symbol-at-point))
+ ("Update USING:" ("\C-c\C-e\C-u" "\C-c\C-eu") fuel-update-usings)
+ --
+ ("Eval definition" ("\C-\M-x" "\C-c\C-e\C-x" "\C-c\C-ex")
+ fuel-eval-definition)
+ ("Eval extended region" ("\C-\M-r" "\C-c\C-e\C-e" "\C-c\C-ee")
+ fuel-eval-extended-region :enable mark-active)
+ ("Eval region" ("\C-c\C-r" "\C-c\C-e\C-r" "\C-c\C-er")
+ fuel-eval-region :enable mark-active)
+ --
+ ("Edit word at point" ("\M-." "\C-c\C-e\C-d" "\C-c\C-ed")
+ fuel-edit-word-at-point :enable (symbol-at-point))
+ ("Edit word..." ("\C-c\C-e\C-w" "\C-c\C-ew") fuel-edit-word)
+ ("Edit vocab..." ("\C-c\C-e\C-v" "\C-c\C-ev") fuel-edit-vocabulary)
+ ("Jump back" "\M-," fuel-edit-pop-edit-word-stack)
+ --
+ ("Help on word" ("\C-c\C-d\C-d" "\C-c\C-dd") fuel-help)
+ ("Short help on word" ("\C-c\C-d\C-s" "\C-c\C-ds") fuel-help)
+ ("Apropos..." ("\C-c\C-d\C-p" "\C-c\C-dp") fuel-apropos)
+ ("Show stack effect" ("\C-c\C-d\C-e" "\C-c\C-de") fuel-stack-effect-sexp)
+ --
+ ("Show all words" ("\C-c\C-d\C-v" "\C-c\C-dv") fuel-show-file-words)
+ ("Word callers" "\C-c\M-<" fuel-show-callers :enable (symbol-at-point))
+ ("Word callees" "\C-c\M->" fuel-show-callees :enable (symbol-at-point))
+ (mode "Autodoc mode" ("\C-c\C-d\C-a" "\C-c\C-da") fuel-autodoc-mode)
+ --
+ (menu "Refactor"
+ ("Rename word" ("\C-c\C-x\C-w" "\C-c\C-xw") fuel-refactor-rename-word)
+ ("Inline word" ("\C-c\C-x\C-i" "\C-c\C-xi") fuel-refactor-inline-word)
+ ("Extract region" ("\C-c\C-x\C-r" "\C-c\C-xr")
+ fuel-refactor-extract-region :enable mark-active)
+ ("Extract subregion" ("\C-c\C-x\C-s" "\C-c\C-xs")
+ fuel-refactor-extract-sexp)
+ ("Extract vocab" ("\C-c\C-x\C-v" "\C-c\C-xv")
+ fuel-refactor-extract-vocab)
+ ("Make generic" ("\C-c\C-x\C-g" "\C-c\C-xg")
+ fuel-refactor-make-generic)
+ --
+ ("Extract article" ("\C-c\C-x\C-a" "\C-c\C-xa")
+ fuel-refactor-extract-article))
+ --
+ ("Load used vocabs" ("\C-c\C-e\C-l" "\C-c\C-el") fuel-load-usings)
+ ("Run file" ("\C-c\C-k" "\C-c\C-l" "\C-c\C-e\C-k") fuel-run-file)
+ ("Run unit tests" "\C-c\C-t" fuel-test-vocab)
+ ("Refresh vocabs" "\C-c\C-r" fuel-refresh-all)
+ --
+ (menu "Switch to"
+ ("Listener" "\C-c\C-z" run-factor)
+ ("Related Factor file" "\C-c\C-o" factor-mode-visit-other-file)
+ ("Other Factor buffer" "\C-c\C-s" fuel-switch-to-buffer)
+ ("Other Factor buffer other window" "\C-x4s"
+ fuel-switch-to-buffer-other-window)
+ ("Other Factor buffer other frame" "\C-x5s"
+ fuel-switch-to-buffer-other-frame)))
\f
(provide 'fuel-mode)
;;; fuel-xref.el -- showing cross-reference info
-;; Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz
+;; Copyright (C) 2008, 2009, 2010 Jose Antonio Ortega Ruiz
;; See http://factorcode.org/license.txt for BSD license.
;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
(require 'fuel-syntax)
(require 'fuel-popup)
(require 'fuel-font-lock)
+(require 'fuel-menu)
(require 'fuel-base)
(require 'button)
(set-syntax-table fuel-syntax--syntax-table)
(setq mode-name "FUEL Xref")
(setq major-mode 'fuel-xref-mode)
- (font-lock-add-keywords nil '(("(in \\(.+\\))" 1 'fuel-font-lock-xref-vocab)))
+ (font-lock-add-keywords nil
+ '(("(in \\(.+\\))" 1 'fuel-font-lock-xref-vocab)))
(setq buffer-read-only t))
\f