;;; swarm-mode.el --- Swarm Lang mode -*- lexical-binding: t -*- ;; ;; Author: swarm contributors ;; URL: https://github.com/swarm-game/swarm ;; Version: 0.1 ;; Package-Requires: ((emacs-lsp)) ;; ;; This file is not part of GNU Emacs. ;; ;;; Code: (require 'lsp-mode) (defvar swarm-mode-syntax-table nil "Syntax table for `swarm-mode'.") (setq swarm-mode-syntax-table (let ( (synTable (make-syntax-table))) ;; C++ style comments ("// ..." and "/* ... */") (modify-syntax-entry ?\/ ". 124" synTable) (modify-syntax-entry ?* ". 23b" synTable) (modify-syntax-entry ?\n "> " synTable) synTable)) (setq swarm-font-lock-keywords (let* ( ;; Generate the current keywords with: ;; cabal run swarm:swarm -- generate editors --emacs (x-keywords '("def" "end" "let" "in" "require")) (x-builtins '( "self" "parent" "base" "if" "inl" "inr" "case" "fst" "snd" "force" "undefined" "fail" "not" "format" "chars" "split" )) (x-commands '( "noop" "wait" "selfdestruct" "move" "turn" "grab" "harvest" "place" "give" "install" "make" "has" "installed" "count" "drill" "build" "salvage" "reprogram" "say" "listen" "log" "view" "appear" "create" "time" "whereami" "blocked" "scan" "upload" "ishere" "whoami" "setname" "random" "run" "return" "try" "swap" "atomic" "teleport" "as" "robotnamed" "robotnumbered" "knows" "left" "right" "back" "forward" "north" "south" "east" "west" "down" )) (x-types '("int" "text" "dir" "bool" "cmd" "void" "unit")) (x-keywords-regexp (regexp-opt x-keywords 'words)) (x-builtins-regexp (regexp-opt x-builtins 'words)) (x-commands-regexp (regexp-opt x-commands 'words)) (x-types-regexp (regexp-opt x-types 'words))) `( (,x-keywords-regexp . 'font-lock-keyword-face) (,x-builtins-regexp . 'font-lock-builtin-face) (,x-types-regexp . 'font-lock-type-face) (,x-commands-regexp . 'font-lock-constant-face) ("[a-z_][a-z0-9_]*" . 'font-lock-function-name-face) ))) (define-derived-mode swarm-mode prog-mode "Swarm Lang Mode" (setq font-lock-defaults '((swarm-font-lock-keywords) nil t nil)) (set-syntax-table swarm-mode-syntax-table)) (add-to-list 'auto-mode-alist '("\\.sw\\'" . swarm-mode)) (with-eval-after-load 'lsp-mode (add-to-list 'lsp-language-id-configuration '(swarm-mode . "swarm")) (lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection (list "swarm" "lsp")) :activation-fn (lsp-activate-on "swarm") :server-id 'swarm-check))) (provide 'swarm-mode) ;;; swarm-mode.el ends here