Có cách nào để xác định khuôn mặt ở khung x / y (vị trí chuột) không?


8

Khi cố gắng tạo chủ đề cho một số chế độ nhất định, không thể đặt điểm trên mục theo chủ đề (ví dụ: phải làm C-u C-x =) và xác định khuôn mặt được sử dụng.

Suy nghĩ của tôi là sử dụng chuột để xác định khuôn mặt được sử dụng, nhưng tất cả những gì tôi có thể nhận được là vị trí khung x, y (sử dụng (mouse-position))

Từ đó tôi không biết làm thế nào để có được định nghĩa khuôn mặt tại các hợp đồng đó.

Bất kỳ trợ giúp được đánh giá cao.

Câu trả lời:


4

Đâ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-mouse1cho 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 facelà 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)))

Nice one @drew được đánh giá cao
ocodo

Ồ, thật không may khi điều này được sử dụng trong xe buýt nhỏ với chiều dọc (và những người khác), thông báo: describe-char: No character follows specified positionđược trả về bởi description-char. Tôi đoán đó là do xe buýt nhỏ bị xóa tại một số điểm sau sự kiện. Tôi cho rằng 'ignoresẽ ngăn chặn điều này, nhưng điều đó không xảy ra. Có ý kiến ​​gì không?
ocodo

Xin vui lòng cho một công thức từng bước. (Nó hoạt động với tôi : M-x some-text, C-mouse-1trên văn bản đó trong xe buýt nhỏ.) Tất nhiên bạn phải nhấp chuột vào vị trí có văn bản. Nếu bạn bấm sau khi kết thúc văn bản thì bạn sẽ gặp lỗi bạn đã đề cập.
vẽ

Sử dụng chế độ ido-vertical-mode hoặc ido-lưới-mode với chế độ ido, bây giờ Ctrl + nhấp vào văn bản lựa chọn Ido trong bộ thu nhỏ. Lỗi.
ocodo

Khi bạn nhấp vào danh sách hoàn thành cho chế độ Ido hoặc Icomplete, bạn đang nhấp qua văn bản trong bộ đệm (bộ thu nhỏ). Bạn đang nhấp vào một lớp phủ (chỉ). Nếu bạn nhấp vào lớp phủ ở trên cùng của văn bản đệm thì không có vấn đề gì, nhưng nếu bạn nhấp qua kết thúc bộ đệm (đó là những gì bạn đang làm) thì bạn sẽ nhận được thông báo lỗi.
vẽ

2

Nếu bạn không thể đặt điểm vào đúng vị trí và sử dụng C-u C-x =, có thể là do phần tử có liên quan được hiển thị qua trước / sau chuỗi của lớp phủ hoặc do phần tử đó biến mất / thay đổi khi bạn cố gắng đặt điểm vào nó hoặc khi bạn C-u C-x =.

Bạn có thể cố gắng tránh những vấn đề đó như sau:

  • sử dụng posn-at-x-ysẽ trả về một mô tả về những gì tại tọa độ x / y đó. Ví dụ: nếu đó là một đoạn văn bản được lấy từ chuỗi sau / trước, chuỗi đó sẽ được đề cập trong đó (cũng như vị trí trong chuỗi đó), vì vậy bạn có thể tra cứu thuộc tính khuôn mặt được áp dụng cho chuỗi đó tại vị trí đó.
  • bạn có thể chạy mã "trong nền" thay vì thông qua một lệnh. Ví dụ, với run-with-timerbạn có thể chạy mã mỗi giây, in kết quả vào một loại bộ đệm gỡ lỗi nào đó bạn chọn.

1

Bạn có thể sử dụng packate faceup để tạo ra một đại diện văn bản có thể đọc được con người của một văn bản, với các thông tin khuôn mặt. Ví dụ:

(defun foo (arg)
  (if arg 1 2))

Chạy M-x faceup-vire-buffer RETvà sau đây được hiển thị:

(«k:defun» «f:foo» («v:arg»)
  («k:if» arg 1 2))

Các font-lock tiêu chuẩn được thể hiện bằng những cái tên ngắn, giống như kcho font-lock-keyword-face, trong khi khuôn mặt phi tiêu chuẩn đều có phần giới sử dụng tên đầy đủ của họ.

(Faceup là một hệ thống kiểm tra hồi quy để làm nổi bật các gói, ví dụ: từ khóa khóa phông chữ, biểu diễn văn bản được lưu trữ dưới dạng tệp tham chiếu.)

BIÊN TẬP:

Để trả lời câu hỏi trong bình luận: "Nếu tôi đang cố gắng gỡ lỗi các khuôn mặt được sử dụng trong màn hình xe buýt nhỏ thì điều này có còn cung cấp cho tôi thông tin không?"

