Добавление некоторых комментариев в заголовочный файл C / C ++ автоматически или вручную - PullRequest
3 голосов
/ 02 сентября 2010

Я все время добавляю следующий код препроцессора в файлы заголовков.

#ifdef _HELLO_H_
#define _HELLO_H_

#endif

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

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

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

Ответы [ 7 ]

8 голосов
/ 02 сентября 2010

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

Вот пример фрагмента "Once", который расширяется, когда вы набираете "Once" и нажимаете кнопку "Tab" в режиме cc:

#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$
//
7 голосов
/ 02 сентября 2010

Я бы взглянул на Режим скелета .

3 голосов
/ 02 сентября 2010

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

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

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

2 голосов
/ 02 сентября 2010

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

#ifndef STENCIL_HPP
#define STENCIL_HPP

class Stencil
{
};

#endif // STENCIL_HPP

В Emacs и Xemacs есть интеллектуальная замена текста, поэтому вместо 'SQUARE' вместо 'SQUARE' вместо 'SQUARE' вместо 'Square'.

0 голосов
/ 22 февраля 2016

M-x auto-insert

В точности соответствует тому, что вы просите, и встраивается в стандарт emacs

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

0 голосов
/ 25 октября 2010

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

Решением этого вопроса является использование шаблонной структуры.Есть несколько в Emacs.Я не помню всех шаблонных систем, которые я оценил до того, как установил defaultcontent.el .Это в основном автоматизированный способ выполнения подхода Томаса Мэтьюса .

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

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

0 голосов
/ 02 сентября 2010

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

Visual Studio определенно поддерживает это, я думаю, что MS начала конвенцию.

...