之前用 rbenv.el / pyenv.el,但是这些包多少都有点问题,所以我一直都在用自己改的包。各种 *env.el 的代码其实都差不多。所以把它们整合到一个 package,根据情况按需初始化:
(require 'shim)
(shim-init-ruby)
(shim-init-python)
(shim-init-node)
(shim-init-java)
使用上没有区别,只不过把入口函数统一了:
(add-hook 'ruby-mode-hook #'shim-mode)
(add-hook 'python-mode-hook #'shim-mode)
(add-hook 'js-mode-hook #'shim-mode)
(add-hook 'java-mode-hook #'shim-mode)
也可以手动切换:M-x shim-set
/ M-x shim-auto-set
除了使用全局/本地设置的版本,还可以使用 file local variable 来指定版本:
...
// Local Variables:
// shim-node-version: "8.11.3"
// End:
但是 hook 方式也要调整,在 local variable 生效之后再开启:
(add-hook 'hack-local-variables-hook
(lambda ()
(when (ignore-errors (shim--guess-language))
(shim-mode 1))))
由于采用统一的入口函数,所以需要知道那些 mode 下可以使用,因此除了默认之外,可以自行添加:
(shim-register-mode 'node 'js2-mode)
;; 或者在初始化的时侯注册所需的 major-mode
(shim-init-node :major-modes
'(js-mode
js2-mode
rjsx-mode))
增加新的版本管理支持:
(cl-defun shim-init-foo (&key (major-modes '(foo-mode)) (executable "fooenv"))
(shim-init
(make-shim--shim
:language 'foo
:major-modes major-modes
:executable executable)))