gph-mode.el (2267B)
1 ;;; gph-mode.el --- major mode for gph files -*- lexical-binding: t; -*- 2 3 ;; Copyright (C) Troels Henriksen (athas@sigkill.dk) 2022 4 ;; 5 ;; URL: gopher://sigkill.dk/1/programming 6 ;; Keywords: gopher 7 ;; Version: 1.1 8 ;; Package-Requires: ((emacs "25.1")) 9 10 ;; This file is not part of GNU Emacs. 11 12 ;;; License: 13 ;; GPL-3+ 14 15 ;;; Commentary: 16 ;; .gph is the map file format used by the geomyidae Gopher daemon. 17 ;; This Emacs mode provides basic understanding of the link syntax, 18 ;; such that highlighting and folding works properly. It also 19 ;; highlights tab characters in pink because these are not allowed in 20 ;; .gph files. 21 ;; 22 ;; Files with the ".gph" extension are automatically handled by this mode. 23 ;; 24 ;; For extensions: Define local keybindings in `gph-mode-map'. Add 25 ;; startup functions to `gph-mode-hook'. 26 27 ;;; Code: 28 29 (eval-when-compile 30 (require 'rx)) 31 32 (defface gph-tabs-face 33 '((((class color)) (:background "hotpink")) 34 (t (:reverse-video t))) 35 "Face to use for highlighting tabs in Font-Lock mode.") 36 37 (defvar gph-tabs 'gph-tabs-face 38 "Face to use for highlighting tabs in Font-Lock mode.") 39 40 (defvar gph--font-lock-defaults 41 (let* ((type-rx '(or "0" "1" "3" "7" "8" "9" "g" "I" "h" "i")) 42 (desc-rx '(* (not "|"))) 43 (path-rx '(* (not "|"))) 44 (host-rx '(* (not "|"))) 45 (port-rx '(+ digit)) 46 (link-rx `(: line-start "[" ,type-rx "|" ,desc-rx "|" ,path-rx "|" ,host-rx "|" ,port-rx "]")) 47 (badlink-rx `(: line-start "[" (* anything)))) 48 `((,(rx-to-string link-rx) 0 font-lock-doc-markup-face) 49 (,(rx-to-string badlink-rx) 0 font-lock-warning-face) 50 ("\t" 0 gph-tabs)))) 51 52 (defvar gph-mode-hook nil 53 "Hook for `gph-mode'. Is run whenever the mode is entered.") 54 55 (defvar gph-mode-map 56 (let ((map (make-keymap))) 57 map) 58 "Keymap for `gph-mode'.") 59 60 ;;;###autoload 61 (add-to-list 'auto-mode-alist '("\\.gph" . gph-mode)) 62 63 ;;;###autoload 64 (define-derived-mode gph-mode text-mode "gph" 65 "Major mode for .gph files as used by geomyidae." 66 (setq-local paragraph-start (concat "^\\[|\\|[ \t]*$\\|" page-delimiter)) 67 (setq-local paragraph-separate (concat "^\\[\\|[ \t]*$\\|" page-delimiter)) 68 (setq-local font-lock-defaults '(gph--font-lock-defaults))) 69 70 (provide 'gph-mode) 71 72 ;;; gph-mode.el ends here