|
|
gph-mode.el - geomyidae - A small C-based gopherd. |
|
|
 |
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/geomyidae/ (git://bitreich.org) |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
README |
|
|
 |
LICENSE |
|
|
|
--- |
|
|
|
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 |
|