JavaScript
的方法都是有的
但是操控 dom 元素的提示一个都没, 有可以补全dom元素的 package
么?
我查看 list-packages
发现它已经安装了, 但是不知道为什么不生效。
tern 20161222.850 installed Tern-powered JavaScript integration
之前没注意, 使用了 Ubuntu 之后没用过 SPC h SPC
, 刚才使用的时候发现, 不能用了:
SPC h SPC is undefined
, 是因为我缺少什么安装包么, message
里面并没有 warning
和 error
.
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 对接起来:
如果配置没效果,一定是当中某个环节出错了。
当前目录下没有 .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