//////////////////////////////////////////

  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.

//////////////////////////////////////////

= IDE integration

The Groovy language is supported by lots of IDEs and text editors.

[cols="1,1,1,1",options="header,footer"]
|===============================================================
|Editor|Syntax highlighting|Code completion|Refactoring
|https://github.com/groovy/groovy-eclipse[Groovy Eclipse Plugin]|Yes|Yes|Yes
|http://www.jetbrains.com/idea/features/groovy.html[IntelliJ IDEA]|Yes|Yes|Yes
|https://netbeans.org/features/groovy/[Netbeans]|Yes|Yes|Yes
|https://github.com/Groovy-Emacs-Modes/groovy-emacs-modes[Groovy Emacs Modes]|Yes|No|No
|https://github.com/textmate/groovy.tmbundle[TextMate]|Yes|No|No
|http://www.vim.org/[vim]|Yes|No|No
|http://www.ultraedit.com/[UltraEdit]|Yes|No|No
|https://www.slickedit.com/products/slickedit/419-the-most-powerful-groovy-editor-in-the-world/[SlickEdit]|Yes|No|No
|https://editrocket.com/features/groovy_editor.html[EditRocket]|Yes|No|No
|https://code.visualstudio.com/[VSCode]|Yes|No|No
|===============================================================
