Hi,
the attached version adds two features I have been missing,
stack-effect hinting and stack buffer (both realtime). I hope they
won't annoy anyone as they can't be disabled at the moment.
stack-effects will be displayed in the minibuffer area and status of
stack will be in the *factor-stack* buffer. For some reason I can't
get everything to play nicely when using the mode hooks so I use
define following function in my .emacs -file and run the function when
I start a factor-session.
(defun start-factor-ide ()
(interactive)
(split-window-vertically)
(other-window 1)
(run-factor)
(split-window-vertically))
that gives me one bigger window with the source code, two smaller ones
showing the repl and the stack.
- Sampo
;; Eduardo Cavazos - [EMAIL PROTECTED]
;;
;; fixed mode hooks, added stack-effect hinting and factor-stack buffer
;; - Sampo Vuori - [EMAIL PROTECTED]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Add these lines to your .emacs file:
;; (load-file "/scratch/repos/Factor/misc/factor.el")
;; (setq factor-binary "/scratch/repos/Factor/factor")
;; (setq factor-image "/scratch/repos/Factor/factor.image")
;; Of course, you'll have to edit the directory paths for your system
;; accordingly.
;; That's all you have to do to "install" factor.el on your
;; system. Whenever you edit a factor file, Emacs will know to switch
;; to Factor mode.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; M-x run-factor === Start a Factor listener inside Emacs
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BUG: A double quote character on a commented line will break the
;; syntax highlighting for that line.
(defgroup factor nil
"Factor mode"
:group 'languages)
(defvar factor-mode-syntax-table nil
"Syntax table used while in Factor mode.")
(if factor-mode-syntax-table
()
(let ((i 0))
(setq factor-mode-syntax-table (make-syntax-table))
;; Default is atom-constituent
(while (< i 256)
(modify-syntax-entry i "_ " factor-mode-syntax-table)
(setq i (1+ i)))
;; Word components.
(setq i ?0)
(while (<= i ?9)
(modify-syntax-entry i "w " factor-mode-syntax-table)
(setq i (1+ i)))
(setq i ?A)
(while (<= i ?Z)
(modify-syntax-entry i "w " factor-mode-syntax-table)
(setq i (1+ i)))
(setq i ?a)
(while (<= i ?z)
(modify-syntax-entry i "w " factor-mode-syntax-table)
(setq i (1+ i)))
;; Whitespace
(modify-syntax-entry ?\t " " factor-mode-syntax-table)
(modify-syntax-entry ?\n ">" factor-mode-syntax-table)
(modify-syntax-entry ?\f " " factor-mode-syntax-table)
(modify-syntax-entry ?\r " " factor-mode-syntax-table)
(modify-syntax-entry ? " " factor-mode-syntax-table)
(modify-syntax-entry ?\[ "(] " factor-mode-syntax-table)
(modify-syntax-entry ?\] ")[ " factor-mode-syntax-table)
(modify-syntax-entry ?{ "(} " factor-mode-syntax-table)
(modify-syntax-entry ?} "){ " factor-mode-syntax-table)
(modify-syntax-entry ?\( "()" factor-mode-syntax-table)
(modify-syntax-entry ?\) ")(" factor-mode-syntax-table)
(modify-syntax-entry ?\" "\" " factor-mode-syntax-table)))
(defvar factor-mode-map (make-sparse-keymap))
(defcustom factor-mode-hook nil
"Hook run when entering Factor mode."
:type 'hook
:group 'factor)
(defconst factor-font-lock-keywords
'(("#!.*$" . font-lock-comment-face)
("!( .* )" . font-lock-comment-face)
("^!.*$" . font-lock-comment-face)
(" !.*$" . font-lock-comment-face)
("( .* )" . font-lock-comment-face)
"MAIN:"
"IN:" "USING:" "TUPLE:" "^C:" "^M:" "USE:" "REQUIRE:" "PROVIDE:"
"REQUIRES:"
"GENERIC:" "GENERIC#" "SYMBOL:" "PREDICATE:" "VAR:" "VARS:"
"C-STRUCT:"
"C-UNION:" "<PRIVATE" "PRIVATE>" "MACRO:" "MACRO::" "DEFER:" "TYPEDEF:"))
(defun factor-mode ()
"A mode for editing programs written in the Factor programming language."
(interactive)
(kill-all-local-variables)
(use-local-map factor-mode-map)
(setq major-mode 'factor-mode)
(setq mode-name "Factor")
(make-local-variable 'comment-start)
(setq comment-start "! ")
(make-local-variable 'font-lock-defaults)
(setq font-lock-defaults
'(factor-font-lock-keywords nil nil nil nil))
(set-syntax-table factor-mode-syntax-table)
(run-hooks 'factor-mode-hook))
(add-to-list 'auto-mode-alist '("\\.factor\\'" . factor-mode))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'comint)
(defvar factor-binary "/scratch/repos/Factor/factor")
(defvar factor-image "/scratch/repos/Factor/factor.image")
(defun factor-telnet-to-port (port)
(interactive "nPort: ")
(switch-to-buffer
(make-comint-in-buffer "factor-telnet" nil (cons "localhost" port))))
(defun factor-telnet ()
(interactive)
(factor-telnet-to-port 9000))
(defun factor-telnet-factory ()
(interactive)
(factor-telnet-to-port 9010))
(defun factor-run-file ()
(interactive)
(comint-send-string "*factor*" (format "\"%s\"" (buffer-file-name)))
(comint-send-string "*factor*" " run-file\n"))
(defun factor-send-region (start end)
(interactive "r")
(comint-send-region "*factor*" start end)
(comint-send-string "*factor*" "\n"))
(defun factor-see ()
(interactive)
(comint-send-string "*factor*" (format "\\ %s see\n" (thing-at-point 'sexp))))
(defun factor-stack-effects ()
"Query word's stack effect from the factor process and display it"
(interactive)
(message (replace-regexp-in-string "
.*" "" (get-response-string (format "\"%s\" dup use get assoc-stack dup [ stack-effect dup effect-in swap effect-out \" \" join swap \" \" join 2array \" -- \" join \"(\" swap \")\" 3array \" \" join 2array \" \" join print ] [ drop drop ] if" (thing-at-point 'sexp)) (get-process "factor")))))
(defun factor-help ()
(interactive)
(comint-send-string "*factor*" "\\ ")
(comint-send-string "*factor*" (thing-at-point 'sexp))
(comint-send-string "*factor*" " help\n"))
(defun factor-edit ()
(interactive)
(comint-send-string "*factor*" "\\ ")
(comint-send-string "*factor*" (thing-at-point 'sexp))
(comint-send-string "*factor*" " edit\n"))
(defun erase-buffer-contents (buffer)
(interactive)
(with-current-buffer (get-buffer buffer)
(erase-buffer)))
(defun factor-refresh-stack-buffer (text)
(interactive)
(when (get-buffer "*factor-stack*")
(with-current-buffer (get-buffer "*factor-stack*")
(erase-buffer)
(comint-redirect-send-command-to-process ".s" "*factor-stack*" (get-process "factor") nil)
(goto-char (point-max))
))
text)
(defun factor-comment-line ()
(interactive)
(beginning-of-line)
(insert "! "))
(defun get-response-string (msg process)
"Send msg to process and return output as a string"
(with-temp-buffer
(comint-redirect-send-command-to-process msg (buffer-name) process nil)
(accept-process-output nil 1)
(buffer-string)))
(defun factor-word-help ()
(interactive)
(when (get-process "factor")
(save-excursion
(backward-char)
(if (looking-at "[A-Za-z0-9?-+/<>]+")
(factor-stack-effects))))
(insert " "))
(add-hook 'comint-preoutput-filter-functions 'factor-refresh-stack-buffer)
(define-key factor-mode-map "\C-c\C-f" 'factor-run-file)
(define-key factor-mode-map "\C-c\C-r" 'factor-send-region)
(define-key factor-mode-map "\C-c\C-s" 'factor-see)
(define-key factor-mode-map "\C-ce" 'factor-edit)
(define-key factor-mode-map "\C-c\C-h" 'factor-help)
(define-key factor-mode-map "\C-cc" 'comment-region)
(define-key factor-mode-map " " 'factor-word-help)
(define-key factor-mode-map [return] 'newline-and-indent)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; factor-listener-mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-derived-mode factor-listener-mode comint-mode "Factor Listener")
(define-key factor-listener-mode-map [f8] 'factor-refresh-all)
(defun run-factor ()
(interactive)
(get-buffer-create "*factor-stack*")
(switch-to-buffer
(make-comint-in-buffer "factor" nil factor-binary nil
(concat "-i=" factor-image)
"-run=listener"))
(comint-send-string "*factor*" (format "USE: effects\n"))
(factor-listener-mode))
(defun factor-refresh-all ()
(interactive)
(comint-send-string "*factor*" "refresh-all\n"))
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Factor-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/factor-talk