Определение нажимаемого текста
Нажимаемый текст — это текст, который можно нажать (мышью или сочетанием клавиш) для получения результата. Многие основные режимы используют нажимаемый текст для реализации текстовых гиперссылок или ссылок, вкратце.
Самый простой способ вставить и изменить ссылки — использовать пакет 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, позиция находится внутри ссылки, если в этой позиции есть свойствоnilmouse-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