在Emacs中生成跟踪模板

在Emacs中生成跟踪模板,emacs,Emacs,在调试过程中,我通常会在执行过程中写入大量跟踪,以便在屏幕上打印变量。如果Emacs能为我编写模板就好了。我不知道如何在Emacs上编程,因此我请求您的帮助: 我的想法如下。类似于M-x跟踪模板的东西,它将询问变量的名称。然后,类似这样的内容将添加到活动缓冲区: // trace20130604 cout << "test.cpp variable: " << variable << endl; 添加在注释中的日期允许快速搜索当天的痕迹,以便在不需要时将其删

在调试过程中,我通常会在执行过程中写入大量跟踪,以便在屏幕上打印变量。如果Emacs能为我编写模板就好了。我不知道如何在Emacs上编程,因此我请求您的帮助:

我的想法如下。类似于M-x跟踪模板的东西,它将询问变量的名称。然后,类似这样的内容将添加到活动缓冲区:

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

第一种解决方案是使用扩展,它的目的就是做您需要的事情:将可能参数化的模板插入当前缓冲区

Yasnippet可以使用emacs的打包系统轻松安装,例如通过存储库及其解释。模板后面的代码段可能如下所示:

#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跟踪模板变量名 交互式可变名称: 插入格式时间字符串//跟踪%Y%m%d\n
插入格式cout嗨Francesco,非常感谢您的回答!我喜欢你的第二个函数,因为我在不同的计算机之间移动.emacs,所以我只需要移动一个文件。我已经添加了一些ifs,以根据主模式打印不同的模板。这花了我一些时间,但我想我做到了: