在嵌套关联列表中添加或替换项目

时间:2018-09-30 19:32:03

标签: list emacs

从文档中

  

变量window-system-default-frame-alist是以下内容的列表   元素(WINDOW-SYSTEM . ALIST),其中WINDOW-SYSTEM是一个   窗口系统符号,ALIST是框架参数列表。

比方说,我想更改X窗口系统的frame参数alist,使其包含元素(font . "Monospace-11"),但我不想在该列表中包含多个font元素。

那我该怎么办?基本上,我会遍历清单,删除要替换/添加的元素,然后添加该元素。这是代码:

(let ((x-frame-alist (alist-get 'x window-system-default-frame-alist)))
  (cl-acons 'x (cl-acons 'font "Monospace-11"
                         (cl-remove (cl-assoc 'font x-frame-alist)
                                    x-frame-alist))
            (cl-remove `(x . ,x-frame-alist)
                       window-system-default-frame-alist)))

然后必须将结果分配给符号window-system-default-frame-alist。但是,所有这些看起来都过于复杂。当然,必须有一个更简单的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以这样做:

(push '(font . "Monospace-11")
      (alist-get 'x window-system-default-frame-alist))

(setf (alist-get 'font (alist-get 'x window-system-default-frame-alist))
      "Monospace-11")

答案 1 :(得分:1)

您可以使用create_task设置新字体,并使用push删除旧设置。

assq-delete-all

返回:

(progn
  (setq frame-alist '((x . ((font . "remove")
                            (other . "d")
                            (font . "remove")
                            (other . "c")))
                      (w32 . ((font . "keep")))))

  (setq x-change-font (assq-delete-all 'font (alist-get 'x frame-alist)))
  (push '(font . "wanted") x-change-font)
  (setq frame-alist
        (mapcar
         (lambda (elem) (if (eq (car elem) 'x) `(x . ,x-change-font) elem))
         frame-alist ))
  frame-alist)