Combined company adapter for JS and CSS in web-mode.
authorOleksandr Gavenko <gavenkoa@gmail.com>
Tue, 31 Jan 2017 10:10:55 +0200
changeset 1476 b96d34784bf7
parent 1475 0cadf9373539
child 1477 d634562dbf77
Combined company adapter for JS and CSS in web-mode.
company-dom.el
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/company-dom.el	Tue Jan 31 10:10:55 2017 +0200
@@ -0,0 +1,52 @@
+(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.