! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs combinators help help.crossref
-help.markup help.topics io io.streams.string kernel make memoize
-namespaces parser prettyprint sequences summary tools.vocabs
-tools.vocabs.browser vocabs vocabs.loader words ;
+help.markup help.topics io io.streams.string kernel make namespaces
+parser prettyprint sequences summary tools.vocabs tools.vocabs.browser
+vocabs vocabs.loader words ;
IN: fuel.help
<PRIVATE
-MEMO: fuel-find-word ( name -- word/f )
+: fuel-find-word ( name -- word/f )
[ [ name>> ] dip = ] curry all-words swap filter
dup empty? not [ first ] [ drop f ] if ;
: (fuel-vocab-help) ( name -- str )
dup empty? [ fuel-vocab-children-help ] [ (fuel-vocab-element) ] if ;
-MEMO: (fuel-get-vocabs/author) ( author -- element )
+: (fuel-get-vocabs/author) ( author -- element )
[ "Vocabularies by " prepend \ $heading swap 2array ]
[ authored fuel-vocab-list ] bi 2array ;
-MEMO: (fuel-get-vocabs/tag) ( tag -- element )
+: (fuel-get-vocabs/tag) ( tag -- element )
[ "Vocabularies tagged " prepend \ $heading swap 2array ]
[ tagged fuel-vocab-list ] bi 2array ;
<PRIVATE
: fuel-maybe-scape ( ch -- seq )
- dup "\\\"?#()[]'`" member? [ CHAR: \ swap 2array ] [ 1array ] if ;
+ dup "\\\"?#()[]'`;" member? [ CHAR: \ swap 2array ] [ 1array ] if ;
SYMBOL: :restarts
factor image (overwriting the current one) with all the needed
vocabs.
+ Alternatively, you can add the following line to your
+ .factor-boot-rc file:
+
+ "fuel" require
+
+ This will ensure that the image generated while bootstrapping
+ Factor contains fuel and the vocabularies it depends on.
+
*** Connecting to a running Factor
'run-factor' starts a new factor listener process managed by Emacs.
| | (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:
(defun fuel-markup--notes (e)
(fuel-markup--elem-with-heading e "Notes"))
-(defun fuel-markup--see (e)
+(defun fuel-markup--word-info (e s)
(let* ((word (nth 1 e))
- (cmd (and word `(:fuel* (,(format "%s" word) fuel-word-see) "fuel" t)))
- (res (and cmd
- (fuel-eval--retort-result (fuel-eval--send/wait cmd 100)))))
+ (cmd (and word `(:fuel* ((:quote ,(format "%s" word)) ,s) "fuel")))
+ (ret (and cmd (fuel-eval--send/wait cmd)))
+ (res (and (not (fuel-eval--retort-error ret))
+ (fuel-eval--retort-output ret))))
(if res
(fuel-markup--code (list '$code res))
- (fuel-markup--snippet (list '$snippet word)))))
+ (fuel-markup--snippet (list '$snippet " " word)))))
-(defun fuel-markup--null (e))
+(defun fuel-markup--see (e)
+ (fuel-markup--word-info e 'see))
(defun fuel-markup--synopsis (e)
- (insert (format " %S " e)))
+ (fuel-markup--word-info e 'synopsis))
+
+(defun fuel-markup--null (e))
\f
(provide 'fuel-markup)
(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)
(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
(mark-defun)
(mark))))
\f
+;;; 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))))))
+
+\f
(provide 'fuel-refactor)
;;; fuel-refactor.el ends here
"PREDICATE" "PRIMITIVE"
"UNION"))
-(defconst fuel-syntax--no-indent-def-starts '("SINGLETONS"
+(defconst fuel-syntax--no-indent-def-starts '("ARTICLE"
+ "HELP"
+ "SINGLETONS"
"SYMBOLS"
"TUPLE"
"VARS"))
(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:"