Emacsで様々なプログラム言語のDocsetを選べるhelm-dash.elを試す

helm-dash

Toni Reinaさんの helm-dash.el の紹介です。Emacs Lispのライブラリであるdash.elとはまったくの別物です。

複数のプログラミング言語やフレームワークの関数の説明などをEmacs helmのインターフェースで選べるようになり、デフォルトのブラウザで詳細を開くことができます。

最近MacOSX版のEmacsにも対応したみたいなので使い方を書き残しておきます (設定は現時点ものであり、変更になる可能性があります)。

GitHubからclone、またはelpaやel-getから入手します。
helm-dash.el

私はdocsetはDropboxには置かないようにしました。一括インストール方法は後述。


(require 'esqlite) ;; https://github.com/mhayashi1120/Emacs-esqlite
(require 'helm-dash) ;; https://github.com/areina/helm-dash

;; ファイルの場所を変える (容量はGB単位にでかくなるので置き場所に注意)
(setq helm-dash-docsets-path (expand-file-name "~/.docsets"))
;; 検索開始に必要な最低入力文字数。初期設定は 3
(setq helm-dash-min-lengh 0)

;; 適応させたいモードとdocsetを記入
(defun my-set-doctype-for-helm-dash ()
  (setq-local helm-dash-docsets
              (case major-mode
                (js2-mode '("JavaScript" "NodeJS" "jQuery" "UnderscoreJS"))
                (css-mode '("CSS"))
                (scss-mode '("CSS" "Compass")))))
(dolist (hook (list 'js2-mode-hook 'css-mode-hook 'scss-mode-hook))
  (add-hook hook 'my-set-doctype-for-helm-dash))

helmなのにido-modeで選ばせるのはどうかと思いますね。helmにしちゃいましょう。選ぶたびにデータ取得で待たされるのも面倒です。最初の取得の際にdocsetフォルダを作成するか問われます。


;; ソース選択をido-modeではなくhelmにする
(setq helm-dash-completing-read-func
      (lambda ($name $docsets)
        (helm :sources `((name . ,$name)
                         (candidates . ,$docsets)
                         (action . (lambda ($cand) $cand))))))
;; 一回一回の呼び出しに時間がかかるので、リストを初回キャッシュして使う
(defun my-helm-dash-install-docset ()
  (interactive)
  (unless (boundp 'my-helm-dash-available-docsets-cache)
    (setq my-helm-dash-available-docsets-cache (helm-dash-available-docsets)))
  (cl-letf (((symbol-function 'helm-dash-available-docsets)
             (lambda () my-helm-dash-available-docsets-cache)))
    (helm-dash-install-docset)))

M-x my-helm-dash-install-docset で1つずつ選んでインストールできます。

次は一括インストール。並べ過ぎると数分かかると思います。


;; 全部一括でインストールしたい場合
(defun my-helm-dash-install-from-list ($list)
  (dolist ($name $list)
    (let ((helm-dash-completing-read-func
           (lambda (_i1 _i2) $name)))
      (cl-letf (((symbol-function 'helm-dash-available-docsets)
                 (lambda () nil)))
        (helm-dash-install-docset)))))
;; 以下は、カーソルを行末の閉じカッコの位置に移動し[C-x C-e]で使います。
;; インストール済みのdocsetを調べる
;; (helm-dash-installed-docsets)
;; インストール可能なdocsetを書き出す
;; (insert (format "\n%s" (helm-dash-available-docsets)))
;; 上の結果からリストに欲しいdocsetを以下のように並べて一括インストール
;; (my-helm-dash-install-from-list '("CSS" "CoffeeScript" "Compass"))
;; (my-helm-dash-install-from-list '("JavaScript" "Nginx" "NodeJS"))

MacOSXにはアプリ版のDash.appや、そこにカーソル位置の関数を導けるdash-at-point.elというものもありますが、helmで選んで普通のブラウザで開きたいのでこちらを使っていこうと思います。