【问题标题】:Completion for frame local variables from backtrace从回溯完成帧局部变量
【发布时间】:2019-12-09 10:22:27
【问题描述】:

我正在尝试在debugger-eval-expressionedebug-eval-expression 调用read--expression 期间为来自backtrace-frames 的帧局部变量添加完成。

我构造了以下完成表,以将框架局部变量添加到本地 elisp 变量的现有表中,

;; completion table for locals in current frame
(defvar my-backtrace-locals-completion-table
  (completion-table-in-turn
   (completion-table-dynamic
    (lambda (_string)
      (when-let* ((idx (backtrace-get-index))  ;backtrace.el
                  (frame (nth idx backtrace-frames)))
        (backtrace-frame-locals frame)))
    'do-switch-buffer)
   elisp--local-variables-completion-table))   ;elisp-mode.el

这似乎工作正常,例如。重现

(1) 评估

;; debug-on-error = t
(let ((my-local-var '(1 2))) (mapcan #'car this-local-var))

(2) 来自调试器的第二帧,使用 eval-expression 评估

(funcall my-backtrace-locals-completion-table "my-" nil t)

返回预期的("my-local-var")

问题是按照上面的步骤,但是调用debugger-eval-expression 不起作用。评估表的环境找不到backtrace-frame(有或没有do-switch-buffer)。

如何在适当的缓冲区中定义要评估的表?

emacs v27.0.50

【问题讨论】:

    标签: debugging emacs code-completion backtrace


    【解决方案1】:

    上面的完成表并没有完全返回debugger-eval-expression 的预期候选人。计算表达式的环境具有高于但不包括 Backtrace 缓冲区中点的帧的局部变量。

    所以,可用的本地人应该只是那些来自更高帧的人,例如。

    (eval-when-compile (require 'dash))
    (defvar my-backtrace-locals-completion-table
      (completion-table-dynamic
       (lambda (_string)
         (when backtrace-frames
           (--mapcat
            (-some->> (backtrace-frame-locals it) (--map (car it)))
            (nthcdr (1+ (backtrace-get-index)) backtrace-frames))))
       'do-switch-buffer))
    

    然后,重新定义 debugger-eval-expression 的交互式规范以使用新的本地表代替普通的 elisp 表提供了正确的补全(传递 'do-switch-buffer arg completion-table-dynamic 以在原始缓冲区中查找补全)。

    (defun my-backtrace@eval (orig-fn exp &optional nframe)
      (interactive
       (let ((elisp--local-variables-completion-table
              my-backtrace-locals-completion-table))
         (list (read--expression "[my] Eval in stack frame: "))))
      (apply orig-fn (list exp nframe)))
    
    (advice-add 'debugger-eval-expression :around #'my-backtrace@eval)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多