写了一个版本管理的包,整合了 rbenv/pyenv/nodenv/jenv

之前用 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-setM-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)))
2 个赞