附加到 emacs-lisp 中列表的默认值:具体来说,dotspacemacs-configuration-layers

Append to default value of a list in emacs-lisp: specifically, dotspacemacs-configuration-layers

目标

我希望通过引用文件 user-config.orguser-layers.org

进一步扩展我的 spacemacs 配置的模块化

模板

我通过在 dotspacemacs/user-config 中添加以下内容实现了前者:

(defun dotspacemacs/user-config ()
  (org-babel-load-file (expand-file-name
                        "user-config.org" dotspacemacs-directory)))

我可以放心地尝试克隆同步、organize、版本控制user-config.org

问题

现在, dotspacemacs/user-layers 是按以下方式在函数中设置的变量(默认):

(defun dotspacemacs/layers ()
  (setq-default
   dotspacemacs-distribution 'spacemacs  ;; not relevant
   ;;
   ;; many such default variable-value lines in between, skipped.
   ;;
   dotspacemacs-configuration-layers
   '(
     ;;
     ;; many layers auto-added/managed by spacemacs
     ;;
     git
     (python :variables python-backend 'lsp
           python-lsp-server 'pyright
           ;; other such python configurations
           python-formatter 'yapf))
   ;; other such default varialbe-value declarations
  )
)

尝试

我尝试按以下方式在 setq-default 的末尾添加类似的继承(与 user-config 一样),

(defun dotspacemacs/layers ()
  (setq-default
    dotspacemacs-distribution 'spacemacs
    ;;
    ;; many such default variable-value lines in between, skipped.
    ;;
    dotspacemacs-configuration-layers
    '(
    ;; whatever spacemacs wants to auto-add
    )
    ;; other such default variable-value declarations
  )
  (org-babel-load-file (expand-file-name
    "user-layers.org" dotspacemacs-directory))
)

—使得 user-layers.org 具有以下形式:

引用的 org-mode 文件:

#+BEGIN_SRC emacs-lisp

(append dotspacemacs-configuration-layers
  '(
    ;;
    ;; Other layers managed by the user
    ;;
    git
    (python :variables python-backend 'lsp
            python-lsp-server 'pyright
            ;; other such python configurations
            python-formatter 'yapf)))

#+END_SRC

失败

但是,append 似乎没有向 seq-default 值添加元素。 我猜它附加到变量的本地 setq 值。 (我可能错了,因为 lisp 不是我的母语,python 是。)

问题:

有没有办法通过添加另一个列表中的元素来扩展 emacs-lisp 中列表的 default 值?

澄清:

—使得添加后,列表的默认值包含新添加的元素。

像这样的东西应该可以工作:

(setq-default dotspacemacs-configuration-layers
   (append (default-value 'dotspacemacs-configuration-layers)
           '(git ...)))

请注意,append 不会修改原始列表 - 它会创建一个添加了额外值的新列表。要将值添加到变量中包含的列表,您需要重新分配新列表:

*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (setq x (list 1 2 3))
(1 2 3)

ELISP> (setq y (list 4 5 6))
(4 5 6)

ELISP> (append x y)
(1 2 3 4 5 6)

ELISP> x
(1 2 3)

ELISP> (setq x (append x y))
(1 2 3 4 5 6)

ELISP> x
(1 2 3 4 5 6)