// 
//     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.
//

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

==== How do I add syntax highlighting for my language?

Problem: I have a custom programming language that I want to make available in the NetBeans platform. How do I add syntax highlighting for my language?

Solution: Here is a tutorial on syntax highlighting for custom languages: link:http://wiki.netbeans.org/SyntaxColoringANTLR[http://wiki.netbeans.org/SyntaxColoringANTLR]

=== 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/DevFaqSyntaxHighlight[http://wiki.netbeans.org/DevFaqSyntaxHighlight] , 
that was last modified by NetBeans user Stefika 
on 2010-10-01T19:56:10Z.


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