emacs写js的时候不会提示dom相关的操作方法.

JavaScript 的方法都是有的

但是操控 dom 元素的提示一个都没, 有可以补全dom元素的 package 么?

https://github.com/ternjs/tern

我查看 list-packages 发现它已经安装了, 但是不知道为什么不生效。 tern 20161222.850 installed Tern-powered JavaScript integration

之前没注意, 使用了 Ubuntu 之后没用过 SPC h SPC , 刚才使用的时候发现, 不能用了: SPC h SPC is undefined, 是因为我缺少什么安装包么, message 里面并没有 warningerror.

  • tern 是否启动?

    在终端 ps aux | grep tern 看看是否有 tern 的进程。

    tern 启动之后会在项目目录下创建一个 .tern-port 文件,里边的端口跟 M-x describe-variabble tern-known-port 看到的一致。

  • tern-mode 是否启用?

    M-x describe-variabel tern-mode 结果应该是 t。

  • company-tern 是否安装?

    手动调用 M-x company-tern 应该会出现补全菜单。如果手动能补全,就是 company 设置不对了。

终端的信息看不太懂~ 不过好像没开启~

mzy      10105  0.1  0.4 947908 36992 pts/19   Ssl+ 11:15   0:00 node /usr/local/bin/tern --no-port-file --strip-crs
mzy      10279  0.0  0.0  15964  1088 pts/18   S+   11:18   0:00 grep --color=auto tern

我的项目目录里面没有 .tern-port 这个文件, 但是 tern-mode 是开启状态, company-tern 也安装了. 看起来 tern-mode 的工作是正常的, 比如键入 get, 就会有一堆提示方法, 但是 dom 的提示就没有, M-x 调用的话显示: No completion found

真是头大~

我发现我的 company 的 backends 里面总是空的, 即使我添加了值, 下次启动就又没了, 可是即使这里面是空的, 也可以正常使用 js 的提示, 只是唯独 dom 没有

tern 是否安装?

$ which tern # => /path/to/tern

安装 tern

$ npm install -g tern

tern 安装之后应该是能自动启动的,如果没有自动启动,可能是 Emacs 里面路径不对,可以手动试试:

$ cd /path/to/project
$ tern
Listening on port 63935

记住这个端口号,回到 Emacs,手动 M-x tern-use-server RET 63953

当然最终还是要解决配置问题,让 tern 自动启动。

我的配置:

(add-hook 'js-mode-hook
          '(lambda ()
             (company-mode 1)
             (tern-mode 1)
             (setq company-tooltip-align-annotations t)
             (add-to-list 'company-backends 'company-tern)))

这个是单独写在 user-config 的么, 我尝试了一下也没有效果, 好像是我少了 dom 的那部分文件似的, 因为别的提示都是正常的

我实在是不懂 spacemacs 应该写在哪里,没有效果和初始化代码没有执行是不同的,不应该在一个不确定的基础上去解决问题,那几行代码你都可以手动执行。

可以正常执行, 但是就是没效果。。 郁闷了, 晚上回去看看Mac上, 不过我的项目里确实没有 .tern-port 文件, 即使这样 emacs 里面的 tern-mode 还是正常的

没有 .tern-port 就是 tern 服务没有启动,这个是 emacs 之外的。前面也已经说了,无非就是要让 tern 服务跟 emacs 的 tern-mode 对接起来:

  1. 安装 tern
  2. 启动 tern 2.1 通过配置 Emacs 让它自动运行 2.2 或者,在 ternminal 手动运行

如果配置没效果,一定是当中某个环节出错了。

当前目录下没有 .tern-project 文件

刚想起来, 忽略了个东西, 手动设置 tern-use-port 的时候, 第一个参数填 port, 第二个 server 填什么。。 我填的 localhost

手动去项目里启动才有

可以不填,默认是 127.0.0.1

手动启动 tern 之后有 .tern-port 文件了。 而且 emacs 里面的 tern-know-port.tern-port 的一样, 但是还是没作用。。 真是醉了。。

就是一个小小的配置,为什么会讨论这么久。把下边代码保存到 /path/to/test-tern.el 然后按照 Usage 跑起来:

;;; Usage:
;;;
;;;     mkdir /path/to/testdir/
;;;     cd /path/to/testdir/
;;;     /path/to/emacs -nw -Q -l /path/to/test-tern.el
;;;
(toggle-debug-on-error)
(setq package-user-dir (format "%s/elpa--test-tern/%s" user-emacs-directory emacs-version))
(setq package-archives
      '(("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
        ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/"))) ;; For China mainland
      ;; '(("gnu" . "http://elpa.emacs-china.org/gnu/")
      ;;   ("melpa" . "https://melpa.org/packages/")))

(package-initialize)

(defmacro try-install (pkg)
  `(unless (package-installed-p ,pkg)
     (package-refresh-contents)
     (package-install ,pkg)))

(try-install 'tern)
(try-install 'company)
(try-install 'company-tern)

;; ------------------------------------------------------------------

(add-hook 'after-init-hook
          '(lambda ()
             (let ((value (find-file-noselect "test.js" nil nil nil)))
               (if (listp value)
                   (mapcar 'switch-to-buffer (nreverse value))
                 (switch-to-buffer value)))
             (company-mode 1)
             (tern-mode 1)
             (insert "// Press `M-x company-tern` to complete\n")
             (insert "document.get")
             ))

(run-hooks 'after-init-hook)
;;; test-tern.el ends here

跟之前一样, company-tern 的工作是正常的, 只是没有 dom 相关的提示, 不知道是为什么

@zilongshanren 子龙碰到过这种情况么, company 工作正常但是没有 dom 操作相关的提示, 比如 getElementById, querySelector