• 0 Posts
  • 30 Comments
Joined 1 year ago
cake
Cake day: October 4th, 2023

help-circle
  • nv-elisp@alien.topBtoEmacs@communick.newsProblems with elpaca
    link
    fedilink
    English
    arrow-up
    0
    ·
    10 months ago

    [The Elpaca installer] has a version-number variable that it sets. […] The solution is to replace [the installer with] the new code in elpaca’s docs

    This is correct. For anyone troubleshooting Elpaca, there is a Wiki which covers this warning.

    When you initialized your new Emacs instance, it installed elpaca from MELPA

    This is incorrect. The installer directly clones Elpaca. Elpaca is not hosted on any ELPA. Doing so would require an installer package to be installed by another package manager. I don’t offer support for users running multiple package managers because it creates confusion about which package manager is responsible for which package, load-path entry, etc. MELPA rejected a similar proposal for straight.el as well:

    https://github.com/melpa/melpa/issues/4939

    cc: /u/liesdestroyer














  • But, if we’re using use-package to also manage installing the packages for us (:ensure t), then why shouldn’t it know about the autoloads already and automagically imply a :defer t by default?

    Package installation and activation are two seperate concerns. :ensure ensures the package is isntalled if it isn’t already. Users might want to ensure a package is installed and prefer it to be immediately required.

    So, by default, we have to remember to either add :defer t or we have to remember that setting our own hooks, bindings, or commands will create autoloads for us.

    I feel like you’re misunderstanding what autoloads do. Hooks do not autoload anything. The :commands use-package keyword does autolaod commands. This is useful when a package author has not provided the autoload cookie in the package for a command, or when you wish to forgo loading all of the autoloads.

    I know that you can configure use-package to behave as though :defer t is set by default, but that’s just broken for packages that don’t have any autoloads.

    How is it broken? There are other ways to load a package. Namely, require.

    It feels like maybe use-package is doing too many things.

    It only does what you tell it to do via user options and declarations.`

    but that kind of sucks because there’s no reason to load magit before I actually want to use it for anything. So, what we can do instead is to implement the project.el integration ourselves

    Or (use-package project :ensure nil :defer t :config (require magit)) There are multiple ways to set this sort of thing up and use-package (which should have been named use-feature) can be used to configure built-in features.

    Either I’m a little dim or the tooling here is hard to use correctly.

    Third option: You haven’t taken the time to digest the use-package manual and/or expand the macro to see what it’s doing. It’s a DSL. You have to learn it to use it effectively.

    Am I the only one?

    You must be. Otherwise someone would’ve written “use-package alternatives”, which has an almost searchable ring to it.

    Ultimately, organization comes down to the user. Tools like use-package make it easier, but they do not guarantee it.



  • (add-variable-watcher 'autosave-toggle
                          #'(lambda (_ value _ _)
                              (if value (autosave-setup) (autosave-teardown))))
    

    Don’t add an anonymous function. It will make it harder to remove. Better yet, implement this as a minor-mode.

    (defvar autosave-delay-interval 1
      "The amount of time to wait before autosaving after a change has occurred.")
    (defvar autosave-exclude-buffer-list
      '("COMMIT_EDITMSG" "treemacs-persist")
      "List of buffers to exclude from autosaving")
    (defvar autosave-immediate-save-functions-list
      '(switch-to-buffer other-window windmove-up windmove-down windmove-left windmove-right next-buffer previous-buffer)
      "A list of functions which trigger an immediate save")
    (defvar autosave-immediate-save-hooks-list
      '(mouse-leave-buffer-hook focus-out-hook)
      "A list of hooks which trigger an immediate save")
    

    These should be user options defined via defcustom

    (defmacro advice-add-list (advice-list how function)
      "Add list of advice to given function using the how parameter"
      `(dolist (advice ,advice-list)
         (advice-add advice ,how ,function)))
    (defmacro advice-remove-list (advice-list function)
      "Remove list of advice from given function using the how parameter"
      `(dolist (advice ,advice-list)
         (advice-remove advice ,function)))
    (defmacro add-hooks (hook-list function)
      "Add list of hooks to given function"
      `(dolist (hook ,hook-list)
        (add-hook hook ,function)))
    (defmacro remove-hooks (hook-list function)
      "Remove list of hooks from given function"
      `(dolist (hook ,hook-list)
        (remove-hook hook ,function)))
    

    These should be functions instead of macros. They should also be prefixed with your package’s “namespace”.