Đây là một cách. Bạn cần liên kết lệnh với một sự kiện chuột. Nhưng nếu bạn sử dụng nhấp chuột bằng nút chuột thì có thể bạn sẽ cần phải liên kết sự kiện cho phần khác của nhấp chuột (ví dụ: xuống) ignore
. Đây chỉ là một ví dụ - bạn có thể không muốn lãng phí C-mouse1
cho một lệnh như vậy.
Các chức năng chính (lệnh, thực sự) là describe-char
. Nó mô tả điểm tại một vị trí đệm nhất định. Một phần của mô tả đó bao gồm các thuộc tính văn bản và lớp phủ tại vị trí đó và nếu thuộc tính face
là một trong những thuộc tính này thì bạn sẽ thấy giá trị của nó.
(defun foo (event)
(interactive "e")
(let* ((mouse-pos (event-start event))
(pos-pt (posn-point mouse-pos)))
(describe-char pos-pt)))
(global-set-key [(control down-mouse-1)] 'ignore)
(global-set-key [(control mouse-1)] 'foo)
Điều này có thể tốt hơn một chút - ở trên có thể không hoạt động trong một số bối cảnh:
(defun foo (event)
(interactive "e")
(let* ((mouse-pos (event-start event))
(mouse-buf (window-buffer (posn-window mouse-pos)))
(pos-pt (posn-point mouse-pos)))
(with-current-buffer mouse-buf (describe-char pos-pt))))
(Lưu ý rằng C-x =
cũng bị ràng buộc what-cursor-position
, sử dụng describe-char
. Vì vậy, bạn đã đi đúng hướng với C-u C-x =
.)
Như Ido quan tâm: Không giống như Icomplete, sử dụng lớp phủ, chế độ Ido sẽ chèn văn bản vào bộ thu nhỏ. Nhưng lý do đoạn mã trên không hoạt động trên văn bản đó là chế độ Ido xóa văn bản ở đầu mỗi lệnh, sử dụng pre-command-hook
. Vì vậy, khi lệnh trên được thực thi, văn bản hiển thị các phần hoàn thành đã bị xóa.
Các mã sau đây khắc phục vấn đề đó, chỉ dành cho chế độ Ido. Nó chèn lại văn bản hiển thị các phần hoàn thành khi bắt đầu, và sau đó loại bỏ các phần hoàn thành ở cuối.
(defun foo (event)
(interactive "e")
(when (and (boundp 'ido-mode) ido-mode) (ido-exhibit))
(let* ((mouse-pos (event-start event))
(mouse-buf (window-buffer (posn-window mouse-pos)))
(pos-pt (posn-point mouse-pos)))
(with-current-buffer mouse-buf (describe-char pos-pt)))
(when (and (boundp 'ido-mode) ido-mode) (ido-tidy)))