Vâng, nó làm. Tuy nhiên, bạn phải liên kết chức năng với một khóa kể từ khi chạy nó bằng cách sử dụng M-xsẽ không hoạt động khi sử dụng bộ thu nhỏ. Ví dụ:

(global-set-key (kbd "<f6>") 'faceup-view-buffer)

Nếu bạn theo "xe buýt nhỏ" thực sự có nghĩa là khu vực tiếng vang - rằng nó, bạn muốn kiểm tra tin nhắn hiện tại bạn sẽ cần thêm một chút. Các chức năng sau đây sẽ làm điều này:

(defun my-faceup-view-current-message ()
  (interactive)
  (let ((msg (current-message)))
    (unless msg
      (error "Echo area is empty"))
    (with-temp-buffer
      (insert msg)
      (faceup-view-buffer))))

Ví dụ: như sau:

(let ((s "My Message"))
  (add-text-properties 3 (length s) '(face font-lock-warning-face) s)
  (message s)
  (my-faceup-view-current-message))

Sẽ chỉ cho bạn:

My «w:Message»

Nếu tôi đang cố gắng gỡ lỗi các khuôn mặt được sử dụng trong màn hình xe buýt nhỏ thì điều này vẫn sẽ cung cấp cho tôi thông tin chứ?
ocodo

@EmacsFodder Vâng, xem câu trả lời cập nhật của tôi.
Lindydancer

Rất cụ thể, điều khiến tôi đặt câu hỏi là nhận được các khuôn mặt từ lưới dọc và lưới. Cả hai đều xả bộ đệm trước sự kiện chuột (có vẻ như).
ocodo

Trong khi về mặt kỹ thuật, câu trả lời trực tiếp cho câu hỏi là, bạn không thể. Phương pháp này dễ hơn một chút so với quét sạch emacslisp của chế độ nào. Mặc dù điều đó đơn giản như: Cs defface Ms o
ocodo 6/11/2015

1

Một giải pháp thay thế có thể là sử dụng bộ chọn màu và cung cấp giá trị màu list-faces-for-colorđược xác định bên dưới (trong trường hợp bộ chọn màu bị tắt một chút, hãy sử dụng đối số khoảng cách):

(defun list-faces-for-color (color &optional distance)
  "List faces which use COLOR as fg or bg color.

            Accept colors within DISTANCE which defaults to 0."
  (interactive (list (read-color "Color: ")
                     (and current-prefix-arg
                          (prefix-numeric-value current-prefix-arg))))
  (with-help-window (get-buffer-create (format " *%s*" this-command))
    (dolist (face (sort
                   (list-faces--for-color color distance)
                   (lambda (f1 f2)
                     (string< (symbol-name f1)
                              (symbol-name f2)))))
      (list-faces--print-face face)
      (terpri))))

(defun list-faces--print-face (face)
  "Print face and its parents if any."
  (with-current-buffer standard-output
    (let ((fchain (cdr (list-faces--inheritance-chain face :foreground)))
          (bchain (cdr (list-faces--inheritance-chain face :background))))
      (insert (propertize (format "%s" face) 'face face))
      (cond (fchain
             (dolist (face fchain)
               (insert " > " (propertize (format "%s" face) 'face face))))
            (bchain
             (dolist (face bchain)
               (insert " > " (propertize (format "%s" face) 'face face))))))))

(defun list-faces--inheritance-chain (face attr)
  "Return inheritence change for face and attr."
  (let ((g (face-attribute face attr)))
    (if (and (stringp g)
             (not (string= "unspecified" g)))
        (list face)
      (let ((inherit (face-attribute face :inherit)))
        (when inherit
          (if (facep inherit)
              (cons face
                    (list-faces--inheritance-chain inherit attr))
            (if (consp inherit)
                (cl-dolist (face inherit)
                  (let ((res nil))
                    (when (and (facep face)
                               (setq res (list-faces--inheritance-chain face attr)))
                      (cl-return res)))))))))))


(defun list-faces--attribute (face attr)
  "Get face attribute of face as defined or inherited."
  (let* ((chain (list-faces--inheritance-chain face attr)))
    (cl-dolist (f (nreverse chain))
      (let ((g (face-attribute f attr)))
        (when (and (stringp g)
                   (not (string= "unspecified" g)))
          (cl-return g))))))



(defun list-faces--for-color (color &optional distance)
  "Return all faces with COLOR as fg or bg withing DISTANCE."
  (let ((faces ())
        (distance (or distance 0)))
    (mapatoms (lambda (atom)
                (when (facep atom)
                  (let ((fg (list-faces--attribute atom :foreground))
                        (bg (list-faces--attribute atom  :background)))
                    (when (or (and fg
                                   (<= (color-distance
                                        fg
                                        color)
                                       distance))
                              (and bg
                                   (<= (color-distance
                                        bg
                                        color)
                                       distance)))
                      (push atom faces))))))
    (delete-dups faces)))
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.