# HG changeset patch # User Oleksandr Gavenko # Date 1485850255 -7200 # Node ID b96d34784bf7acd828382e7c76510c5ad1f43e1a # Parent 0cadf93735399f6cf26cc45b04d9f7fb703b6b67 Combined company adapter for JS and CSS in web-mode. diff -r 0cadf9373539 -r b96d34784bf7 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.