FUEL: Automatic insertion of scaffolding in docs and test upon file creation.
parent
44cbe417b9
commit
a381d12b6d
|
@ -36,13 +36,6 @@ When set to false, you'll be asked only once."
|
|||
: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.
|
||||
|
||||
|
@ -233,23 +226,18 @@ code in the buffer."
|
|||
(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.
|
||||
|
@ -257,8 +245,6 @@ With prefix, non-existing files will be skipped."
|
|||
(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)
|
||||
|
|
|
@ -172,7 +172,10 @@ interacting with a factor listener is at your disposal.
|
|||
(when fuel-mode-autodoc-p (fuel-autodoc-mode fuel-mode))
|
||||
|
||||
(setq fuel-stack-mode-string "/S")
|
||||
(when fuel-mode-stack-p (fuel-stack-mode fuel-mode)))
|
||||
(when fuel-mode-stack-p (fuel-stack-mode fuel-mode))
|
||||
|
||||
(when (and fuel-mode (not (file-exists-p (buffer-file-name))))
|
||||
(fuel-scaffold--maybe-insert)))
|
||||
|
||||
|
||||
;;; Keys:
|
||||
|
|
|
@ -39,6 +39,64 @@
|
|||
(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)))))
|
||||
|
||||
|
||||
;;; User interface:
|
||||
|
||||
|
@ -73,9 +131,7 @@ You can configure `fuel-scaffold-developer-name' (set by default to
|
|||
(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))))
|
||||
|
|
Loading…
Reference in New Issue