diff --git a/misc/fuel/README b/misc/fuel/README index cf96e29f52..198c9bb275 100644 --- a/misc/fuel/README +++ b/misc/fuel/README @@ -129,6 +129,7 @@ beast. | | (fuel-refactor-extract-vocab) | | C-cC-xi | replace word by its definition (fuel-refactor-inline-word) | | C-cC-xw | rename all uses of a word (fuel-refactor-rename-word) | + | C-cC-xa | extract region as a separate ARTICLE: form | |-----------------+------------------------------------------------------------| *** In the listener: diff --git a/misc/fuel/fuel-mode.el b/misc/fuel/fuel-mode.el index 88ad73864a..504308fccd 100644 --- a/misc/fuel/fuel-mode.el +++ b/misc/fuel/fuel-mode.el @@ -198,6 +198,7 @@ interacting with a factor listener is at your disposal. (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 ?r 'fuel-refactor-extract-region) (fuel-mode--key ?x ?s 'fuel-refactor-extract-sexp) diff --git a/misc/fuel/fuel-refactor.el b/misc/fuel/fuel-refactor.el index 061adbb82c..bd62227755 100644 --- a/misc/fuel/fuel-refactor.el +++ b/misc/fuel/fuel-refactor.el @@ -78,17 +78,19 @@ (when found (setq result (fuel-refactor--reuse-p (car found))))) (and result found)))) +(defsubst fuel-refactor--insertion-point () + (max (save-excursion (fuel-syntax--beginning-of-defun) (point)) + (save-excursion + (re-search-backward fuel-syntax--end-of-def-regex nil t) + (forward-line 1) + (skip-syntax-forward "-")))) + (defun fuel-refactor--insert-word (word stack-effect code) - (let ((beg (save-excursion (fuel-syntax--beginning-of-defun) (point))) - (end (save-excursion - (re-search-backward fuel-syntax--end-of-def-regex nil t) - (forward-line 1) - (skip-syntax-forward "-")))) - (let ((start (goto-char (max beg end)))) - (open-line 1) - (insert ": " word " " stack-effect "\n" code " ;\n") - (indent-region start (point)) - (move-overlay fuel-stack--overlay start (point))))) + (let ((start (goto-char (fuel-refactor--insertion-point)))) + (open-line 1) + (insert ": " word " " stack-effect "\n" code " ;\n") + (indent-region start (point)) + (move-overlay fuel-stack--overlay start (point)))) (defun fuel-refactor--extract-other (start end code) (unwind-protect @@ -233,5 +235,30 @@ The region is extended to the closest definition boundaries." (mark-defun) (mark)))) +;;; Extract article: + +(defun fuel-refactor-extract-article (begin end) + "Extracts region as a new ARTICLE form." + (interactive "r") + (let ((topic (read-string "Article topic: ")) + (title (read-string "Article title: "))) + (kill-region begin end) + (insert (format "{ $subsection %s }\n" topic)) + (end-of-line 0) + (save-excursion + (goto-char (fuel-refactor--insertion-point)) + (open-line 1) + (let ((start (point))) + (insert (format "ARTICLE: %S %S\n" topic title)) + (yank) + (when (looking-at "^ *$") (end-of-line 0)) + (insert " ;") + (unwind-protect + (progn + (move-overlay fuel-stack--overlay start (point)) + (sit-for fuel-stack-highlight-period)) + (delete-overlay fuel-stack--overlay)))))) + + (provide 'fuel-refactor) ;;; fuel-refactor.el ends here diff --git a/misc/fuel/fuel-syntax.el b/misc/fuel/fuel-syntax.el index ad5a025a88..80bfd0afcb 100644 --- a/misc/fuel/fuel-syntax.el +++ b/misc/fuel/fuel-syntax.el @@ -158,7 +158,9 @@ "PREDICATE" "PRIMITIVE" "UNION")) -(defconst fuel-syntax--no-indent-def-starts '("SINGLETONS" +(defconst fuel-syntax--no-indent-def-starts '("ARTICLE" + "HELP" + "SINGLETONS" "SYMBOLS" "TUPLE" "VARS")) @@ -179,13 +181,12 @@ (defconst fuel-syntax--single-liner-regex (regexp-opt '("ABOUT:" - "ARTICLE:" "ALIAS:" "CONSTANT:" "C:" "DEFER:" "FORGET:" "GENERIC:" "GENERIC#" - "HELP:" "HEX:" "HOOK:" + "HEX:" "HOOK:" "IN:" "INSTANCE:" "LIBRARY:" "MAIN:" "MATH:" "MIXIN:"