mylisp-obsolete/company-dom.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Mon, 28 Nov 2022 23:05:00 +0200
changeset 1764 a40a9f231aa0
parent 1662 f697f2772ec9
permissions -rw-r--r--
Set dictionary name to american for aspell, this fixes MINGW64 env.

(require 'company)
(require 'cl-lib)
(require 'web-mode)

(unless (fboundp 'web-mode-language-at-pos)
  (defun web-mode-language-at-pos (&optional pos)
    (plist-get (web-mode-point-context (or pos (point))) :language)))

(defvar company-dom--document-methods
  '("getElementById" "getElementsByClassName" "createElement" "createElementNS" "createEvent"))

(defvar company-dom--window-methods
  '("console" "document" "location"))

(defun company-dom--prefix ()
  (when (looking-back "\\<\\w+\\(?:\\.?\\w+\\>\\|\\.\\)")
    (match-string 0)))

(defun company-dom--candidates (prefix)
  (cond
   ((string-match "^window\\.\\(.*\\)" prefix)
    (mapcar
     (lambda (str) (concat "window." str))
     (all-completions (match-string 1) company-dom--window-methods)))
   ((string-match "^document\\.\\(.*\\)" prefix)
    (mapcar
     (lambda (str) (concat "document." str))
     (all-completions (match-string 1) company-dom--document-methods)))
   (t
    (all-completions prefix '("document" "window")))
   ))

(defun company-web (command &optional arg &rest ignored)
  (interactive (list 'interactive))
  (cl-case command
    (interactive (company-begin-backend 'company-web))
    (prefix
     (pcase (plist-get (web-mode-point-context (point)) :language)
       ("css" (company-css 'prefix))
       ("javascript" (company-dom--prefix))))
    (candidates
     (pcase (plist-get (web-mode-point-context (point)) :language)
       ("css" (company-css 'candidates arg))
       ("javascript" (company-dom--candidates arg))))
    (meta (format "This value is named %s" arg))))

(defun company-web-register ()
  (set (make-local-variable 'company-backends) '(company-web)))

(add-hook 'web-mode-hook #'company-web-register)

;; Debug company with M-x company-diag.