ForthHub / discussion

Discussion repository for Forth enthusiasts.
118 stars 4 forks source link

Any good formatters? #84

Open timmyjose opened 4 years ago

timmyjose commented 4 years ago

Hello all!

Glad to join the community. Currently learning Forth for good using the gforth manuals. Doing "Starting Forth" in parallel.

Is there any good formatter than you might recommend? I'm having trouble figuring out/conforming to standard Forth guidelines. If relevant, Vim is my preferred editor, but I use Emacs very regularly as well. Ideally, an independent tool would be ideal!

Cheers.

MitchBradley commented 4 years ago

https://www.emacswiki.org/emacs/Forth-mode works pretty well

quozl commented 4 years ago

Welcome @timmyjose. I also use the Emacs Forth Mode, as I was working with @MitchBradley's source and it just made sense to stick to the same indentation. But I was and keep using it in my unpublished work. I also have some customisations in .emacs;

(add-to-list 'auto-mode-alist '("\\.fth$" . forth-mode))
(add-to-list 'auto-mode-alist '("\\.bth$" . forth-mode))
(add-hook 'forth-mode-hook (function (lambda ()
                       (setq forth-indent-level 3)
                       (setq forth-minor-indent-level 1)
                       (setq forth-hilight-level 3))))
timmyjose commented 4 years ago

@MitchBradley @quozl Thank you! I was able to locate it on melpa as well, so it should be easy to set it up.

And @quozl, that snippet will come in very handy indeed. Thanks again!

Cheers.

MitchBradley commented 4 years ago

My set of customizations is a bit more extensive that that of my good friend @quozl . To wit:

(defvar GFORTH_EL (concat HOME "/lisp/gforth.el"))
(cond ((file-readable-p GFORTH_EL)
  (load-library GFORTH_EL)
  (autoload 'forth-mode GFORTH_EL)
  (setq auto-mode-alist (cons '("\\.fth\\'" . forth-mode) auto-mode-alist))
  (setq auto-mode-alist (cons '("\\.bth\\'" . forth-mode) auto-mode-alist))
  (autoload 'forth-block-mode GFORTH_EL)
  (setq auto-mode-alist (cons '("\\.fb\\'" . forth-block-mode) auto-mode-alist))
  (add-hook 'forth-mode-hook (function (lambda ()
    (setq forth-indent-level 3)
    (setq forth-minor-indent-level 2)
    (setq forth-hilight-level 3)
    (setq forth-custom-words
          '(
            (("label") non-immediate (font-lock-keyword-face . 1)
             "[ \t\n]" t name (font-lock-function-name-face . 3))
            (("stand-init:") definition-starter (font-lock-function-name-face . 1)
             "[\t\n]" nil comment (font-lock-string-face . 1))
            (("end-code") definition-ender (font-lock-keyword-face . 1))
            (("loopa") compile-only (font-lock-keyword-face . 2))
            (("fload" "fl" "in:") 
             non-immediate (font-lock-keyword-face . 1) 
             "[\n\t ]" t string (font-lock-string-face . 1))
            (("\"") immediate (font-lock-string-face . 1)
             "[\"\n]" nil string (font-lock-string-face . 1))
            (("purpose:") immediate (font-lock-comment-face . 1)
             "[\n]" nil comment (font-lock-comment-face . 1))
            (("[ifndef]") immediate (font-lock-keyword-face . 2)
             "[ \t\n]" t name (font-lock-function-name-face . 3))
            (("/n" "/w" "/c") 
             non-immediate (font-lock-constant-face . 2))
            (("2value" "buffer:")
             non-immediate (font-lock-type-face . 2)
             "[ \t\n]" t name (font-lock-variable-name-face . 3))
            (("end-string-array") non-immediate (font-lock-keyword-face . 2)
             "[ \t\n]" t name (font-lock-type-face . 3))
            (("string-array") non-immediate (font-lock-keyword-face . 2))
            ("-?[0-9a-f]+\\(\\.[0-9]*e\\(-?[0-9]+\\)?\\|\\.?[0-9a-f]*\\)\\.?" 
             immediate (font-lock-constant-face . 3))
            ))
    (setq forth-custom-indent-words
      '((("[ifndef]")
     (0 . 2) (0 . 2))
    (("label")
     (0 . 2) (0 . 2) non-immediate)
    (("end-code")
     (-2 . 0) (0 . -2) non-immediate)
    (("c;")
     (-2 . 0) (0 . -2) non-immediate)))
    (define-key forth-mode-map "\C-h" 'backward-delete-char)
)))))

Some of the keywords mentioned above are specific to Open Firmware source, but you might find a few of interest.

timmyjose commented 4 years ago

@MitchBradley Wow, that is quite something indeed. I must confess I don't understand most of it, but I can pick and incorporate some useful tidbits from there as I progress in Forth myself. Thank you for sharing the coniguration!