Простая реализация многоуровневого всплывающего меню - PullRequest
0 голосов
/ 01 августа 2020

Речь идет о реализации всплывающего меню, а именно получении многоуровневого подменю. Приведенный выше код создает простое меню с одним уровнем вложенности (раскомментируйте supPane1 и комментарий; supSupPane). При попытке добавить другое вложение (раскомментируйте supSupPane и комментарий; supPane1) результат для меня неожиданный.

    (let* ((Pane1 '("Разделы1" ("ПодПод1"."ПодПод1")("ПодПод2"."ПодПод2")("ПодПод3"."ПодПод3")("ПодПод4"."ПодПод4")))
       (Pane2 '("Разделы2" ("ПодПод1"."ПодПод1")("ПодПод2"."ПодПод2")("ПодПод3"."ПодПод3")("ПодПод4"."ПодПод4")))
       (Pane3 '("Разделы3" ("ПодПод1"."ПодПод1")("ПодПод2"."ПодПод2")("ПодПод3"."ПодПод3")("ПодПод4"."ПодПод4")))
       (Pane4 '("Разделы4" ("ПодПод1"."ПодПод1")("ПодПод2"."ПодПод2")("ПодПод3"."ПодПод3")("ПодПод4"."ПодПод4")))
       (supPane1 `("ЧудоМеню1" ,Pane1 ,Pane2 ,Pane3 ,Pane4))
       (supPane2 `("ЧудоМеню2" ,Pane1 ,Pane2 ,Pane3 ,Pane4))
       (supPane3 `("ЧудоМеню3" ,Pane1 ,Pane2 ,Pane3 ,Pane4))
       (supPane4 `("ЧудоМеню4" ,Pane1 ,Pane2 ,Pane3 ,Pane4))
       (supSupPane `("СупперЧудоМеню" ,supPane1 ,supPane2 ,supPane3 ,supPane4))
       (выбзнч (x-popup-menu 
        (list '(50 50) (selected-frame)) 
        supPane1)
           ;supSupPane)
           ))
  (message "Ваш выбор это: %s" выбзнч))

Кроме того, меня интересует просто отключить назначенные сочетания клавиш для быстрого доступа к меню в emacs код поиска. Спасибо.

Существует решение с использованием макроса easy-menu-define.

    (setq my-menu '())
(easy-menu-define my-menu nil "Моё Чудо Меню"
              '("ПодМеню"
            ["ПодМенюВыбор1" "ПодМенюВыбор1" t]
            ["ПодМенюВыбор2" "ПодМенюВыбор2" t]
            ["ПодМенюВыбор3" "ПодМенюВыбор3" t]
            ("ПодПодМеню1"
             ["ПодПодМеню1Выбор1" "ПодПодМеню1Выбор1" t]
             ("ПодПодМеню1Выбор2Меню"
              ["ПодПодМеню1Выбор2МенюВыбор1" "ПодПодПодМеню1Выбор1" t]
              ["ПодПодМеню1Выбор2МенюВыбор2" "ПодПодПодМеню1Выбор2" t]
              ["ПодПодМеню1Выбор2МенюВыбор3" "ПодПодПодМеню1Выбор3" t]
              ["ПодПодМеню1Выбор2МенюВыбор4" "ПодПодПодМеню1Выбор4" t]
              ("ПодПодМеню1Выбор2МенюВыбор5Меню"
               ["ПодПодМеню1Выбор2МенюВыбор5МенюВыбор1" "ПодПодПодМеню1Выбор1" t]
               ["ПодПодМеню1Выбор2МенюВыбор5МенюВыбор2" "ПодПодПодМеню1Выбор2" t]
               ["ПодПодМеню1Выбор2МенюВыбор5МенюВыбор3" "ПодПодПодМеню1Выбор3" t]
               ["ПодПодМеню1Выбор2МенюВыбор5МенюВыбор4" "ПодПодПодМеню1Выбор4" t]
               )
              )
             ["ПодПодМеню1Выбор2" "ПодПодМеню1Выбор2" t]
             ["ПодПодМеню1Выбор3" "ПодПодМеню1Выбор3" t]
             )
            ("ПодПодМеню2"
             ["ПодПодМеню2Выбор1" "ПодПодМеню2Выбор1" t]
             ("ПодПодПодМеню1"
              ["ПодПодПодМеню1Выбор1" "ПодПодПодМеню1Выбор1" t]
              ["ПодПодПодМеню1Выбор2" "ПодПодПодМеню1Выбор2" t]
              ("ПодПодПодМеню"
               ["ПодПодПодМеню1Выбор1" "ПодПодПодМеню1Выбор1" t]
               ["ПодПодПодМеню1Выбор2" "ПодПодПодМеню1Выбор2" t]
               ["ПодПодПодМеню1Выбор3" "ПодПодПодМеню1Выбор3" t]
               )
              ["ПодПодПодМеню1Выбор3" "ПодПодПодМеню1Выбор3" t]
              )
             ["ПодПодМеню2Выбор2" "ПодПодМеню2Выбор2" t]
             ["ПодПодМеню2Выбор3" "ПодПодМеню2Выбор3" t]
             )))
(let* ((выбзнч (x-popup-menu 
        (list '(50 50) (selected-frame)) 
        my-menu)
           ))
  (message "Ваш выбор это: %s" выбзнч))

Меню формируется динамически, поэтому использование этого макроса больше не действует.

Давайте проанализируем, какое меню сделал макрос

my-menu =>

(keymap "ПодМеню" (ПодМенюВыбор1 menu-item "ПодМенюВыбор1" menu-function-2 :key-sequence nil) (ПодМенюВыбор2 menu-item "ПодМенюВыбор2" menu-function-3 :key-sequence nil) (ПодМенюВыбор3 menu-item "ПодМенюВыбор3" menu-function-4 :key-sequence nil) (ПодПодМеню1 menu-item "ПодПодМеню1" (keymap "ПодПодМеню1" (ПодПодМеню1Выбор1 menu-item "ПодПодМеню1Выбор1" menu-function-5 :key-sequence nil) (ПодПодМеню1Выбор2Меню menu-item "ПодПодМеню1Выбор2Меню" ...) (ПодПодМеню1Выбор2 menu-item "ПодПодМеню1Выбор2" menu-function-10 :key-sequence nil) (ПодПодМеню1Выбор3 menu-item "ПодПодМеню1Выбор3" menu-function-11 :key-sequence nil))) (ПодПодМеню2 menu-item "ПодПодМеню2" (keymap "ПодПодМеню2" (ПодПодМеню2Выбор1 menu-item "ПодПодМеню2Выбор1" menu-function-12 :key-sequence nil) (ПодПодПодМеню1 menu-item "ПодПодПодМеню1" ...) (ПодПодМеню2Выбор2 menu-item "ПодПодМеню2Выбор2" menu-function-13 :key-sequence nil) (ПодПодМеню2Выбор3 menu-item "ПодПодМеню2Выбор3" menu-function-14 :key-sequence nil))))

Что он здесь составил, вообще не понятно. Учимся!

(ПодПодМеню1Выбор2Меню пункт меню "ПодПодМеню1Выбор2Меню" ...)

Самое интересное, как всегда скрыто!

1 Ответ

0 голосов
/ 01 августа 2020

Всем спасибо, разобрался сам.

(let ((выбзнч (x-popup-menu 
        (list '(0 0) (selected-frame)) 
    '(keymap "Меню"
         (ПодМенюВыбор1 menu-item "ПодМенюВыбор1" menu-function-2 :key-sequence nil)
         (ПодМенюВыбор2 menu-item "ПодМенюВыбор2" menu-function-3 :key-sequence nil)
         (ПодМенюВыбор3 menu-item "ПодМенюВыбор3" menu-function-4 :key-sequence nil)
         (ПодМенюВыбор4 menu-item "ПодМенюВыбор4Меню" (keymap "ПодПодМеню"
                (ПодПодМенюВыбор1 menu-item "ПодПодМенюВыбор1" menu-function-2 :key-sequence nil)
                (ПодПодМенюВыбор2 menu-item "ПодПодМенюВыбор2" menu-function-3 :key-sequence nil)
                (ПодПодМенюВыбор3 menu-item "ПодПодМенюВыбор3" menu-function-4 :key-sequence nil)
                (ПодПодМенюВыбор4 menu-item "ПодПодМенюВыбор4Меню" (keymap "ПодПодПодМеню"
                                               (ПодПодПодМенюВыбор1 menu-item "ПодПодПодМенюВыбор1" menu-function-2 :key-sequence nil)
                                               (ПодПодПодМенюВыбор2 menu-item "ПодПодПодМенюВыбор2" menu-function-3 :key-sequence nil)
                                               (ПодПодПодМенюВыбор3 menu-item "ПодПодПодМенюВыбор3Меню" (keymap "ПодПодПодПодМеню"

                                                                            (ПодПодПодПодМенюВыбор1 menu-item "ПодПодПодПодМенюВыбор1" menu-function-2 :key-sequence nil)
                                                                            (ПодПодПодПодМенюВыбор2 menu-item "ПодПодПодПодМенюВыбор2" menu-function-3 :key-sequence nil)
                                                                            (ПодПодПодПодМенюВыбор3 menu-item "ПодПодПодПодМенюВыбор3" menu-function-4 :key-sequence nil)))))))))))                                                 
  (message "Ваш выбор это: %s" выбзнч))
...