company-dom.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Wed, 11 Oct 2017 00:28:06 +0300
changeset 1541 dca10cecc9e2
parent 1476 b96d34784bf7
permissions -rw-r--r--
Set font size depending on DPI.

(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.