在调试时,我通常会在执行过程中在屏幕上编写很多痕迹来打印变量。如果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)))
)
)
答案 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)))