gph-mode.el - geomyidae - A small C-based gopherd. | |
git clone git://bitreich.org/geomyidae/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfri… | |
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 ([email protected]) 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 mod… | |
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 … | |
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-delimite… | |
67 (setq-local paragraph-separate (concat "^\\[\\|[ \t]*$\\|" page-delimi… | |
68 (setq-local font-lock-defaults '(gph--font-lock-defaults))) | |
69 | |
70 (provide 'gph-mode) | |
71 | |
72 ;;; gph-mode.el ends here |