LINUX.ORG.RU

Emacs выпадающее меню

 


1

1

Здравствуйте!

Подскажи, если кто знает, есть ли в emacs готовое решение с программируемым выпадающим контекстным меню. Т.е я нажимаю какую-то комбинацию клавиш и выпадает меню, а пункты этого меню я могу формировать сам, загоняя туда нужные мне команды.

Контекстное меню в emacs - это минибуфер с автодополнением. Проще всего наверное будет использовать helm или ido и сделать к ним дополнение. Тогда «меню» будет автоматически, нужно будет только свой «источник пунктов» прикрутить.

no-such-file ★★★★★
()

Нашел!

Есть вариант: https://github.com/zonuexe/right-click-context По возможностям именно то, что нужно. Настроил для примера:

(require 'right-click-context)
(define-key global-map (kbd "M-<apps>")
	(lambda ()
	(interactive)
	(let ((right-click-context-local-menu-tree
       (append right-click-context-global-menu-tree
               '(("Insert"
                  ("Hi" :call (insert "Здравствуйте!"))
				  ("Открыть TODO" :call (org-agenda))
				  )))))
		(right-click-context-menu))))

Очень полезная штука. Функций, которые нужны, очень много и помнить комбинации клавиш для всех нереально. Поэтому можно положить их в такое меню и вызывать по названию.

knigolaz
() автор топика
Ответ на: комментарий от knigolaz

Очень полезная штука. Функций, которые нужны, очень много и помнить комбинации клавиш для всех нереально. Поэтому можно положить их в такое меню и вызывать по названию.

0. Можно их засунуть в обычное меню

1. Чтобы меньше помнить комбинации клавиш можно использовать замечательный which-key

2. Функции, которые нужны, очень неплохо вызываются из smex (ido или counsel+ivy)

3. Функции, которые нужны, также замечательно вызываются из hydra

4. etc.

habamax ★★★
()

Решил сделать в виде отдельной функции, а уже её назначить на клавишу Apps:

(require 'right-click-context)

(defun my-contex-menu ()
	(interactive)
	(let ((right-click-context-local-menu-tree
       (append right-click-context-global-menu-tree
               '(("Insert"
                  ("Hi" :call (insert "Здравствуйте!"))
				  ("Открыть TODO" :call (org-agenda))
			     )
				 ("Insert+"
                  ("Hi" :call (insert "Здравствуйте!"))
				  ("Открыть TODO" :call (org-agenda))
			     )
				))))
		(right-click-context-menu)))
knigolaz
() автор топика
Ответ на: комментарий от habamax

Спасибо за столько вариантов. Но ничего удобнее и проще выпадающего контекстного меню еще не придумали. Оно легко настраивается, а пунктам меню можно присваивать свои имена, также можно добавлять собственные функции.

knigolaz
() автор топика
Ответ на: комментарий от knigolaz

Оно легко настраивается, а пунктам меню можно присваивать свои имена, также можно добавлять собственные функции.

Ты на гидру смотрел? Там можно очень кучеряво все настроить.

Конечно на вкус и цвет товарища/образца нет, но M-x вместе со smex рвет контекстное меню как тузик грелку.

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

С гидрой я до сих пор разбираюсь, а контекстное меню уже работает и настроено. Smex я попробовал, он в принципе никого порвать не может. Я может не докрутил чего, но это обычный контекстный поиск.

knigolaz
() автор топика
Ответ на: комментарий от knigolaz

Smex я попробовал, он в принципе никого порвать не может. Я может не докрутил чего, но это обычный контекстный поиск.

Ну ок. Хотя твои функции оттуда можно вызывать, наиболее часто вызываемые на самом верху, фуззи поиск.

Еще вариант уже был описан выше — ставишь ivy/helm и отдаешь ему свой источник, в котором только твои функции. Получается аналог smex, но заточенный под тебя.

Например, если установен ivy:

(defun my-action-1 ()
  (message "action-1 was called!"))

(defun my-action-2 ()
  (message "action-2 is here"))

(defun my-action-3 ()
  (message "action-3, come on boy!"))


(defun my-commands ()
  (interactive)
  (ivy-read "Choose command: " '(("Делаем раз" . my-action-1)
                                 ("Делаем два" . my-action-2)
                                 ("Делаем три" . my-action-3))
            :action (lambda (func)
                      (funcall (cdr func)))))


биндишь my-commands на кнопку — профит.

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

Специально поставил ivy и протестировал. С контекстным меню не идет ни в какое сравнение. Нет иерархической структуры. Ограниченный обзор.Это просто еще один буфер со списком команд.

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