我一直在头文件中添加以下预处理器代码。
#ifdef _HELLO_H_ #define _HELLO_H_ #万一
有没有办法自动(我的意思是,当我第一次加载头文件时,emacs 只是添加代码)或手动(我的意思是,我有一些 Mx 东西)?
如果不存在,我该如何编写 elisp 代码呢?
- 检查#ifdef 是否未定义。
- 将_HELLO_H_命名为头文件的名称。
我一直在头文件中添加以下预处理器代码。
#ifdef _HELLO_H_ #define _HELLO_H_ #万一
有没有办法自动(我的意思是,当我第一次加载头文件时,emacs 只是添加代码)或手动(我的意思是,我有一些 Mx 东西)?
如果不存在,我该如何编写 elisp 代码呢?
我使用YaSnippet,效果很好。它默认带有许多用于不同语言和模式的片段,不仅适用于 C++。另外,您可以编写自己的模板(片段),甚至在其中使用 Lisp(即生成带有版权信息的文件头,包括当前年份)。还有一个很好的文档。
这是一个“once”片段的示例,当您在 cc-mode 中键入“once”并点击“tab”按钮时,该片段正在展开:
#name : #ifndef XXX; #define XXX; #endif
# --
#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_}
#define $1
$0
#endif
这是我的 c++-mode 的“许可证”片段,它添加了当前年份的版权信息:
#name : C++ source file license
# --
//
// Copyright (C) `(format-time-string "%Y" (current-time))` Bueller? Bueller?
//
// $Id$
//
我会看看Skeleton Mode。
如果您使用的是 Emacs 23.2,或者安装了 CEDET,则可以使用 SRecode。如果global-srecode-minor-mode
打开,您可以使用C-c / /
插入预定义模板之一。默认情况下,在一个空.h
文件中,它将提供空模板并插入文本,就像您在上面显示的那样。由于 SRecode 具有分层模板,您可以通过立即从菜单中选择“编辑模板”并将其复制到目录中的模板文件(如mytemplates.srt
)中轻松覆盖它的功能~/.srecode
。使用与上面相同的空模板插入技术来启动新的模板文件。
如果您想要插入复杂的代码模式,SRecode 非常好,因为它具有用于组合和重用模板的丰富语言,这使得使用语义标签生成代码或构建代码生成应用程序变得容易。
如果您喜欢将模板插入作为一种编码模式,例如快速插入 if{} 块等,我不得不推荐 yasnippet,因为它具有更好的 UI。
我使用模板,然后全局替换文本:
#ifndef STENCIL_HPP
#define STENCIL_HPP
class Stencil
{
};
#endif // STENCIL_HPP
Emacs 和 Xemacs 具有智能文本替换功能,因此“Stencil”将替换为“Square”而不是“SQUARE”。
大多数现代编译器都支持#pragma once
,但 YMMV. 在您的编译器中尝试它(我猜因为您使用 emacs 它是 gcc,它现在已经支持它很长一段时间了,至少从 2.95 版开始,可能更早。)
Visual Studio 也绝对支持它,我想是 MS 开始了这个约定。
YASnippet 很酷,我使用它,但它不适合这项工作。
这个问题的解决方案是使用模板框架。在 emacs 中有几个。我不记得我在设置defaultcontent.el之前评估的所有模板系统。它基本上是执行Thomas Matthews 方法的一种自动化方式。
我尝试了 SkeletonMode,但觉得它太不模板化而不能成为模板包。使用 defaultcontent.el,我在模板文件中为每种文件类型定义模板。没有必要省略。
还有 YASnippet?它用于嵌入代码片段 - 在模块中出现 1-n 次的东西。示例:for 循环、方法定义、类定义、案例语句。相比之下,文件模板每次都包含进入每个文件的内容。该片段是我选择添加或不添加到文件中的内容,具体取决于编码要求。
M-x auto-insert
完全按照您的要求进行操作,并将其作为标准内置于 emacs
只需打开头文件并运行命令