progfolio / elpaca Goto Github PK
View Code? Open in Web Editor NEWAn elisp package manager
License: GNU General Public License v3.0
An elisp package manager
License: GNU General Public License v3.0
Installing packages works fine until it stops working. I get an error saying that elpaca-ui--buttonize
is void. I got the error first when I calling elpaca-try
on the package solarized-theme
and then when I tried installing
org-auto-tangle
. Now, that being said, I suspect it doesn't have to do with the specific package being installed.
Looking at the source code I see that elpaca-ui--buttonize
is an alias for buttonize
(in my case with emacs 27). I
suspect somehow the alias wasn't compiled properly.
(defalias 'elpaca-ui--buttonize
(with-no-warnings (if (version< emacs-version "29.1") #'button-buttonize #'buttonize)))
Here is a backtrace of me trying to install the company
package. I noticed it's also mentioning a package I tried to install prior to this, lf
.
Debugger entered--Lisp error: (void-function elpaca-ui--buttonize)
elpaca-ui--buttonize(#("lf.el:1:427" 0 11 (face nil)) #f(compiled-function (&rest _) #<bytecode 0x1fde1d0d2f09>))
#f(compiled-function (entry) #<bytecode 0x114dc5d>)((lf [#("lf" 0 2 (face default elpaca (elpaca< lf "lf" (lf :package "lf" :fetcher github :repo "alhassy/lf" :files ("*.el" "*.el.in" "dir" "*.info" "*.texi" "*.texinfo" "doc/dir" "doc/*.info" "doc/*.texi" "doc/*.texinfo" "lisp/*.el" ...)) (finished activation info byte-compilation autoloads linking cloning-deps ref-checked-out cloning queued) "/home/luis/.config/emacs/elpaca/repos/lf" "/home/luis/.config/emacs/elpaca/builds/lf" nil (("/home/luis/.config/emacs/elpaca/repos/lf/lf.el" . "/home/luis/.config/emacs/elpaca/builds/lf/lf.el")) nil (:package "lf" :fetcher github :repo "alhassy/lf" :files ("*.el" "*.el.in" "dir" "*.info" "*.texi" "*.texinfo" "doc/dir" "doc/*.info" "doc/*.texi" "doc/*.texinfo" "lisp/*.el" ...) :protocol https :remotes "origin" :inherit t :depth 1) ((elpaca< dash "dash" ... ... "/home/luis/.config/emacs/elpaca/repos/dash" "/home/luis/.config/emacs/elpaca/builds/dash" nil nil nil ... nil ... nil 0 ... t nil ...) (elpaca< s "s" ... ... "/home/luis/.config/emacs/elpaca/repos/s" "/home/luis/.config/emacs/elpaca/builds/s" nil nil nil ... nil ... nil 0 ... t nil ...)) nil nil 2 (25469 32856 655055 474000) nil #<process elpaca-clone-lf> ((finished ... "✓ 2.014 secs") (activation ... "Autoloads cached") (activation ... "Caching autoloads") (activation ... "Package build dir added to load-path") (activation ... "Activating package") (info ... "No .info files found") (info ... "Compiling Info files") (byte-compilation ... "Byte compilation complete") (byte-compilation ... "Done (Total of 1 file compiled, 1 skipped)") (byte-compilation ... "lf.el:427:1:Warning: Unused lexical variable ‘advi...") (byte-compilation ... "In toplevel form:") (byte-compilation ... "Compiling /home/luis/.config/emacs/elpaca/builds/l...") (byte-compilation ... "Compiling /home/luis/.config/emacs/elpaca/builds/l...") (byte-compilation ... "Checking /home/luis/.config/emacs/elpaca/builds/lf...") (byte-compilation ... "Byte compiling") (autoloads ... "Autoloads Generated") (autoloads ... " INFO Scraping files for lf-autoloads.el...do...") (autoloads ... " INFO Scraping files for lf-autoloads.el... ") (autoloads ... "Generating autoloads: /home/luis/.config/emacs/elp...") (linking ... "Build files linked") (linking ... "Linking build files") (cloning-deps ... "Cloning Dependencies") (ref-checked-out ... "No ref specified. Using default") (cloning ... "Remotes fetched") (cloning ... "Fetching origin") (cloning ... "Adding Remotes") (cloning ... "Resolving deltas: 100% (1/1), done.") (cloning ... "Cloning into '/home/luis/.config/emacs/elpaca/repo...") (queued ... "Package queued"))))) "byte-compilation" #("lf.el:427:1:Warning: Unused lexical variable ‘advi..." 0 58 (face elpaca-failed)) "23878.834045"]))
mapcar(#f(compiled-function (entry) #<bytecode 0x114dc5d>) ((elpaca [... "rebuilding" "Rebuilding" "74652.378062"]) (lf [... "finished" "✓ 2.014 secs" "23878.841106"]) (lf [... "activation" "Autoloads cached" "23878.841043"]) (lf [... "activation" "Caching autoloads" "23878.840545"]) (lf [... "activation" "Package build dir added to..." "23878.840486"]) (lf [... "activation" "Activating package" "23878.840422"]) (lf [... "info" "No .info files found" "23878.840399"]) (lf [... "info" "Compiling Info files" "23878.840362"]) (lf [... "byte-compilation" "Byte compilation complete" "23878.840324"]) (lf [... "byte-compilation" "Done (Total of 1 file comp..." "23878.834065"]) (lf [... "byte-compilation" ... "23878.834045"]) (lf [... "byte-compilation" "In toplevel form:" "23878.834021"]) (lf [... "byte-compilation" "Compiling /home/luis/.conf..." "23878.755431"]) (lf [... "byte-compilation" "Compiling /home/luis/.conf..." "23878.755405"]) (lf [... "byte-compilation" "Checking /home/luis/.confi..." "23878.676771"]) (lf [... "byte-compilation" "Byte compiling" "23878.578816"]) (lf [... "autoloads" "Autoloads Generated" "23878.578797"]) (lf [... "autoloads" " INFO Scraping files ..." "23878.578712"]) (lf [... "autoloads" " INFO Scraping files ..." "23878.578688"]) (lf [... "autoloads" "Generating autoloads: /hom..." "23877.934781"]) (lf [... "linking" "Build files linked" "23877.933493"]) (lf [... "linking" "Linking build files" "23877.923880"]) (lf [... "cloning-deps" "Cloning Dependencies" "23877.922603"]) (lf [... "ref-checked-out" "No ref specified. Using de..." "23877.922551"]) (lf [... "cloning" "Remotes fetched" "23877.922479"]) (lf [... "cloning" "Fetching origin" "23877.533210"]) ...))
elpaca-ui--byte-comp-warnings(((elpaca [... "rebuilding" "Rebuilding" "74652.378062"]) (lf [... "finished" "✓ 2.014 secs" "23878.841106"]) (lf [... "activation" "Autoloads cached" "23878.841043"]) (lf [... "activation" "Caching autoloads" "23878.840545"]) (lf [... "activation" "Package build dir added to..." "23878.840486"]) (lf [... "activation" "Activating package" "23878.840422"]) (lf [... "info" "No .info files found" "23878.840399"]) (lf [... "info" "Compiling Info files" "23878.840362"]) (lf [... "byte-compilation" "Byte compilation complete" "23878.840324"]) (lf [... "byte-compilation" "Done (Total of 1 file comp..." "23878.834065"]) (lf [... "byte-compilation" ... "23878.834045"]) (lf [... "byte-compilation" "In toplevel form:" "23878.834021"]) (lf [... "byte-compilation" "Compiling /home/luis/.conf..." "23878.755431"]) (lf [... "byte-compilation" "Compiling /home/luis/.conf..." "23878.755405"]) (lf [... "byte-compilation" "Checking /home/luis/.confi..." "23878.676771"]) (lf [... "byte-compilation" "Byte compiling" "23878.578816"]) (lf [... "autoloads" "Autoloads Generated" "23878.578797"]) (lf [... "autoloads" " INFO Scraping files ..." "23878.578712"]) (lf [... "autoloads" " INFO Scraping files ..." "23878.578688"]) (lf [... "autoloads" "Generating autoloads: /hom..." "23877.934781"]) (lf [... "linking" "Build files linked" "23877.933493"]) (lf [... "linking" "Linking build files" "23877.923880"]) (lf [... "cloning-deps" "Cloning Dependencies" "23877.922603"]) (lf [... "ref-checked-out" "No ref specified. Using de..." "23877.922551"]) (lf [... "cloning" "Remotes fetched" "23877.922479"]) (lf [... "cloning" "Fetching origin" "23877.533210"]) ...))
#f(compiled-function () #<bytecode 0x1fde1d7e87a9>)()
elpaca-ui--update-search-filter(#<buffer *elpaca-log*> "#latest #linked-errors")
elpaca-log()
elpaca-log--latest()
elpaca-try((company :package "company" :repo "company-mode/company-mode" :fetcher github :files (:defaults "icons" ("images/small" "doc/images/small/*.png"))))
funcall-interactively(elpaca-try (company :package "company" :repo "company-mode/company-mode" :fetcher github :files (:defaults "icons" ("images/small" "doc/images/small/*.png"))))
call-interactively(elpaca-try nil nil)
command-execute(elpaca-try)
Interestingly, this error doesn't happen immediately. It happens after
installing a few packages. Again, not sure whether certain packages triggering
this.
I tried:
1- re-evaluating this form
It evaluated successfully but I kept getting the same error.
2- re-building elpaca
The error doesn't let me re-build it.
Trying to install BBDB using
(elpaca-use-package bbdb)
results in it not being able to find bbdb-site
when trying to require it.
The file exists as bbdb-site.el.in
and is linked as such but the makefile build-process copies the two *.el.in files to *.el so that they can be processed properly.
I've tried renaming them using :pre-build
but it doesn't seem to do anything.
GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6) of 2022-10-29
OS: Arch Linux x86_64
Hi, I'm trying to replace my current use-package + straight setup with elpaca. I started testing to replace package by package but it seems like I faced a problem trying to enable vertico
. I added the bootstrap code and specified it to use to load elpaca and (elpaca use-package (require 'use-package))
. In my configs I try to load vertico
:
(elpaca-use-package vertico
:demand t
:init
(vertico-mode))
But vertico
is not installed (I cannot activate vertico-mode
manually with M-x
because it is not found). What I might be doing wrong?
No response
Hello I'm trying to install this tree-sitter language definitions bundle using elpaca like this:
(elpaca-use-package (tree-sitter-module
:type git :host github
:repo "casouri/tree-sitter-module"
:pre-build (("./batch.sh"))
:files ("dist/*.so" "dist/*.dll" "dist/*.dylib"))
:init
(with-eval-after-load 'treesit
(add-to-list 'treesit-extra-load-path
(concat elpaca-builds-directory "tree-sitter-module"))))
It builds it and symlinks the modules in the builds directory but elpaca signals this error.
elpaca--queue-dependencies: (error "Unable to find main elisp file for tree-sitter-module)
How can I instruct it not look for a main elisp file, I tried :main nil
and :build (:not elpaca--queue-dependencies)
?
GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6)
of 2022-09-12
Arch Linux x86_64
I want to argue that elpaca should not modify the variableinitial-buffer-choice
and that that variable should be reserved exclusively for user modification.
I understand that when something goes wrong it can be convenient to show elpaca log.
One of my concerns that the indirection caused by elpaca's setting of initial-buffer-choice
only to switch to the user's initial-buffer-choice
is a source of unexpected behaviors. If some error occurs between elpaca's setting of initial-buffer-choice
and the user setting it himself, or if the user's configuration has some code assumes (as it should be able to) that relies initial-buffer-choice
's value never changes something unexpected may happen.
Arguably, even if this doesn't happen the user may not want *elpaca-log*
or any other elpaca buffer to be the initial buffer even if something goes wrong with elpaca.
Furthermore, elpaca's manipulation of initial-buffer-choice
means that it is more involved for the user to customize elpaca's default behavior on which buffer to show under which circumstances because in addition to writing his own function to add into initial-buffer-choice
he has to then suppress elpaca from trying to do so itself.
I propose that elpaca instead provides a function that the user can add into initial-buffer-choice
which would provide elpaca's behavior as to which buffer and in what circumstance to display it and would default to the user's value for initial-buffer-choice
.
This way the user can add it in their bootstrap code easily if they wish (maybe it should be in the bootstrap code by default) but it is not imposed on them.
(setq initial-buffer-choice #'elpaca-default-elpaca-buffer-maybe)
The function elpaca-default-elpaca-buffer-maybe
could optional take a user's initial-buffer-choice
value to default to.
No response
GNU Emacs 29.0.50 (build 1, x86_64-apple-darwin22.1.0, NS appkit-2299.00 Version 13.0 (Build 22A380)) of 2022-10-26
Mac OS X
Thanks for the package, really great work! I have been trying to port my init.el
to use elpaca-use-package
and found a problem with some packages that seem to be only present in MELPA, they seem not to be found by use-package
because my package.el
does not have the MELPA repository data.
I tried to dig in but I am a bit out of my depth with the interaction of all the packages.
Debug trace:
Debugger entered--Lisp error: (error "Package ‘doom-modeline-’ is unavailable")
error("Package `%s-%s' is unavailable" doom-modeline "")
package-compute-transaction(nil ((doom-modeline)))
package-install(doom-modeline)
use-package-ensure-elpa(doom-modeline (t) nil)
(progn (use-package-ensure-elpa 'doom-modeline '(t) 'nil) (defvar use-package--warning1 #'(lambda (keyword err) (let ((msg (format "%s/%s: %s" ... keyword ...))) (display-warning 'use-pa$
(use-package doom-modeline :ensure t :hook (after-init . doom-modeline-mode) :config (setq doom-modeline-height 25))
(progn (require 'use-package) (use-package compat :ensure t) (use-package doom-modeline :ensure t :hook (after-init . doom-modeline-mode) :config (setq doom-modeline-height 25)))
init.el to reproduce:
(setq load-prefer-newer t)
(declare-function elpaca-generate-autoloads "elpaca")
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(when-let ((elpaca-repo (expand-file-name "repos/elpaca/" elpaca-directory))
(elpaca-build (expand-file-name "builds/elpaca/" elpaca-directory))
(elpaca-target (if (file-exists-p elpaca-build) elpaca-build elpaca-repo))
(elpaca-url "https://www.github.com/progfolio/elpaca.git")
((add-to-list 'load-path elpaca-target))
((not (file-exists-p elpaca-repo)))
(buffer (get-buffer-create "*elpaca-bootstrap*")))
(condition-case-unless-debug err
(progn
(unless (zerop (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo))
(error "%s" (list (with-current-buffer buffer (buffer-string)))))
(byte-recompile-directory elpaca-repo 0 'force)
(require 'elpaca)
(elpaca-generate-autoloads "elpaca" elpaca-repo)
(kill-buffer buffer))
((error)
(delete-directory elpaca-directory 'recursive)
(with-current-buffer buffer
(goto-char (point-max))
(insert (format "\n%S" err))
(display-buffer buffer)))))
(require 'elpaca-autoloads)
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca (elpaca :host github :repo "progfolio/elpaca"))
(setq package-enable-at-startup nil)
;; Use-package as the package configuration tool of choice
(elpaca use-package (require 'use-package))
(elpaca-use-package compat
:ensure t)
(elpaca-use-package doom-modeline
:ensure t
:hook (after-init . doom-modeline-mode)
:config
(setq doom-modeline-height 25))
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(package-selected-packages '(doom-modeline compat)))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
I also had to patch elpaca-menu-gnu-elpa-mirror--clone because compat dependency was not downloading.
(defun elpaca-menu-gnu-elpa-mirror--clone ()
"Clone GNU ELPA recipes repo to PATH."
(make-directory elpaca-menu-gnu-elpa-mirror-path t)
(message "Downloading GNU ELPA recipes...")
(elpaca-with-process
(elpaca-process-call "git" "clone"
elpaca-menu-gnu-elpa-mirror-address
elpaca-menu-gnu-elpa-mirror-path)
(message "%s" (if success "GNU ELPA recipes downloaded." stderr))))
GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6) of 2022-09-12
Arch Linux x86_64 on kernel 6.0.10-arch2-1
Sometimes (not always) when I run M-x elpaca-update-all
the autoloads will not get generated properly and I will be hit with void-function errors due to the packages no longer being loaded correctly. This also happens with the Elpaca package itself, which is annoying because then Emacs wont start loading the init at all. After updating and manually running elpaca-rebuild
on the packages that broke will correctly produce autoloads.
Note: I did use chemacs2 when testing this, but I believe this doesnt affect the issue.
I've managed to capture this behavior in a minimal working example. Due to the nature of this odd behavior I have zipped up the before and after state of the entire .emacs.d
directory when running the elpaca-update-all
command.
before.zip after.zip
The contents of elpaca-autoloads.el
after updating will look like the following below (there is a hex 0x000c
character on line 5 in the file which is not visually rendered):
;;; elpaca-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*-
;;
;;; Code:
(provide 'elpaca-autoloads)
;; Local Variables:
;; version-control: never
;; no-byte-compile: t
;; no-update-autoloads: t
;; coding: utf-8
;; End:
;;; elpaca-autoloads.el ends here
GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0)
Guix System 371aa5777a3805a3886f3feea5f1960fe3fe4219 x86_64
When the elpaca log buffer is displayed and actions are being logged into it, point stays at the beginning of the buffer.
In my experiences with logs which are actively updated, the point automatically goes to the bottom so that the user can see what's happening. Otherwise, the user has to keep scrolling down. This is what I think should be the default.
A specific example, I called elpaca-rebuild
on elpaca
to test a new commit and then the log buffer came up but I was confused momentarily and didn't know what was happening because I didn't see any change--there actually was change happening, but at the bottom of the buffer. My view was at the top of the buffer.
No response
I can't install AUCTeX. I get this warning:
⛔ Error (use-package): auctex/:catch: Loading file /Users/ashton/.emacs.d/elpaca/builds/auctex/auctex.elc failed to provide feature ‘auctex’
I don't know if this is a problem with elpaca or with AUCTeX. I've never installed AUCTeX before, so I don't know if this is expected behavior.
(elpaca-use-package auctex)
I've looked through the repo but I couldn't find any references to this, is this feature planned?
Or is this already possible with some additional elisp in my config?
User wants to be able to debug their config by compiling it on the command line before actually using it.
e.g.
emacs --batch -f batch-byte-compile init.el
This works only, of course, if I wrap the initial bootstrapping / configuration steps
in eval-and-compile, like so (originally practiced with straight.el, and here adapted for elpaca):
(eval-and-compile
(setq debug-on-error t)
;; init-elpaca.el --- ELPACA INIT DEMO -*- lexical-binding: t; -*-
;; Bootstrap Elpaca
(declare-function elpaca-generate-autoloads "elpaca")
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(when-let ((elpaca-repo (expand-file-name "repos/elpaca/" elpaca-directory))
(elpaca-build (expand-file-name "builds/elpaca/" elpaca-directory))
(elpaca-target (if (file-exists-p elpaca-build) elpaca-build elpaca-repo))
(elpaca-url "https://www.github.com/progfolio/elpaca.git")
((add-to-list 'load-path elpaca-target))
((not (file-exists-p elpaca-repo)))
(buffer (get-buffer-create "*elpaca-bootstrap*")))
(condition-case-unless-debug err
(progn
(unless (zerop (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo))
(error "%s" (list (with-current-buffer buffer (buffer-string)))))
(byte-recompile-directory elpaca-repo 0 'force)
(require 'elpaca)
(elpaca-generate-autoloads "elpaca" elpaca-repo)
(kill-buffer buffer))
((error)
(delete-directory elpaca-directory 'recursive)
(with-current-buffer buffer
(goto-char (point-max))
(insert (format "\n%S" err))
(display-buffer buffer)))))
(require 'elpaca-autoloads)
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca (elpaca :host github :repo "progfolio/elpaca")))
(eval-and-compile
;; some very basic variables - YMMV
(add-to-list 'load-path "~rx/el")
(add-to-list 'load-path "~/cfg/gnus")
(add-to-list 'custom-theme-load-path "~rx/el/themes")
;; (setq load-prefer-newer t) )
Originally posted by @reuleaux in #8 (comment)
GNU Emacs 29.0.50 (build 1, aarch64-apple-darwin22.1.0, NS appkit-2299.00 Version 13.0.1 (Build 22A400))
MacOS
Failed to install org with
(elpaca-use-package org)
Info Time ▼
org queued Package queued 00.395804
org queued Adding Remotes 00.420607
org queued Remotes fetched 01.246130
org ref-checked-out No ref specified. Using default 01.246168
org pre-build Running :pre-build commands 01.246194
org pre-build running command: (progn (require 'elpaca-menu-org) (elpaca-menu-org--build)) 01.454250
org pre-build Error: error ("Failed to parse ORGVERSION") 01.478993
org pre-build debug-early-backtrace() 01.479000
org pre-build debug-early(error (error "Failed to parse ORGVERSION")) 01.479006
org pre-build error("Failed to parse ORGVERSION") 01.479010
org pre-build (if failure (error "Failed to parse ORGVERSION") (replace-regexp-in-string "-dev" "" stdout)) 01.479016
org pre-build (let* ((result (elpaca-process-call "emacs" "-Q" "--batch" "--eval" "(require 'lisp-mnt)" "--visit" "org.el" "--eval" "(princ (lm-header \"version\"))")) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if failure (error "Failed to parse ORGVERSION") (replace-regexp-in-string "-dev" "" stdout))) 01.479020
org pre-build (if failure (let* ((result (elpaca-process-call "emacs" "-Q" "--batch" "--eval" "(require 'lisp-mnt)" "--visit" "org.el" "--eval" "(princ (lm-header \"version\"))")) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if failure (error "Failed to parse ORGVERSION") (replace-regexp-in-string "-dev" "" stdout))) (string-trim (replace-regexp-in-string "release_" "" stdout))) 01.507311
org pre-build (let* ((result (elpaca-process-call "git" "describe" "--match" "release*" "--abbrev=0" "HEAD")) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if failure (let* ((result (elpaca-process-call "emacs" "-Q" "--batch" "--eval" "(require 'lisp-mnt)" "--visit" "org.el" "--eval" "(princ (lm-header \"version\"))")) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if failure (error "Failed to parse ORGVERSION") (replace-regexp-in-string "-dev" "" stdout))) (string-trim (replace-regexp-in-string "release_" "" stdout)))) 01.535995
org pre-build (let* ((default-directory (expand-file-name "lisp/")) (orgversion (let* ((result (elpaca-process-call "git" "describe" "--match" "release*" "--abbrev=0" "HEAD")) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if failure (let* ((result (elpaca-process-call "emacs" "-Q" "--batch" "--eval" "(require 'lisp-mnt)" "--visit" "org.el" "--eval" "(princ (lm-header \"version\"))")) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if failure (error "Failed to parse ORGVERSION") (replace-regexp-in-string "-dev" "" stdout))) (string-trim (replace-regexp-in-string "release_" "" stdout))))) (gitversion (concat orgversion "-g" (string-trim (elpaca-process-output "git" "rev-parse" "--short=6" "HEAD")))) (emacs (concat invocation-directory invocation-name))) (call-process emacs nil "*elpaca-byte-compilation*" nil "-Q" "--batch" "--eval" "(setq vc-handled-backends nil org-startup-folded nil)" "--eval" "(add-to-list 'load-path \".\")" "--eval" "(load \"org-compat.el\")" "--eval" "(load \"../mk/org-fixup.el\")" "--eval" "(org-make-org-loaddefs)" "--eval" (format "(org-make-org-version %S %S)" orgversion gitversion) "--eval" "(cd \"../doc\")" "--eval" "(org-make-manuals)")) 01.564310
org pre-build elpaca-menu-org--build() 01.564318
org pre-build (progn (require 'elpaca-menu-org) (elpaca-menu-org--build)) 01.564323
org pre-build eval((progn (require 'elpaca-menu-org) (elpaca-menu-org--build)) t) 01.564328
org pre-build (if (cl-every #'stringp command) (let* ((result (apply #'elpaca-process-call command)) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if success (message stdout) (message "Build command error: %S" result) (error "Build command failed: %S" stderr))) (eval command t)) 01.593350
org pre-build (let ((command (car tail))) (message "running command: %S" command) (if (cl-every #'stringp command) (let* ((result (apply #'elpaca-process-call command)) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if success (message stdout) (message "Build command error: %S" result) (error "Build command failed: %S" stderr))) (eval command t)) (setq tail (cdr tail))) 01.593360
org pre-build (while tail (let ((command (car tail))) (message "running command: %S" command) (if (cl-every #'stringp command) (let* ((result (apply #'elpaca-process-call command)) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if success (message stdout) (message "Build command error: %S" result) (error "Build command failed: %S" stderr))) (eval command t)) (setq tail (cdr tail)))) 01.622006
org pre-build (let ((tail (if (listp (car-safe commands)) commands (list commands)))) (while tail (let ((command (car tail))) (message "running command: %S" command) (if (cl-every #'stringp command) (let* ((result (apply #'elpaca-process-call command)) (exit (car result)) (invoked (numberp exit)) (success (and invoked (= 0 exit))) (failure (not success)) (stdout (nth 1 result)) (stderr (nth 2 result))) (ignore result exit invoked success failure stdout stderr) (if success (message stdout) (message "Build command error: %S" result) (error "Build command failed: %S" stderr))) (eval command t)) (setq tail (cdr tail))))) 01.622017
org pre-build elpaca--run-build-commands((progn (require 'elpaca-menu-org) (elpaca-menu-org--build))) 01.622022
org pre-build (progn (require 'elpaca) (normal-top-level-add-subdirs-to-load-path) (setq gc-cons-percentage 1.0) (elpaca--run-build-commands '(progn (require 'elpaca-menu-org) (elpaca-menu-org--build)))) 01.648733
org pre-build command-line-1(("-L" "./" "-L" "/Users/jannesauvala/.emacs.d/elpaca/builds/elpaca/" "--eval" "(progn (require 'elpaca) (normal-top-level-add-subdirs-to-load-path) (setq gc-cons-percentage 1.0) (elpaca--run-build-commands '(progn (require 'elpaca-menu-org) (elpaca-menu-org--build))))")) 01.648745
org pre-build command-line() 01.648750
org pre-build normal-top-level() 01.648754
org pre-build Failed to parse ORGVERSION 01.648760
org failed Adding Remotes 01.652019
Is this the correct way to tell Elpaca to rebuild a package on every init?
(add-hook 'elpaca-after-init-hook (lambda () (elpaca-rebuild 'my-package t)))
Originally posted by @suconakh in #22 (comment)
GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.36, cairo version 1.17.6) of 2022-12-25
Arch
I think the example code in Queue
section doesn't work.
My understanding is that (2) and (3) is executed before (1). Shouldn't (2) and (3) be the body of (1)? or maybe my understanding is wrong.
(elpaca-queue
(elpaca (melpulls :host github :repo "progfolio/melpulls")) ;; (1)
(add-to-list 'elpaca-menu-functions #'melpulls) ;; (2)
(elpaca-update-menus #'melpulls)) ;; (3)
;; Implicitly queued into a new queue.
(elpaca menu-item-available-in-melpulls)
No response
Hi there!
First off: this is amazing. The load time on my Emacs is just insane now. Thank you so much!
I use vertico, which has a number of extensions that come bundled with the package. I would like to get vertico-directory
working.
If I were using straight.el
, I would just put this:
(elpaca-use-package vertico
:defer t
:straight (vertico :files (:defaults "extensions/*")
:includes vertico-directory)
:bind (:map vertico-map
("M-DEL" . vertico-directory-delete-word))
:hook (rfn-eshadow-update-overlay . vertico-directory-tidy)
:init
(vertico-mode))
Or even this after (use-package vertico :init (vertico-mode))
: (taken from vertico's README)
(use-package vertico-directory
:after vertico
:bind (:map vertico-map
("M-DEL" . vertico-directory-delete-word))
:hook (rfn-eshadow-update-overlay . vertico-directory-tidy))
How would I do this with elpaca? (elpaca-use-package vertico-directory)
can't find any repository. I'm honestly not sure what magic use-package and straight are doing to get it to work in the previous examples, but work it does.
GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.36, cairo version 1.17.6) of 2022-12-25
Arch
consult-dir
packages depends on project
package. So when installing consult-dir
:
(elpaca consult-dir)
elpaca also clone and build project
package as well.
Recent Emacs bundles project.el
. Is there a way to tell elpaca to not install project
package and use the bundled one?
I'm thinking of something like:
(elpaca (project :use-bundled t))
No response
GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6) of 2022-09-12
Arch Linux x86_64 on kernel 6.0.10-arch2-1
The current elpaca-use-package
macro seems to only work with a list.
(elpaca-use-package 'which-key)
;; expands to
(elpaca 'which-key
(use-package quote))
(elpaca-use-package (which-key))
;; expands to
(elpaca
(which-key)
(use-package which-key))
I don't know if both variants are desired, but under the quick start section of /README.org
the quote variant is used.
In the /doc/manual.org
document under the "Installing Packages" section the list variant is used.
No response
Hi there,
While trying elpaca out, I noticed a lot of my packages were not loading when expected. E.g. magit would get installed, but when I'd hit C-x g
with this config I would get an error saying that magit-status
was not defined:
(elpaca-use-package magit
:defer t
:bind (("C-x g" . 'magit-status)
("s-g" . 'magit-status)))
Removing the :defer t
makes it work; I did that will all my packages an my Emacs load time is somewhere between 3 and 5 seconds, which is pretty slow. (Though, oddly enough, emacs-init-time
doesn't report this lag before Emacs becomes usable; is there a better way to clock whatever is going on during elpaca's init?)
Is there something I'm doing wrong? Or is elpaca not able to handle the :defer
keyword and the lazy-loading properly?
IMO although the readme does contain useful information I think that it goes too much in depth sometimes. Not that this shouldn't be documented, but I think that parts of the README are definitely more focused for a developer or for someone wishing to customize/do something more involved or nuanced as opposed to someone just wishing to try a new package manager and install packages.
inheritence-precedence
menus
orders
queues
Here I make the assumption that the README should be intended for users that are either not well versed in elisp or just want to get going and switch to a new package manager. To that end, the most important points are the bootstrapping, installing packages and--since I know people are going to be confused by this--the how to make sure their init is loaded in the proper order. Right now this is mentioned in the FAQ, but I would even put this in the example config.
Maybe the recipe format could go into the developer's readme as well because elpaca
provides a lot of recipes out of the box so maybe those details don't need to be there. I think quelpa also doesn't have exact recipe details in its readme.
Also I think elpaca-try
should be mentioned or maybe aliased to elpaca-install
. I get why it's named try over install. But I definitely had trouble identifying this function when I first tried elpaca
.
I think this could bring a lot of new users. I know I was a bit intimidated and confused by some of the depth of the readme which I later realized I didn't need to understand at all for basic usage. I think also the readme doesn't do justice to how good of a package manager elpaca actually is. I remember thinking "ah ok, looks like its a bit better than straight" when I first read the readme when it's in actuality leagues ahead of any other known package manager. Maybe a gif of the elpaca-log
when installing a package would be nice too.
I'm trying to run the example script provided in the README, and I get the following error:
Debugger entered--Lisp error: (wrong-number-of-arguments autoload-rubric 4)
(autoload-rubric output nil 'feature 'compile)
(write-region (autoload-rubric output nil 'feature 'compile) nil output nil 'silent)
(let* ((default-directory dir) (auto-name (format "%s-autoloads.el" package)) (output (expand-file-name auto-name dir)) (generated-autoload-file output) (autoload-timestamps nil) (backup-inhibited t) (version-control 'never) (find-file-hook nil) (write-file-functions nil) (left-margin 0)) (write-region (autoload-rubric output nil 'feature 'compile) nil output nil 'silent) (cond ((fboundp 'loaddefs-generate) (loaddefs-generate dir auto-name nil nil nil t)) ((fboundp 'make-directory-autoloads) (make-directory-autoloads dir output)) ((fboundp 'update-directory-autoloads) (with-no-warnings (update-directory-autoloads dir)))) (let* ((buf (and t (find-buffer-visiting output)))) (if buf (kill-buffer buf) nil)) auto-name)
elpaca-generate-autoloads("elpaca" "/Users/ashton/.emacs.d/elpaca/repos/elpaca/")
(progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer))
(condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer))))
(if buffer (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer)))) nil)
(let* ((elpaca-repo (and t (expand-file-name "repos/elpaca/" elpaca-directory))) (elpaca-build (and elpaca-repo (expand-file-name "builds/elpaca/" elpaca-directory))) (elpaca-target (and elpaca-build (if (file-exists-p elpaca-build) elpaca-build elpaca-repo))) (elpaca-url (and elpaca-target "https://www.github.com/progfolio/elpaca.git")) (s (and elpaca-url (add-to-list 'load-path elpaca-target))) (s (and s (not (file-exists-p elpaca-repo)))) (buffer (and s (get-buffer-create "*elpaca-bootstrap*")))) (if buffer (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer ... ...)))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer)))) nil))
load-with-code-conversion("/Users/ashton/.emacs.d/init.el" "/Users/ashton/.emacs.d/init.el" t t)
load("/Users/ashton/.emacs.d/init" noerror nomessage)
startup--load-user-init-file(#f(compiled-function () #<bytecode 0x1550e63276dba1>) #f(compiled-function () #<bytecode -0x1f3c6feddc0eaeb5>) t)
command-line()
normal-top-level()
Copy the example bootstrap config into a clean ~/.emacs.d/init.el
. Try opening Emacs.
Looks like a commit 33dcd33 added an extra argument to autoload-rubric
.
GNU Emacs 30.0.50 (build1, aarch64-apple-darwin21 ...) 2022-12-01
(Yes, running bleeding edge. Why not?)
macOS
What is the "blessed way" to update all packages? I've been going into elpaca-manager
, holding down u
to mark all packages for update, hitting x
, then waiting a while. Then I'll mark all packages with r
and wait a little longer until they rebuild. Is there a better way?
No response
On a fresh installation, there will be two buffers shown, elpaca-ui
and *Compile-log*
. Is there a way to suppress both of them?
P.S. Absolutely love your work, rewriting my config so I don't have to use straight.el anymore!
I like to run different versions of emacs e.g. a stable 28.1 and a development branch on 29
As compiled .elc files are not necessarily compatible over versions you need different build directories for each version.
I can control the original bootstrap but elpaca-build-dir hard codes this.
straight.el has the variable straight-build-dir to control this.
I am only just starting out with elpaca, so bear with me. - I am trying to get a very basic configuration running:
but I use leaf (https://github.com/conao3/leaf.el), and leaf-keywords (https://github.com/conao3/leaf-keywords.el),
instead of use-package (and I would think that this should work just as well [?]). After all, leaf is modeled after use-package.
Elpaca works for me, in the sense that I can see it downloading packages: leaf, leaf-keywords, and vertico -
which I want to configure then with leaf. This is my basic setup:
;;; init-elpaca.el --- ELPACA INIT DEMO -*- lexical-binding: t; -*-
;; Bootstrap Elpaca
(declare-function elpaca-generate-autoloads "elpaca")
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(when-let ((elpaca-repo (expand-file-name "repos/elpaca/" elpaca-directory))
(elpaca-build (expand-file-name "builds/elpaca/" elpaca-directory))
(elpaca-target (if (file-exists-p elpaca-build) elpaca-build elpaca-repo))
(elpaca-url "https://www.github.com/progfolio/elpaca.git")
((add-to-list 'load-path elpaca-target))
((not (file-exists-p elpaca-repo)))
(buffer (get-buffer-create "*elpaca-bootstrap*")))
(condition-case-unless-debug err
(progn
(unless (zerop (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo))
(error "%s" (list (with-current-buffer buffer (buffer-string)))))
(byte-recompile-directory elpaca-repo 0 'force)
(require 'elpaca)
(elpaca-generate-autoloads "elpaca" elpaca-repo)
(kill-buffer buffer))
((error)
(delete-directory elpaca-directory 'recursive)
(with-current-buffer buffer
(goto-char (point-max))
(insert (format "\n%S" err))
(display-buffer buffer)))))
(require 'elpaca-autoloads)
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca (elpaca :host github :repo "progfolio/elpaca"))
(elpaca leaf (require 'leaf))
(elpaca leaf-keywords (require 'leaf-keywords))
(elpaca vertico (require 'vertico))
(leaf vertico
:init
(vertico-mode)
)
If I comment out this last bit for a second in the stanza above:
;; (leaf vertico
;; :init
;; (vertico-mode)
;; )
then I can see elpaca fetching recipes from Melpa, GNU ELPA, NonGNU ELPA, and installing
leaf, leaf-keywords, vertico, and their dependencies (the Elpaca Log "Package Status Info" is green, after that).
And I would think, that I could use leaf then as above:
(leaf vertico
:init
(vertico-mode)
)
But apperently not:
Warning (initialization): An error occurred while loading ‘/home/rx/.emacs.d/init.el’:
Symbol's function definition is void: leaf
To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file. Start Emacs with
the ‘--debug-init’ option to view a complete error backtrace.
What I am doing wrong?
The situation is not much better for me, if I use use-package instead
(elpaca use-package (require 'use-package))
(elpaca vertico (require 'vertico))
(use-package
:init
(vertico-mode)
)
So I guess, my configuration (weak understanding) is cauing this issue, rather than a use-package vs leaf thing.
Thanks,
-A
As far as I know, Straight.el has command straight-freeze-version
. Is similar feature planned for Elpaca? Ideally, I would love to have ability to roll back packages versions to ones before last upgrade
Add a menu for built-in packages? So other packages can depend on them(see error below),
and be listed when using elpaca-manager
.
Built-in packages are indexed here C-h v package--builtins
.
Recently, I elpaca-try password-store
, and got the error below.
password-store failed Failed dependencies: ("auth-source-pass") 19.267592
auth-source-pass failed elpaca--clone: (wrong-type-argument stringp nil) 19.269149
I resolved it by (add-to-list 'elpaca-ignored-dependencies 'auth-source-pass)
Line 1463 in bb5799d
GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo version 1.16.0, Xaw3d scroll bars)
Linux
When processing queues, elpaca will set initial-buffer-choice
to a function for displaying the log buffer. The value is never reset, so frames created using e.g. emacsclient -c
will always show the elpaca status buffer.
No response
GNU Emacs 29.0.50 (build 3, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.16.0) of 2022-11-23
Ubuntu 22.04 LTS x86_64
git version 2.34.1
Basic reproducible init file:
;; from README
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
:ref nil
:build (:not elpaca--activate-package)))
(when-let ((repo (expand-file-name "repos/elpaca/" elpaca-directory))
(build (expand-file-name "elpaca/" elpaca-builds-directory))
(order (cdr elpaca-order))
((add-to-list 'load-path (if (file-exists-p build) build repo)))
((not (file-exists-p repo)))
(buffer (get-buffer-create "*elpaca-bootstrap*")))
(condition-case-unless-debug err
(if-let (((pop-to-buffer buffer '((display-buffer-reuse-window
display-buffer-same-window))))
((zerop (call-process "git" nil buffer t "clone"
(plist-get order :repo) repo)))
(default-directory repo)
((zerop (call-process "git" nil buffer t "checkout"
(or (plist-get order :ref) "--")))))
(progn
(byte-recompile-directory repo 0 'force)
(require 'elpaca)
(and (fboundp 'elpaca-generate-autoloads)
(elpaca-generate-autoloads "elpaca" repo))
(kill-buffer buffer))
(error "%s" (with-current-buffer buffer (buffer-string))))
((error)
(warn "%s" err)
(delete-directory repo 'recursive))))
(require 'elpaca-autoloads)
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))
;; reproduce error
(elpaca paredit)
(elpaca-rebuild 'paredit)
Expected behavior:
Emacs starts up normally
Actual behavior:
Elpaca log comes up and gives the below error about paredit.
This looks to be the same thing as radian-software/straight.el#777.
paredit failed fatal: dumb http transport does not support shallow capabilities
First off, thanks for this package! I've been migrating my setup to elpaca
and not sure if I'm doing anything wrong, but I can't install some packages: ol-notmuch
and consult-notmuch
in particular. They do have MELPA recipes and I can see the files under elpaca-directory/cache/melpa/recipes
, but I can't find them when I either try to install them or search in elpaca-manager
. It seems that recipes that have a source other than github
(e.g., sourcehut
) are the problematic ones. Tried stepping through with edebug
but didn't have any luck.
emacs -Q
elpaca
bootstrap snippetconsult-notmuch
or search for it in elpaca-manager
I'm getting the following error on init:
Debugger entered--Lisp error: (file-missing "Cannot open load file" "No such file or directory" "loaddefs-gen")
require(loaddefs-gen)
(and (require 'loaddefs-gen) nil)
(or (and (version< emacs-version "29") (require 'autoload)) (and (require 'loaddefs-gen) nil))
(let* ((autoloadp (or (and (version< emacs-version "29") (require 'autoload)) (and (require 'loaddefs-gen) nil))) (default-directory dir) (name (format "%s-autoloads.el" package)) (output (expand-file-name name dir)) (generated-autoload-file output) (autoload-timestamps nil) (backup-inhibited t) (version-control 'never) (find-file-hook nil) (write-file-functions nil) (left-margin 0)) (if autoloadp (progn (write-region (autoload-rubric output nil 'feature) nil output nil 'silent))) (cond ((fboundp 'loaddefs-generate) (loaddefs-generate (let* ((seen nil) (--cl-var-- (elpaca--directory-files-recursively dir "\\.el$")) (file nil) (d nil) (--cl-var-- nil) (--cl-var-- t)) (while (consp --cl-var--) (setq file (car --cl-var--)) (setq d (file-name-directory file)) (if (member d seen) (progn) (setq --cl-var-- ...)) (setq seen (cons d seen)) (setq --cl-var-- (cdr --cl-var--)) (setq --cl-var-- nil)) (nreverse --cl-var--)) name nil nil nil t)) ((fboundp 'make-directory-autoloads) (make-directory-autoloads dir output)) ((fboundp 'update-directory-autoloads) (with-no-warnings (update-directory-autoloads dir)))) (let* ((buf (and t (find-buffer-visiting output)))) (if buf (kill-buffer buf) nil)) name)
elpaca-generate-autoloads("elpaca" "/Users/ashton/.emacs.d/elpaca/repos/elpaca/")
(progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer))
(condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer))))
(if buffer (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer)))) nil)
(let* ((elpaca-repo (and t (expand-file-name "repos/elpaca/" elpaca-directory))) (elpaca-build (and elpaca-repo (expand-file-name "builds/elpaca/" elpaca-directory))) (elpaca-target (and elpaca-build (if (file-exists-p elpaca-build) elpaca-build elpaca-repo))) (elpaca-url (and elpaca-target "https://www.github.com/progfolio/elpaca.git")) (s (and elpaca-url (add-to-list 'load-path elpaca-target))) (s (and s (not (file-exists-p elpaca-repo)))) (buffer (and s (get-buffer-create "*elpaca-bootstrap*")))) (if buffer (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer ... ...)))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer)))) nil))
load-with-code-conversion("/Users/ashton/.emacs.d/init.el" "/Users/ashton/.emacs.d/init.el" t t)
load("/Users/ashton/.emacs.d/init" noerror nomessage)
startup--load-user-init-file(#f(compiled-function () #<bytecode 0x1550e63276dba1>) #f(compiled-function () #<bytecode -0x1f3c6feddc0eaeb5>) t)
command-line()
normal-top-level()
After a little digging it seems this loaddefs-gen is pretty new. I'm down to rebuild my Emacs, but it's a little friction. Would checking if the necessary functions are defined work just as well as checking the version of Emacs? Though if this is behavior that's expected to be locked-in with the first release of Emacs 29, then I can see the case for leaving this as-is.
good morning sir,
recently, trying to find a better package management alternative to straight.el, I stumbled across your reddit post about this package manager. so I redited my config for elpaca but I don't know why I am recieving the following error in messages buffer:
elpaca--repo-uri: wrong type argument: stringp, nil
I have not changed or added the default elpaca recipes.
By the way, I am using arch linux with emacs-nativecomp package installed using pacman and if i am missing any essential information to provide please guide me for it though :) .
Also here is my emacs config (init.el) to reproduce the problem:
Getting error stating elpaca--repo-uri: wrong type argument: stringp, nil even using default recipes.
Here is my emacs config (init.el) to reproduce the problem:
Name : emacs-nativecomp
Installed from: Installed using pacman.
GNU Emacs 28.1
Arch linux
GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo version 1.16.0, Xaw3d scroll bars)
Linux
With straight i can install a local package in my user-emacsdirectory using the :local-repo
keyword and straight will compile and do autoloads for me. Is it possible to do this with elpaca?
No response
Currently elpaca
is a macro, which makes it cumbersome to write wrappers around that.
Maybe define a function named elpaca*
(like evil-define-key
and evil-define-key*
)?
28.something
macOS
My old use-package config had customizations for several built-in Emacs modes, like org. But, org mode doesn't need to actually be downloaded/installed, so use-package has the :ensure nil option to avoid trying to install the package while still getting the convenient, consistent, configuration syntax with :config, :bind, etc.
Is there a way to do that with elpaca-use-package? Or should I just stick to using use-package directly for those modes? It doesn't matter for any technical reason, but it would be nice if all of my package configs used the same top form instead of some starting with (elpaca-use-package ...)
and some starting with (use-package ...)
.
No response
When using elpaca, probably the most important thing to keep in mind that I encountered is that packages are only guaranteed to be installed and initialized after elpaca-after-init-hook
. This means that unless the user wants to install all the packages preemptively with a script and then start their real emacs config (which is my preference), they have to run any external package dependent code after the elpaca-after-init-hook
. elpaca provides integration with use-package for this, but still this means--at least from my understanding--that the user would likely have to wrap many "free" forms in elpaca-use-package
blocks.
(use-package foo :demand t)
;; can assume that foo is installed and initialized
(foo-message "hi")
(elpaca-use-package :demand t)
;; cannot assume foo is installed, must wrap this in `elpaca-use-package` as well (or add it to `elpaca-after-init-hook`).
(foo-message "hi")
I think this point should be emphasized more in the readme. It is kind of mentioned in the FAQs, but I don't think it is stated directly enough. Also I think it's important enough to be mentioned in the first section with the bootstrapping code. I imagine most users would think they just add the bootstrapping code to their config, tell use-package
to use elpaca
and they're all set.
Furthermore, I argue that the user should be able to "circumvent" this if they provide all their recipes via a lockfile. Something like elpaca-bootstrap-from-lockfile
which would take a path to the lockfile.
;; bootstrap-code
(...)
(elpaca-bootstrap-from-lockfile "~/.emacs.d/lockfile") ; processing done immediately since we already have all package recipes
;; can assume everything is setup and don't have to wait until after the `elpaca-after-init-hook`.
(require 'foo)
(foo-message "hi")
I want to install the kind-icon
package:
(elpaca-use-package kind-icon)
But I get this error when I try to install it:
error in process sentinel: Wrong type argument: listp, svg-lib
I looked in the source for kind-icon and it looks like the dependencies might be formatted in an unexpected way:
;; Package-Requires: ((emacs "27.1") svg-lib)
I haven't been able to find the spec for the package-requires declaration and whether or not versionless deps are allowed. As it stands, elpaca chokes on this. I'd like to know if this is something elpaca needs to fix, or if it's something that kind-icon should fix.
Try installing kind-icon
GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0)
Guix System 371aa5777a3805a3886f3feea5f1960fe3fe4219 x86_64
auto-save-list
directory created when bootstrapping elpaca
.
My recommendation is to add (setq auto-save-list-file-prefix nil)
to the bootstrap code or maybe to the build steps of packages. For me the former prevented it from being created. I don't think it's appropriate for this directory to be created as a result of installing packages.
No response
good morning sir,
recently, trying to find a better package management alternative to straight.el, I stumbled across your reddit post about this package manager. so I redited my config for elpaca but I don't know why I am recieving the following error in messages buffer:
elpaca--repo-uri: wrong type argument: stringp, nil
I have not changed or added the default elpaca recipes.
By the way, I am using arch linux with emacs-nativecomp package installed using pacman and if i am missing any essential information to provide please guide for it though :) .
Also here is my emacs config (init.el) to reproduce the problem:
GNU Emacs 28.2 build 2
x86_64-unknown-linux-gnu
GTK+ Version 3.24.34
cairo version 1.16.0
build-options: cairo gif gmp gnutls harfbuzz jpeg json m17n nativecomp png sound svg tiff xml xpm ~dbus ~imagemagick
Void Linux 6.0.10_1
x86_64 GNU/Linux
I tried installing several different packages but ran into this same issue.
Did a fresh start with just two files init.el and early-init.el with the following contents:
;; init.el
<elpaca bootstrapping snippet>
(elpaca nano-theme)
(load-theme 'nano-dark t)
;; early-init.el
(setq package-enable-at-startup nil)
Once fetching package sources completes I get the error mentioned in the log output.
elpaca-log
shows the following:
Package Status Info Time ▼
elpaca queued Package queued 27.220514
nano-theme queued Package queued 27.220894
Then if I do elpaca-rebuild nano-theme
I get:
Package Status Info Time ▼
nano-theme cloning Resolving deltas: 100% (2/2), done. 927.461470
nano-theme cloning Adding Remotes 927.484334
nano-theme cloning Remotes fetched 928.355380
nano-theme ref-checked-out remote's HEAD checked out 928.355432
nano-theme cloning-deps Cloning Dependencies 928.355449
nano-theme cloning-deps No external dependencies detected 928.355679
nano-theme linking Linking build files 928.355704
nano-theme linking Build files linked 928.357357
nano-theme autoloads Generating autoloads: /home/snakebite/.config/emacs/elpaca/builds/nano-theme 928.357678
nano-theme autoloads INFO Scraping files for nano-theme-autoloads.el... 928.650038
nano-theme autoloads INFO Scraping files for nano-theme-autoloads.el...done 928.658779
nano-theme autoloads Autoloads Generated 928.713499
nano-theme byte-compilation Byte compiling 928.713537
nano-theme byte-compilation Checking /home/user/.config/emacs/elpaca/builds/nano-theme... 928.846052
nano-theme byte-compilation Compiling /home/user/.config/emacs/elpaca/builds/nano-theme/nano-dark-theme.el... 928.871431
nano-theme byte-compilation Compiling /home/user/.config/emacs/elpaca/builds/nano-theme/nano-light-theme.el... 928.936611
nano-theme byte-compilation Compiling /home/user/.config/emacs/elpaca/builds/nano-theme/nano-theme-autoloads.el... 928.936638
nano-theme byte-compilation Compiling /home/user/.config/emacs/elpaca/builds/nano-theme/nano-theme-support.el... 928.936657
nano-theme byte-compilation In nano-mode: 928.936672
nano-theme byte-compilation nano-theme-support.el:9:379 Warning: assignment to free variable 928.936688
nano-theme byte-compilation ‘default-major-mode’ 928.936702
nano-theme byte-compilation nano-theme-support.el:9:388 Warning: assignment to free variable 928.936717
nano-theme byte-compilation ‘auto-fill-mode’ 928.936730
nano-theme byte-compilation In nano-new-frame: 928.936745
nano-theme byte-compilation nano-theme-support.el:10:464 Warning: Unused lexical variable 928.936759
nano-theme byte-compilation `background-mode' 928.936779
nano-theme byte-compilation nano-theme-support.el:26:464 Warning: Unused lexical variable 928.936795
nano-theme byte-compilation `selected-frame' 928.936811
nano-theme byte-compilation nano-theme-support.el:26:465 Warning: Unused lexical variable 928.936826
nano-theme byte-compilation `nano-theme-frame-only' 928.936841
nano-theme byte-compilation Compiling /home/user/.config/emacs/elpaca/builds/nano-theme/nano-theme.el... 928.936855
nano-theme byte-compilation Done (Total of 4 files compiled, 1 skipped) 928.946514
nano-theme byte-compilation Byte compilation complete 928.946582
nano-theme info Compiling Info files 928.946604
nano-theme info makeinfo executable not found 928.946614
nano-theme activation Activating package 928.946639
nano-theme activation Package build dir added to load-path 928.946669
nano-theme activated Package activated 928.947355
nano-theme finished ✓ 4.031 secs 928.947399
Now with M-x customize-themes
I'm able to activate the theme,
but when I restart emacs I again come across the same error mentioned in log output.
Although ".config/emacs/elpaca/builds/nano-theme/" has all related theme files.
elpaca-log
again shows the same queued status:
Package Status Info Time ▼
elpaca queued Package queued 27.220514
nano-theme queued Package queued 27.220894
I tried (elpaca-use-package nano-theme)
but got same results.
I also got this same issue when I tried it in termux on android phone.
Debugger entered--Lisp error: (error "Unable to find theme file for ‘nano-dark’")
error("Unable to find theme file for `%s'" nano-dark)
load-theme(nano-dark t)
load-with-code-conversion("/home/user/.config/emacs/init.el" "/home/user/.config/emacs/init.el" t t)
load("/home/user/.config/emacs/init" noerror nomessage)
startup--load-user-init-file(#f(compiled-function () #<bytecode 0x1aa15021294705b2>) #f(compiled-function () #<bytecode 0x4d12c0e0e454f0b>) t)
command-line()
normal-top-level()
Edit: added build options
Elpaca log has borders around the header and clears each line as it completes.
GNU emacs 29 Keeps all the entries visible in a list and does not box the headers.
Originally reported by: @bestlem
[I] start an emacs instance with --debug-init
enabled, but the backtrace isn't showing up. And emacs's is suggesting that I didn't use the debug flag.
Originally posted by @Luis-Henriquez-Perez in #42 (comment)
GNU Emacs 30.0.50
Development version 26b93ce7cc1d on kt_fix_sieve-manage_multibyte_handling branch; build date 2022-12-31.
Debian bookworm
I'm currently using straight.el
and just started to play around with elpaca
. I really like it, thanks for working on this!
However, somehow I cannot convert the following:
(use-package zenburn-theme
:straight (:fork (:protocol ssh)) ;; :repo "ktetzlaff/zenburn-emacs"
:init
(load-theme 'zenburn t nil)
to an equivalent elpaca recipe.
With straight, the form above creates a clone with remotes origin
(from the original recipe) and fork
(my fork). straight then uses fork/master
to install the package. However, elpaca ends up using origin/master
(which is bbatsov/zenburn-emacs not ktetzlaff/zenburn-emacs) for the package installation.
I first tried the following:
(elpaca-use-package (zenburn-theme
:remotes (("fork"
:host github ;; why is it necessary to specify the :host?
:protocol ssh ;; the :protocol keyword is missing in the documentation
:repo "ktetzlaff/zenburn-emacs")
"origin"))
:init
(load-theme 'zenburn t nil))
then:
(elpaca-use-package (zenburn-theme
:remotes (("fork"
:host github
:repo "ktetzlaff/zenburn-emacs"
:protocol ssh)
("origin"
:host github ;; why is it necessary to repeat :host?
:repo "bbatsov/zenburn-emacs"
:protocol https)))
(load-theme 'zenburn t nil))
But in both cases, the branch which gets used during the build/install phase, is origin/master
(aka bbatsov/zenburn-emacs) not my fork.
I even tried:
(elpaca-use-package (zenburn-theme
:remotes ("fork"
("fork"
:host github
:repo "ktetzlaff/zenburn-emacs"
:protocol ssh)))
:init
(load-theme 'zenburn t nil))
Which, at first glance, looked to do the right thing:
git -C zenburn-emacs status
# On branch master
# Your branch is up to date with 'fork/master'.
So, there is now a branch fork/master
, but now forks' URLs points to bbatsov/zenburn-emacs and not ktetzlaff/zenburn-emacs:
git -C zenburn-emacs remote -v
fork https://github.com/bbatsov/zenburn-emacs.git (fetch)
fork https://github.com/bbatsov/zenburn-emacs.git (push)
After that, some remarks regarding the elpaca :remotes
documentation:
The first element is the default remote when installing the package. If it is a string, it names the default remote. The remaining elements are lists of the form: (NAME . PROPS)
From this, it is not clear to me, how to select the default remote. The first sentence seems to indicate that the order of remotes decides which remote should be the default. However, the second sentence then seems to state that the first element is only used as default if it is a string?
Anyway, since I always end up with origin/master
: What needs to be done to get fork/master
?
The documentation then goes on:
NAME is a string used to name the remote. PROPS are recipe keyword/value pairs used to override values previously declared in the recipe.
Here, the ... used to override values previously declared in the recipe ... part doesn't seem to be working. E.g. even in the 2nd example, leaving out the :host
in the origin
remote results in an error (due to :host nil
).
elpaca commit SHA: 008949ef8edf804e4833d5
While trying to figure out what was going on in recipes with multiple remotes (s. #50), I found the available logs lacking. E.g. with the following recipe:
(elpaca-use-package (zenburn-theme
:remotes (("fork"
:host github
:repo "ktetzlaff/zenburn-emacs"
:protocol ssh)
("origin"
:host github
:repo "bbatsov/zenburn-emacs"
:protocol https))))
the log contains:
...
zenburn-theme cloning Adding Remotes 03.920017
zenburn-theme cloning Fetching origin 04.024162
zenburn-theme cloning * [new branch] master -> fork/master 08.925965
zenburn-theme cloning Remotes fetched 08.926009
zenburn-theme ref-checked-out remote's HEAD checked out 08.926020
...
Which is missing a lot of relevant information and contains some inconsistencies. Like:
As a quick overview, the current logging is fine. But also quite useless when it really matters. ;-)
As a suggestion: It would help a lot if the external (git, build, install, ...) commands which are executed would be logged. Maybe after enabling verbose logging via a customizable variable.
Further down, it gets much more detailed:
zenburn-theme byte-compilation Byte compiling 09.122967
zenburn-theme byte-compilation Checking /home/kai/.emacs.d/minimal/elpaca/builds/zenburn-theme... 09.249076
zenburn-theme byte-compilation Compiling /home/kai/.emacs.d/minimal/elpaca/builds/zenburn-theme/zenburn-theme-autoloads.el... 09.261003
zenburn-theme byte-compilation Compiling /home/kai/.emacs.d/minimal/elpaca/builds/zenburn-theme/zenburn-theme.el... 09.261011
zenburn-theme byte-compilation Done (Total of 0 files compiled, 2 skipped) 09.261019
zenburn-theme byte-compilation Byte compilation complete 09.261058
However, now some of the messages are too long to fit into the elpaca-ui table and get cut off. The log seems to claim that two files got byte compiled (Compiling ...
). But, in the next line the log continues with: Done (Total of 0 files compiled, 2 skipped)
. So actually nothing got compiled? Why? Maybe having the complete messages would clarify this (or maybe not, s. [1]).
Is there a way to see the complete log lines?
[1] The zenburn theme sources are a bit peculiar. Byte-compiling the .el
files actually does not produce any output. I.e. there are no .elc
files.
GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.34, cairo version 1.17.6) of 2022-09-12
Arch Linux
Org fails to clone after change in ded0a70
The org recipe is a full url to git repository on savannah. The change to expand-file-name if host is not set breaks this by prefixing the url with the current directory.
Reverting to d7d887a allows the clone to work again.
This likely also affects org-contrib since the recipe is a full url for the repo rather than host + repo.
No response
GNU Emacs 27.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.24, cairo version 1.16.0)
OS: Guix System 371aa5777a3805a3886f3feea5f1960fe3fe4219 x86_64
How to avoid head does not point to a branch
error when updating a package? I tried to update one of my packages tempel
and the updating failed due to the before mentioned git error. When I visited the directory of the package I saw that it was not checkout out to a branch. And looking at my recipes I saw that there was no default branch. This is true even for packages I installed with elpaca
after I started using it.
Should there be a default branch?
If not, I figure I should programmatically add one for all of the recipes I have.
tempel update-log fatal: HEAD does not point to a branch 53463.776085
### Confirmation
- [X] I've read the documentation and I still am unsure.
I was using a build of emacs without json support.
The bootstrapping process failed with:
In end of data:
elpaca-menu-melpa.el:38:6: Warning: the function ‘json-parse-string’ is not known to be defined.
Compilation finished.
In my case, the solution was to say apt install libjansson-dev
; rebuild emacs, including --with-json
in configure
's arguments, etc. This isn't exactly a fully generalizable solution 😄.
I think the instructions in README.org need to be clear that this requires a build of emacs with json support.
Try to bootstrap elpaca per instructions in README.org using emacs built without --with-json
.
I am in the process of migrating from straight.el. The way I used straight is unconventional. I used an elisp script to register a list of recipes with straight-register-package
. I am trying to replicate this process with elpaca
.
I have an org file with elpaca acceptable recipes for the packages I adapted from my straight recipes. Each heading in the file has a source block with a package recipe. I display the first one as an example below.
* evil-goggles
:PROPERTIES:
:LABELS: [[id:e80a07f6-a377-4f86-b892-d221897e8980][recipe]]
:ID: 20cd3665-1f17-4a1a-b30f-ef428e192862
:END:
#+begin_src emacs-lisp
'(evil-goggles :host github :repo "edkolev/evil-goggles" :branch nil :depth 1 :ref "08a22058fd6a167f9f1b684c649008caef571459")
#+end_src
So in essense what I want is for a package manager to simply install a list of packages into a directory that I specify. And to provide me with directories I can append to the load-path
, custom-theme-directory
and Info-directory-files
. I don't want my init file to install any packages, I just want it to assume these directories exist and append to these variables accordingly.
I thought about just going down the list and calling elpaca
on each recipe one by one, but some packages are dependencies of others. And installing a dependency might pull in other packages before I've had a chance to specify their recipe. For example, evil-goggles
is (by chance) the first item in my list of recipes. But calling elpaca
on it might install evil.
I recall straight had straight-register-package
for this reason which would register package recipes before installing them.
I tried using elpaca-recipe-functions
for this. (I also tried adding to elpaca-order-functions
, not sure which one to use). The idea being that I wanted merge plist values to the built-in recipes so that my preferences for :ref
and :repo
and :depth
were respected.
;; create
;; An alist of elpaca recipes.
(defun oo-elpaca-custom-recipes ()
"Return recipes in recipes.org as an alist."
(with-temp-buffer
(insert-file-contents "~/dotfiles/recipes.org")
(goto-char (point-min))
(let (orders)
(while (re-search-forward (rx "#+begin_src emacs-lisp\n" (group-n 1 (1+ not-newline)) "\n#+end_src") nil t)
(push (cadr (car (read-from-string (match-string 1)))) orders))
orders)))
(defvar oo-elpaca-custom-recipes (oo-elpaca-custom-recipes)
"Custom recipes derived from recipe files.")
(defun oo-elpaca-custom-recipes-fn (recipe)
(alist-get (car recipe) oo-elpaca-custom-orders))
(add-hook 'elpaca-recipe-functions #'oo-elpaca-custom-recipes-fn)
;; I think this should work instead of the ugliness I did below.
;; (mapc #'elpaca-try (mapcar #'car oo-elpaca-custom-recipes))
(let* ((packages (mapcar #'car oo-elpaca-custom-recipes))
(elpaca-forms (mapcar (lambda (package) `(elpaca ,package (message "Installed %s..." ',package))) packages)))
(funcall `(lambda () ,@elpaca-forms)))
This didn't work.
I try relying on elpaca merging the recipe I provide with its internal one to do what I mean.
(defun oo-elpaca-custom-orders ()
"Try to see if I have a recipe registered."
(with-temp-buffer
(insert-file-contents "~/dotfiles/recipes.org")
(goto-char (point-min))
(let (orders)
(while (re-search-forward (rx "#+begin_src emacs-lisp\n" (group-n 1 (1+ not-newline)) "\n#+end_src") nil t)
(push (cadr (car (read-from-string (match-string 1)))) orders))
orders)))
(defvar oo-elpaca-custom-orders (oo-elpaca-custom-orders)
"Custom recipes derived from recipe files.")
(let* ((packages oo-elpaca-custom-orders)
(elpaca-forms (mapcar (lambda (package) `(elpaca ,package (message "Installed %s..." ',package))) packages)))
(funcall `(lambda () ,@elpaca-forms)))
This is successfully installing packages, but I'm not sure if my concern about registering packages/sorting by dependencies is being met. Maybe it is because elpaca
works asyncronously so I'm not sure if it is actually installing packages yet until elpaca-process-queues
is called.
Many packages were installed, as claimed by elpaca-status
. However, the queue processing seemed to stop on sevaral occations, I had to manually call elpaca-process-queues
multiple times. I'm not completely sure what's happening.
Either a certain parameter of a function or macro, or a variable (probably the former would be preferable) that forces elpaca
to install packages synchronously.
I understand that elpaca
is specifically designed to work asynchronously so a synchronous install would be an "anti-feature".
Sometimes in which an asynchronous install of packages is preferable. For me this is nice when installing a package during an active emacs session. You can use elpaca-try
to install one or more packages, and do other things while waiting for them to be installed.
elpaca-after-init-hook
The solution suggested for why did my init file execute out of order is to move all of your init file (or at least the external package dependant parts of it) into elpaca-after-init-hook
. This way this code will be run only after package installation as ended.
Even if you follow the recommended solution, you still miss potentially the entire startup process when installing a sufficiently large number of packages. So any code you have involving after-init-hook
, before-init-hook
, frame-notice-user-settings
, .etc has to be revised and likely modified so that it still works even if it missed timing.
In my opinion, requiring to move all their init file contents into a hook to accommodate a single emacs package is unreasonable. A package should require installation, configuration and installation of any dependencies it needs, but it shouldn't entail a restructuring of your entire config solely to meet its own needs.
I suspect many Emacs users like me have a config file that heavily relies on external packages--so much so that not having those packages would make emacs unusable for them. For these users, an asynchronous package installation during startup does not benefit them as much because even if emacs is unblocked, it would be too inconvenient to use until their main packages are installed.
I am not the only one who has been concerned about this. I assert that enough users have expressed interest in a synchronous installation for it to be added as an alternative.
#29 (comment)
#29 (comment)
#7 (comment)
#7 (comment)
Hello,
What a great job you are doing with this package manager, I have a query:
How elpaca can be integrated with setup.el as an alternative to use-package.
Thank you very much
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.