2013-04-06 79 views
1

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

我的想法如下。就像M-x trace-template一样,它会询问变量的名称。那么,这样的事情将被添加到活动的缓冲区:

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

日期在评论中添加允许执行当天的痕迹快速搜索将其删除不需要的时候。 “test.cpp”是自动插入的活动缓冲区。 “变量”是Emacs命令在执行时要求您输入的变量名称。

您认为这样做会有帮助吗?易于实施?也许已经实施? :)

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

非常感谢您的帮助!

问候。

解决方案的几大-模式

我已经扩大了弗朗西斯科的解决方案,用于支付两大模式中。这是我第一次尝试在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))) 
    ) 
) 

回答

0

第一种解决方案将包括在使用yasnippet延伸,其目的是在做什么您需要:将(潜在参数)模板到当前的缓冲区。

Yasnippet可以使用emacs的包装系统轻松安装,例如通过MELPA存储库,其documentation解释为how to write custom snippets。下面的模板代码片段看起来是这样的:

#contributor : me <[email protected]> 
#name : trace 
# -- 
// `(format-time-string "%Y%m%d")` 
cout << "`(file-name-nondirectory buffer-file-name)` $1:" << $1 << endl; 

Yasnippet可以限制片段扩展到特定的模式,所以,我认为你可以很容易地定义多个特定语言的片段都以同样的方式命名。


另一种解决办法是写一个定制的Emacs Lisp的功能,如下列:

​​
+0

嗨弗朗西斯,非常感谢你的回答!我喜欢你的第二个功能,因为我在不同的计算机之间移动.emacs,所以我只需要移动一个文件。我一直在添加一些ifs来根据主模式打印不同的模板。这花了我一些时间,但我想我做到了:) – siritinga 2013-04-07 12:16:22