]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow completing tags, parameters and values in html-mode
authorLars Ingebrigtsen <larsi@gnus.org>
Wed, 15 Jun 2022 16:29:42 +0000 (18:29 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 15 Jun 2022 16:29:42 +0000 (18:29 +0200)
* lisp/textmodes/sgml-mode.el (html-mode--complete-at-point):
Allow completing tags, parameters and values (bug#29057).

lisp/textmodes/sgml-mode.el

index b49541f47d44793e7d41f14241be57d39a7b6621..ff881377a7e99ca380deeefc9e1ac8b93923d1d5 100644 (file)
@@ -2409,6 +2409,7 @@ To work around that, do:
              (lambda () (char-before (match-end 0))))
   (setq-local add-log-current-defun-function #'html-current-defun-name)
   (setq-local sentence-end-base "[.?!][]\"'”)}]*\\(<[^>]*>\\)*")
+  (add-hook 'completion-at-point-functions 'html-mode--complete-at-point nil t)
 
   (when (fboundp 'libxml-parse-html-region)
     (defvar css-class-list-function)
@@ -2434,6 +2435,36 @@ To work around that, do:
   ;; (setq imenu-sort-function nil) ; sorting the menu defeats the purpose
   )
 
+(defun html-mode--complete-at-point ()
+  ;; Complete a tag like <colg etc.
+  (or
+   (when-let ((tag (save-excursion
+                     (and (looking-back "<\\([^ \t\n]*\\)"
+                                        (line-beginning-position))
+                          (match-string 1)))))
+     (list (match-beginning 1) (point)
+           (mapcar #'car html-tag-alist)))
+   ;; Complete params like <colgroup ali etc.
+   (when-let ((tag (save-excursion (sgml-beginning-of-tag)))
+              (params (seq-filter #'consp (cdr (assoc tag html-tag-alist))))
+              (param (save-excursion
+                       (and (looking-back "[ \t\n]\\([^= \t\n]*\\)"
+                                          (line-beginning-position))
+                            (match-string 1)))))
+     (list (match-beginning 1) (point)
+           (mapcar #'car params)))
+   ;; Complete param values like <colgroup align=mi etc.
+   (when-let ((tag (save-excursion (sgml-beginning-of-tag)))
+              (params (seq-filter #'consp (cdr (assoc tag html-tag-alist))))
+              (param (save-excursion
+                       (and (looking-back
+                             "[ \t\n]\\([^= \t\n]+\\)=\\([^= \t\n]*\\)"
+                             (line-beginning-position))
+                            (match-string 1))))
+              (values (cdr (assoc param params))))
+     (list (match-beginning 2) (point)
+           (mapcar #'car values)))))
+
 (defun html-mode--html-yank-handler (_type html)
   (save-restriction
     (insert html)