company-dom.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Wed, 11 Oct 2017 00:28:06 +0300
changeset 1541 dca10cecc9e2
parent 1476 b96d34784bf7
permissions -rw-r--r--
Set font size depending on DPI.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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.