分层弹出菜单的简单实现
Simple implementation of a layered popup menu
题目是弹出菜单的实现,即获取多级子菜单。上面的代码创建了一个具有一个嵌套级别的简单菜单(取消注释 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Меню menu-item "ПодПодМеню1Выбор2Меню" ...)
最有趣,一如既往的隐藏!
谢谢大家,我自己搞定了
(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" выбзнч))
题目是弹出菜单的实现,即获取多级子菜单。上面的代码创建了一个具有一个嵌套级别的简单菜单(取消注释 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Меню menu-item "ПодПодМеню1Выбор2Меню" ...)
最有趣,一如既往的隐藏!
谢谢大家,我自己搞定了
(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" выбзнч))