Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

el-get in a portable emacs configuration solution

Tags:

emacs

el-get goes a long way in helping achieve a portable emacs configuration setup. The idea is to declare the packages you want in the emacs config file, push that file to a repo, and pull it on all the computers where you want an identical emacs configuration. This is how the code might look in elisp:

(setq my-packages (append '(el-get switch-window yasnippet ...)
    (mapcar 'el-get-source-name el-get-sources)))                  
(el-get 'sync my-packages)                                                

el-get will make sure that the packages get automatically installed and properly initialized. However, my understanding is that when you dereference a package, it doesn't get uninstalled. And if you uninstall it manually, you'll have to do it across all the computers, also manually. In other words, el-get goes only half the way in achieving a truly portable solution. My question is if anybody has written elisp code that will uninstall the packages just by dereferencing them in init.el? Or whether I should look elsewhere for a fully portable declarative dependency management solution for emacs?

like image 498
Daniel Szmulewicz Avatar asked Sep 23 '12 13:09

Daniel Szmulewicz


1 Answers

I'm answering myself here because in the end I opted for an alternate solution.

phils' answer is still valid, but I found it troublesome to have the .emacs.d directory under version control, and to be fair I didn't want to bother with fake submodules.

What I did instead: I contacted el-get's maintainer, Dimitri, and presented him with the problem.

Dimitri said:

I could see us adding an el-get-cleanup function that you would have to call with the current list of packages and that would el-get-remove any package already installed locally but not on the provided list.

(el-get-cleanup my-packages)

You could then use that from your user-init-file if you want to, or do that as a routine every now and then.

With his guidance, I then wrote the function in question.

(defun el-get-cleanup (packages)
  "Remove packages not explicitly declared"
  (let* ((packages-to-keep (el-get-dependencies (mapcar 'el-get-as-symbol packages)))
         (packages-to-remove (set-difference (mapcar 'el-get-as-symbol
                                                     (el-get-list-package-names-with-status
                                                      "installed")) packages-to-keep)))
    (mapc 'el-get-remove packages-to-remove)))

Ah, the joys of open source...

(See also my blog post)

like image 181
Daniel Szmulewicz Avatar answered Sep 28 '22 03:09

Daniel Szmulewicz