Spec-Zone.ru › Elisp

Определение нажимаемого текста

Нажимаемый текст — это текст, который можно нажать (мышью или сочетанием клавиш) для получения результата. Многие основные режимы используют нажимаемый текст для реализации текстовых гиперссылок или ссылок, вкратце.

Самый простой способ вставить и изменить ссылки — использовать пакет button. См. Кнопки. В этом разделе мы объясним, как вручную настроить нажимаемый текст в буфере, используя свойства текста. Для простоты мы будем называть нажимаемый текст ссылкой.

Реализация ссылки включает три отдельных шага: (1) указание возможности нажатия при наведении курсора на ссылку; (2) выполнение действия при нажатии RET или mouse-2 на этой ссылке; и (3) установка условия follow-link, чтобы ссылка подчинялась mouse-1-click-follows-link.

Чтобы указать возможность нажатия, добавьте свойство текста mouse-face к тексту ссылки; тогда Emacs будет выделять ссылку при наведении курсора. Кроме того, вы должны определить всплывающую подсказку или сообщение области отображения, используя свойство текста help-echo. См. Специальные свойства. Например, вот как Dired указывает, что имена файлов нажимаемы:

 (if (dired-move-to-filename)
     (add-text-properties
       (point)
       (save-excursion
         (dired-move-to-end-of-filename)
         (point))
       '(mouse-face highlight
         help-echo "mouse-2: visit this file in other window")))

Чтобы сделать ссылку нажимаемой, привяжите RET и mouse-2 к командам, выполняющим нужное действие. Каждая команда должна проверять, вызвана ли она по ссылке, и действовать соответственно. Например, в ключевой карте основного режима Dired привязана mouse-2 к следующей команде:

(defun dired-mouse-find-file-other-window (event)
  "In Dired, visit the file or directory name you click on."
  (interactive "e")
  (let ((window (posn-window (event-end event)))
        (pos (posn-point (event-end event)))
        file)
    (if (not (windowp window))
        (error "No file chosen"))
    (with-current-buffer (window-buffer window)
      (goto-char pos)
      (setq file (dired-get-file-for-visit)))
    (if (file-directory-p file)
        (or (and (cdr dired-subdir-alist)
                 (dired-goto-subdir file))
            (progn
              (select-window window)
              (dired-other-window file)))
      (select-window window)
      (find-file-other-window (file-name-sans-versions file t)))))

Эта команда использует функции posn-window и posn-point для определения места нажатия и dired-get-file-for-visit для определения файла для посещения.

Вместо того, чтобы привязывать команду мыши в ключевой карте основного режима, вы можете привязать её к тексту ссылки, используя свойство текста keymap (см. Специальные свойства). Например:

(let ((map (make-sparse-keymap)))
  (define-key map [mouse-2] 'operate-this-button)
  (put-text-property link-start link-end 'keymap map))

С этим методом вы можете легко определять разные команды для разных ссылок. Кроме того, глобальное определение RET и mouse-2 остаётся доступным для остального текста в буфере.

Основной командой Emacs для нажатия на ссылки является mouse-2. Однако для совместимости с другими графическими приложениями Emacs также распознаёт нажатия mouse-1 на ссылки, при условии, что пользователь быстро нажимает на ссылку, не перемещая мышь. Это поведение контролируется пользовательским параметром mouse-1-click-follows-link. См. Справочные материалы по мыши в Руководстве GNU Emacs.

Чтобы настроить ссылку таким образом, чтобы она подчинялась mouse-1-click-follows-link, вы должны либо (1) применить свойство текста или наложения follow-link к тексту ссылки, либо (2) привязать событие follow-link к ключевой карте (которая может быть ключевой картой основного режима или локальной ключевой картой, заданной через свойство текста keymap). Значение свойства follow-link или привязка к событию follow-link служит условием для действия ссылки. Это условие сообщает Emacs две вещи: обстоятельства, при которых щелчок mouse-1 должен считаться происходящим внутри ссылки, и как вычислить код действия, который указывает, во что следует преобразовать щелчок mouse-1. Условие действия ссылки может быть одним из следующих:

mouse-face

Если условие — символ mouse-face, позиция находится внутри ссылки, если в этой позиции есть свойство nil mouse-face, отличное от нуля. Код действия всегда t.

Например, вот как Info-режим обрабатывает mouse-1:

(define-key Info-mode-map [follow-link] 'mouse-face)
функция

Если условие — функция func, то позиция pos находится внутри ссылки, если (func pos) вычисляется как отличное от нуля значение. Возвращаемое значение func служит кодом действия.

Например, вот как pcvs позволяет mouse-1 следовать ссылкам только на имена файлов:

(define-key map [follow-link]
  (lambda (pos)
    (eq (get-char-property pos 'face) 'cvs-filename-face)))
что-либо еще

Если значение условия — что-либо ещё, то позиция находится внутри ссылки, а само условие — код действия. Очевидно, что вы должны указать этот вид условия только при применении условия через свойство текста или наложения к тексту ссылки (чтобы оно не применялось ко всему буферу).

Код действия сообщает mouse-1, как следовать ссылке:

строка или вектор

Если код действия — строка или вектор, событие mouse-1 преобразуется в первый элемент строки или вектора; т. е., действие щелчка mouse-1 — это локальная или глобальная привязка этого символа или значка. Таким образом, если код действия — "foo", mouse-1 преобразуется в f. Если это [foo], mouse-1 преобразуется в foo.

что-либо ещё

Для любого другого, не являющегося nil кода действия, событие mouse-1 преобразуется в событие mouse-2 в той же позиции.

Чтобы определить mouse-1 для активации кнопки, определенной с помощью define-button-type, присвойте кнопке свойство follow-link. Значение свойства должно быть условием действия ссылки, как описано выше. См. Кнопки. Например, вот как Help-режим обрабатывает mouse-1:

(define-button-type 'help-xref
  'follow-link t
  'action #'help-button-action)

Чтобы определить mouse-1 на виджете, определенном с помощью define-widget, присвойте виджету свойство :follow-link. Значение свойства должно быть условием действия ссылки, как описано выше. Например, вот как виджет link указывает, что щелчок mouse-1 должен быть преобразован в RET:

(define-widget 'link 'item
  "An embedded link."
  :button-prefix 'widget-link-prefix
  :button-suffix 'widget-link-suffix
  :follow-link "\C-m"
  :help-echo "Follow the link."
  :format "%[%t%]")
Функция: mouse-on-link-p pos

Эта функция возвращает значение, отличное от nil, если позиция pos в текущем буфере находится на ссылке. pos также может быть местоположением события мыши, возвращаемым event-start (см. Доступ к мыши).

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Clickable-Text.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API