aboutsummaryrefslogtreecommitdiff
path: root/xroff.el
blob: 48ba5338909c8e44fbbc29ec073b59eca55ae98a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
(defvar xroff--request-regexp
  (rx "<"
	 (group (+ (or "\\>"
		       (not (in "> ")))))
	 (group (* (or "\\>"
		       (not ?>))))
	 ">"))

(defconst xroff-font-lock-keywords
  `(("<!--.*-->"
     (0 font-lock-comment-face))
    ("\\\\\\(.\\)"
     (1 font-lock-builtin-face))
    (,(concat xroff--request-regexp)
     (1 font-lock-keyword-face)
     (2 font-lock-string-face))
    (,(concat "\\\\" xroff--request-regexp)
     (1 nil t)
     (2 nil t))
    ;; ("<FS\\(?: \\(?:\\\\>\\|[^>]\\)*\\)?>\\(.*?\\)<FE\\(?: \\(?:\\\\>\\|[^>]\\)*\\)?>"
    ;;  1 font-lock-doc-string)
    ))

(define-derived-mode xroff-mode text-mode "Xroff"
  "Major mode for editing documents with xroff syntax."
  ;; A start or end tag by itself on a line separates a paragraph.
  ;; This is desirable because SGML discards a newline that appears
  ;; immediately after a start tag or immediately before an end tag.
  (setq-local paragraph-start "<\\([^>]\\)+>")
  (setq-local paragraph-separate "$\\|\\]>")
  (setq-local adaptive-fill-regexp "[ \t]*")
  (add-hook 'fill-nobreak-predicate 'sgml-fill-nobreak nil t)
  (setq-local indent-line-function 'sgml-indent-line)
  (setq-local comment-start "<!-- ")
  (setq-local comment-end " -->")
  (setq-local comment-indent-function 'sgml-comment-indent)
  (setq-local comment-line-break-function 'sgml-comment-indent-new-line)
  (setq-local skeleton-further-elements '((completion-ignore-case t)))
  (setq-local skeleton-end-hook
	      (lambda ()
		(or (eolp)
		    (not (or (eq v2 '\n) (eq (car-safe v2) '\n)))
		    (newline-and-indent))))
  (setq-local font-lock-defaults '((xroff-font-lock-keywords) nil t nil))
  ;; (setq-local font-lock-multiline t)
  (setq-local comment-start-skip "<!--[ \t]*")
  (setq-local comment-end-skip "[ \t]*--[ \t\n]*>")
  (visual-line-mode 1))