LINUX.ORG.RU

emacs динамическое меню, как правильно привязать lambda/функцию?

 ,


0

1

Здравствуйте, проблема в следующем: создаю динамическое меню из списка найденных файлов и проблема возникает в том что не понятно как идентифицировать какой пункт был выбран.Если генерировать lambda примерно вот так вот :

(mapc (lambda (el) 
	    (define-key global-map [menu-bar Test (cons (file-name-nondirectory el))]
	      (cons (file-name-nondirectory el)  (lambda ()
						   (interactive)
						   (shell-command (concat "file  " el)))))) FileList) ;;пусть условно это будет программа file
То при выборе пункта будет ошибка, el - уже давно не существует. Можно ли развернуть значение el в lambda или как то создать список функций с заполненной константой или просто узнать имя или номер пункта на который нажал?

Проблему решил, перешел на easymenu - там все это делается просто.

★★★★

Последнее исправление: Silerus (всего исправлений: 1)

Ответ на: комментарий от no-such-file

я пробовал, говорит что el неизвестный элемент, оно и логично к моменту вызова никакого el уже нет и в помине, вот если б он сразу свое содержимое подставлял, у меня есть запасной вариант создать виджет-форму и там все это спокойно обработать, но это не так красиво как динамическое меню

Silerus ★★★★
() автор топика
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

Похоже, что создавать надо через переменную lexical-binding. А форма (closure ...) — это то, во что оно внутри превратится.

monk ★★★★★
()
Ответ на: комментарий от monk

похоже я слишком туп, высплюсь попробую снова, похоже там надо обязательно byte компилить и грузить уже этот файл, но я все больше склоняюсь ко второму варианту

Silerus ★★★★
() автор топика
Последнее исправление: Silerus (всего исправлений: 1)
Ответ на: комментарий от Silerus

Просто добавь первой строкой файла с кодом

;; -*- lexical-binding: t -*-

Этого должно хватить, чтобы el проваливалось внутрь вложенных замыканий внутри (lambda (el) ...).

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.