Qual è la funzione di selezione parola / simbolo associata a <double-mouse-1>


11

Adoro la possibilità di selezionare la parola / simbolo nel punto che attualmente faccio con un doppio clic del mouse. Vorrei poterlo fare dalla tastiera, e quindi vorrei associarlo a una sequenza di tasti (o forse lo è già?), Quindi ho bisogno del nome della funzione. Presumo che la funzione debba già esistere, ma non riesco a capire come si chiama.

Ho provato, C-h kma poi quando faccio doppio clic con il mouse viene <down-mouse-1>visualizzata la guida per (presumo che il sistema di guida non aspetti il ​​secondo clic o qualcosa del genere). Ho anche cercato la documentazione in cui questa funzionalità è definita nella sezione 21.2, ma non dice il nome della funzione.

Aggiornamento: per il tipico keybinding suppongo sia l'equivalente <C-left>seguito da <C-S-right>quali sono left-worde right-wordrispettivamente, sebbene il tasto shift sia tenuto per quest'ultimo. (Non capisco completamente la relazione tra le designazioni della tastiera con il tasto Maiusc e la loro mappatura in funzioni, l'aiuto per <C-S-right>tradurlo in <C-right>prima che lo identifichi come right-word)


L'uso C-h be la ricerca attraverso quel buffer mostra che le <double-mouse-1>chiamate mouse-set-point(da "mouse.el") con qualche evento specifico. Non sono sicuro di quanto sia utile :)
VanLaser,

1
Per la relazione tra la versione spostata e non spostata di C-destra e C-sinistra, è l'effetto di shift-selection-mode(vedi (info "(emacs) Shift Selection")). Vedi anche emacs.stackexchange.com/questions/12858/…
YoungFrog,

@YoungFrog quel tipo di complicazione è ciò che spesso mantiene la maggior parte dei miei emacs programmati come macro da tastiera. Una semplice macro di kbd basata su <right> <C-left> <C-S-right>significa che non ho bisogno di affrontare completamente le questioni sottili discusse a lungo in quel link.
Chip Grandits,

Risposte:


9

In realtà è un po 'complicato. Quando fai doppio clic mouse-1ci sono più azioni. <down-mouse-1>si verifica per primo, quando si preme il pulsante. Quindi si mouse-1verifica quando si rilascia il pulsante.

<down-mouse-1>è associato al comando mouse-drag-regione quel comando chiama mouse-drag-track. Tale funzione conta i clic del pulsante del mouse e tiene traccia di qualsiasi movimento del mouse (se fai doppio clic significa che non hai spostato il mouse).

mouse-drag-trackchiama la funzione mouse-start-end per determinare l'intervallo di testo da selezionare. Passa alla mouse-start-endposizione in cui hai fatto clic, i primi due argomenti e il conteggio dei clic, come terzo argomento. Questo è 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.

Il conteggio dei clic passato come terzo arg ( MODE) è 1 per un doppio clic.

Non sarai in grado di chiamare solo parte di questo codice da una sequenza di tasti della tastiera, ma esaminare il codice potrebbe aiutarti a scrivere un comando associabile ai tasti della tastiera per fare ciò che desideri.


Grazie per aver spiegato perché C-h k non funziona per gli eventi del mouse. Il modo migliore che ho capito per studiare come Emacs "sta gestendo il mouse" è registrarlo come una macro di tastiera, nominarlo e quindi guardare il codice generato da insert-kbd-macro Generalmente non proverei a usare un evento del mouse in un macro, quindi queste macro temporanee sono utili solo per vedere cosa sta facendo Emacs.
Chip Grandits,

6

@Drew ha spiegato alcune delle complessità associate agli eventi legati alle azioni del mouse. Per quanto riguarda il tuo obiettivo finale di contrassegnare la parola nel punto usando la tastiera, potresti essere interessato a espandere la regione .

expand-regionti permette di manipolare la regione con unità semantiche. Ad esempio, quando nessuna regione è attiva, la chiamata er/expand-region(in genere associata C-=) contrassegnerà la parola corrente. Chiamandolo di nuovo si espande la regione alla frase corrente. E poi il paragrafo, la sezione ecc. Le unità effettive dipenderanno dalla modalità in cui ci si trova, quindi nelle modalità lisp sarebbero simbolo, espressione che racchiude il simbolo, espressione che racchiude quell'espressione ecc.

La pagina collegata ha ulteriori spiegazioni e un video che lo dimostra.


1
sì, vedo il pacchetto di espansione-regione nell'elenco dei pacchetti di melpa. Molto utile, sono sorpreso che non sia predefinito in Emacs o almeno in bundle con CEDET. Grazie per il consiglio!
Chip Grandits,

Chip Grandits: dipende dall'autore o dagli autori che inviano il loro pacchetto alla FSF con un'adeguata assegnazione del copyright. Non può essere una parte predefinita di Emacs se gli autori non l'hanno inviata.
phils,

2

Ecco una funzione che ho estratto mouse-set-regionche fa la marcatura quando fai doppio 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))))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.