From 47ef542e92c1faffa536c4680e97e19a506184ae Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Mon, 24 Nov 2008 10:18:47 +0100 Subject: [PATCH 1/2] Emacs factor mode: defun and sexp navigation are aware of word definition syntax. --- misc/factor.el | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/misc/factor.el b/misc/factor.el index 3c5b6bb544..c8e637f268 100644 --- a/misc/factor.el +++ b/misc/factor.el @@ -204,7 +204,7 @@ buffer." (defconst factor--regex-using-line "^USING: +\\([^;]*\\);") (defconst factor--regex-use-line "^USE: +\\(.*\\)$") -(defconst factor-font-lock-keywords +(defconst factor--font-lock-keywords `(("( .* )" . 'factor-font-lock-stack-effect) ("\\(P\\|SBUF\\)\"" 1 'factor-font-lock-parsing-word) ,@(mapcar #'(lambda (w) (cons (concat "\\(^\\| \\)\\(" w "\\)\\($\\| \\)") @@ -502,17 +502,25 @@ buffer." (use-local-map factor-mode-map) (setq major-mode 'factor-mode) (setq mode-name "Factor") + ;; Font locking (set (make-local-variable 'comment-start) "! ") + (set (make-local-variable 'parse-sexp-lookup-properties) t) (set (make-local-variable 'font-lock-comment-face) 'factor-font-lock-comment) (set (make-local-variable 'font-lock-string-face) 'factor-font-lock-string) (set (make-local-variable 'font-lock-defaults) - `(factor-font-lock-keywords + `(factor--font-lock-keywords nil nil nil nil (font-lock-syntactic-keywords . ,factor--font-lock-syntactic-keywords))) + (set-syntax-table factor-mode-syntax-table) + ;; Defun navigation + (setq defun-prompt-regexp "[^ :]+") + (set (make-local-variable 'open-paren-in-column-0-is-defun-start) t) + ;; Indentation (set (make-local-variable 'indent-line-function) 'factor--indent-line) (setq factor-indent-width (factor--guess-indent-width)) (setq indent-tabs-mode nil) + (run-hooks 'factor-mode-hook)) (add-to-list 'auto-mode-alist '("\\.factor\\'" . factor-mode)) @@ -568,6 +576,7 @@ buffer." "Generic word contract" "Inputs and outputs" "Parent topics:" + "See also" "Syntax" "Vocabulary" "Warning" @@ -578,7 +587,7 @@ buffer." (defconst factor--help-font-lock-keywords `((,factor--help-headlines-regexp . 'factor-font-lock-help-mode-headlines) - ,@factor-font-lock-keywords)) + ,@factor--font-lock-keywords)) (defun factor-help-mode () "Major mode for displaying Factor help messages. @@ -591,6 +600,7 @@ buffer." (set (make-local-variable 'font-lock-defaults) '(factor--help-font-lock-keywords t nil nil nil)) (set (make-local-variable 'comint-redirect-subvert-readonly) t) + (set (make-local-variable 'comint-redirect-echo-input) nil) (set (make-local-variable 'view-no-disable-on-exit) t) (view-mode) (setq view-exit-action @@ -602,11 +612,11 @@ buffer." (run-mode-hooks 'factor-help-mode-hook)) (defun factor--listener-help-buffer () - (set-buffer (get-buffer-create "*factor-help*")) - (let ((inhibit-read-only t)) - (delete-region (point-min) (point-max))) - (factor-help-mode) - (current-buffer)) + (with-current-buffer (get-buffer-create "*factor-help*") + (let ((inhibit-read-only t)) + (delete-region (point-min) (point-max))) + (factor-help-mode) + (current-buffer))) (defvar factor--help-history nil) @@ -622,7 +632,8 @@ buffer." (hb (factor--listener-help-buffer)) (proc (factor--listener-process))) (comint-redirect-send-command-to-process cmd hb proc nil) - (pop-to-buffer hb))) + (pop-to-buffer hb) + (beginning-of-buffer hb))) (defun factor-see () (interactive) From c4f8da0510390935d4debdcc038ce102335197c4 Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Mon, 24 Nov 2008 22:44:05 +0100 Subject: [PATCH 2/2] Emacs factor mode: better defaults for font-lock faces. --- misc/factor.el | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/misc/factor.el b/misc/factor.el index c8e637f268..6c9faf50c9 100644 --- a/misc/factor.el +++ b/misc/factor.el @@ -109,49 +109,47 @@ buffer." :group 'factor :group 'faces) -(defsubst factor--face (face) `((t ,(face-attr-construct face)))) - -(defface factor-font-lock-parsing-word (factor--face font-lock-keyword-face) +(defface factor-font-lock-parsing-word (face-default-spec font-lock-keyword-face) "Face for parsing words." :group 'factor-faces) -(defface factor-font-lock-comment (factor--face font-lock-comment-face) +(defface factor-font-lock-comment (face-default-spec font-lock-comment-face) "Face for comments." :group 'factor-faces) -(defface factor-font-lock-string (factor--face font-lock-string-face) +(defface factor-font-lock-string (face-default-spec font-lock-string-face) "Face for strings." :group 'factor-faces) -(defface factor-font-lock-stack-effect (factor--face font-lock-comment-face) +(defface factor-font-lock-stack-effect (face-default-spec font-lock-comment-face) "Face for stack effect specifications." :group 'factor-faces) -(defface factor-font-lock-word-definition (factor--face font-lock-function-name-face) +(defface factor-font-lock-word-definition (face-default-spec font-lock-function-name-face) "Face for word, generic or method being defined." :group 'factor-faces) -(defface factor-font-lock-symbol-definition (factor--face font-lock-variable-name-face) +(defface factor-font-lock-symbol-definition (face-default-spec font-lock-variable-name-face) "Face for name of symbol being defined." :group 'factor-faces) -(defface factor-font-lock-vocabulary-name (factor--face font-lock-constant-face) +(defface factor-font-lock-vocabulary-name (face-default-spec font-lock-constant-face) "Face for names of vocabularies in USE or USING." :group 'factor-faces) -(defface factor-font-lock-type-definition (factor--face font-lock-type-face) +(defface factor-font-lock-type-definition (face-default-spec font-lock-type-face) "Face for type (tuple) names." :group 'factor-faces) -(defface factor-font-lock-constructor (factor--face font-lock-type-face) +(defface factor-font-lock-constructor (face-default-spec font-lock-type-face) "Face for constructors ()." :group 'factor-faces) -(defface factor-font-lock-setter-word (factor--face font-lock-function-name-face) +(defface factor-font-lock-setter-word (face-default-spec font-lock-function-name-face) "Face for setter words (>>foo)." :group 'factor-faces) -(defface factor-font-lock-parsing-word (factor--face font-lock-keyword-face) +(defface factor-font-lock-parsing-word (face-default-spec font-lock-keyword-face) "Face for parsing words." :group 'factor-faces)