在Emacs中生成跟踪模板

时间:2013-04-06 15:26:57

标签: emacs

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

我的想法如下。类似M-x 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)))
    )
  )

1 个答案:

答案 0 :(得分:0)

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

Yasnippet可以使用emacs的打包系统轻松安装,例如通过MELPA存储库,documentation解释how to write custom snippets。模板后面的代码段如下所示:

#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)))