3

我一直在头文件中添加以下预处理器代码。

#ifdef _HELLO_H_
#define _HELLO_H_

#万一

有没有办法自动(我的意思是,当我第一次加载头文件时,emacs 只是添加代码)或手动(我的意思是,我有一些 Mx 东西)?

如果不存在,我该如何编写 elisp 代码呢?

  • 检查#ifdef 是否未定义。
  • 将_HELLO_H_命名为头文件的名称。
4

7 回答 7

8

我使用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$
//
于 2010-09-01T21:28:04.150 回答
7

我会看看Skeleton Mode

于 2010-09-01T20:32:03.540 回答
3

如果您使用的是 Emacs 23.2,或者安装了 CEDET,则可以使用 SRecode。如果global-srecode-minor-mode打开,您可以使用C-c / /插入预定义模板之一。默认情况下,在一个空.h文件中,它将提供空模板并插入文本,就像您在上面显示的那样。由于 SRecode 具有分层模板,您可以通过立即从菜单中选择“编辑模板”并将其复制到目录中的模板文件(如mytemplates.srt)中轻松覆盖它的功能~/.srecode。使用与上面相同的空模板插入技术来启动新的模板文件。

如果您想要插入复杂的代码模式,SRecode 非常好,因为它具有用于组合和重用模板的丰富语言,这使得使用语义标签生成代码或构建代码生成应用程序变得容易。

如果您喜欢将模板插入作为一种编码模式,例如快速插入 if{} 块等,我不得不推荐 yasnippet,因为它具有更好的 UI。

于 2010-09-01T23:16:58.100 回答
2

我使用模板,然后全局替换文本:

#ifndef STENCIL_HPP
#define STENCIL_HPP

class Stencil
{
};

#endif // STENCIL_HPP

Emacs 和 Xemacs 具有智能文本替换功能,因此“Stencil”将替换为“Square”而不是“SQUARE”。

于 2010-09-01T21:22:41.930 回答
0

大多数现代编译器都支持#pragma once,但 YMMV. 在您的编译器中尝试它(我猜因为您使用 emacs 它是 gcc,它现在已经支持它很长一段时间了,至少从 2.95 版开始,可能更早。)

Visual Studio 也绝对支持它,我想是 MS 开始了这个约定。

于 2010-09-01T20:30:12.187 回答
0

YASnippet 很酷,我使用它,但它不适合这项工作。

这个问题的解决方案是使用模板框架。在 emacs 中有几个。我不记得我在设置defaultcontent.el之前评估的所有模板系统。它基本上是执行Thomas Matthews 方法的一种自动化方式。

我尝试了 SkeletonMode,但觉得它太不模板化而不能成为模板包。使用 defaultcontent.el,我在模板文件中为每种文件类型定义模板。没有必要省略。

还有 YASnippet?它用于嵌入代码片段 - 在模块中出现 1-n 次的东西。示例:for 循环、方法定义、类定义、案例语句。相比之下,文件模板每次都包含进入每个文件的内容。该片段是我选择添加或不添加到文件中的内容,具体取决于编码要求。

于 2010-10-25T02:24:29.687 回答
0

M-x auto-insert

完全按照您的要求进行操作,并将其作为标准内置于 emacs

只需打开头文件并运行命令

于 2016-02-22T13:42:19.763 回答