Quelle est la fonction de sélection de mot / symbole liée à <double-mouse-1>


11

J'aime la possibilité de sélectionner un mot / symbole au point que je fais actuellement avec un double clic de souris. Je voudrais pouvoir le faire à partir du clavier, et je voudrais donc le lier à une frappe (ou peut-être qu'il l'est déjà?), J'ai donc besoin du nom de la fonction. Je suppose que la fonction doit déjà exister, mais je ne peux pas comprendre son nom.

J'ai essayé C-h kmais quand je double-clique sur la souris, l'aide pour <down-mouse-1>s'affiche (je suppose que le système d'aide n'attend pas le deuxième clic ou quelque chose). J'ai également cherché dans la documentation où cette fonctionnalité est définie dans la section 21.2, mais elle ne dit pas le nom de la fonction.

Mise à jour: Pour la liaison de touches typique, je suppose que c'est l'équivalent de <C-left>suivi de <C-S-right>qui sont left-wordet right-wordrespectivement, bien que la touche Maj soit maintenue pour ce dernier. (Je ne comprends pas complètement la relation entre les désignations de clavier avec la touche Maj et leur mappage aux fonctions, l'aide pour la <C-S-right>traduire <C-right>avant de l'identifier right-word)


L'utilisation C-h bet la recherche dans ce tampon montrent que les <double-mouse-1>appels mouse-set-point(depuis "mouse.el") avec un événement spécifique. Je ne sais pas combien cela aide :)
VanLaser

1
Pour la relation entre la version décalée et la version non décalée de C-droite et C-gauche, c'est l'effet de shift-selection-mode(voir (info "(emacs) Shift Selection")). Voir aussi emacs.stackexchange.com/questions/12858/…
YoungFrog

@YoungFrog ce genre de complication est ce qui garde souvent la plupart de mes programmes emacs sous forme de macros clavier. Une simple macro kbd basée sur <right> <C-left> <C-S-right>signifie que je n'ai pas besoin de résoudre complètement les problèmes subtils longuement discutés dans ce lien.
Chip Grandits

Réponses:


9

C'est en fait un peu compliqué. Lorsque vous double-cliquez, mouse-1il existe plusieurs actions. <down-mouse-1>se produit en premier, lorsque vous appuyez sur le bouton. Se mouse-1produit ensuite , lorsque vous relâchez le bouton.

<down-mouse-1>est lié à la commande mouse-drag-region, et cette commande appelle mouse-drag-track. Cette fonction compte les clics du bouton de la souris et garde la trace de tout mouvement de la souris (si vous double-cliquez, cela signifie que vous n'avez pas déplacé la souris).

mouse-drag-trackappelle la fonction mouse-start-end pour déterminer la plage de texte à sélectionner. Il passe à mouse-start-endla position où vous avez cliqué, les deux premiers arguments et le nombre de clics, comme troisième argument. C’est 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.

Le nombre de clics passé comme troisième argument ( MODE) est 1 pour un double-clic.

Vous ne pourrez pas simplement appeler une partie de ce code à partir d'une séquence de touches du clavier, mais l'examen du code peut vous aider à écrire une commande de raccourci clavier pour faire ce que vous voulez.


Merci d'avoir expliqué pourquoi C-h k cela ne fonctionne pas pour les événements de souris. Le meilleur moyen que j'ai trouvé pour étudier comment Emacs "gère la souris" est de l'enregistrer en tant que macro clavier, de le nommer, puis de regarder le code généré par insert-kbd-macro Généralement, je n'essaierais pas d'utiliser un événement de souris dans un macro, donc ces macros temporaires sont juste utiles pour voir ce que fait Emacs.
Chip Grandits

6

@Drew a expliqué une partie de la complexité associée aux événements liés aux actions de la souris. Quant à votre objectif ultime de marquer le mot au point à l'aide du clavier, vous pourriez être intéressé par expand-region .

expand-regionvous permet de manipuler la région par unités sémantiques. Par exemple, lorsqu'aucune région n'est active, l'appel er/expand-region(généralement lié à C-=) marquera le mot actuel. L'appeler à nouveau étend la région à la phrase actuelle. Et puis le paragraphe, la section etc. Les unités réelles dépendront du mode dans lequel vous vous trouvez, donc dans les modes lisp, elles seraient le symbole, l'expression entourant le symbole, l'expression entourant cette expression, etc.

La page liée contient des explications supplémentaires et une vidéo illustrant cela.


1
oui, je vois le package expand-region dans la liste des packages de melpa. Très utile, je suis surpris que ce ne soit pas par défaut dans Emacs ou du moins intégré à CEDET. Merci pour le conseil!
Chip Grandits

Chip Grandits: Cela dépend de la soumission de l'auteur (s) à la FSF avec la cession de droit d'auteur appropriée. Ce ne peut pas être une partie par défaut d'Emacs si les auteurs ne l'ont pas soumis.
phils

2

Voici une fonction que j'ai extraite de mouse-set-regionqui fait le marquage lorsque vous double-cliquez:

(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))))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.