company-dom.el
changeset 1476 b96d34784bf7
equal deleted inserted replaced
1475:0cadf9373539 1476:b96d34784bf7
       
     1 (require 'company)
       
     2 (require 'cl-lib)
       
     3 (require 'web-mode)
       
     4 
       
     5 (unless (fboundp 'web-mode-language-at-pos)
       
     6   (defun web-mode-language-at-pos (&optional pos)
       
     7     (plist-get (web-mode-point-context (or pos (point))) :language)))
       
     8 
       
     9 (defvar company-dom--document-methods
       
    10   '("getElementById" "getElementsByClassName" "createElement" "createElementNS" "createEvent"))
       
    11 
       
    12 (defvar company-dom--window-methods
       
    13   '("console" "document" "location"))
       
    14 
       
    15 (defun company-dom--prefix ()
       
    16   (when (looking-back "\\<\\w+\\(?:\\.?\\w+\\>\\|\\.\\)")
       
    17     (match-string 0)))
       
    18 
       
    19 (defun company-dom--candidates (prefix)
       
    20   (cond
       
    21    ((string-match "^window\\.\\(.*\\)" prefix)
       
    22     (mapcar
       
    23      (lambda (str) (concat "window." str))
       
    24      (all-completions (match-string 1) company-dom--window-methods)))
       
    25    ((string-match "^document\\.\\(.*\\)" prefix)
       
    26     (mapcar
       
    27      (lambda (str) (concat "document." str))
       
    28      (all-completions (match-string 1) company-dom--document-methods)))
       
    29    (t
       
    30     (all-completions prefix '("document" "window")))
       
    31    ))
       
    32 
       
    33 (defun company-web (command &optional arg &rest ignored)
       
    34   (interactive (list 'interactive))
       
    35   (cl-case command
       
    36     (interactive (company-begin-backend 'company-web))
       
    37     (prefix
       
    38      (pcase (plist-get (web-mode-point-context (point)) :language)
       
    39        ("css" (company-css 'prefix))
       
    40        ("javascript" (company-dom--prefix))))
       
    41     (candidates
       
    42      (pcase (plist-get (web-mode-point-context (point)) :language)
       
    43        ("css" (company-css 'candidates arg))
       
    44        ("javascript" (company-dom--candidates arg))))
       
    45     (meta (format "This value is named %s" arg))))
       
    46 
       
    47 (defun company-web-register ()
       
    48   (set (make-local-variable 'company-backends) '(company-web)))
       
    49 
       
    50 (add-hook 'web-mode-hook #'company-web-register)
       
    51 
       
    52 ;; Debug company with M-x company-diag.