Apa fungsi kata / simbol pilih terikat ke <double-mouse-1>

11

Saya suka kemampuan untuk memilih kata / simbol pada titik yang saat ini saya lakukan dengan klik mouse ganda. Saya ingin dapat melakukannya dari keyboard, jadi saya ingin mengikatnya keystroke (atau mungkin sudah?), Jadi saya perlu nama fungsinya. Saya menganggap fungsi tersebut harus sudah ada, tetapi saya tidak tahu apa namanya.

Saya mencoba C-h ktetapi kemudian ketika saya klik dua kali mouse bantuan untuk <down-mouse-1>muncul (saya menganggap sistem bantuan tidak menunggu klik kedua atau sesuatu). Saya juga mencari dokumentasi di mana fungsi ini didefinisikan di bagian 21.2, tetapi tidak menyebutkan nama fungsinya.

Pembaruan: Untuk pengikatan kunci tipikal, saya kira itu sama dengan <C-left>diikuti oleh <C-S-right>yang mana left-worddan right-wordmasing - masing, meskipun tombol shift diadakan untuk yang terakhir. (Saya tidak sepenuhnya memahami hubungan antara penunjukan keyboard dengan tombol shift dan pemetaannya terhadap fungsi, bantuan untuk <C-S-right>menerjemahkannya <C-right>sebelum mengidentifikasi sebagai right-word)

Chip Grandits
sumber
Menggunakan C-h bdan mencari melalui buffer itu menunjukkan bahwa <double-mouse-1>panggilan mouse-set-point(dari "mouse.el") dengan beberapa peristiwa tertentu. Tidak yakin seberapa banyak ini membantu :)
VanLaser
1
Untuk hubungan antara versi C-kanan dan C-kiri yang bergeser dan yang tidak bergeser, itulah efeknya shift-selection-mode(lihat (info "(emacs) Shift Selection")). Lihat juga emacs.stackexchange.com/questions/12858/…
YoungFrog
@YoungFrog komplikasi semacam itu adalah yang sering membuat sebagian besar pemrograman emacs saya sebagai macro keyboard. Makro kbd sederhana berdasarkan <right> <C-left> <C-S-right>cara saya tidak perlu sepenuhnya mengatasi masalah halus yang dibahas panjang lebar di tautan itu.
Chip Grandits

Jawaban:

9

Ini sebenarnya agak rumit. Ketika Anda mengklik dua kali mouse-1ada beberapa tindakan. <down-mouse-1>terjadi lebih dulu, ketika Anda menekan tombol. Kemudian mouse-1terjadi, ketika Anda melepaskan tombol.

<down-mouse-1>terikat pada perintah mouse-drag-region, dan perintah itu memanggil mouse-drag-track. Fungsi itu menghitung klik tombol mouse dan melacak setiap gerakan mouse (jika Anda mengklik dua kali itu berarti Anda tidak menggerakkan mouse).

mouse-drag-trackfungsi panggilan mouse-start-end untuk menentukan rentang teks yang akan dipilih. Ini lolos ke mouse-start-endposisi di mana Anda mengklik, dua arg pertama, dan jumlah klik, sebagai arg ketiga. Ini adalah 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.

Hitungan-klik yang dilewati sebagai arg ketiga ( MODE) adalah 1 untuk klik-ganda.

Anda tidak akan dapat hanya memanggil beberapa kode ini dari urutan tombol keyboard, tetapi memeriksa kode ini dapat membantu Anda menulis perintah yang dapat diikat dengan tombol keyboard untuk melakukan apa yang Anda inginkan.

Drew
sumber
Terima kasih telah menjelaskan mengapa C-h k tidak berfungsi untuk acara mouse. Cara terbaik yang saya temukan untuk menyelidiki bagaimana Emacs "menangani mouse" adalah merekamnya sebagai keyboard makro, beri nama, dan kemudian lihat kode yang dihasilkan oleh insert-kbd-macro Umumnya saya tidak akan mencoba menggunakan acara mouse dalam sebuah makro, jadi makro sementara ini hanya berguna untuk melihat apa yang sedang dilakukan Emacs.
Chip Grandits
6

@Drew telah menjelaskan beberapa kompleksitas yang terkait dengan peristiwa yang terkait dengan tindakan mouse. Adapun tujuan akhir Anda menandai kata pada titik menggunakan keyboard, Anda mungkin tertarik dalam memperluas wilayah .

expand-regionmemungkinkan Anda untuk memanipulasi wilayah oleh unit semantik. Misalnya, ketika tidak ada wilayah yang aktif, panggilan er/expand-region(biasanya terikat C-=) akan menandai kata saat ini. Menyebutnya lagi memperluas wilayah ke kalimat saat ini. Dan kemudian paragraf, bagian dll. Unit yang sebenarnya akan tergantung pada mode Anda, jadi dalam mode lisp mereka akan menjadi simbol, ekspresi melampirkan simbol, ekspresi melampirkan ekspresi itu dll.

Halaman yang ditautkan memiliki penjelasan lebih lanjut dan video yang menunjukkan hal ini.

Tyler
sumber
1
ya saya melihat paket memperluas wilayah dalam daftar paket dari melpa. Sangat berguna, saya terkejut itu bukan default di Emacs atau setidaknya dibundel dengan CEDET. Terima kasih atas tipnya!
Chip Grandits
Chip Grandits: Itu tergantung pada penulis (s) yang mengirimkan paket mereka ke FSF dengan penugasan hak cipta yang sesuai. Itu tidak bisa menjadi bagian default Emacs jika penulis belum mengirimkannya.
phils
2

Berikut adalah fungsi yang saya ekstrak dari mouse-set-regionyang melakukan penandaan saat Anda mengklik dua kali:

(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
sumber