1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801 |
- \input texinfo
- @c %**start of header
- @setfilename ../../info/srecode.info
- @set TITLE SRecoder Manual
- @set AUTHOR Eric M. Ludlam
- @settitle @value{TITLE}
- @include docstyle.texi
- @c Merge all indexes into a single index for now.
- @c We can always separate them later into two or more as needed.
- @syncodeindex vr cp
- @syncodeindex fn cp
- @syncodeindex ky cp
- @syncodeindex pg cp
- @syncodeindex tp cp
- @c %**end of header
- @copying
- Copyright @copyright{} 2007--2016 Free Software Foundation, Inc.
- @quotation
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3 or
- any later version published by the Free Software Foundation; with no
- Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,''
- and with the Back-Cover Texts as in (a) below. A copy of the license
- is included in the section entitled ``GNU Free Documentation License''.
- (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
- modify this GNU manual.''
- @end quotation
- @end copying
- @dircategory Emacs misc features
- @direntry
- * SRecode: (srecode). Semantic template code generator.
- @end direntry
- @titlepage
- @sp 10
- @center @titlefont{SRecode}
- @vskip 0pt plus 1 fill
- @center by @value{AUTHOR}
- @page
- @vskip 0pt plus 1filll
- @insertcopying
- @end titlepage
- @macro semantic{}
- @i{Semantic}
- @end macro
- @macro EIEIO{}
- @i{EIEIO}
- @end macro
- @macro srecode{}
- @i{SRecode}
- @end macro
- @node Top
- @top @value{TITLE}
- @srecode{} is the @i{Semantic Recoder}. Where @semantic{} will parse
- source files into lists of tags, the @i{Semantic Recoder} will aid in
- converting @semantic{} tags and various other information back into
- various types of code.
- While the @srecode{} tool provides a template language, templates for
- several languages, and even a sequence of heuristics that aid the user
- in choosing a template to insert, this is not the main goal of
- @srecode{}.
- The goal of @srecode{} is to provide an application framework where
- someone can write a complex code generator, and the underlying
- template commonality allows it to work in multiple languages with
- ease.
- @ifnottex
- @insertcopying
- @end ifnottex
- @menu
- * Quick Start:: Basic Setup for template insertion.
- * User Templates:: Custom User Templates
- * Parts of SRecode:: Parts of the system
- * SRecode Minor Mode:: A minor mode for using templates
- * Template Writing:: How to write a template
- * Dictionaries:: How dictionaries work
- * Developing Template Functions:: How to write your own template insert functions.
- * Template Naming Conventions:: Creating a set of core templates
- * Inserting Tag Lists:: Inserting Semantic tags via templates
- * Application Writing:: Writing an @srecode{}r application
- * GNU Free Documentation License:: The license for this documentation.
- * Index::
- @end menu
- @node Quick Start
- @chapter Quick Start
- When you install CEDET and enable @srecode{}, an @code{SRecoder} menu
- item should appear.
- To toggle @srecode{} minor mode on and off use:
- @example
- M-x srecode-minor-mode RET
- @end example
- or
- @example
- M-x global-srecode-minor-mode RET
- @end example
- or add
- @example
- (srecode-minor-mode 1)
- @end example
- into a language hook function to force it on (which is the default) or
- pass in @code{-1} to force it off.
- See @ref{SRecode Minor Mode} for more on using the minor mode.
- Use the menu to insert templates into the current file.
- You can add your own templates in @file{~/.srecode}, or update the
- template map path:
- @deffn Option srecode-map-load-path
- @anchor{srecode-map-load-path}
- Global load path for SRecode template files.
- @end deffn
- Once installed, you can start inserting templates using the menu, or
- the command:
- @deffn Command srecode-insert template-name &rest dict-entries
- @anchor{srecode-insert}
- Insert the template @var{template-name} into the current buffer at point.
- @var{dict-entries} are additional dictionary values to add.
- @end deffn
- SRecode Insert will prompt for a template name. Template names are
- specific to each major mode. A typical name is of the form:
- @code{CONTEXT:NAME} where a @var{CONTEXT} might be something like
- @code{file} or @code{declaration}. The same @var{NAME} can occur in
- multiple contexts.
- @node User Templates
- @chapter User Templates
- @srecode{} builds and maintains a map of all template files. The root
- template files resides in the @srecode{} distribution. User written
- templates files are saved in @file{~/.srecode}, along with the
- @srecode{} map file.
- @defvar srecode-map-save-file
- @anchor{srecode-map-save-file}
- The save location for SRecode's map file.
- @end defvar
- Template files end with a @file{.srt} extension. Details on how to
- write templates are in @ref{Template Writing}.
- Each template file you write is dedicated to a single major mode. In
- it, you can write templates within the same context and with the same
- name as core templates. You can force your templates to override the
- core templates for a particular major mode by setting the
- priority. See @ref{Special Variables}.
- To get going quickly, open a new @file{.srt} file. It will start in
- the @srecode{} template writing mode. Use the @srecode{} minor mode
- menu to insert the @code{empty} file template.
- When using templates in other modes (such as C++ or Emacs Lisp
- templates), use the ``Edit Template'' menu to find a template you
- would like to update. Copy it into your user template file, and
- change it.
- If you were to update @code{declaration:function} in your user
- template file, then you would get this new template instead of the one
- that comes with @srecode{}. Higher level applications should always
- use @code{declaration:function} when generating their own code, so
- higher level templates will then adopt your changes to
- @code{declaration:function} into themselves.
- You can also override variables. Core variables are stored in the
- @srecode{} root template file @file{default.srt}, and that contains
- the copyright usually used, and some basic file setup formats.
- Override variables like this by specifying a @code{mode} of
- @code{default} like this:
- @example
- set mode "default"
- @end example
- @node Parts of SRecode
- @chapter Parts of SRecode
- The @srecode{} system is made up of several layers which work together
- to generate code.
- @section Template Layer
- The template layer provides a way to write, and compile templates. The
- template layer is the scheme used to insert text into an Emacs buffer.
- The @srecode{} template layer is more advanced than other modes like the
- Emacs packages @code{skeleton} or @code{tempo} in that it allows
- multiple layers of templates to be created with the same names. This
- means that @srecode{} can provide a wide range of templates, and users
- can override only the small sections they want, instead of either
- accepting someone else's template, or writing large new templates of
- their own.
- Templates are written in @file{.srt} files. You can learn how to
- author new @file{.srt} files @ref{Template Writing}.
- While the template system was designed for @srecode{} based
- applications it can also be used independently for simple template
- insertion during typical coding.
- @section Template Manager
- Once templates have been written, a scheme for loading and selecting
- templates is needed. The template manager has a loader for finding
- template files, and determining which templates are relevant to the
- current buffer. Template files are sorted by priority, with user
- templates being found first, and system level default templates last.
- Templates are also sorted by application. Each application has its
- own templates, and are kept separate from the generic templates.
- @section Dictionary
- Dictionaries contain values associated with variable. Variables are
- used in macros in a template. Variables are what allows a generic
- template such as a function to be made specific, such as a function
- named foo. The value of a variable can be one of three things; a
- string, a list of more dictionaries, or a special
- @code{srecode-dictionary-compound-value} object subclass. See
- @ref{Variables} for more.
- @section Template Insertion
- The template insertion layer involves extensions to the basic template
- layer. A wide range of custom variables are available for mixing derived
- data as macros into the plain text of a template.
- In addition, templates can be declared with arguments. These
- arguments represent predetermined sets of dictionary values, such as
- features of the current file name, user name, time, etc.
- Some arguments are major-mode specific, such as the @code{:el} or
- @code{:cpp} arguments.
- @section Template Insertion Context
- A context can be provided for templates in a file. This helps
- auto-selection of templates by name, or allows templates in different
- contexts to have the same name. Some standard contexts are
- @code{file}, @code{declaration}, and @code{classdecl}.
- A context can be automatically derived as well based on the parsing
- state from @i{Semantic}. @inforef{Top, Semantic Manual, semantic}.
- @section Applications
- Commands that do a particular user task which involves also writing
- Emacs Lisp code. Applications are at the top layer. These
- applications have their own template files and logic needed to fill in
- dictionaries or position a cursor. SRecode comes with an example
- @code{srecode-document} application for creating comments for Semantic
- tags. The CEDET application @i{EDE} has a project type that is an
- @srecode{} application.
- @section Field Editing
- If the variable @code{srecode-insert-ask-variable-method} is set to
- 'field, then variables that would normally ask a question, will
- instead create ``fields'' in the buffer. A field-editing layer
- provides simple interaction through the fields. Typing in a field
- will cause all variable locations that are the same to edit at the
- same time. Pressing TAB on a field will move you to the next field.
- @node SRecode Minor Mode
- @chapter SRecode Minor Mode
- The Semantic Recode minor mode enables a keymap and menu that provides
- simple access to different templates or template applications.
- The key prefix is @key{C-c /}.
- If the variable @code{srecode-takeover-INS-key} is set, then the key
- @key{<insert>} can also be used.
- The most important key is bound to @code{srecode-insert} which is
- @key{C-c / /}, or @key{insert insert}. @ref{Quick Start}.
- Major keybindings are:
- @table @key
- @item C-c / /
- Insert a template whose name is typed into the minibuffer.
- @item C-c / <lower case letter>
- Reserved for direct binding of simple templates to keys using a
- keybinding command in the template file.
- @item C-c / <upper case letter>
- Reserved for template applications (Such as comment or get/set inserter.)
- @item C-c / E
- Edit the code of a template.
- @item C-c / .
- Insert template again. This will cause the previously inserted
- template to be inserted again.
- @end table
- @section Field Editing
- By default, when inserting a template, if the user needs to enter text
- to fill in a part of the template, then the minibuffer is used to
- query for that information. SRecode also supports a field-editing mode
- that can be used instead. To enable it set:
- @defun srecode-insert-ask-variable-method
- @anchor{srecode-insert-ask-variable-method}
- Determine how to ask for a dictionary value when inserting a template.
- Only the @var{ASK} style inserter will query the user for a value.
- Dictionary value references that ask begin with the ? character.
- Possible values are:
- @table @code
- @item ask
- Prompt in the minibuffer as the value is inserted.
- @item field
- Use the dictionary macro name as the inserted value,
- and place a field there. Matched fields change together.
- @end table
- @b{NOTE}: The field feature does not yet work with XEmacs.
- @end defun
- Field editing mode is supported in newer versions of Emacs. You
- will not be prompted to fill in values while the template is
- inserted. Instead, short regions will be highlighted, and the cursor
- placed in a field. Typing in the field will then fill in the value.
- Several fields might be linked together. In that case, typing in one
- area will modify the other linked areas. Pressing TAB will move
- between editable fields in the template.
- Once the cursor moves out of the are inserted by the template, all the
- fields are canceled.
- @b{NOTE}: Some conveniences in templates, such as completion, or
- character restrictions are lost when using field editing mode.
- @node Template Writing
- @chapter Template Writing
- @anchor{@code{SRecode-template-mode}}
- @code{srecode-template-mode} is the major mode used for designing new
- templates. @srecode{} files (Extension @file{.srt}) are made up of
- variable settings and template declarations.
- Here is an overview of the terminology you will need for the next few
- sections:
- @table @asis
- @item template file
- A file with a @file{.srt} extension which contains settings,
- variables, and templates.
- @item template
- One named entity which represents a block of text that will be
- inserted. The text is compiled into a sequence of insertable
- entities. The entities are string constants, and macros.
- @item macro
- A macro is a text sequence within template text that is replaced with
- some other value.
- @item dictionary
- A table of variable names and values.
- @item subdictionary
- A dictionary that is subordinate under another dictionary as a value
- to some variable.
- @item variable
- A variable is an entry in a dictionary which has a value.
- @end table
- @menu
- * Variables:: Creating special and regular variables.
- * Templates:: Creating templates
- * Contexts:: Templates are grouped by context
- * Prompts:: Setting prompts for interactive insert macros
- @end menu
- @node Variables
- @section Variables
- Variables can be set up and used in templates. Many variables you may
- use are set up via template arguments, but some may be preferences a
- user can set up that are used in system templates.
- When expanding a template, variables are stored in a @dfn{dictionary}.
- Dictionary entries are variables. Variables defined in templates can
- have string like values.
- A variable can be set like this:
- @example
- set VARNAME "some value"
- @end example
- Note that a VARIABLE is a name in a dictionary that can be used in a
- MACRO in a template. The macro references some variable by name.
- @menu
- * String Values:: Basic Variable values
- * Multi-string Values:: Complex variable values
- * Section Show:: Enabling the display of a named section.
- * Special Variables:: Variables with special names
- * Automatic Loop Variables:: Variables automatically set in section loops.
- * Compound Variable Values:: Compound Variable Values
- @end menu
- @node String Values
- @subsection String Values
- Variables can be set to strings. Strings may contain newlines or any
- other characters. Strings are interpreted by the Emacs Lisp reader so
- @code{\n}, @code{\t}, and @code{\"} work.
- When a string is inserted as part of a template, nothing within the
- string is interpreted, such as template escape characters.
- @node Multi-string Values
- @subsection Multi-string Values
- A variable can be set to multiple strings. A compound value is
- usually used when you want to use dictionary entries as part of a
- variable later on.
- Multi-string variable values are set like string values except there
- are more than one. For example
- @example
- set NAME "this" "-mode"
- @end example
- These two strings will be concatenated together.
- A more useful thing is to include dictionary variables and concatenate
- those into the string. Use the ``macro'' keyword to include the name
- of a variable. This is like macros in a template. For example:
- @example
- set NAME macro "MODE" "-mode"
- @end example
- will extract the value of the dictionary variable MODE and append
- ``-mode'' to the end.
- @node Section Show
- @subsection Section Show
- To set a variable to show a template section, use the @code{show}
- command. Sections are blocks of a template wrapped in section macros.
- If there is a section macro using @var{NAME} it will be shown for each
- dictionary associated with the @var{NAME} macro.
- @example
- show NAME
- @end example
- This will enable that section.
- NOTE: May 11, 2008: I haven't used this yet, so I don't know if it works.
- @node Special Variables
- @subsection Special Variables
- Some variables have special meaning that changes attributes when
- templates are compiled, including:
- @table @code
- @item escape-start
- This is the character sequence that escapes from raw text to template
- macro names. The ability to change the escape characters are key for
- enabling @srecode{} templates to work across many kinds of languages.
- @item escape-end
- This is the character sequence that escapes the end of a template
- macro name.
- Example:
- @example
- set escape_start "$"
- set escape_end "$"
- @end example
- @item mode
- This is the major mode, as a string with the full Emacs Lisp symbol in
- it. All templates in this file will be installed into the template
- table for this major mode.
- Multiple template files can use the same mode, and all those templates
- will be available in buffers of that mode.
- Example:
- @example
- set mode "emacs-lisp-mode"
- @end example
- @item priority
- The priority of a file is a number in a string constant that
- indicates where it lies in the template search order. System
- templates default to low priority numbers. User templates default to
- high priority numbers. You can specify the priority of your template
- to insert it anywhere in the template search list.
- If there are multiple templates with the same context and name, the
- template with the highest priority number will be used.
- If multiple files have the same priority, then then sort order is
- unpredictable. If no template names match, then it doesn't matter.
- Example:
- @example
- set priority "35"
- @end example
- @item application
- If a template file contains templates only needed for a particular
- application, then specify an application. Template files for an
- application are stored in the template repository, but are not used in
- the generic template insertion case.
- The application with a particular name will access these templates
- from Lisp code.
- Example:
- @example
- set application "document"
- @end example
- @item project
- If a template file contains templates, or template overrides specific
- to a set of files under a particular directory, then that template
- file can specify a ``project'' that it belongs to.
- Set the ``project'' special variable to a directory name. Only files
- under that directory will be able to access the templates in that
- file.
- Any template file that has a project specified will get have a
- priority that is set between SRecode base templates, and user defined
- templates.
- Templates can be compiled via a project system, such as EDE@. EDE
- loaded templates will get a @var{project} set automatically.
- Example:
- @example
- set project "/tmp/testproject"
- @end example
- @end table
- If you need to insert the characters that belong to the variables
- @code{escape_start} or @code{escape_end}, then place those into
- a variable. For example
- @example
- set escape_start "$"
- set escape_end "$"
- set DOLLAR "$"
- @end example
- @node Automatic Loop Variables
- @subsection Automatic Loop Variables
- When section macros are used, that section is repeated for each
- subdictionary bound to the loop variable.
- Each dictionary added will automatically get values for positional
- macros which will enable different @var{sections}. The automatic
- section variables are.
- @itemize @bullet
- @item @var{first}---The first entry in the table.
- @item @var{notfirst}---Not the first entry in the table.
- @item @var{last}---The last entry in the table
- @item @var{notlast}---Not the last entry in the table.
- @end itemize
- @node Compound Variable Values
- @subsection Compound Variable Values
- A variable can also have a compound value. This means the value of
- the variable is an @EIEIO{} object, which is a subclass of
- @code{srecode-dictionary-compound-value}.
- New compound variables can only be setup from Lisp code. See
- @ref{Compound Dictionary Values} for details on setting up compound
- variables from Lisp.
- @node Templates
- @section Templates
- A template represents a text pattern that can be inserted into
- a buffer.
- A basic template is declared like this:
- @example
- template TEMPLATENAME :arg1 :arg2
- "Optional documentation string"
- ----
- The text to your template goes here.
- ----
- bind "a"
- @end example
- Templates are stored in a template table by name, and are inserted by
- the @var{templatename} provided.
- The documentation string is optional. This documentation string will
- be used to aid users in selecting which template they want to use.
- The code that makes up the raw template occurs between the lines that
- contain the text "-----".
- @menu
- * Template Section Dictionaries:: Template Scoped Macro values
- * Template Macros:: Macros occurring in template patterns
- @end menu
- @node Template Section Dictionaries
- @subsection Template Section Dictionaries
- To add variable values to section dictionaries used within a specific
- template, you can add them to the beginning of the template
- declaration like this:
- @example
- template TEMPLATENAME :arg1 :arg2
- "Optional documentation string"
- sectiondictionary "A"
- set NAME "foo"
- ----
- A beginning line @{@{NAME@}@}
- @{@{#A@}@}Optional string @{@{NAME@}@} here@{@{/A@}@}
- An end line
- ----
- @end example
- In this example, the @var{NAME} variable gets the value ``foo'', but
- only while it is inside section macro A@. The outer scoped NAME will
- be empty.
- This is particularly useful while using an include macro to pull in a
- second template. In this way, you can pass values known from one
- template to a subordinate template where some value is not known.
- From the Emacs Lisp default template file, a syntax table is just a
- variable with a specialized value.
- If a variable is declared like this (where $ is the escape character):
- @example
- template variable :el
- "Insert a variable.
- DOC is optional."
- ----
- (defvar $?NAME$ $^$
- "$DOC$")
- ----
- @end example
- then you can see that there is a NAME and DOC that is needed.
- The @code{^} point inserter is also a handy key here.
- The syntax table wants a variable, but knows the values of some of
- these variables, and can recast the problem like this by using
- template specific @code{sectiondictionary} macro declarations.
- @example
- template syntax-table
- "Create a syntax table."
- sectiondictionary "A"
- set NAME macro "?MODESYM" "-mode-syntax-table"
- set DOC "Syntax table used in " macro "?MODESYM" " buffers."
- ----
- $<A:variable$
- (let ((table (make-syntax-table (standard-syntax-table))))
- (modify-syntax-entry ?\; ". 12" table) ;; SEMI, Comment start ;;
- ;; ...
- table)
- $/A$
- ----
- @end example
- In this way, @var{NAME} can be set as a user posed question for
- @var{MODESYM} with ``-mode-syntax-table'' appended. A simplified doc
- string will also be inserted.
- Lastly, the @var{A} section contains more macro text which is inserted
- at the @code{^} point marker.
- By creating useful base templates for things like function or variable
- declarations, and recycling them in higher-order templates, an end
- user can override the basic declarator, and the higher order templates
- will then obey the new format, or perhaps even work in more than one
- major mode.
- @node Template Macros
- @subsection Template Macros
- Template macros occur in the template text. The default escape
- characters are ``@{@{`` and ``@}@}'', though they can be changed
- in the top-level variables. See @ref{Variables}.
- Thus, if you have the template code that looks like this:
- @example
- ;; Author: @{@{AUTHOR@}@}
- @end example
- Then the text between @{@{ and @}@} are a macro, and substituted by
- the value of the variable @var{AUTHOR}.
- Macros can be specialized to be more than just a text string. For
- example, the macro above could be augmented with an Emacs Lisp
- function.
- @example
- ;; Author: @{@{AUTHOR:upcase@}@}
- @end example
- In this case, the Emacs Lisp function @code{upcase} will be called on
- the text value of the @var{AUTHOR} variable.
- Macros can also be specialized to have different behaviors by using a
- prefix, non-alpha character or symbol. For example:
- @example
- @{@{! This is a comment inside macro escape characters @}@}
- @end example
- shows that the ``!'' symbol is for comments.
- Alternately, a macro could query the user during insertion:
- @example
- (defun @{@{?NAME@}@} ()
- @{@{^@}@}
- ) ;; End of @{@{NAME@}@}
- @end example
- the ``?'' symbol indicates that if the symbol @var{NAME} isn't in the
- dictionary, then the user should be queried for the @var{NAME}
- variable. If @var{NAME} appears again in the template, the original
- value specified by the user will be inserted again.
- If the text from a dictionary value is to be placed in column format,
- you can use the ``|'' symbol to indicate you want column control. For
- example:
- @example
- | this | that |@{@{#A@}@}
- | @{@{|THIS:4@}@} | @{@{|THAT:4@}@} |@{@{/A@}@}
- @end example
- For each repeated section ``#A'' the dictionary values for @var{THIS}
- and @var{THAT} will be inserted and either trimmed to, or expanded to
- 4 characters in width.
- Macros that are prefixed with the ``#'' symbol denote a section. A
- macro of the same name with a ``/'' prefix denotes the end of that
- section.
- @example
- @{@{#MOOSE@}@}
- Here is some text describing moose.
- @{@{/MOOSE@}@}
- @end example
- In this example if the section MOOSE was ``shown'' in the active
- dictionary, then the text between the # and / macros will also be
- inserted.
- All the text and macros within a section are either not shown at all
- (if that section is not 'visible') or the section is shown one time
- for each dictionary added to that symbol.
- @xref{Developing Template Functions}.
- Macros prefixed with ``>'' will include another template. Include
- macros would look like this:
- @example
- @{@{>FOO:defun@}@}
- @end example
- where @code{FOO} is the dictionary variable for the sub-dictionary used for
- expanding the template @code{defun}. The @code{defun} template will
- be looked up in the template repository for the current mode, or in
- any inherited modes.
- Another way to include another template is with an include macro that
- will also wrap section text. The includewrap insertion method looks
- like this:
- @example
- @{@{<FOO:defun@}@}Handy Text goes here@{@{/FOO@}@}
- @end example
- In this case, @code{defun} is included just as above. If the
- @code{defun} template has a @{@{^@}@} macro in it, then the
- section text ``Handy Text goes here'' will be inserted at that point,
- and that location will not be saved as the cursor location.
- If there is no @{@{^@}@}, then the text will not be inserted.
- For both kinds of include macros, you may need to include a template
- from a different context. You can use @code{:} separate the context
- from the name, like this:
- @example
- @{@{>FOO:declaration:function@}@}
- @end example
- @node Contexts
- @section Context
- Each template belongs to a context. When prompting for a template by
- name, such as with @kbd{C-c / /}, the name is prefixed by the current
- context. If there is no context, it defaults to @code{declaration}.
- You can change context like this:
- @example
- context NAME
- @end example
- where @var{name} is some symbol that represents any context.
- A context resides over all templates that come after it until the next
- context statement. Thus:
- @example
- context C1
- template foo
- "Foo template in C1"
- ----
- ----
- context C2
- template foo
- "Foo template in C2"
- ----
- ----
- @end example
- creates two @code{foo} templates. The first one is when in context
- C1. The second is available in context C2.
- This is useful if there are multiple ways to declare something like a
- function or variable that differ only by where it is in the syntax of
- the language. The name @code{foo} is not ambiguous because each is in
- a different context.
- @node Prompts
- @section Prompt
- Some templates use prompting macro insertion. A macro that needs a
- prompt looks like this:
- @example
- @{@{?NAME@}@}
- @end example
- where ? comes after the first escape character.
- by default, it will use a prompt like this when it is encountered:
- @example
- Specify NAME:
- @end example
- For such macros, you can pre-define prompts for any dictionary entry.
- When that dictionary entry is first encountered, the user is prompted,
- and subsequent occurrences of that dictionary entry use the same value.
- To get a different prompt, use a prompt command like this:
- @example
- prompt VARNAME "Nice Way to ask for VARNAME: "
- @end example
- Now, if you put this in a template:
- @example
- template variable
- ----
- (defvar @{@{?VARNAME@}@} nil
- "")
- ----
- @end example
- when VARNAME is encountered, it will use the nice prompt.
- Prompts can be extended as well. For example:
- @example
- prompt VARNAME "VARNAME: " default "srecode" read y-or-n-p
- @end example
- In this case, the @code{default} keyword indicates that
- @code{"srecode"} is the default string to use, and @code{y-or-n-p} is
- the function to use to ask the question.
- For @code{y-or-n-p} if you type ``y'' it inserts the default string,
- otherwise it inserts empty.
- For any other symbol that occurs after the @code{read} token, it is
- expected to take the same argument list as @code{read-string}. As
- such, you can create your own prompts that do completing reads on
- deterministic values.
- To have the default be calculated later from a dictionary entry, you
- need to use the @code{defaultmacro} keyword instead.
- @example
- prompt VARNAME "Varname: " defaultmacro "PREFIX"
- @end example
- now, when it attempts to read in VARNAME, it will pre-populate the text
- editing section with whatever the value of PREFIX is.
- Some language arguments may supply possible prefixes for prompts.
- Look for these when creating your prompts.
- @node Dictionaries
- @chapter Dictionaries
- Dictionaries are a set of variables. The values associated with the
- variable names could be anything, but how it is handled is dependent
- on the type of macro being inserted.
- Most of this chapter is for writing Lisp programs that use @srecode{}.
- If you only want to write template files, then you only need to read
- the @ref{Template Argument Dictionary Entries} section.
- @menu
- * Create a Dictionary::
- * Setting Dictionary Values:: Basic dictionary values
- * Compound Dictionary Values:: Complex dictionary values
- * Argument Resolution:: Automatic template argument resolution
- * Creating new Arguments:: Create new arguments for use in templates
- * Querying a Dictionary:: Querying a dictionary for values.
- * Template Argument Dictionary Entries:: Catalog of arguments
- @end menu
- @node Create a Dictionary
- @section Create a Dictionary
- @defun srecode-create-dictionary &optional buffer
- @anchor{srecode-create-dictionary}
- Create a dictionary for @var{buffer}.
- If @var{buffer} is not specified, use the current buffer.
- The dictionary is initialized with no variables or enabled sections.
- Any variables defined with @code{set} in the template, however,
- becomes a name in the dictionary.
- @end defun
- @node Setting Dictionary Values
- @section Setting Dictionary Values
- When building an @srecode{} based application, you will need to setup
- your dictionary values yourself. There are several utility functions
- for this.
- In the simplest form, you can associate a string with a variable.
- @defun srecode-dictionary-set-value dict name value
- @anchor{srecode-dictionary-set-value}
- In dictionary @var{dict}, set @var{name} to have @var{value}.
- @end defun
- For section macros, you can have alternate values. A section can
- either be toggled as visible, or it can act as a loop.
- @defun srecode-dictionary-show-section dict name
- @anchor{srecode-dictionary-show-section}
- In dictionary @var{dict}, indicate that the section @var{name} should be exposed.
- @end defun
- @defun srecode-dictionary-add-section-dictionary dict name show-only
- @anchor{srecode-dictionary-add-section-dictionary}
- In dictionary @var{DICT}, add a section dictionary for section macro @var{NAME}.
- Return the new dictionary.
- You can add several dictionaries to the same section entry.
- For each dictionary added to a variable, the block of codes in
- the template will be repeated.
- If optional argument @var{SHOW-ONLY} is non-@code{nil}, then don't add
- a new dictionary if there is already one in place. Also, don't add
- @var{FIRST}/@var{LAST} entries.
- These entries are not needed when we are just showing a section.
- Each dictionary added will automatically get values for positional macros
- which will enable @var{SECTIONS} to be enabled.
- @table @var
- @item first
- The first entry in the table.
- @item notfirst
- Not the first entry in the table.
- @item last
- The last entry in the table
- @item notlast
- Not the last entry in the table.
- @end table
- Adding a new dictionary will alter these values in previously
- inserted dictionaries.
- @end defun
- @node Compound Dictionary Values
- @section Compound Dictionary Values
- If you want to associate a non-string value with a dictionary
- variable, then you will need to use a compound value. Compound
- dictionary values are derived using @EIEIO{} from a base class for
- handling arbitrary data in a macro.
- @deffn Type srecode-dictionary-compound-value
- @anchor{srecode-dictionary-compound-value}
- A compound dictionary value.
- Values stored in a dictionary must be a @var{string},
- a dictionary for showing sections, or an instance of a subclass
- of this class.
- Compound dictionary values derive from this class, and must
- provide a sequence of method implementations to convert into
- a string.
- @end deffn
- Your new subclass of the compound value needs to implement these
- methods:
- @defun srecode-compound-toString cp function dictionary
- @anchor{srecode-compound-toString}
- Convert the compound dictionary value @var{cp} to a string.
- If @var{function} is non-@code{nil}, then @var{function} is somehow applied to an aspect
- of the compound value. The @var{function} could be a fraction
- of some function symbol with a logical prefix excluded.
- @end defun
- The next method is for dumping out tables during debugging.
- @defun srecode-dump cp &optional indent
- @anchor{srecode-dump}
- Display information about this compound value.
- @end defun
- Here is an example of wrapping a semantic tag in a compound value:
- @example
- (defclass srecode-semantic-tag (srecode-dictionary-compound-value)
- ((prime :initarg :prime
- :type semantic-tag
- :documentation
- "This is the primary insertion tag.")
- )
- "Wrap up a collection of semantic tag information.
- This class will be used to derive dictionary values.")
- (defmethod srecode-compound-toString((cp srecode-semantic-tag)
- function
- dictionary)
- "Convert the compound dictionary value CP to a string.
- If FUNCTION is non-nil, then FUNCTION is somehow applied to an
- aspect of the compound value."
- (if (not function)
- ;; Just format it in some handy dandy way.
- (semantic-format-tag-prototype (oref cp :prime))
- ;; Otherwise, apply the function to the tag itself.
- (funcall function (oref cp :prime))
- ))
- @end example
- @node Argument Resolution
- @section Argument Resolution
- Some dictionary entries can be set via template arguments in the
- template declaration. For examples of template arguments, see
- @ref{Template Argument Dictionary Entries}.
- You can resolve an argument list into a dictionary with:
- @defun srecode-resolve-arguments temp dict
- @anchor{srecode-resolve-arguments}
- Resolve all the arguments needed by the template @var{temp}.
- Apply anything learned to the dictionary @var{dict}.
- @end defun
- @node Creating new Arguments
- @section Creating new Arguments
- You can create new arguments for use in template files by writing new
- Emacs Lisp functions. Doing so is easy. Here is an example for the
- @code{:user} argument:
- @example
- (defun srecode-semantic-handle-:user (dict)
- "Add macros into the dictionary DICT based on the current :user."
- (srecode-dictionary-set-value dict "AUTHOR" (user-full-name))
- (srecode-dictionary-set-value dict "LOGIN" (user-login-name))
- ;; ...
- )
- @end example
- In this case, a function with the name prefix
- @code{srecode-semantic-handle-} that ends in @code{:user} creates a
- new argument @code{:user} that can be used in a template.
- Your argument handler must take one argument @var{dict}, which is the
- dictionary to fill in. Inside your function, you can do whatever you
- want, but adding dictionary values is the right thing.
- @node Querying a Dictionary
- @section Querying a Dictionary
- When creating a new argument, it may be useful to ask the dictionary
- what entries are already set there, and conditionally create new
- entries based on those.
- In this way, a template author can get additional logic through more
- advanced arguments.
- @defun srecode-dictionary-lookup-name dict name
- @anchor{srecode-dictionary-lookup-name}
- Return information about the current @var{DICT}'s value for @var{NAME}.
- @var{DICT} is a dictionary, and @var{NAME} is a string that is the name of
- a symbol in the dictionary.
- This function derives values for some special NAMEs, such as @var{FIRST}
- and '@var{LAST}'.
- @end defun
- @node Template Argument Dictionary Entries
- @section Template Argument Dictionary Entries
- When a dictionary is initialized for a template, then the dictionary
- will be initialized with a predefined set of macro values.
- A template of the form:
- @example
- template template-name :arg1 :arg2
- ----
- Your template goes here
- ----
- @end example
- specifies two arguments :arg1, and :arg2.
- The following built-in simple arguments are available:
- @menu
- * Base Arguments::
- * Semantic Arguments::
- * Language Arguments::
- @end menu
- @node Base Arguments
- @subsection Base Arguments
- @subsubsection Argument :indent
- Supplies the @code{INDENT} macro. When @code{INDENT} is non-@code{nil}, then
- each line is individually indented with
- @code{indent-according-to-mode} during macro processing.
- @subsubsection Argument :blank
- Specifying this argument adds a special @code{:blank} handler at the
- beginning and end of the template. This handler will insert @code{\n}
- if the insertion point is not on a line by itself.
- @subsubsection Argument :region
- If there is an active region via @code{transient-mark-mode}, or
- @code{mouse-drag-region}, then the @code{REGION} section will be
- enabled.
- In addition, @code{REGIONTEXT} will be set to the text in the region,
- and that region of text will be ``killed'' from the current buffer.
- If standard-output is NOT the current buffer, then the region will not
- be deleted. In this way, you can safely use @code{:region} using
- templates in arbitrary output streams.
- @subsubsection Argument :user
- Sets up variables about the current user.
- @table @code
- @item AUTHOR
- Value of the Emacs function @code{user-full-name}
- @item EMAIL
- Current Emacs user's email address.
- @item LOGIN
- Current Emacs user's login name.
- @item UID
- Current Emacs user's login ID.
- @item EMACSINITFILE
- This Emacs sessions' init file.
- @end table
- @subsubsection Argument :time
- Sets up variables with the current date and time.
- @table @code
- @item YEAR
- The current year.
- @item MONTH
- The current month as a number.
- @item MONTHNAME
- The current month name, unabbreviated.
- @item DAY
- The current day as a number.
- @item WEEKDAY
- The current day of the week as an abbreviated name
- @item HOUR
- The current hour in 24 hour format.
- @item HOUR12
- The current hour in 12 hour format.
- @item AMPM
- Locale equivalent of AM or PM@. Useful with HOUR12.
- @item MINUTE
- The current minute.
- @item SECOND
- The current second.
- @item TIMEZONE
- The timezone string.
- @item DATE
- The Locale supported date (%D).
- @item TIME
- The Locale supported time format (%X).
- @end table
- @subsubsection Argument :file
- Sets up variables with details about the current file.
- @table @code
- @item FILENAME
- The filename without the directory part of the current buffer.
- @item FILE
- The filename without the directory or extension
- @item EXTENSION
- The filename extension.
- @item DIRECTORY
- The directory in which the current buffer resides.
- @item MODE
- Major mode of this buffer.
- @item SHORTMODE
- Major mode of this buffer without ``-mode''.
- Useful for inserting the Emacs mode specifier.
- @item section RCS
- Show the section RCS if there is a CVS or RCS directory here.
- @end table
- @subsubsection Argument :system
- Sets up variables with computer system information.
- @table @code
- @item SYSTEMCONF
- The ``system-configuration''.
- @item SYSTEMTYPE
- The ``system-type''.
- @item SYSTEMNAME
- The ``system-name''.
- @item MAILHOST
- The name of the machine Emacs derived mail ``comes from''.
- @end table
- @subsubsection Argument :kill
- @table @code
- @item KILL
- The top-most item from the kill ring.
- @item KILL2
- The second item in the kill ring.
- @item KILL3
- The third item in the kill ring.
- @item KILL4
- The fourth item in the kill ring.
- @end table
- @node Semantic Arguments
- @subsection Semantic Arguments
- @subsubsection Argument :tag
- The :tag argument is filled in with information from Semantic.
- The tag in question is queried from the senator tag ring, or passed
- in from @srecode{} utilities that use tags in templates.
- @table @code
- @item TAG
- This is a compound value for the tag in the current senator kill ring,
- or something handled via the variable
- @code{srecode-semantic-selected-tag}.
- @defvar srecode-semantic-selected-tag
- @anchor{srecode-semantic-selected-tag}
- The tag selected by a @code{:tag} template argument.
- If this is @code{nil}, then @code{senator-tag-ring} is used.
- @end defvar
- Use the function part of a macro insert to extract obscure parts
- of the tag.
- @item NAME
- The name of the tag as a string.
- @item TYPE
- The data type of the tag as a string.
- @end table
- If @var{tag} is a function, you will get these additional dictionary
- entries.
- @table @code
- @item ARGS
- A Loop macro value. Each argument is inserted in ARGS@. To create a
- comma separated list of arguments, you might do this:
- @example
- @{@{#ARGS@}@}@{@{TYPE@}@} @{@{NAME@}@}@{@{#NOTLAST@}@},@{@{/NOTLAST@}@}@{@{/ARGS@}@}
- @end example
- Within the section dictionaries for each argument, you will find both
- @var{NAME} and @var{TYPE}, in addition to the automatic section values
- for @var{FIRST}, @var{LAST}, @var{NOTFIRST}, and @var{NOTLAST}.
- @item PARENT
- The string name of the parent of this function, if the function is a
- method of some class.
- @item THROWS
- In each @var{THROWS} entry, the @var{NAME} of the signal thrown is specified.
- @end table
- If @var{tag} is a variable, you will get these dictionary entries.
- @table @code
- @item DEFAULTVALUE
- Enabled if there is a @var{VALUE}.
- @item VALUE
- An entry in the @var{HAVEDEFAULT} subdictionary that represents the
- textual representation of the default value of this variable.
- @end table
- If @var{tag} is a datatype, you will get these dictionary entries.
- @table @code
- @item PARENTS
- Section dictionaries for the parents of this class. Each parent will
- have a @var{NAME}.
- @item INTERFACES
- Section dictionaries for all the implemented interfaces of this
- class. Each interface will have a @var{NAME}.
- @end table
- Note that data type templates should always have a @code{@{@{^@}@}}
- macro in it where the core contents of that type will go. This is why
- data types don't have subdictionaries full of the slots in the classes
- or structs.
- @node Language Arguments
- @subsection language Arguments
- Each language typically has its own argument. These arguments can be
- used to fill in language specific values that will be useful.
- @subsubsection Argument :srt
- Used for SRecoder template files.
- @table @code
- @item ESCAPE_START
- The characters used for an escape start
- @item ESCAPE_END
- The characters used for an escape end
- @end table
- @subsubsection Argument :cpp
- @table @code
- @item HEADER
- Shows this section if the current file is a header file.
- @item NOTHEADER
- The opposite of @code{HEADER}.
- @item FILENAME_SYMBOL
- The current filename reformatted as a C friendly symbol.
- @end table
- @subsection Argument :java
- @table @code
- @item FILENAME_AS_PACKAGE
- Converts the filename into text that would be suitable as a package
- name.
- @item FILENAME_AS_CLASS
- Converts the filename into text that would be suitable as a class-name
- for the main class in the file.
- @item CURRENT_PACKAGE
- Finds the occurrence of ``package'' and gets its value.
- @end table
- @subsubsection Argument :el
- Sets @code{PRENAME}. This would be a common prefix from all the
- tags in the current buffer.
- Most Emacs Lisp packages have some common prefix used in a way similar
- to namespaces in other languages.
- @subsubsection Argument :el-custom
- @table @code
- @item GROUP
- The name of the Emacs Custom group that instances of @code{defcustom}
- ought to use.
- @item FACEGROUP
- The name of the Emacs Custom group that faces declared with
- @code{defface} ought to use.
- @end table
- @subsubsection Argument :texi
- @table @code
- @item LEVEL
- The current section level, such as @code{chapter} or @code{section}.
- @item NEXTLEVEL
- The next level down, so if @code{LEVEL} is @code{chapter}, then
- @code{NEXTLEVEL} would be @code{section}.
- @end table
- @subsubsection Argument :texitag
- The @code{:texitag} argument is like the @code{:tag} argument, except that
- additional variable @code{TAGDOC} is provided for each tag.
- The @code{TAGDOC} is filled with derived documentation from the tag in
- question, and that documentation is also reformatted to be mostly
- texinfo compatible.
- @subsection Argument :android
- The @code{:android} argument pulls in information from your current
- project.
- @@TODO - add more here.
- @node Developing Template Functions
- @chapter Developing Template Functions
- You can develop your own custom template insertion functions.
- Doing so is relatively simple, and requires that you write an Emacs
- Lisp command.
- If the built in commands don't provide enough options, you will need
- to write your own function in order to provide your dictionaries with
- the values needed for custom templates.
- In this way, you can build your own code generator for any language
- based on a set of predefined macros whos values you need to derive
- from Emacs Lisp code yourself.
- For example:
- @example
- (defun my-srecode-insert (template-name)
- "Insert the template TEMPLATE-NAME into the current buffer at point."
- ;; Read in a template name.
- (interactive (list (srecode-read-template-name "Template Name: ")))
- (if (not (srecode-table))
- (error "No template table found for mode %s" major-mode))
- (let ((temp (srecode-template-get-table (srecode-table) template-name))
- ;; Create a new dictionary
- (newdict (srecode-create-dictionary)))
- (if (not temp)
- (error "No Template named %s" template-name))
- ;; Add some values into the dictionary!
- (srecode-dictionary-set-value newdict "FOO" (my-get-value-of-foo))
- ;; Optionally show a section
- (srecode-dictionary-show-section newdict "BLARG")
- ;; Add in several items over a loop
- (let ((my-stuff (get-my-stuff-list)))
- (while my-stuff
- (let ((subdict (srecode-dictionary-add-section-dictionary
- newdict "LOOP")))
- (srecode-dictionary-set-value subdict "NAME" (nth 0 my-stuff))
- (srecode-dictionary-set-value subdict "ARG" (nth 1 my-stuff))
- (srecode-dictionary-set-value subdict "MOOSE" (nth 2 my-stuff))
- )
- (setq my-stuff (cdr my-stuff)))
- ;; Some templates have arguments that need to be resolved.
- (srecode-resolve-arguments temp newdict)
- ;; Do the expansion
- (srecode-insert-fcn temp newdict)
- ))
- @end example
- Lets look at the key functions involved above:
- @section Interactive Completion:
- @defun srecode-read-template-name prompt
- @anchor{srecode-read-template-name}
- Completing read for Semantic Recoder template names.
- @var{prompt} is used to query for the name of the template desired.
- @end defun
- @section Template Lookup
- Even if your program does not query the user for a template name, you
- will need to locate a template. First, you need to locate the table
- to look the template up in.
- @defun srecode-table &optional mode
- @anchor{srecode-table}
- Return the currently active Semantic Recoder table for this buffer.
- Optional argument @var{MODE} specifies the mode table to use.
- @end defun
- @defun srecode-template-get-table tab template-name &optional context application
- @anchor{srecode-template-get-table}
- Find in the template in mode table @var{TAB}, the template with @var{TEMPLATE-NAME}.
- Optional argument @var{CONTEXT} specifies a context a particular template
- would belong to.
- Optional argument @var{APPLICATION} restricts searches to only template tables
- belonging to a specific application. If @var{APPLICATION} is @code{nil}, then only
- tables that do not belong to an application will be searched.
- @end defun
- For purposes of an @srecode{} application, it is important to decide
- what to call your application, and use that with this method call.
- @section Creating dictionaries
- Several dictionary calls are made in this example, including:
- @table @code
- @item srecode-create-dictionary
- @item srecode-dictionary-set-value
- @item srecode-dictionary-show-section
- @item srecode-dictionary-add-section-dictionary
- @end table
- These are documented more fully @ref{Dictionaries}.
- Also used is @code{srecode-resolve-arguments}. To learn more about
- that, see @ref{Argument Resolution}.
- @section Template Insertion Commands
- There are several ways to insert a template. It is easiest to just
- start with the main entry point.
- @defun srecode-insert-fcn template dictionary &optional stream
- @anchor{srecode-insert-fcn}
- Insert @var{template} using @var{dictionary} into @var{stream}.
- If @var{stream} is @code{nil}, then use the current buffer.
- @end defun
- @node Template Naming Conventions
- @chapter Template Naming Conventions
- For @srecode{} to work across languages reliably, templates need to
- follow a predictable pattern. For every language of similar nature
- (OO, functional, doc based) if they all provide the same base
- templates, then an application can be written against the base
- templates, and it will work in each of the supported language.
- Having consistent templates also makes it easy to use those templates
- from a user perspective during basic interactive insertion via
- @code{srecode-minor-mode}.
- NOTES ON THIS CHAPTER:
- These conventions are being worked on. Check w/ CEDET-DEVEL mailing
- list if you want to support a language, or write an application and
- provide your opinions on this topic. Any help is appreciated.
- @section Context: File
- Each language should support the @code{file:empty} template. This
- will generally use the default copyright insertion mechanism.
- @section Context: Declaration
- Functional languages should attempt to support the following:
- @table @code
- @item function
- A standalone function. Not a method, external method, or other.
- @item method
- A method belonging to some class declared outside the textual bounds
- of that class' declaration.
- @item variable
- A global variable.
- @item type
- A data type. If the language supports several types of datatypes
- then do not use this, use more specific ones instead.
- @item class
- For OO languages, use this instead of @code{type}.
- @item include
- Include files.
- @end table
- For any @semantic{} tag class in your language, you will likely want
- to have a corresponding template.
- In order for the @srecode{} function
- @code{srecode-semantic-insert-tag} to work, you can create templates
- similar to those mentioned above, except with @code{-tag} appended to
- the end. This lets a template like @code{function} have user
- conveniences when referencing @code{function-tag}, while also
- allowing the tag inserter to do its job with a simpler template.
- @section Context: Classdef
- Inside a class definition. These are to be inserted inside the
- textual bounds of a class declaration.
- @table @code
- @item function
- This would be a method of the class being inserted into.
- @item constructor
- @itemx destructor
- Like @code{function} but specific to alloc/delete of an object.
- @item variable
- This would be a field of the class being inserted into.
- @end table
- @section Context: Code
- Inside a body of code, such as a function or method body.
- ---no conventions yet.
- @section Standard Dictionary Values
- For these variables to be useful, standard names should be used.
- These values could be provided directly from a Semantic tag, or by an
- application.
- @table @var
- @item NAME
- The name of the declaration being created.
- @item PARENT
- If the item belongs to some parent type, it would be the full name of
- that type, including namespaces.
- @item TYPE
- A datatype name for a variable, or the return value of a function.
- @item DOC
- If there is some documentation associated with the item, then DOC
- should contain the value. (Optional)
- @item ARGS
- The ARGS variable defines a section for 0 or more arguments to a function
- or method. Each entry in ARGS will follow the rest of these naming
- conventions, such as for NAME and TYPE.
- @end table
- For templates used by @code{srecode-semantic-insert-tag}, there is
- also the following useful dictionary values.
- @table @var
- @item TAG
- A special insertion value TAG@. You can use semantic functions to turn
- the tag into a string.
- @item HAVEDEFAULT
- @itemx DEFAULT
- Default value for a variable.
- @end table
- @node Inserting Tag Lists
- @chapter Inserting Tag Lists
- Since @srecode{} is the @i{Semantic Recoder}, the ultimate goal for
- @srecode{} is to convert lists of tags, as produced by @semantic{}
- back into code.
- A single function provides the interface for programs to do this, but
- it requires any particular language to have provided the correct
- templates to make it work.
- @defun srecode-semantic-insert-tag tag &optional style-option point-insert-fcn &rest dict-entries
- @anchor{srecode-semantic-insert-tag}
- Insert @var{tag} into a buffer using srecode templates at point.
- Optional @var{style-option} is a list of minor configuration of styles,
- such as the symbol @code{'prototype} for prototype functions, or
- @code{'system} for system includes, and @code{'doxygen}, for a doxygen style
- comment.
- Optional third argument @var{point-insert-fcn} is a hook that is run after
- @var{tag} is inserted that allows an opportunity to fill in the body of
- some thing. This hook function is called with one argument, the @var{tag}
- being inserted.
- The rest of the arguments are @var{dict-entries}. @var{dict-entries}
- is of the form ( @var{name1} @var{value1} @var{name2} @var{value2} @dots{} NAMEn VALUEn).
- The exact template used is based on the current context.
- The template used is found within the toplevel context as calculated
- by @dfn{srecode-calculate-context}, such as @code{declaration}, @code{classdecl},
- or @code{code}.
- For various conditions, this function looks for a template with
- the name @var{class}-tag, where @var{class} is the tag class. If it cannot
- find that, it will look for that template in the
- @code{declaration}context (if the current context was not @code{declaration}).
- If @var{prototype} is specified, it will first look for templates with
- the name @var{class}-tag-prototype, or @var{class}-prototype as above.
- See @dfn{srecode-semantic-apply-tag-to-dict} for details on what is in
- the dictionary when the templates are called.
- This function returns to location in the buffer where the
- inserted tag @var{ends}, and will leave point inside the inserted
- text based on any occurrence of a point-inserter. Templates such
- as @dfn{function} will leave point where code might be inserted.
- @end defun
- @node Application Writing
- @chapter Application Writing
- The main goal of @srecode{} is to provide a strong platform for
- writing code generating applications.
- Any templates that are application specific should make an application
- declaration for each template file they use. This prevents those
- templates from being used outside of that application.
- For example, add this to a file:
- @example
- set application "getset"
- @end example
- In your application Emacs Lisp code, you would then load those
- templates. A typical initialization would look like this:
- @example
- (srecode-load-tables-for-mode major-mode)
- (srecode-load-tables-for-mode major-mode 'getset)
- @end example
- These two lines will load in the base templates for the major mode,
- and then the application specific templates.
- @defun srecode-load-tables-for-mode mmode &optional appname
- @anchor{srecode-load-tables-for-mode}
- Load all the template files for @var{mmode}.
- Templates are found in the SRecode Template Map.
- See @dfn{srecode-get-maps} for more.
- @var{appname} is the name of an application. In this case,
- all template files for that application will be loaded.
- @end defun
- todo: Add examples. Most core stuff is already described above.
- @node GNU Free Documentation License
- @appendix GNU Free Documentation License
- @include doclicense.texi
- @node Index
- @unnumbered Index
- @printindex cp
- @iftex
- @contents
- @summarycontents
- @end iftex
- @bye
|