// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqEditorHowToAddCodeTemplates
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqEditorHowToAddCodeTemplates
:description: Apache NetBeans wiki DevFaqEditorHowToAddCodeTemplates
:toc: left
:toc-title:
:syntax: true

=== How to add code templates?

1. Create your template file

[source,xml]
----

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE codetemplates PUBLIC "-//NetBeans//DTD Editor Code Templates settings 1.0//EN" "http://www.netbeans.org/dtds/EditorCodeTemplates-1_0.dtd">
<codetemplates>
    <codetemplate abbreviation="hello" xml:space="preserve">
        `<![CDATA[Hello ${world}]]>`
        <description><![CDATA[Bla bla bla]]></description>
    </codetemplate>
</codetemplates>
----

2. Register it for the mimetype in the layer.xml

[source,xml]
----

    <folder name="Editors">
        <folder name="text">
            <folder name="x-java">
                <folder name="CodeTemplates">
                    <file name="my-templates.xml" url="my-templates.xml"/>
                </folder>
            </folder>
        </folder>
    </folder>
----

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqEditorHowToAddCodeTemplates[http://wiki.netbeans.org/DevFaqEditorHowToAddCodeTemplates] , 
that was last modified by NetBeans user Markiewb 
on 2016-05-26T21:47:37Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
