JSの補完を入れた話
company-mode + tern
環境
- Win10
- GNUEmacs 25.2
導入
company
自動補完のドライバ
M-x package-install RET
companyをインストール-
Emacs実践入門 などを参考に、良しなに設定する
- 筆者は改定前の赤い本を使用した
tern
自動補完のバックエンド
- Node.jsが入っていなければインストールする
$ npm install -g tern
.tern-project
-
ternの設定ファイル。下記のような内容を設定する
- 補完対象のファイル
-
使用するライブラリ
- 例えば、windowオブジェクトはECMAScriptにはないので
“browser”を指定する必要がある - 他にも、jqueryとか指定可能
- 例えば、windowオブジェクトはECMAScriptにはないので
- 開発対象プロジェクトのルートに設置する
- 設定例。
import
/export
等不使用の原始的な分割ソースコードでもこれでいける
{
"libs": [
"browser",
"ecmascript"
],
"loadEagerly": [
"./src/*.js"
],
"plugins": {
"requirejs": {
"baseURL": "./",
"paths": {}
}
}
}
-
読みたくないファイルは
dontLoad
で指定するらしい- ビルド済コードとか
{
"dontLoad": []
}
companyのバックエンドに登録
M-x package-install RET
company-ternをインストール- 筆者の設定項目
init.el
;; depth絡みの不具合への対策
;; override
(defun company-tern-depth (candidate)
"Return depth attribute for CANDIDATE. 'nil' entries are treated as 0."
(let ((depth (get-text-property 0 'depth candidate)))
(if (eq depth nil) 0 depth)))
(defun js2-company-tern-hook ()
(when (locate-library "tern")
;; .tern-port を作らない
(setq tern-command '("tern" "--no-port-file"))
(tern-mode t)))
(add-hook 'js2-mode-hook 'js2-company-tern-hook)
;; backend追加
(add-to-list 'company-backends 'company-tern)
;; company-dabbrev-codeは現在開いているバッファからワードを拾ってくる
;; IdとIDとかの表記ゆれにやられるのであえて切っている
;; (add-to-list 'company-backends '(company-tern :with company-dabbrev-code))
—no-port-fileオプションを設定しないと、.tern-portがポコポコ生成されて鬱陶しい
所感
-
関数の仮引数なども型推論してくれる。すごい
- 呼び出し側コードから推論している?
-
M-.
で定義にジャンプできる。tagsとか要らなかったんや- .tern-projectを適切に設定すれば、ファイルをまたいで飛んでくれる
TODO
参考にした資料の出典のせる