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

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

==== How do I find out which keybindings are already in use?

For an existing release you can look at e.g. link:KeymapProfileFor60.asciidoc[KeymapProfileFor60] to see the specification.

If you are developing a module for NetBeans development builds,
you can just look at
link:http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastSuccessfulBuild/artifact/nbbuild/build/generated/layers.txt[this file]
in the section `Shortcuts/`.
This will show all global keybindings being used by modules in the standard IDE
as well as experimental update center
in `link:http://hg.netbeans.org/main/[http://hg.netbeans.org/main/]` and `link:http://hg.netbeans.org/main/contrib/[http://hg.netbeans.org/main/contrib/]`
as of a few hours ago.

Editor-specific keybindings are listed in `Editors/*/*/Keybindings/` folders,
which is unfortunately harder to browse through.

Be conservative about adding new keybindings;
they are a precious resource.
Be careful with bindings using `Alt`, as these often clash with mnemonics,
Linux window manager shortcuts, etc.
If at all possible, use a multistroke binding:
for example, `Shortcuts/D-J R C.shadow` binds the 3-stroke sequence `Ctrl-J R C`.

=== 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/DevFaqKeybindingsInUse[http://wiki.netbeans.org/DevFaqKeybindingsInUse] , 
that was last modified by NetBeans user Admin 
on 2009-11-06T15:50:58Z.


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