2010-09-01 2 views
3

Я все время добавляю следующий код препроцессора в заголовочные файлы.Добавление комментариев в файл заголовка C/C++ автоматически или вручную

 
#ifdef _HELLO_H_ 
#define _HELLO_H_ 

#endif 

Есть ли способ сделать это автоматически (я имею в виду, когда я загрузить файл заголовка в первый раз, то Emacs просто добавляет код) или вручную (я имею в виду, у меня есть некоторые Mx КОЕ) ?

Если не существует, как я могу запрограммировать код elisp на это?

  • Проверьте, если #ifdef не определен.
  • введите имя _HELLO_H_ из имени файла заголовка.
+6

сторона Примечание: Идентификаторы, начинающиеся с подчеркивания зарезервированы (в одну сторону или другие). Вы должны использовать что-то вроде '#define HELLO_H_INCLUDED' –

+0

+1, _MACROS являются незаконными для кода пользователя. – Puppy

ответ

7

Я использую YaSnippet, и он отлично работает. Он поставляется по умолчанию с множеством фрагментов для разных языков и режимов, а не только для C++. Кроме того, вы можете написать свои собственные шаблоны (фрагменты) и даже использовать Lisp внутри них (т. Е. Сгенерировать заголовок файла с информацией об авторских правах, включая текущий год). Существует также хорошее documentation.

Вот пример «однажды» сниппета, который расширяется при вводе «один раз» и нажмите кнопку «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++ - режим, который добавляет информацию об авторских прав с текущим годом:

#name : C++ source file license 
# -- 
// 
// Copyright (C) `(format-time-string "%Y" (current-time))` Bueller? Bueller? 
// 
// $Id$ 
// 
+1

+1 для YASnippet – ocodo

+0

YASnippet - отличный инструмент, но для этой цели это не так, это * templates *. – Cheeso

+0

@Cheeso: Это спорно. В чем разница между шаблоном шаблона и шаблоном, описанным в функции? – 2010-10-25 17:23:44

0

Большинство современных компиляторов поддерживают #pragma once, но YMMV. Попробуйте в своем компиляторе (я предполагаю, что с тех пор, как вы используете emacs, это gcc, который поддерживал его уже довольно давно, по крайней мере, начиная с версии 2.95, возможно, раньше.)

Visual Studio определенно поддерживает его, Я бы предположил, что именно MS начала конвенцию.

+0

+1 для прагмы один раз –

+1

# прагма один раз иногда просто не работает. Например, когда заголовок копируется как часть некоторого сценария установки (make install?) И из-за некоторой ошибки в include-пути (например, когда он включен как «mylib/header.h», а другое время идет так же, как «header» .час"). Кроме того, не забывайте о некоторых компиляторах, которые не обрабатывают hardlinks правильно. Кроме того, это не входит в стандарт. – 2010-09-01 22:09:58

2

Я использую трафарет, то глобальный заменить текст:

#ifndef STENCIL_HPP 
#define STENCIL_HPP 

class Stencil 
{ 
}; 

#endif // STENCIL_HPP 

Emacs и Xemacs имеют смарт замены текста, так что «Трафарет» будет заменено «квадрат» вместо «КВАДРАТ».

+0

Это то, что defaultcontent.el делает, автоматически. – Cheeso

3

Если вы используете Emacs 23,2, или Cedet иначе установлены, вы можете использовать SRecode. Если включено global-srecode-minor-mode, вы можете использовать C-c// для вставки одного из предопределенных шаблонов. По умолчанию в пустой файл .h он будет предлагать пустой шаблон и вставлять текст, как показано выше. Поскольку SRecode имеет иерархические шаблоны, вы можете легко переопределить, что он делает, выбрав «Редактировать шаблон» сразу после этого из меню и скопировав его в файл шаблона (например, mytemplates.srt) в вашем каталоге ~/.srecode. Используйте тот же метод вставки пустого шаблона, что и выше, чтобы начать новый файл шаблона.

SRecode приятный, если у вас есть сложные шаблоны кода, которые вы хотите вставить, поскольку он имеет богатый язык для объединения и повторного использования шаблонов, что позволяет легко генерировать код с использованием тегов из семантических или создающих приложений для генерации кода.

Если вам нравится вставка шаблона в качестве шаблона кодирования, например, быстрая вставка if {} блоков и т. Д., Я должен был бы рекомендовать yasnippet иметь гораздо более приятный интерфейс.

0

YASnippet классный, и я использую его, но это неправильный инструмент для этой работы.

Решение этого вопроса заключается в использовании шаблона. Внутри emacs есть несколько. Я не помню все системы шаблонов, которые я оценил, прежде чем установить defaultcontent.el. Это в основном автоматизированный способ выполнения Thomas Matthews' approach.

Я пробовал SkeletonMode, но считал, что это слишком шаблонно, чтобы быть пакетом шаблонов. С defaultcontent.el я определяю шаблон для каждого типа файла в файле шаблона. Нет необходимости в elisp.

И YASnippet? Он предназначен для встраивания фрагментов кода, которые появляются в модуле 1 раз. Примеры: для циклов, определений методов, определений классов, операторов case. Напротив, шаблон файла содержит все, что входит в КАЖДЫЙ ФАЙЛ каждый раз. Этот фрагмент - это то, что я хочу добавить в файл или нет, в зависимости от требования к кодированию.

0

M-x auto-insert

ли именно то, что вы просите, и его встроенный в Emacs в качестве стандартного

Просто откройте файл заголовка и запустить команду

 Смежные вопросы

  • Нет связанных вопросов^_^