diff --git a/basis/regexp/regexp-tests.factor b/basis/regexp/regexp-tests.factor index 6fc21be19c..c2f7bb5bc6 100644 --- a/basis/regexp/regexp-tests.factor +++ b/basis/regexp/regexp-tests.factor @@ -302,6 +302,8 @@ IN: regexp-tests [ "1.2.3.4" ] [ "1ABC2DEF3GHI4JK" R/ [A-Z]+/ "." re-replace ] unit-test +[ "-- title --" ] [ "== title ==" "=" "-" re-replace ] unit-test + /* ! FIXME [ f ] [ "ab" "a(?!b)" first-match ] unit-test diff --git a/misc/fuel/README b/misc/fuel/README index 69e5a98299..cf96e29f52 100644 --- a/misc/fuel/README +++ b/misc/fuel/README @@ -1,4 +1,4 @@ -FUEL, Factor's Ultimate Emacs Library -*- org -*- +FUEL, Factor's Ultimate Emacs Library ------------------------------------- FUEL provides a complete environment for your Factor coding pleasure @@ -29,47 +29,46 @@ beast. * Basic usage *** Running the listener - If you're using the default factor binary and images locations inside - the Factor's source tree, that should be enough to start using FUEL. - Editing any file with the extension .factor will put you in - factor-mode; try C-hm for a summary of available commands. + If you're using the default factor binary and images locations inside + the Factor's source tree, that should be enough to start using FUEL. + Editing any file with the extension .factor will put you in + factor-mode; try C-hm for a summary of available commands. - To start the listener, try M-x run-factor. + To start the listener, try M-x run-factor. - By default, FUEL will try to use the binary and image files in the - factor installation directory. You can customize them with: + By default, FUEL will try to use the binary and image files in the + factor installation directory. You can customize them with: (setq fuel-listener-factor-binary ) (setq fuel-listener-factor-image ) - Many aspects of the environment can be customized: - M-x customize-group fuel will show you how many. + Many aspects of the environment can be customized: + M-x customize-group fuel will show you how many. *** Faster listener startup - On startup, run-factor loads the fuel vocabulary, which can take a - while. If you want to speedup the load process, type 'save' in the - listener prompt just after invoking run-factor. This will save a - factor image (overwriting the current one) with all the needed - vocabs. + On startup, run-factor loads the fuel vocabulary, which can take a + while. If you want to speedup the load process, type 'save' in the + listener prompt just after invoking run-factor. This will save a + factor image (overwriting the current one) with all the needed + vocabs. *** Connecting to a running Factor - 'run-factor' starts a new factor listener process managed by Emacs. - If you prefer to start Factor externally, you can also connect - remotely from Emacs. Here's how to proceed: + 'run-factor' starts a new factor listener process managed by Emacs. + If you prefer to start Factor externally, you can also connect + remotely from Emacs. Here's how to proceed: - - In the factor listener, run FUEL: - "fuel" run - This will start a server listener in port 9000. - - Switch to Emacs and issue the command 'M-x connect-to-factor'. + - In the factor listener, run FUEL: "fuel" run + This will start a server listener in port 9000. + - Switch to Emacs and issue the command 'M-x connect-to-factor'. That's it; you should be up and running. See the help for 'connect-to-factor' for how to use a different port. *** Vocabulary creation - FUEL offers a basic interface with Factor's scaffolding utilities. + FUEL offers a basic interface to Factor's scaffolding utilities. To create a new vocabulary directory and associated files: M-x fuel-scaffold-vocab @@ -81,91 +80,107 @@ beast. * Quick key reference - (Triple chords ending in a single letter accept also C- (e.g. - C-cC-eC-r is the same as C-cC-er)). + Triple chords ending in a single letter accept also C- (e.g. + C-cC-eC-r is the same as C-cC-er). *** In factor source files: - - C-cz : switch to listener - - C-co : cycle between code, tests and docs factor files - - C-cs : switch to other factor buffer (M-x fuel-switch-to-buffer) - - C-cr : switch to listener and refresh all loaded vocabs - - C-x4s : switch to other factor buffer in other window - - C-x5s : switch to other factor buffer in other frame + Commands in parenthesis can be invoked interactively with + M-x , not necessarily in a factor buffer. - - M-. : edit word at point in Emacs (see fuel-edit-word-method custom var) - - M-, : go back to where M-. was last invoked - - M-TAB : complete word at point - - C-cC-eu : update USING: line - - C-cC-ev : edit vocabulary (M-x fuel-edit-vocabulary) - - C-cC-ew : edit word (M-x fuel-edit-word-at-point) - - C-cC-ed : edit word's doc (M-x fuel-edit-word-at-point) - - - C-cC-er : eval region - - C-M-r, C-cC-ee : eval region, extending it to definition boundaries - - C-M-x, C-cC-ex : eval definition around point - - C-ck, C-cC-ek : run file - - - C-cC-da : toggle autodoc mode - - C-cC-dd : help for word at point - - C-cC-ds : short help word at point - - C-cC-de : show stack effect of current sexp (with prefix, region) - - C-cC-dp : find words containing given substring (M-x fuel-apropos) - - C-cC-dv : show words in current file (with prefix, ask for vocab) - - - C-cM-<, C-cC-d< : show callers of word or vocabulary at point - (M-x fuel-show-callers, M-x fuel-vocab-usage) - - C-cM->, C-cC-d> : show callees of word or vocabulary at point - (M-x fuel-show-callees, M-x fuel-vocab-uses) - - - C-cC-xs : extract innermost sexp (up to point) as a separate word - - C-cC-xr : extract region as a separate word - - C-cC-xi : replace word at point by its definition - - C-cC-xv : extract region as a separate vocabulary - - C-cC-xw : rename all uses of a word + |-----------------+------------------------------------------------------------| + | C-cz | switch to listener (run-factor) | + | C-co | cycle between code, tests and docs files | + | C-cr | switch to listener and refresh all loaded vocabs | + | C-cs | switch to other factor buffer (fuel-switch-to-buffer) | + | C-x4s | switch to other factor buffer in other window | + | C-x5s | switch to other factor buffer in other frame | + |-----------------+------------------------------------------------------------| + | M-. | edit word at point in Emacs (fuel-edit-word) | + | M-, | go back to where M-. was last invoked | + | M-TAB | complete word at point | + | C-cC-eu | update USING: line (fuel-update-usings) | + | C-cC-ev | edit vocabulary (fuel-edit-vocabulary) | + | C-cC-ew | edit word (fuel-edit-word-at-point) | + | C-cC-ed | edit word's doc (C-u M-x fuel-edit-word-doc-at-point) | + |-----------------+------------------------------------------------------------| + | C-cC-er | eval region | + | C-M-r, C-cC-ee | eval region, extending it to definition boundaries | + | C-M-x, C-cC-ex | eval definition around point | + | C-ck, C-cC-ek | run file (fuel-run-file) | + |-----------------+------------------------------------------------------------| + | C-cC-da | toggle autodoc mode (fuel-autodoc-mode) | + | C-cC-dd | help for word at point (fuel-help) | + | C-cC-ds | short help word at point (fuel-help-short) | + | C-cC-de | show stack effect of current sexp (with prefix, region) | + | C-cC-dp | find words containing given substring (fuel-apropos) | + | C-cC-dv | show words in current file (with prefix, ask for vocab) | + |-----------------+------------------------------------------------------------| + | C-cM-<, C-cC-d< | show callers of word or vocabulary at point | + | | (fuel-show-callers, fuel-vocab-usage) | + | C-cM->, C-cC-d> | show callees of word or vocabulary at point | + | | (fuel-show-callees, fuel-vocab-uses) | + |-----------------+------------------------------------------------------------| + | C-cC-xs | extract innermost sexp (up to point) as a separate word | + | | (fuel-refactor-extract-sexp) | + | C-cC-xr | extract region as a separate word | + | | (fuel-refactor-extract-region) | + | C-cC-xv | extract region as a separate vocabulary | + | | (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) | + |-----------------+------------------------------------------------------------| *** In the listener: - - TAB : complete word at point - - M-. : edit word at point in Emacs - - C-cr : refresh all loaded vocabs - - C-ca : toggle autodoc mode - - C-cp : find words containing given substring (M-x fuel-apropos) - - C-cs : toggle stack mode - - C-cv : edit vocabulary - - C-ch : help for word at point - - C-ck : run file + |------+----------------------------------------------------------| + | TAB | complete word at point | + | M-. | edit word at point in Emacs | + | C-cr | refresh all loaded vocabs | + | C-ca | toggle autodoc mode | + | C-cp | find words containing given substring (M-x fuel-apropos) | + | C-cs | toggle stack mode | + | C-cv | edit vocabulary | + | C-ch | help for word at point | + | C-ck | run file | + |------+----------------------------------------------------------| *** In the debugger (it pops up upon eval/compilation errors): - - g : go to error - - : invoke nth restart - - w/e/l : invoke :warnings, :errors, :linkage - - q : bury buffer + |---------+-------------------------------------| + | g | go to error | + | | invoke nth restart | + | w/e/l | invoke :warnings, :errors, :linkage | + | q | bury buffer | + |---------+-------------------------------------| *** In the help browser: - - h : help for word at point - - v : help for a vocabulary - - a : find words containing given substring (M-x fuel-apropos) - - e : edit current article - - ba : bookmark current page - - bb : display bookmarks - - bd : delete bookmark at point - - n/p : next/previous page - - l : previous page - - SPC/S-SPC : scroll up/down - - TAB/S-TAB : next/previous link - - k : kill current page and go to previous or next - - r : refresh page - - c : clean browsing history - - M-. : edit word at point in Emacs - - C-cz : switch to listener - - q : bury buffer + |-----------+----------------------------------------------------------| + | h | help for word at point | + | v | help for a vocabulary | + | a | find words containing given substring (M-x fuel-apropos) | + | e | edit current article | + | ba | bookmark current page | + | bb | display bookmarks | + | bd | delete bookmark at point | + | n/p | next/previous page | + | l | previous page | + | SPC/S-SPC | scroll up/down | + | TAB/S-TAB | next/previous link | + | k | kill current page and go to previous or next | + | r | refresh page | + | c | clean browsing history | + | M-. | edit word at point in Emacs | + | C-cz | switch to listener | + | q | bury buffer | + |-----------+----------------------------------------------------------| *** In crossref buffers - - TAB/BACKTAB : navigate links - - RET/mouse click : follow link - - h : show help for word at point - - q : bury buffer + |-----------------+-----------------------------| + | TAB/BACKTAB | navigate links | + | RET/mouse click | follow link | + | h | show help for word at point | + | q | bury buffer | + |-----------------+-----------------------------| diff --git a/misc/fuel/fuel-eval.el b/misc/fuel/fuel-eval.el index 4c34ef17b8..9e8210a3e3 100644 --- a/misc/fuel/fuel-eval.el +++ b/misc/fuel/fuel-eval.el @@ -32,6 +32,7 @@ (case (car sexp) (:array (factor--seq 'V{ '} (cdr sexp))) (:seq (factor--seq '{ '} (cdr sexp))) + (:tuple (factor--seq 'T{ '} (cdr sexp))) (:quote (format "\\ %s" (factor `(:factor ,(cadr sexp))))) (:quotation (factor--seq '\[ '\] (cdr sexp))) (:using (factor `(USING: ,@(cdr sexp) :end))) diff --git a/misc/fuel/fuel-font-lock.el b/misc/fuel/fuel-font-lock.el index 4b3607b96d..86ae94fe8a 100644 --- a/misc/fuel/fuel-font-lock.el +++ b/misc/fuel/fuel-font-lock.el @@ -79,11 +79,15 @@ (save-excursion (goto-char (nth 8 state)) (beginning-of-line) - (cond ((looking-at "USING: ") 'factor-font-lock-vocabulary-name) + (cond ((looking-at "USING: ") + 'factor-font-lock-vocabulary-name) ((looking-at "\\(TUPLE\\|SYMBOLS\\|VARS\\): ") 'factor-font-lock-symbol) + ((looking-at "C-ENUM:\\( \\|\n\\)") + 'factor-font-lock-constant) (t 'default)))) - ((char-equal c ?U) 'factor-font-lock-parsing-word) + ((or (char-equal c ?U) (char-equal c ?C)) + 'factor-font-lock-parsing-word) ((char-equal c ?\() 'factor-font-lock-stack-effect) ((char-equal c ?\") 'factor-font-lock-string) (t 'factor-font-lock-comment))))) @@ -91,6 +95,8 @@ (defconst fuel-font-lock--font-lock-keywords `((,fuel-syntax--stack-effect-regex . 'factor-font-lock-stack-effect) (,fuel-syntax--brace-words-regex 1 'factor-font-lock-parsing-word) + (,fuel-syntax--alien-function-regex (1 'factor-font-lock-type-name) + (2 'factor-font-lock-word)) (,fuel-syntax--vocab-ref-regexp 2 'factor-font-lock-vocabulary-name) (,fuel-syntax--constructor-decl-regex (1 'factor-font-lock-word) (2 'factor-font-lock-type-name) @@ -119,7 +125,7 @@ (,fuel-syntax--getter-regex . 'factor-font-lock-getter-word) (,fuel-syntax--symbol-definition-regex 2 'factor-font-lock-symbol) (,fuel-syntax--bad-string-regex . 'factor-font-lock-invalid-syntax) - ("\\(P\\|SBUF\\)\"" 1 'factor-font-lock-parsing-word) + ("\\_<\\(P\\|SBUF\\|DLL\\)\"" 1 'factor-font-lock-parsing-word) (,fuel-syntax--parsing-words-regex . 'factor-font-lock-parsing-word))) (defun fuel-font-lock--font-lock-setup (&optional keywords no-syntax) diff --git a/misc/fuel/fuel-markup.el b/misc/fuel/fuel-markup.el index 6a374cd5c8..7a8fa0c234 100644 --- a/misc/fuel/fuel-markup.el +++ b/misc/fuel/fuel-markup.el @@ -156,7 +156,7 @@ (defvar fuel-markup--maybe-nl nil)) (defun fuel-markup--print (e) - (cond ((null e)) + (cond ((null e) (insert "f")) ((stringp e) (fuel-markup--insert-string e)) ((and (listp e) (symbolp (car e)) (assoc (car e) fuel-markup--printers)) @@ -253,8 +253,12 @@ (insert (cadr e)))) (defun fuel-markup--snippet (e) - (let ((snip (format "%s" (cadr e)))) - (insert (fuel-font-lock--factor-str snip)))) + (insert (mapconcat '(lambda (s) + (if (stringp s) + (fuel-font-lock--factor-str s) + (fuel-markup--print-str s))) + (cdr e) + " "))) (defun fuel-markup--code (e) (fuel-markup--insert-nl-if-nb) @@ -285,7 +289,7 @@ (fuel-markup--snippet (cons '$snippet (cdr e)))) (defun fuel-markup--link (e) - (let* ((link (nth 1 e)) + (let* ((link (or (nth 1 e) 'f)) (type (or (nth 3 e) (if (symbolp link) 'word 'article))) (label (or (nth 2 e) (and (eq type 'article) diff --git a/misc/fuel/fuel-syntax.el b/misc/fuel/fuel-syntax.el index 6f33eb2993..a095e70256 100644 --- a/misc/fuel/fuel-syntax.el +++ b/misc/fuel/fuel-syntax.el @@ -43,16 +43,17 @@ ;;; Regexps galore: (defconst fuel-syntax--parsing-words - '(":" "::" ";" "<<" ">" - "ABOUT:" "ALIAS:" "ARTICLE:" + '(":" "::" ";" "&:" "<<" ">" + "ABOUT:" "ALIAS:" "ALIEN:" "ARTICLE:" "B" "BIN:" - "C:" "C-STRUCT:" "C-UNION:" "CHAR:" "CONSTANT:" "call-next-method" + "C:" "C-ENUM:" "C-STRUCT:" "C-UNION:" "CHAR:" "CONSTANT:" "call-next-method" "DEFER:" "ERROR:" "EXCLUDE:" - "f" "FORGET:" "FROM:" + "f" "FORGET:" "FROM:" "FUNCTION:" "GENERIC#" "GENERIC:" "HELP:" "HEX:" "HOOK:" "IN:" "initial:" "INSTANCE:" "INTERSECTION:" + "LIBRARY:" "M:" "MACRO:" "MACRO::" "MAIN:" "MATH:" "MEMO:" "MEMO:" "METHOD:" "MIXIN:" "OCT:" "POSTPONE:" "PREDICATE:" "PRIMITIVE:" "PRIVATE>" "PROVIDE:" @@ -117,10 +118,11 @@ '("IN:" "USE:" "FROM:" "EXCLUDE:" "QUALIFIED:" "QUALIFIED-WITH:"))) (defconst fuel-syntax--int-constant-def-regex - (fuel-syntax--second-word-regex '("CHAR:" "BIN:" "HEX:" "OCT:"))) + (fuel-syntax--second-word-regex '("ALIEN:" "CHAR:" "BIN:" "HEX:" "OCT:"))) (defconst fuel-syntax--type-definition-regex - (fuel-syntax--second-word-regex '("MIXIN:" "TUPLE:" "SINGLETON:" "UNION:"))) + (fuel-syntax--second-word-regex + '("C-STRUCT:" "C-UNION:" "MIXIN:" "TUPLE:" "SINGLETON:" "UNION:"))) (defconst fuel-syntax--tuple-decl-regex "^TUPLE: +\\([^ \n]+\\) +< +\\([^ \n]+\\)\\_>") @@ -131,7 +133,7 @@ (defconst fuel-syntax--setter-regex "\\_<>>.+?\\_>") (defconst fuel-syntax--symbol-definition-regex - (fuel-syntax--second-word-regex '("SYMBOL:" "VAR:"))) + (fuel-syntax--second-word-regex '("&:" "SYMBOL:" "VAR:"))) (defconst fuel-syntax--stack-effect-regex "\\( ( .* )\\)\\|\\( (( .* ))\\)") @@ -144,8 +146,12 @@ (defconst fuel-syntax--sub-vocab-regex "^<\\([^ \n]+\\) *$") +(defconst fuel-syntax--alien-function-regex + "\\_" "b")) (" \\((\\) \\([^\n]*\\) \\()\\)\\( \\|\n\\)" (1 "b")) ;; Strings + ("\\( \\|^\\)\\(DLL\\|P\\|SBUF\\)\\(\"\\)[^\n\r\f]*\\(\"\\)\\( \\|\n\\)" + (3 "\"") (4 "\"")) ("\\( \\|^\\)\\(\"\\)[^\n\r\f]*\\(\"\\)\\( \\|\n\\)" (2 "\"") (3 "\"")) ("\\_<<\\(\"\\)\\_>" (1 "\\_>" (1 ">b")) ;; Multiline constructs ("\\_<\\(U\\)SING: \\(;\\)" (1 "b")) ("\\_b")) + ("\\_\\)" (2 "