Как динамически определить пункт меню - что такое в квадратных скобках? - PullRequest
3 голосов
/ 01 апреля 2012

Непонятно о каком-то фундаментальном синтаксисе здесь.define-key принимает набор входных данных, один из которых находится внутри квадратных скобок.Что это за конструкция?Как я могу динамически генерировать то, что происходит внутри квадратных скобок?

В простом случае я могу отобразить одноэлементное меню следующим образом:

(flet ((ok (&optional p1 &rest args) t))
  (setq menu-1 (make-sparse-keymap "Title"))
  (define-key menu-1 [menu-1-ok-event]
    `(menu-item "OK"
                ok 
                :keys ""
                :visible t
                :enable t))
  (x-popup-menu t menu-1))

Я могу вставить дополнительные пункты меню, такие как:

(flet ((ok (&optional p1 &rest args) t))
  (setq menu-1 (make-sparse-keymap "Title"))
  (define-key menu-1 [menu-1-event-ok]
    `(menu-item "OK"
                ok 
                :keys ""
                :visible t
                :enable t))
  (define-key menu-1 [menu-1-event-1]
    `(menu-item "This is line 1"
                nil
                :keys ""
                :visible t
                :enable t))
  (x-popup-menu t menu-1))

НоЧто делать, если я хочу динамически генерировать вещь в квадратных скобках?Что делать, если я хочу что-то вроде этого:

  (while (< n 5)
   (define-key menu-1 [(dynamic-thing n)]
    `(menu-item (format "This is line %d" n)
                nil
                :keys ""
                :visible t
                :enable t)))

Я пытался

   (define-key menu-1 [(intern (format "menu-1-event-%d" n))]
      ...

.. но это не сработало.Результат всегда "стажер".???

Что такое квадратные скобки?Синтаксис мне незнаком.

1 Ответ

4 голосов
/ 01 апреля 2012

Это векторов . [foo bar] является синтаксическим сахаром для (quote (vector foo bar)); это буквально. Чтобы построить вектор, в котором необходимо оценивать элементы, явно используйте встроенную функцию vector; это работает как list.

(define-key menu-1 (vector (format "menu-1-event-%d" n)) …

Также может помочь глава раскладки меню .

...