;;; gph-mode.el --- major mode for gph files -*- lexical-binding: t; -*-
;; Copyright (C) Troels Henriksen (athas@sigkill.dk) 2022
;;
;; URL: gopher://sigkill.dk/1/programming
;; Keywords: gopher
;; Version: 1.2
;; Package-Requires: ((emacs "25.1"))
;; This file is not part of GNU Emacs.
;;; License:
;; GPL-3+
;;; Commentary:
;; .gph is the map file format used by the geomyidae Gopher daemon.
;; This Emacs mode provides basic understanding of the link syntax,
;; such that highlighting and folding works properly. It also
;; highlights tab characters in pink because these are not allowed in
;; .gph files.
;;
;; Files with the ".gph" extension are automatically handled by this mode.
;;
;; For extensions: Define local keybindings in `gph-mode-map'. Add
;; startup functions to `gph-mode-hook'.
;;; Code:
(eval-when-compile
(require 'rx))
(defface gph-tabs-face
'((((class color)) (:background "hotpink"))
(t (:reverse-video t)))
"Face to use for highlighting tabs in Font-Lock mode.")
(defvar gph-tabs 'gph-tabs-face
"Face to use for highlighting tabs in Font-Lock mode.")
(defvar gph--font-lock-defaults
(let* ((type-rx '(or "0" "1" "3" "7" "8" "9" "g" "I" "h" "i"))
(desc-rx '(* (not "|")))
(path-rx '(* (not "|")))
(host-rx '(* (not "|")))
(port-rx '(or (+ digit) "port"))
(link-rx `(: line-start "[" ,type-rx "|" ,desc-rx "|" ,path-rx "|" ,host-rx "|" ,port-rx "]"))
(badlink-rx `(: line-start "[" (* anything))))
`((,(rx-to-string link-rx) 0 font-lock-doc-markup-face)
(,(rx-to-string badlink-rx) 0 font-lock-warning-face)
("\t" 0 gph-tabs))))
(defvar gph-mode-hook nil
"Hook for `gph-mode'. Is run whenever the mode is entered.")
(defvar gph-mode-map
(let ((map (make-keymap)))
map)
"Keymap for `gph-mode'.")
;;;###autoload
(add-to-list 'auto-mode-alist '("\\.gph" . gph-mode))
;;;###autoload
(define-derived-mode gph-mode text-mode "gph"
"Major mode for .gph files as used by geomyidae."
(setq-local paragraph-start (concat "^\\[|\\|[ \t]*$\\|" page-delimiter))
(setq-local paragraph-separate (concat "^\\[\\|[ \t]*$\\|" page-delimiter))
(setq-local font-lock-defaults '(gph--font-lock-defaults)))
(provide 'gph-mode)
;;; gph-mode.el ends here
Response:
text/plain