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