¿Cuál es la función de selección de palabra / símbolo vinculada a <double-mouse-1>

11

Me encanta la capacidad de seleccionar palabra / símbolo en el punto que actualmente hago con doble clic del mouse. Me gustaría poder hacerlo desde el teclado, por lo que me gustaría vincularlo a una pulsación de tecla (¿o tal vez ya lo es?), Así que necesito el nombre de la función. Supongo que la función ya debe existir, pero no puedo entender cuál es su nombre.

Lo intenté, C-h kpero cuando hago doble clic con el mouse <down-mouse-1>aparece la ayuda (supongo que el sistema de ayuda no espera el segundo clic o algo así). También busqué en la documentación donde esta funcionalidad se define en la sección 21.2, pero no dice el nombre de la función.

Actualización: para la combinación de teclas típica, supongo que es el equivalente a <C-left>seguido de <C-S-right>cuáles son left-wordy right-wordrespectivamente, aunque la tecla Mayús se mantiene para este último. (No entiendo completamente la relación entre las designaciones de teclado con la tecla Mayús y su asignación a funciones, la ayuda se <C-S-right>traduce <C-right>antes de que se identifique como right-word)

Chip Grandits
fuente
El uso C-h by la búsqueda a través de ese búfer muestra que las <double-mouse-1>llamadas mouse-set-point(desde "mouse.el") tienen algún evento específico. No estoy seguro de cuánto ayuda esto :)
VanLaser
1
Para la relación entre la versión desplazada y no desplazada de C-derecha y C-izquierda, es el efecto de shift-selection-mode(ver (info "(emacs) Shift Selection")). Ver también emacs.stackexchange.com/questions/12858/…
YoungFrog
@YoungFrog ese tipo de complicación es lo que a menudo mantiene la mayor parte de mi programación de emacs como macros de teclado. Una macro kbd simple basada en <right> <C-left> <C-S-right>significa que no necesito abordar completamente los problemas sutiles discutidos en detalle en ese enlace.
Chip Grandits

Respuestas:

9

En realidad es un poco complicado. Cuando hace doble clic, mouse-1hay varias acciones. <down-mouse-1>ocurre primero, cuando presiona el botón. Entonces mouse-1ocurre, cuando sueltas el botón.

<down-mouse-1>está obligado a ordenar mouse-drag-region, y ese comando llama mouse-drag-track. Esa función cuenta los clics del botón del mouse y realiza un seguimiento de cualquier movimiento del mouse (si hace doble clic, significa que no movió el mouse).

mouse-drag-trackllama a la función mouse-start-end para determinar el rango de texto a seleccionar. Pasa a mouse-start-endla posición donde hizo clic, los dos primeros argumentos y el recuento de clics, como el tercer argumento. Esto es 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.

El recuento de clics pasado como el tercer argumento ( MODE) es 1 para un doble clic.

No podrá llamar solo parte de este código desde una secuencia de teclas del teclado, pero examinar el código podría ayudarlo a escribir un comando enlazable con la tecla del teclado para hacer lo que desee.

Dibujó
fuente
Gracias por explicar por qué C-h k no funciona para eventos de mouse. La mejor manera que he descubierto para investigar cómo Emacs "maneja el mouse" es grabarlo como una macro de teclado, nombrarlo y luego mirar el código generado por insert-kbd-macro Generalmente, no trataría de usar un evento de mouse en un macro, por lo que estas macros temporales son útiles para ver qué está haciendo Emacs.
Chip Grandits
6

@Drew ha explicado algo de la complejidad asociada con los eventos vinculados a las acciones del mouse. En cuanto a su objetivo final de marcar la palabra en el punto usando el teclado, es posible que le interese expandir la región .

expand-regionle permite manipular la región por unidades semánticas. Por ejemplo, cuando no hay ninguna región activa, la llamada er/expand-region(generalmente vinculada a C-=) marcará la palabra actual. Llamarlo nuevamente expande la región a la oración actual. Y luego el párrafo, la sección, etc. Las unidades reales dependerán del modo en el que se encuentre, por lo que en los modos lisp serían símbolo, expresión que encierra el símbolo, expresión que encierra esa expresión, etc.

La página vinculada tiene más explicaciones y un video que lo demuestra.

Tyler
fuente
1
sí, veo el paquete expand-region en la lista de paquetes de melpa. Muy útil, me sorprende que no esté predeterminado en Emacs o al menos incluido en CEDET. ¡Gracias por el consejo!
Chip Grandits
Chip Grandits: Eso depende de que los autores presenten su paquete a la FSF con la asignación de derechos de autor adecuada. No puede ser una parte predeterminada de Emacs si los autores no lo han enviado.
phils
2

Aquí hay una función que extraje de mouse-set-regionque marca cuando hace doble clic:

(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))))
abo-abo
fuente