Какая функция выбора слова / символа связана с <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
Для отношений между сдвинутой и несмещенной версиями C-right и C-left, это эффект shift-selection-mode(см. (info "(emacs) Shift Selection")). См. Также emacs.stackexchange.com/questions/12858/…
YoungFrog
@YoungFrog такого рода осложнения часто заставляют большинство моих программ Emacs программировать как клавиатурные макросы. Простой макрос kbd, основанный на том, <right> <C-left> <C-S-right>что мне не нужно полностью решать тонкие вопросы, подробно обсуждаемые в этой ссылке.
Чип Грандитс

Ответы:

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.
Чип Грандитс
6

@Drew объяснил некоторые сложности, связанные с событиями, связанными с действиями мыши. Что касается вашей конечной цели пометки слова в точке с помощью клавиатуры, вас может заинтересовать расширение области .

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

На связанной странице есть дополнительное объяснение и видео, демонстрирующее это.

Тайлер
источник
1
да, я вижу пакет расширенного региона в списке пакетов от melpa. Очень полезно, я удивлен, что это не по умолчанию в Emacs или, по крайней мере, в комплекте с CEDET. Спасибо за совет!
Чип Грандитс
Грандиозный чип: это зависит от того, автор (ы) отправит свой пакет в 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))))
Або-або
источник