Яка функція вибору слова / символу пов'язана з <double-mouse-1>


11

Мені подобається можливість вибору слова / символу в точці, яку я зараз роблю подвійним клацанням миші. Мені б хотілося це зробити з клавіатури, і тому я хотів би прив’язати його до натискання клавіші (а може, це вже є?), Тому мені потрібна назва функції. Я припускаю, що функція повинна вже існувати, але я не можу зрозуміти, як це звуть.

Я спробував, C-h kале тоді, коли я двічі клацнув мишкою, допомога <down-mouse-1>з’являється (я припускаю, що довідкова система не чекає другого клацання чи щось таке). Я також шукав документацію, де ця функціональність визначена в розділі 21.2, але в ній не вказано назви функції.

Оновлення: Для типового прив'язування клавіш я вважаю, що це еквівалент, <C-left>за <C-S-right>яким слідують , left-wordі right-wordвідповідно, хоча клавіша зрушення утримується для останнього. (Я не повністю розумію взаємозв'язок позначень клавіатури з клавішею Shift та їх відображенням до функцій; довідка для <C-S-right>перекладу її до того, <C-right>як вона визначить її як right-word)


Використання C-h bта пошук через цей буфер показує, що <double-mouse-1>дзвінки mouse-set-point(з "mouse.el") з певної конкретної події. Не впевнений, наскільки це допомагає :)
VanLaser

1
Для взаємозв'язку між зміщеною та не зміщеною версією С-правий та С-лівий це ефект shift-selection-mode(див. (info "(emacs) Shift Selection")). Дивіться також emacs.stackexchange.com/questions/12858/…
YoungFrog

@YoungFrog подібне ускладнення - це те, що часто зберігає більшість моїх програм emacs як макроси клавіатури. Простий макрос kbd, заснований на <right> <C-left> <C-S-right>засобах, що мені не потрібно повністю вирішувати тонкі проблеми, що обговорюються в цьому посиланні.
Chip Grandits

Відповіді:


9

Насправді це трохи складно. При подвійному клацанні миші mouse-1відбувається кілька дій. <down-mouse-1>виникає спочатку при натисканні на кнопку. Потім mouse-1виникає, коли ви відпустите кнопку.

<down-mouse-1>прив’язаний до команди mouse-drag-region, і ця команда викликає mouse-drag-track. Ця функція підраховує натискання кнопки миші та відстежує будь-який рух миші (якщо ви двічі клацніть, це означає, що ви не перемістили мишу).

mouse-drag-trackфункція дзвінків, mouse-start-end щоб визначити діапазон тексту для вибору. Він переходить mouse-start-endу позицію, на яку ви натиснули, перші два аргументи та кількість кліків як третій аргумент. Це mouse-start-end:

mouse-start-end is a compiled Lisp function in `mouse.el'.

(mouse-start-end START END MODE)

Return a list of region bounds based on START and END according to MODE.
If MODE is 0 then set point to (min START END), mark to (max START END).
If MODE is 1 then set point to start of word at (min START END),
mark to end of word at (max START END).
If MODE is 2 then do the same for lines.

Кількість кліків, передана як третій аргумент ( MODE), дорівнює 1 для подвійного клацання.

Ви не зможете просто зателефонувати деякий з цього коду з послідовності клавіш клавіатури, але вивчення коду може допомогти вам написати команду, що поєднує клавіші клавіатури, щоб робити те, що ви хочете.


Дякуємо за пояснення, чому C-h k це не працює для подій миші. Найкращий спосіб я розібрався дослідити, як Emacs "обробляє мишу" - це записати його як макрос клавіатури, назвати його, а потім подивитися на код, сформований insert-kbd-macro загалом, я б не намагався використовувати подія миші в макрос, тому ці тимчасові макроси просто корисні, щоб побачити, що робить Emacs.
Chip Grandits

6

@Drew пояснив деякі складності, пов'язані з подіями, пов'язаними з діями миші. Що стосується вашої кінцевої мети - позначити слово в точці за допомогою клавіатури, то, можливо, вас зацікавить розширити регіон .

expand-regionдозволяє маніпулювати регіоном смисловими одиницями. Наприклад, коли жодна область не активна, виклик er/expand-region(як правило, пов'язаний з C-=) позначатиме поточне слово. Виклик його знову розширює область до поточного речення. А потім абзац, розділ тощо. Фактичні одиниці залежатимуть від режиму, в якому ви перебуваєте, тож у режимах lisp вони будуть символом, виразом, що охоплює символ, виразом, що охоплює цей вираз тощо.

На пов'язаній сторінці є додаткові пояснення та відео, що демонструє це.


1
так, я бачу пакет розширення регіону в списку пакунків від melpa. Дуже корисно, я здивований, що це не за замовчуванням у Emacs або принаймні у комплекті з CEDET. Дякую за пораду!
Chip Grandits

Chip Grandits: Це залежить від того, хто (-ла) подає пакет до FSF з відповідним авторським правом. Вона не може бути частиною за замовчуванням Emacs, якщо автори не надіслали її.
філ

2

Ось функція, яку я витягнув із mouse-set-regionцього, робить маркування при подвійному клацанні:

(defun ora-mark-like-double-mouse-1 ()
  (interactive)
  (let ((bnd (mouse-start-end (point) (point) 1)))
    (goto-char (car bnd))
    (push-mark)
    (set-mark (point))
    (goto-char (cadr bnd))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.