When I first added a new file to my XCode 2.1 project I ended up with something like this:
/*
* untitled.cpp
* FooProject
*
* Created by Brian H Ray on 11/5/05.
* Copyright __MyCompanyName__. All rights reserved.
*
*/
#include "untitled.h"
|
The MyCompanyName macro was easily accessible:
$ defaults read com.apple.XCode PBXCustomTemplateMacroDefinitions
{ORGANIZATIONNAME = "__MyCompanyName__"; }
Changing this value with write does the trick. See 'man defaults'. However, I still do not like this header on every file. I want to customize these templates so they are more friendly to doxygen, subversion, and some common class definitions I use with most new files. Here I will use C++ as the example file, although these customization tip works just as well with Java, Cocoa, or any other languages already defined or you define (I added Python). The files I need to customize are located under "/Library/Application Support/Apple/Developer Tools/File Templates". The C++ header looks like:
/*
* «FILENAME»
* «PROJECTNAME»
*
* Created by «FULLUSERNAME» on «DATE».
* Copyright «YEAR» «ORGANIZATIONNAME». All rights reserved.
*
*/
#include <Carbon/Carbon.h>
|
So here is the complete list (I think) of the macro available for expansion. WARNING: when opening these templates open the as Unicode, otherwise you will see junk for the start and stop character.
| Expanded Example |
Macro |
Description |
| MyCompany |
ORGANIZATIONNAME |
Name set from above macro |
| 11/5/05 |
DATE |
current date (using NSCalendarDate format "%x") |
| /tmp/Foo & Test Project |
DIRECTORY |
full path of directory in which the new file is being created |
| test.h |
FILENAME |
full file name, exactly as typed by the user |
| test |
FILEBASENAME |
file name without extension |
| test |
FILEBASENAMEASIDENTIFIER |
same as FILEBASENAME, but mangled to a legal C-style identifier |
| h |
FILEEXTENSION |
extension of file name |
| Brian H Ray |
FULLUSERNAME |
full name of the logged-in user |
| Foo & Test Project |
PROJECTNAME |
name of project in which file is created, "" if no project |
| Foo___Test_Project |
PROJECTNAMEASIDENTIFIER |
same as PROJECTNAME, but mangled to a legal C-style identifier |
| Foo & Test Project |
PROJECTNAMEASXML |
XML entities replaced |
| 10:08:20 AM |
TIME |
current time (using NSCalendarDate format "%X") |
| 2005 |
YEAR |
four int date |
| bray |
USERNAME |
account name of the logged-in use |
| test.app |
PRODUCTNAME |
only works in Taget Templates |
| DEBUG |
TARGETNAMEASIDENTIFIER |
only works in Target Templates |
| 95C97E10-9F0E-4C68-8... |
UUID |
unique User ID |
My result template looks like this:
/*!
\file «FILENAME»
$Id$
$URL$
\version $Rev$
\author «FULLUSERNAME»
\date «DATE»
\namespace «PROJECTNAMEASIDENTIFIER»
*/
#ifndef «PROJECTNAMEASIDENTIFIER»«FILEBASENAMEASIDENTIFIER»
#define «PROJECTNAMEASIDENTIFIER»«FILEBASENAMEASIDENTIFIER»
namespace «PROJECTNAMEASIDENTIFIER»
{
/*! \class «FILEBASENAME».h "$URL$"
* \brief «FILEBASENAME» class from «PROJECTNAME»
*
*
*/
class «FILEBASENAMEASIDENTIFIER»
{
public:
//! «FILEBASENAMEASIDENTIFIER» constructor.
/*!
*/
«FILEBASENAMEASIDENTIFIER»();
//! «FILEBASENAMEASIDENTIFIER» destructor.
/*!
*/
~«FILEBASENAMEASIDENTIFIER»();
};
} // end namespace «PROJECTNAMEASIDENTIFIER»
#endif // «PROJECTNAMEASIDENTIFIER»«FILEBASENAMEASIDENTIFIER»
|
When creating a new file from XCode the result looks like:
/*!
\file Test.h
$Id$
$URL$
\version $Rev$
\author Brian H Ray
\date 11/5/05
\namespace Foo___Test_Project
*/
#ifndef Foo___Test_ProjectTest
#define Foo___Test_ProjectTest
namespace Foo___Test_Project
{
/*! \class Test.h "$URL$"
* \brief Test class from Foo & Test Project
*
*
*/
class Test
{
public:
//! Test constructor.
/*!
*/
Test();
//! Test destructor.
/*!
*/
~Test();
};
} // end namespace Foo___Test_Project
#endif // Foo___Test_ProjectTest
|
For further expansion of the Subversion Keywords, I added the meta data for these in subversion:
$ svn proplist --verbose test.h
$ svn propset svn:keywords "Id Rev URL" test.h
The file of course needs to be added/committed to subversion before these are
expanded. XCode supports subversion, btw so I do not need to leave the IDE.