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