Hàm từ / ký hiệu được chọn liên kết với <double-mouse-1> là gì


11

Tôi thích khả năng chọn từ / ký hiệu tại điểm mà tôi hiện đang làm với nhấp chuột đôi. Tôi muốn có thể làm điều đó từ bàn phím, và vì vậy tôi muốn liên kết nó với một tổ hợp phím (hoặc có thể nó đã là?), Vì vậy tôi cần tên của chức năng. Tôi giả sử chức năng phải tồn tại, nhưng tôi không thể tìm ra tên của nó là gì.

Tôi đã thử C-h knhưng sau đó khi tôi nhấp đúp chuột vào trợ giúp để <down-mouse-1>hiển thị (Tôi cho rằng hệ thống trợ giúp không chờ đợi lần nhấp thứ hai hoặc thứ gì đó). Tôi cũng đã tìm kiếm tài liệu trong đó chức năng này được xác định trong phần 21.2, nhưng nó không nói tên của chức năng.

Cập nhật: Đối với keybinding điển hình Tôi cho rằng nó là tương đương với <C-left>tiếp theo <C-S-right>đó là left-wordright-wordtương ứng, mặc dù các phím shift được tổ chức cho sau này. (Tôi không hiểu đầy đủ về mối quan hệ giữa các chỉ định bàn phím với phím shift và ánh xạ của chúng tới các chức năng, sự trợ giúp để <C-S-right>dịch nó <C-right>trước khi xác định nó là right-word)


Sử dụng C-h bvà tìm kiếm thông qua bộ đệm đó cho thấy <double-mouse-1>các cuộc gọi mouse-set-point(từ "mouse.el") với một số sự kiện cụ thể. Không chắc chắn điều này sẽ giúp được bao nhiêu :)
VanLaser

1
Đối với mối quan hệ giữa phiên bản dịch chuyển và không dịch chuyển của C-right và C-left, đó là hiệu ứng của shift-selection-mode(xem (info "(emacs) Shift Selection")). Xem thêm emacs.stackexchange.com/questions/12858/ từ
YoungFrog

@YoungFrog loại phức tạp đó là thứ thường giữ phần lớn chương trình emacs của tôi dưới dạng macro bàn phím. Một macro kbd đơn giản dựa trên <right> <C-left> <C-S-right>có nghĩa là tôi không cần phải giải quyết đầy đủ các vấn đề tinh tế được thảo luận ở độ dài trong liên kết đó.
Chip Grandits

Câu trả lời:


9

Nó thực sự hơi phức tạp. Khi bạn bấm đúp mouse-1có nhiều hành động. <down-mouse-1>xảy ra đầu tiên, khi bạn nhấn nút. Sau đó mouse-1xảy ra, khi bạn phát hành nút.

<down-mouse-1>bị ràng buộc với lệnh mouse-drag-region, và lệnh đó gọi mouse-drag-track. Chức năng đó đếm số lần nhấp chuột và theo dõi mọi chuyển động của chuột (nếu bạn nhấp đúp có nghĩa là bạn không di chuyển chuột).

mouse-drag-trackgọi hàm mouse-start-end để xác định phạm vi văn bản cần chọn. Nó chuyển đến mouse-start-endvị trí mà bạn đã nhấp, hai đối số đầu tiên và số lần nhấp, như đối số thứ ba. Đây là 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.

Số lần nhấp được truyền dưới dạng đối số thứ ba ( MODE) là 1 cho một lần nhấp đúp.

Bạn sẽ không thể gọi một số mã này từ chuỗi phím bàn phím, nhưng kiểm tra mã có thể giúp bạn viết lệnh liên kết phím bàn phím để làm những gì bạn muốn.


Cảm ơn đã giải thích lý do tại sao C-h k không hoạt động cho các sự kiện chuột. Cách tốt nhất mà tôi đã tìm ra để điều tra cách Emacs "xử lý chuột" là ghi lại nó dưới dạng macro bàn phím, đặt tên và sau đó xem mã được tạo bởi insert-kbd-macro Nói chung tôi sẽ không thử sử dụng sự kiện chuột trong macro, vì vậy các macro tạm thời này chỉ hữu ích để xem Emacs đang làm gì.
Chip Grandits

6

@Drew đã giải thích một số sự phức tạp liên quan đến các sự kiện liên quan đến hành động của chuột. Đối với mục tiêu cuối cùng của bạn là đánh dấu từ tại điểm bằng bàn phím, bạn có thể quan tâm đến khu vực mở rộng .

expand-regioncho phép bạn thao tác khu vực bằng các đơn vị ngữ nghĩa. Ví dụ: khi không có vùng nào được kích hoạt, việc gọi er/expand-region(thường bị ràng buộc C-=) sẽ đánh dấu từ hiện tại. Gọi nó một lần nữa mở rộng khu vực đến câu hiện tại. Và sau đó là đoạn văn, phần, v.v.

Trang được liên kết có giải thích thêm và một video chứng minh điều này.


1
có, tôi thấy gói khu vực mở rộng trong danh sách gói từ melpa. Rất hữu ích, tôi ngạc nhiên rằng nó không được mặc định trong Emacs hoặc ít nhất là được gói trong CEDET. Cảm ơn vì tiền hỗ trợ!
Chip Grandits

Chip Grandits: Điều đó phụ thuộc vào (các) tác giả gửi gói của họ tới FSF với sự phân công bản quyền phù hợp. Nó không thể là một phần mặc định của Emacs nếu các tác giả chưa gửi nó.
phils

2

Đây là một chức năng mà tôi đã trích xuất từ mouse-set-regionđó đánh dấu khi bạn nhấp đúp chuột:

(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))))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.