1

在调试时,我通常会在执行过程中编写很多跟踪以在屏幕上打印变量。如果 Emacs 可以为我编写模板就好了。我不知道如何在 Emacs 上编程,所以我请求你的帮助 :)

我的想法如下。像 Mx trace-template 这样的东西,会询问变量的名称。然后,类似这样的内容将被添加到活动缓冲区中:

// trace20130604
cout << "test.cpp variable: " << variable << endl;

注释中添加的日期允许对当天的痕迹进行快速搜索,以便在不需要时将其删除。“test.cpp”是活动缓冲区,自动插入。“变量”是 Emacs 命令在执行时询问您的变量名称。

你认为这会有用吗?易于实施?也许已经实施?:)

理想情况下,它应该是特定于模式的,因此可以根据您使用的语言插入正确的模板。

非常感谢你的帮助!

问候。

几种主要模式的解决方案

我已经扩展了 Francesco 的解决方案以涵盖两种主要模式。这是我第一次尝试在 Elisp 中做某事,我认为代码很难看,但它似乎可以工作。

(defun trace-template (variable-name)
  (interactive "sVariable Name: ")
  (if (string-equal (format "%s" major-mode) "c++-mode")
      (progn
            (insert (format-time-string "// trace%Y%m%d\n"))
            (insert (format "cout << \"%s %s:\" << %s << endl;\n\n"
                  (file-name-nondirectory buffer-file-name)
                  variable-name variable-name)))
    )
  (if (string-equal (format "%s" major-mode) "fortran-mode")
      (progn
            (insert (format-time-string "! trace%Y%m%d\n"))
            (insert (format "WRITE(*,*) \"%s %s:\", %s\n\n"
                  (file-name-nondirectory buffer-file-name)
                  variable-name variable-name)))
    )
  )
4

1 回答 1

0

第一个解决方案是使用yasnippet扩展,它旨在满足您的需要:将(可能参数化的)模板插入到当前缓冲区中。

Yasnippet 可以使用 emacs 的打包系统轻松安装,例如通过MELPA存储库,它的文档解释了如何编写自定义片段。模板后面的代码段可能如下所示:

#contributor : me <me@example.com>
#name : trace
# --
// `(format-time-string "%Y%m%d")`
cout << "`(file-name-nondirectory buffer-file-name)` $1:" << $1 << endl;

Yasnippet 可以将片段扩展限制为特定模式,因此我认为您可以轻松定义多个以相同方式命名的特定于语言的片段。


另一种解决方案是编写一个自定义的 Emacs LISP 函数,如下所示:

(defun trace-template (variable-name)
  (interactive "sVariable Name: ")
  (insert (format-time-string "// trace%Y%m%d\n"))
  (insert (format "cout << \"%s %s:\" << %s << endl"
                  (file-name-nondirectory buffer-file-name)
                  variable-name variable-name)))
于 2013-04-06T18:26:50.107 回答