Добавить или заменить элемент во вложенном списке ассоциаций - PullRequest
0 голосов
/ 30 сентября 2018

Из документов:

Переменная window-system-default-frame-alist является списком элементов (WINDOW-SYSTEM . ALIST), где WINDOW-SYSTEM является символом оконной системы, а ALIST является списком параметров кадра.

Допустим, я хочу изменить список параметров кадра для системы X Window, чтобы он содержал элемент (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 голосов
/ 30 сентября 2018

Вы можете использовать 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)

Возвращает:

((x   (font . "wanted") (other . "d") (other . "c"))
 (w32 (font . "keep")))
0 голосов
/ 30 сентября 2018

Вы можете сделать:

(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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...