Czym jest funkcja wyboru słowa / symbolu powiązana z <podwójną myszą-1>

11

Uwielbiam możliwość wyboru słowa / symbolu w punkcie, który obecnie robię podwójnym kliknięciem myszy. Chciałbym móc to zrobić z klawiatury, więc chciałbym powiązać to z naciśnięciem klawisza (a może już jest?), Więc potrzebuję nazwy funkcji. Zakładam, że funkcja musi już istnieć, ale nie mogę zrozumieć, jak się nazywa.

Próbowałem, C-h kale potem po dwukrotnym kliknięciu myszą <down-mouse-1>pojawia się pomoc (zakładam, że system pomocy nie czeka na drugie kliknięcie). Przeszukałem również dokumentację, w której ta funkcjonalność jest zdefiniowana w sekcji 21.2, ale nie podaje nazwy funkcji.

Aktualizacja: W przypadku typowego kombinacja klawiszy Przypuszczam, że jest to równoznaczne z <C-left>zastosowaną przez <C-S-right>które left-wordi right-wordodpowiednio, chociaż klawisz Shift jest przeznaczone do tego ostatniego. (Nie do końca rozumiem związek między oznaczeniami klawiatury za pomocą klawisza Shift a ich mapowaniem do funkcji, pomoc w <C-S-right>tłumaczeniu go <C-right>przed identyfikacją jako right-word)

Chip Grandits
źródło
Używanie C-h bi przeszukiwanie tego bufora pokazuje, że <double-mouse-1>wywołania mouse-set-point(z „mouse.el”) z określonym zdarzeniem. Nie wiesz, ile to pomaga :)
VanLaser
1
W przypadku związku między przesuniętą a nie przesuniętą wersją C-prawej i C-lewej jest to efekt shift-selection-mode(patrz (info "(emacs) Shift Selection")). Zobacz także emacs.stackexchange.com/questions/12858/...
YoungFrog
@YoungFrog tego rodzaju komplikacje często utrzymują większość moich programów emacsowych jako makra klawiatury. Proste makro kbd oparte na <right> <C-left> <C-S-right>oznacza, że ​​nie muszę w pełni zajmować się subtelnymi kwestiami omówionymi szczegółowo w tym linku.
Chip Grandits 28.04.16

Odpowiedzi:

9

To jest trochę skomplikowane. Po dwukrotnym kliknięciu mouse-1dostępnych jest wiele akcji. <down-mouse-1>występuje najpierw po naciśnięciu przycisku. Następnie mouse-1następuje po zwolnieniu przycisku.

<down-mouse-1>jest zobowiązany do polecenia mouse-drag-region, a to polecenie wywołuje mouse-drag-track. Ta funkcja zlicza kliknięcia przycisku myszy i śledzi każdy ruch myszy (dwukrotne kliknięcie oznacza, że ​​nie poruszyłeś myszą).

mouse-drag-trackwywołuje funkcję, mouse-start-end aby określić zakres tekstu do wyboru. Przechodzi do mouse-start-endpozycji, w której kliknąłeś, pierwsze dwa argumenty i kliknięcie liczą się jako trzeci argument. To jest 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.

Liczba kliknięć przekazana jako trzeci argument arg ( MODE) wynosi 1 dla podwójnego kliknięcia.

Nie będziesz w stanie wywołać części tego kodu z sekwencji klawiszy na klawiaturze, ale sprawdzenie kodu może pomóc w napisaniu komendy, którą można przypisać do klawisza, aby zrobić to, co chcesz.

Rysował
źródło
Dziękujemy za wyjaśnienie, dlaczego C-h k nie działa w przypadku zdarzeń myszy. Najlepszym sposobem, w jaki doszedłem do zbadania, w jaki sposób Emacs „obsługuje mysz”, jest zarejestrowanie go jako makra klawiatury, nazwanie go, a następnie spojrzenie na kod wygenerowany przez insert-kbd-macro Generalnie nie próbowałbym używać zdarzenia myszy w makro, więc te tymczasowe makra są po prostu przydatne, aby zobaczyć, co robi Emacs.
Chip Grandits
6

@Drew wyjaśnił część złożoności związanej ze zdarzeniami związanymi z działaniami myszy. Jeśli chodzi o ostateczny cel oznaczenia słowa w punkcie przy użyciu klawiatury, możesz zainteresować się rozwinięciem regionu .

expand-regionpozwala manipulować regionem za pomocą jednostek semantycznych. Na przykład, gdy żaden region nie jest aktywny, wywołanie er/expand-region(zwykle powiązane C-=) spowoduje zaznaczenie bieżącego słowa. Ponowne wywołanie powoduje rozszerzenie regionu na bieżące zdanie. A potem akapit, sekcja itp. Rzeczywiste jednostki będą zależeć od trybu, w którym się znajdujesz, więc w trybach seplacji będą to symbol, wyrażenie otaczające symbol, wyrażenie otaczające to wyrażenie itp.

Strona, do której prowadzi link, zawiera dodatkowe objaśnienia i film wideo.

Tyler
źródło
1
tak, widzę pakiet rozwijania regionu na liście pakietów od melpa. Bardzo przydatne, jestem zaskoczony, że nie jest domyślny w Emacsie lub przynajmniej dołączony do CEDET. Dzięki za wskazówkę!
Chip Grandits 28.04.16
Chip Grandits: Zależy to od autora (-ów) przesłającego paczkę do FSF z odpowiednim przypisaniem praw autorskich. Nie może być domyślną częścią Emacsa, jeśli autorzy go nie przesłali.
Filip
2

Oto funkcja, którą wyodrębniłem, mouse-set-regionktóra wykonuje oznaczenie po dwukrotnym kliknięciu:

(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
źródło