LINUX.ORG.RU

Проблема с Clickable text в Emacs

 , ,


0

1

Задача такая: есть буфер FirstBuffer, в котором содержится код на elisp. Этот код после вычисления должен создать буфер TextButtonBuffer, в котором должна создаться текстовая кнопка «Кнопка».Эта кнопка при клике должна возвращать нас обратно в FirstBuffer. Ну то есть я пытаюсь понять простейшую реализацию Clickable Text.

Вот мой код:

  (let ((MyMap (make-sparse-keymap)) StartPos EndPos FirstBuffer TextButtonBuffer ClickFunc)
    (progn
      (setq FirstBuffer (current-buffer))

      (defun ClickFunc()
        "Кликальщик"
        (switch-to-buffer FirstBuffer)
      )

      (switch-to-buffer "*TextButton*")
        (setq TextButtonBuffer (current-buffer))
        (setq StartPos (point))
        (princ "Кнопка" TextButtonBuffer)
        (setq EndPos (point))

      (define-key MyMap [mouse-1] 'ClickFunc)
      (add-text-properties StartPos EndPos '(mouse-face highlight keymap MyMap) TextButtonBuffer)
    )
  )   

Я совсем не уверен насчет строки

(define-key MyMap [mouse-1] 'ClickFunc)

В целом этот код не работает. Кнопка подсвечивается как кликуемая, но сам клик не пашет(

Также меня интересует реализация той же задачи на widget link. Не совсем понимаю смысл follow-link в виджетах. И как в виджете привязывать кликанье к действию?

или добавь в заголовок файла
;;; -*- lexical-binding: t -*-
или делай (require 'cl) и вместо let — lexical-let
переменные динамические по умолчанию поэтому в момент клика по кнопке переменная FirstBuffer не определена

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

Ну я вообще убрал весь let

  (progn
    (setq MyMap (make-sparse-keymap))
    (setq FirstBuffer (current-buffer))

    (defun ClickFunc()
      "Кликальщик"
      (switch-to-buffer FirstBuffer)
    )

    (switch-to-buffer "*TextButton*")
      (setq TextButtonBuffer (current-buffer))
      (setq StartPos (point))
      (princ "Кнопка" TextButtonBuffer)
      (setq EndPos (point))

    (define-key MyMap [mouse-1] 'ClickFunc)
    (add-text-properties StartPos EndPos '(mouse-face highlight keymap MyMap) TextButtonBuffer)
  )

а все тоже самое.Проблема, как я понимаю где-то в привязывании действия к клику.

Nerevarino
() автор топика

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

Nerevarino
() автор топика
Ответ на: комментарий от Nerevarino
(defun insert-simple-button (label)
  (interactive "sButton label: ")
  (lexical-let* ((oldbuf (current-buffer))
                 (action (lambda (_)
                           (switch-to-buffer oldbuf))))
    (switch-to-buffer "*TextButton*")
    (insert-button label 'action action 'mouse-action action 'follow-link action
                   'help-echo "Click me!")))
theNamelessOne ★★★★★
()
Ответ на: комментарий от Norgat

Да, этот код работает, спасибо. Однако я пытаюсь добиться реализации на TextProperties или Widget link. Вот что такое follow-link? Например для виджета link есть свойство :follow-link, но :action там вроде нет. У меня весь сыр бор и начался с того, что я попытался воспользоваться пакетом Widget, когда не получилось полез в азы Clickable Text - в TextProperties и там застрял)

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