:type 'boolean
:group 'factor-mode)
-(defcustom factor-mode-cycle-insert-docs-p 'ask
- "Whether to insert documentation templates upon creation of doc
-file during cycling."
- :type '(choice (const :tag "Never" nil)
- (const :tag "Always" 'always)
- (const :tag "Ask me" 'ask)))
-
(defcustom factor-mode-use-fuel t
"Whether to use the full FUEL facilities in factor mode.
(defsubst factor-mode--cycling-setup ()
(setq factor-mode--cycling-no-ask nil))
-(defun factor-mode--other-file-doc-p (file)
- (let ((bn (file-name-nondirectory file)))
- (and (string-match "\\(.+\\)-docs.factor" bn)
+(defun factor-mode--code-file (kind &optional file)
+ (let* ((file (or file (buffer-file-name)))
+ (bn (file-name-nondirectory file)))
+ (and (string-match (format "\\(.+\\)-%s\\.factor$" kind) bn)
(expand-file-name (concat (match-string 1 bn) ".factor")
(file-name-directory file)))))
-(defun factor-mode--other-file-check-docs (file)
- (when (and factor-mode-cycle-insert-docs-p
- (boundp 'fuel-mode)
- fuel-mode)
- (let ((code-file (factor-mode--other-file-doc-p file)))
- (when (and code-file
- (or (eq factor-mode-cycle-insert-docs-p 'always)
- (y-or-n-p "Insert doc templates? ")))
- (save-excursion
- (set-buffer (find-file-noselect code-file))
- (fuel-scaffold-help))))))
+(defsubst factor-mode--in-docs (&optional file)
+ (factor-mode--code-file "docs"))
+
+(defsubst factor-mode--in-tests (&optional file)
+ (factor-mode--code-file "tests"))
(defun factor-mode-visit-other-file (&optional skip)
"Cycle between code, tests and docs factor files.
(interactive "P")
(let ((file (factor-mode--cycle-next (buffer-file-name) skip)))
(unless file (error "No other file found"))
- (unless (file-exists-p file)
- (factor-mode--other-file-check-docs file))
(find-file file)
(unless (file-exists-p file)
(set-buffer-modified-p t)
(let ((cmd '(:fuel* (vocab-roots get :get) "fuel")))
(fuel-eval--retort-result (fuel-eval--send/wait cmd))))
+(defun fuel-scaffold--dev-name ()
+ (or fuel-scaffold-developer-name
+ (let ((cmd '(:fuel* (developer-name get :get) "fuel")))
+ (fuel-eval--retort-result (fuel-eval--send/wait cmd)))
+ "Your name"))
+
+(defun fuel-scaffold--first-vocab ()
+ (goto-char (point-min))
+ (re-search-forward fuel-syntax--current-vocab-regex nil t))
+
+(defsubst fuel-scaffold--vocab (file)
+ (save-excursion
+ (set-buffer (find-file-noselect file))
+ (fuel-scaffold--first-vocab)
+ (fuel-syntax--current-vocab)))
+
+(defconst fuel-scaffold--tests-header-format
+ "! Copyright (C) %s %s
+! See http://factorcode.org/license.txt for BSD license.
+USING: %s tools.test ;
+IN: %s
+")
+
+(defsubst fuel-scaffold--check-auto (var)
+ (and var (or (eq var 'always) (y-or-n-p "Insert template? "))))
+
+(defun fuel-scaffold--tests (parent)
+ (when (and parent (fuel-scaffold--check-auto fuel-scaffold-test-autoinsert-p))
+ (let ((year (format-time-string "%Y"))
+ (name (fuel-scaffold--dev-name))
+ (vocab (fuel-scaffold--vocab parent)))
+ (insert (format fuel-scaffold--tests-header-format
+ year name vocab vocab))
+ t)))
+
+(defsubst fuel-scaffold--create-docs (vocab)
+ (let ((cmd `(:fuel* (,vocab ,fuel-scaffold-developer-name fuel-scaffold-help)
+ "fuel")))
+ (fuel-eval--send/wait cmd)))
+
+(defun fuel-scaffold--help (parent)
+ (when (and parent (fuel-scaffold--check-auto fuel-scaffold-help-autoinsert-p))
+ (let* ((ret (fuel-scaffold--create-docs (fuel-scaffold--vocab parent)))
+ (file (fuel-eval--retort-result ret)))
+ (when file
+ (revert-buffer t t t)
+ (when (and fuel-scaffold-help-header-only-p
+ (fuel-scaffold--first-vocab))
+ (delete-region (1+ (point)) (point-max))
+ (save-buffer))
+ (message "Inserting template ... done."))
+ (goto-char (point-min)))))
+
+(defun fuel-scaffold--maybe-insert ()
+ (ignore-errors
+ (or (fuel-scaffold--tests (factor-mode--in-tests))
+ (fuel-scaffold--help (factor-mode--in-docs)))))
+
\f
;;; User interface:
(interactive "P")
(let* ((vocab (or (and (not arg) (fuel-syntax--current-vocab))
(fuel-completion--read-vocab nil)))
- (cmd `(:fuel* (,vocab ,fuel-scaffold-developer-name fuel-scaffold-help)
- "fuel"))
- (ret (fuel-eval--send/wait cmd))
+ (ret (fuel-scaffold--create-docs vocab))
(file (fuel-eval--retort-result ret)))
(unless file
(error "Error creating help file" (car (fuel-eval--retort-error ret))))