From fe05286a9c1fdb6ec59c00a00daa0d34fe380906 Mon Sep 17 00:00:00 2001 From: hybrid Date: Wed, 3 Jun 2026 04:51:45 +0300 Subject: add: sqf-mode v0.1.0 --- sqf-mode.el | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 sqf-mode.el diff --git a/sqf-mode.el b/sqf-mode.el new file mode 100644 index 0000000..e8c758b --- /dev/null +++ b/sqf-mode.el @@ -0,0 +1,61 @@ +;;; sqf-mode.el --- Major mode for SQF scripts in Arma -*- lexical-binding: t; -*- + +;; Author: hybrid +;; Version: 0.1.0 +;; Keywords: languages, sqf, arma, arma3, arma2, syntax +;; URL: https://git.hybridlabs.pro/sqf-mode.git +;; Package-Requires: ((emacs "30.2") (lsp-mode "10.0.0")) + +;; This file is not part of GNU Emacs. + +;;; Comment: +;; Major mode for editing SQF scripts used in Arma 2/3 series. +;; Provides basic syntax highlighting and integrates with HEMTT LSP server + +;;; Code: + +(require 'prog-mode) + +(defgroup sqf nil + "Major mode for SQF scripts." + :group 'languages) + +;;;###autoload +(define-derived-mode sqf-mode prog-mode "SQF" + "Major mode for editing SQF files. +Provides basic font-lock keywords and relies on LSP (HEMTT) for +advanced features when available. +\\{sqf-mode-map}" + ;; Comments setup + (setq-local comment-start "//") + (setq-local comment-end "") + (setq-local comment-start-skip "\\(//+\\|/\\*+\\)\\s *") + + ;; Syntax table: double-quoted strings, + ;; processing '/' and '*' symbols and '\n' for multi-line commentaries + (modify-syntax-entry ?/ ". 124b") + (modify-syntax-entry ?* ". 23") + (modify-syntax-entry ?\n "> b") + (modify-syntax-entry ?\" "\"") + + ;; Basic keywords for font-lock (instant highlighting) + (setq-local font-lock-defaults + `((,(regexp-opt '("if" "then" "else" "while" "for" "do" "switch" + "case" "default" "private" "public" "param" + "params" "nil" "true" "false" "exitWith" + "forEach" "select" "format" "hint" "call" + "spawn" "execVM" "and" "or" "not" "mod" + "isEqualTo" "in" "this" "player" "server" + "local" "global" "remoteExec" "remoteExecCall") + 'words) + (0 font-lock-keyword-face)))) + + ;; Soft LSP start (can be configured to disable) + (add-hook 'lsp-mode-hook #'lsp--open-after-save nil t) + (lsp-deferred)) + +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.sqf\\'" . sqf-mode)) + +(provide 'sqf-mode) +;;; sqf-mode.el ends here -- cgit v1.3.1