Làm cách nào để tôi chỉnh sửa một hàm được xác định trong khối gói sử dụng?


7

Dưới đây là một ví dụ hoạt động tối thiểu để chứng minh vấn đề, bạn sẽ cần use-packagecài đặt gói:

(use-package ido
  :config
  (progn
    (defun dummy/function ()
      (interactive)
      (message "I am in the dummy function."))))

Khi tôi cố gắng thêm thiết bị edebug vào dummy/functionsử dụng M-x edebug-defun, nó sẽ khởi động edebug ngay lập tức như thể tôi đã làm M-x dummy/function. Tôi phải bỏ nó bằng cách đánh q. Nhưng sau đó khi tôi thực sự làm M-x dummy/function, tôi không thấy edebug kích hoạt.

Có một cái gì đó về use-packagetrình bao bọc gây rối với các thiết bị edebug? Làm thế nào nó có thể được cố định?


Tôi không biết cách sử dụng gói hoạt động, nhưng việc xác định dummy/functionở cấp cao nhất (nghĩa là bên ngoài gói sử dụng) có khắc phục được sự cố ngay lập tức không? Tôi đã ngừng sử dụng các hàm lambda ẩn danh có lợi cho các hàm được đặt tên để xử lý các loại vấn đề tương tự trong hook-mode.
Tyler

@ Có, các chức năng được xác định bên ngoài use-packagetrình bao bọc có thể được chỉnh sửa tốt. Tôi muốn bao bọc mọi thứ liên quan đến gói X bên trong (use-package X ..), bao gồm các chức năng tùy chỉnh của tôi liên quan đến X. Nhưng nếu edebug của các chức năng đó là một vấn đề, thì tôi cần phải suy nghĩ lại về tổ chức mã của mình ..
Kaushal Modi

Nếu bạn nghĩ rằng hành vi bạn đang tìm kiếm nên được cung cấp nhưng không, hãy xem xét việc gửi yêu cầu tăng cường Emacs : M-x report-emacs-bug. Hãy chuẩn bị để cung cấp một công thức đơn giản bắt đầu từ emacs -Q.
vẽ

1
Tôi nghĩ edebug-defungỡ lỗi hình thức cấp cao nhất, trong trường hợp này là (use-package ...)chính nó chứ không phải là defun bạn đang chuyển sang use-packagemacro. Bạn có thể sử dụng edebug-on-entryvà cho biết tên của hàm bạn đã xác định không?
glucas

1
FWIW, tôi sử dụng trình gỡ lỗi Emacs thông thường debug, không edebug. Ví dụ , M-x debug-on-entry. HTH.
vẽ

Câu trả lời:


9

Khi bạn gọi edebug-defunnó là gỡ lỗi hình thức cấp cao nhất, trong trường hợp này là (use-package ...).

Bạn có thể sử dụng debug-on-entryđể gỡ lỗi một chức năng được đặt tên.


4
  1. Đánh dấu defun thích hợp và gọi C-x nn( narrow-to-region)
  2. C-u C-M-x( edebug-defun)
  3. C-x nw( widen)

Nếu bạn thích làm việc nhanh chóng, phím tắt lispy cho việc này là N xe W.


1
Điều này không hoạt động vì narrow-to-defunthu hẹp đến cùng một (use-package ...)hình thức edebug-defuntìm thấy. Tuy nhiên, nó hoạt động nếu bạn đánh dấu defun trước và sử dụng narrow-to-region.
glucas

Vâng, đó là những gì tôi muốn nói. Tôi không thực sự sử dụng narrow-to-defun. lispyChọn Nvùng và cuộc gọi narrow-to-region.
abo-abo

3

edebug-defun

Cảm ơn @ abo-abo cho mẹo để đánh dấu defun đầu tiên.

Đây là một cách nhanh chóng để bật / tắt edebug-defun. Điều này sử dụng search-backward-regexpđể edebug-instrument hoặc eval tên defun hoặc defmacro một cách chính xác, cho dù nó được xác định trong use-packagetrình bao bọc hay không.

;; Edebug a defun or defmacro
(defvar modi/fns-in-edebug nil
  "List of functions for which `edebug' is instrumented.")

(defconst modi/fns-regexp (concat "(\\s-*"
                                  "\\(defun\\|defmacro\\)\\s-+"
                                  "\\(?1:\\(\\w\\|\\s_\\)+\\)\\_>") ; word or symbol char
  "Regexp to find defun or defmacro definition.")

(defun modi/toggle-edebug-defun ()
  (interactive)
  (let (fn)
    (save-excursion
      (search-backward-regexp modi/fns-regexp)
      (setq fn (match-string 1))
      (mark-sexp)
      (narrow-to-region (point) (mark))
      (if (member fn modi/fns-in-edebug)
          ;; If the function is already being edebugged, uninstrument it
          (progn
            (setq modi/fns-in-edebug (delete fn modi/fns-in-edebug))
            (eval-region (point) (mark))
            (setq-default eval-expression-print-length 12)
            (setq-default eval-expression-print-level  4)
            (message "Edebug disabled: %s" fn))
        ;; If the function is not being edebugged, instrument it
        (progn
          (add-to-list 'modi/fns-in-edebug fn)
          (setq-default eval-expression-print-length nil)
          (setq-default eval-expression-print-level  nil)
          (edebug-defun)
          (message "Edebug: %s" fn)))
      (widen))))

Cách sử dụng - Với điểm bất kỳ nơi nào trong thân hàm / macro, việc gọi modi/toggle-edebug-defunsẽ bật hoặc tắt edebugcho thực thể đó.

debug-on-entry

Nhờ @glucas và @Drew, tôi đã tạo ra một cách thuận tiện để chuyển đổi debug-on-entry. Điều này cũng sử dụng cách tiếp cận tương tự như trên để phân tích tên defun / defmacro.

;; Debug on entry
(defvar modi/fns-in-debug nil
  "List of functions for which `debug-on-entry' is instrumented.")

(defun modi/toggle-debug-defun ()
  (interactive)
  (let (fn)
    (save-excursion
      (search-backward-regexp modi/fns-regexp)
      (setq fn (match-string 1)))
    (if (member fn modi/fns-in-debug)
        ;; If the function is already being debugged, cancel its debug on entry
        (progn
          (setq modi/fns-in-debug (delete fn modi/fns-in-debug))
          (cancel-debug-on-entry (intern fn))
          (message "Debug-on-entry disabled: %s" fn))
      ;; If the function is not being debugged, debug it on entry
      (progn
        (add-to-list 'modi/fns-in-debug fn)
        (debug-on-entry (intern fn))
        (message "Debug-on-entry: %s" fn)))))

Cách sử dụng - Với điểm bất kỳ nơi nào trong thân hàm, việc gọi modi/toggle-debug-defunsẽ bật hoặc hủy debug-on-errorchức năng đó.

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.