Làm thế nào để tìm ra những gì một chuỗi chính thực sự làm


14

Thỉnh thoảng tôi quan sát hành vi bất ngờ khi chỉnh sửa văn bản. Lần truy cập đầu tiên của tôi thường là sử dụng C-h kđể tìm hiểu các hàm nào đang được gọi bởi một chuỗi khóa đã cho. Tuy nhiên, đôi khi tài liệu này mâu thuẫn với hành vi được quan sát. Trong những trường hợp này, tôi thường cho rằng một số gói khác đã nối vào hàm hoặc chuỗi khóa đó và đang sửa đổi hành vi của nó.

Làm thế nào tôi có thể tìm hiểu chức năng đang thu hút vào dãy phím của tôi không?

Một ví dụ mà tôi gặp phải gần đây là tôi đã nhấn "phím và dấu ngoặc kép được chèn vào đầu và cuối của vùng hoạt động. Tôi đã có một nghi ngờ rằng đây không phải là hành vi Emacs mặc định, vì vậy tôi đã sử dụng C-h k "để tìm ra chức năng nào thực sự được gọi.

Các describe-keytài liệu hướng dẫn nói với tôi rằng các chức năng self-insert-commandđã được gọi, mà là một chức năng built-in. Để làm cho một câu chuyện dài ngắn, sau một số lượng thử nghiệm và lỗi, tôi đã có thể xác định rằng hành vi đó là do electric-pair-mode. Trong tương lai, có cách nào nhanh hơn để đi đến kết luận này hơn là tắt từng gói bị nghi ngờ cho đến khi tìm ra thủ phạm?


Có thể electric-pair-modelà đã được kích hoạt chỉ trong một số chế độ chính? Bạn vẫn thấy self-insert-commandcho "khi bạn làm C-h ktrong khi electric-pair-modeđang hoạt động?
Kaushal Modi

@kaushalmodi: Hóa ra nó electric-pair-modehoạt động bằng cách móc vào post-self-insert-hookchứ không phải bằng cách thay đổi phím bấm.
nispio

C-h kcho bạn biết chính xác những gì xảy ra cho một phím nhấn. Nếu bạn nhìn vào tài liệu cho self-insert-command, nó nói rất rõ post-self-insert-hooklà chạy sau khi lệnh kết thúc.
shosti

@shosti: Trong ví dụ đơn giản này, vâng. Nhưng chuyện gì sẽ xảy ra nếu một phần mở rộng sử dụng after-change-functionsnhư Jordon đề cập đến trong câu trả lời của anh ta? Tài liệu cho một chức năng có lẽ sẽ không đề cập cụ thể đến cái móc đó, phải không?
nispio

Xin lỗi, tôi nên đã được cụ thể hơn. C-h k+ các móc tiêu chuẩn == hành vi hoàn chỉnh (nhiều hơn hoặc ít hơn). Tất nhiên đôi khi để lại rất nhiều khả năng, nhưng nó vẫn minh bạch hơn bất kỳ hệ thống phần mềm phức tạp nào khác mà tôi biết.
shosti

Câu trả lời:


13

Không có cách nào dễ dàng để biết chính xác những gì một lần nhấn phím sẽ làm.

Nếu bạn thấy hành vi bổ sung luôn kiểm tra các móc chung. Xem danh sách tại đây: http://www.gnu.org/software/emacs/manual/html_node/elisp/St Chuẩn-Hooks.html

Trong hầu hết các trường hợp, những cái quan trọng là:

  • chức năng sau thay đổi
  • chức năng trước khi thay đổi
  • thay đổi đầu tiên
  • hậu lệnh
  • móc lệnh
  • hậu tự chèn

Bạn sẽ cần kiểm tra các móc đó và xem xét các chức năng mà chúng chứa để xem cái nào đang sửa đổi hành vi của bạn.

Nếu các chức năng trong các móc này không mô tả đầy đủ hành vi được quan sát, hãy kiểm tra các chức năng để được tư vấn sẽ hiển thị trong tài liệu của chúng describe-function.


Chỉnh sửa: Tôi đã viết một số chức năng để giúp mô tả một cái móc tốt hơn là lần lượt đi qua các chức năng: https://gist.github.com/jordonbiondo/bad03e44bb053db0f1eb Bạn có thể sử dụng describe-hookđược xác định ở đó giống như các chức năng mô tả khác. Đây là một mẫu đầu ra của nó:

Và đây là tất cả các mã, trong trường hợp ý chính biến mất:

(defun guess-all-hooks ()
  "Return a list of all variables that are probably hook lists."
  (let ((syms '()))
    (mapatoms
     (lambda (sym)
       (if (ignore-errors (symbol-value sym))
           (let ((name (symbol-name sym)))
             (when (string-match "-\\(hook[s]?\\|functions\\)$" name)
               (push sym syms))))))
    syms))

(defun face-it (str face)
  "Apply FACE to STR and return."
  (propertize str 'face face))

(defun describe-hook (hook)
  "Display documentation about a hook variable and the
functions it contains."
  (interactive
   (list (completing-read
          "Hook: " (mapcar (lambda (x) (cons x nil)) (guess-all-hooks)))))
  (let* ((sym (intern hook))
         (sym-doc (documentation-property sym 'variable-documentation))
         (hook-docs (mapcar
                     (lambda (func)
                       (cons func (ignore-errors (documentation func))))
                     (symbol-value sym))))
    (switch-to-buffer
     (with-current-buffer (get-buffer-create "*describe-hook*")
       (let ((inhibit-read-only t))
         (delete-region (point-min) (point-max))
         (insert (face-it "Hook: " 'font-lock-constant-face) "\n\n")
         (insert (face-it (concat "`" hook "'") 'font-lock-variable-name-face))
         (replace-string "\n" "\n\t" nil
                         (point)
                         (save-excursion
                           (insert "\n" sym-doc "\n\n")
                           (1- (point))))
         (goto-char (point-max))
         (insert (face-it "Hook Functions: " 'font-lock-constant-face) "\n\n")
         (dolist (hd hook-docs)
           (insert (face-it (concat "`" (symbol-name (car hd)) "'")
                            'font-lock-function-name-face)
                   ": \n\t")
           (replace-string "\n" "\n\t" nil
                           (point)
                           (save-excursion
                             (insert (or (cdr hd) "No Documentation") "\n\n")
                             (1- (point))))
           (goto-char (point-max))))
       (help-mode)
       (help-make-xrefs)
       (read-only-mode t)
       (setq truncate-lines nil)
       (current-buffer)))))

Điều đó có nghĩa là khi một chức năng được thông báo, tài liệu được tự động cập nhật để phản ánh sự thay đổi?
nispio

Tôi không biết các thuộc tính thực tế có được cập nhật hay không, nhưng giá trị được trả về documentationđược cập nhật để phản ánh.
Jordon Biondo

1
@nispio vâng, đúng vậy.
Malabarba

1
Mã / hàm trong gist.github.com/jordonbiondo/bad03e44bb053db0f1eb có thể, và theo tôi, nên được đưa vào câu trả lời. Tôi nghĩ rằng một câu trả lời SE có giới hạn 30.000 ký tự.
Faheem Mitha

4

Có lẽ không phải là một câu trả lời đầy đủ cho câu hỏi của bạn, nhưng gói helm-descbindsgiúp bạn tìm kiếm tất cả các ràng buộc bàn phím được xác định từ đại diện ascii của phím tắt. Đối với mỗi hit, nó cho bạn thấy các chức năng tương tác kết hợp với phím tắt, và bạn có thể yêu cầu helm-descbindsđể mô tả nó, hoặc thực hiện trực tiếp từ các kết quả tìm kiếm.

nhập mô tả hình ảnh ở đây

Dưới đây là mô tả gói từ trang GitHub:

Helm Descbinds cung cấp một giao diện cho các ràng buộc mô tả của emacs làm cho các ràng buộc khóa hiện đang hoạt động có thể tìm kiếm tương tác với helm.

Ngoài ra, bạn có các hành động sau đây

  • Thực hiện lệnh
  • Mô tả lệnh
  • Tìm lệnh

C-zsẽ cung cấp cho bạn một mô tả liên tục của lệnh hiện tại.


2
Điều đó thật tuyệt. Tôi chắc chắn sẽ ràng buộc điều này với C-h b. Mong muốn duy nhất của tôi là tôi có thể nhảy đến mục trong danh sách bằng cách nhập chuỗi khóa thực tế thay vì gõ raC - c _ C - p
nispio
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.