-
Notifications
You must be signed in to change notification settings - Fork 0
/
sgml-edit.el
69 lines (57 loc) · 2.4 KB
/
sgml-edit.el
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;;; sgml-edit.el --- Additional editing commands for Emacs' SGML mode
;;
;; Copyright (C) 2015 Dominique Quatravaux
;; Author: Dominique Quatravaux <[email protected]>
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License
;; as published by the Free Software Foundation; either version 2
;; of the License, or (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
;;;; Commentary:
;; Some features I was missing from the psgml good old days.
;;;; Code:
(require 'pcase)
(defconst sgml-edit-version "0.0.1"
"Version of the sgml-edit package.")
(defvar sgml-last-split-marker nil
"Used by sgml-split-element")
(defun sgml-split-element ()
"Split the current element at point.
If repeated, the containing element will be split before the beginning
of then current element."
(interactive "*")
(pcase (car (sgml-lexical-context))
(`comment (insert "-->\n<!-- ")
(indent-according-to-mode))
(`cdata (insert "]]>\n<![CDATA[")
(indent-according-to-mode))
(`pi (insert "?>\n<? ")
(indent-according-to-mode))
(`jsp (insert " %>\n<% ")
(indent-according-to-mode))
(`tag (error "cannot split a tag"))
(`text
(if (and sgml-last-split-marker (eq this-command last-command))
;; Pretend we re-split from last split point; don't move point.
(save-excursion
(goto-char (marker-position sgml-last-split-marker))
(setq sgml-last-split-marker nil)
(sgml-split-element))
(let* ((context (save-excursion (sgml-get-context)))
(opentag (car (last context)))
(tagname (sgml-tag-name opentag)))
(insert "\n</" tagname ">")
(indent-according-to-mode)
(setq sgml-last-split-marker (point-marker))
(insert "\n<" tagname ">")
(indent-according-to-mode))))
(_ (error "cannot split here"))))
(provide 'sgml-edit)