Thierry Volpiatto writes: > Philip Kaludercic writes: > >> Philip Kaludercic writes: >> >>>>>> It is used specially for reproducing bugs in a clean environment, see it >>>>>> as emacs -Q for Emacs when reporting bugs. This script starts Emacs -Q >>>>>> with only Helm loaded, this ensure the bug if one comes from Helm and >>>>>> not another package. This is important especially nowaday people are >>>>>> using "Emacs distribution" with the world list of packages installed. >>>>>> Apart that the script is useful to quickly launch Emacs with helm, one >>>>>> can use it from the Helm directory or symlinked to e.g. ~/bin. >>>>> >>>>> I see. In that case is there any reason you implement this as a shell >>>>> script? >>>> >>>> Well when I wrote the script, packages where not existing and from >>>> outside emacs it is actually the only way to run a package isolated. >>>> >>>>> (It might be interesting to provide something like this for >>>>> package.el, to test packages in a generic way.) >>>> >>>> Yes, this would be interesting, it would be something like this: >>>> >>>> Emacs -Q >>>> M-x >>> packages nuisances> >>> >>> I was actually thinking of a command like >>> >>> M-x package-isolate RET foo,bar,baz RET >>> >>> and a new instance of Emacs using -Q is spun up, with all the packages >>> you have listed loaded, and nothing else... Sounds like a fun little >>> weekend project ;^) >> >> Here is my first attempt at providing this kind of a command. Any >> comments? > > Why not reusing package.el functions? > Why do you want to start in an isolated elpa directory? > Isn't something like this suffice? (just missing to fallback to CRM when > helm is not available) I don't know much about Helm, but does it not support CRM? > (defun package-isolate (packages) > "Start an uncustomised Emacs and only load a set of PACKAGES." > (interactive > (list (let ((helm-comp-read-use-marked t)) > (completing-read "Packages: " (mapcar #'car (package--alist)))))) This doesn't allow selecting specific package versions, in case multiple are installed (which might easily happen if you use package-vc). I stole the code in my patch from package-delete, and I guess it would be possible to generalise it into a utility function. > (let* ((name (concat "package-isolate-" (mapconcat #'identity > packages ","))) This doesn't work, because the above returns a string, not a list of strings. > (deps (cl-loop for p in packages > for sym = (intern p) > append (package--dependencies sym)))) > (apply #'start-process (concat "*" name "*") nil > (list (file-truename (expand-file-name invocation-name invocation-directory)) > "--quick" "--debug-init" > (format "--eval=%S" > `(progn > (require 'warnings) > (add-to-list 'warning-suppress-log-types 'initialization) > (require 'package) > (setq package-load-list > ',(append (mapcar (lambda (p) (list (intern p) t)) packages) > (mapcar (lambda (p) (list p t)) deps))) > (package-initialize))))))) This is actually a good idea, assuming there are no issues with lexical scoping that might arise from --eval. I didn't think of using package-load-list here, but it seems that this only works if we don't add --init-directory, because otherwise the elpa/ directory is not populated. It seems to me, that for a proper isolated environment, we should add a --init-directory option. This is easy to fix though, we just need to specify `package-user-dir' at startup. Here is my updated patch, merging our approaches: