Logo

Contents:

  • 1. Introduction
    • 1.1. Getting Sublime Text
    • 1.2. Sublime Basics
      • 1.2.1. Starting Sublime Text
    • 1.3. Major Concepts
      • 1.3.1. Path Syntax
      • 1.3.2. Sublime Python
      • 1.3.3. Sublime API
      • 1.3.4. JSON
    • 1.4. Additional Information Resources
      • 1.4.1. Documentation
      • 1.4.2. In-Application References
      • 1.4.3. Training Videos
      • 1.4.4. Sublime Text Community
      • 1.4.5. 3rd-Party Contributions, Examples, Etc.
  • 2. Editing
    • 2.1. Layouts
      • 2.1.1. set_layout() Arguments
    • 2.2. Keyboard Editing
      • 2.2.1. Spell Checking
      • 2.2.2. Bracket-Type Key Behaviors
      • 2.2.3. Find and Replace
        • 2.2.3.1. Power Feature: Find All
        • 2.2.3.2. Regular Expressions
        • 2.2.3.3. Find in Files, a.k.a. Recursive File Searching
        • 2.2.3.4. Leaving the Find Panel Open
        • 2.2.3.5. After the Find Panel Has Closed
      • 2.2.4. Macros
      • 2.2.5. Further Reading
    • 2.3. Mouse Features
  • 3. Markers and Bookmarks
    • 3.1. Markers
    • 3.2. Bookmarks
    • 3.3. MarkerStack
      • 3.3.1. The Problem MarkerStack Solves
      • 3.3.2. Why MarkerStack is Better than Bookmarks for Interruptions
  • 4. Projects
    • 4.1. Creating a New Project
    • 4.2. Project File Format
      • 4.2.1. “folders” Key
      • 4.2.2. “settings” Key
      • 4.2.3. “build_systems” Key
  • 5. Commands
    • 5.1. Adding Existing Commands to Command Palette
      • 5.1.1. Variables Available in .sublime-commands Args
    • 5.2. Further Reading
  • 6. Command List
    • 6.1. Default
      • 6.1.1. ApplicationCommand
      • 6.1.2. TextCommand
      • 6.1.3. WindowCommand
    • 6.2. A File Icon
      • 6.2.1. ApplicationCommand
    • 6.3. Diff
      • 6.3.1. TextCommand
      • 6.3.2. WindowCommand
    • 6.4. HTML
      • 6.4.1. TextCommand
    • 6.5. Package Control
      • 6.5.1. ApplicationCommand
      • 6.5.2. TextCommand
      • 6.5.3. WindowCommand
    • 6.6. User
      • 6.6.1. ApplicationCommand
      • 6.6.2. TextCommand
      • 6.6.3. WindowCommand
  • 7. Scope, Selectors and Context
    • 7.1. Scope
    • 7.2. Scope Name
    • 7.3. Selector
    • 7.4. Basic Match
    • 7.5. Logical Operators in Selectors
    • 7.6. Context
    • 7.7. API
  • 8. Key Bindings
    • 8.1. Keymap Files
    • 8.2. How Key Bindings are Chosen
      • 8.2.1. Key Bindings Loading Order
    • 8.3. Key Binding Definitions
      • 8.3.1. <key_combination>
        • 8.3.1.1. <key_modifier>
        • 8.3.1.2. <key_name>
      • 8.3.2. <command_name>
      • 8.3.3. “args” Key
      • 8.3.4. Variables in Args
      • 8.3.5. Context
        • 8.3.5.1. <condition> Syntax
        • 8.3.5.2. Creating Custom Conditions
    • 8.4. Diagnosing Binding Problems
  • 9. Default Key Bindings
    • 9.1. Rationale Used in Binding Tables Below
    • 9.2. Named-Key Bindings
    • 9.3. Tab Key
    • 9.4. Default F-Key Bindings
    • 9.5. Default Letter-Key Bindings
    • 9.6. Default Number-Key Bindings
    • 9.7. Default Symbol-Key Bindings
    • 9.8. Ctrl+J Primary
    • 9.9. Ctrl+K Primary
  • 10. Menus
    • 10.1. Customizing Menus
    • 10.2. Menu-Item Structure
    • 10.3. Adding to Existing Sub-Menus
    • 10.4. Dynamically Changing Menu Items
    • 10.5. Side Bar “Magic”
    • 10.6. Other Context Menu “Magic”
    • 10.7. Lastly
    • 10.8. Further Reading
  • 11. Completions
    • 11.1. Using Completions
    • 11.2. Creating Your Own Completions
    • 11.3. Completions File Format
      • 11.3.1. Trigger
      • 11.3.2. Contents
      • 11.3.3. Kind
      • 11.3.4. Annotation
      • 11.3.5. Details
      • 11.3.6. Example
    • 11.4. Implementing Completions in a Plugin
    • 11.5. Further Reading
  • 12. Snippets
    • 12.1. Snippets vs Completions
    • 12.2. Snippet Files
    • 12.3. Smart-Template Syntax
      • 12.3.1. Literal “$”
      • 12.3.2. Fields
        • 12.3.2.1. Default Text
      • 12.3.3. Predefined Variables
      • 12.3.4. Combining Form Fields with Variables
      • 12.3.5. The insert_snippet Command
        • 12.3.5.1. insert_snippet Arguments
      • 12.3.6. Custom Variables
      • 12.3.7. Substitutions
    • 12.4. Creating Snippets
    • 12.5. Finding Snippets
    • 12.6. Further Reading
  • 13. Build Systems
    • 13.1. Selecting a Build System
    • 13.2. Launching a Build
    • 13.3. Navigating Among Results
    • 13.4. Creating Your Own Build System
      • 13.4.1. Variables
    • 13.5. Further Reading
  • 14. Plugins
    • 14.1. Creating New Commands
    • 14.2. Other Command Methods
      • 14.2.1. Inherited Methods
    • 14.3. Text Commands
      • 14.3.1. Some Data Types You Need to Know About
      • 14.3.2. What Happens Inside the run() Method
        • 14.3.2.1. Editing the Buffer
        • 14.3.2.2. Change Position of Caret
        • 14.3.2.3. Rows and Columns
        • 14.3.2.4. Finding New Region(s)
        • 14.3.2.5. Running Other Commands
      • 14.3.3. Further Reading
    • 14.4. Adding Python Packages
      • 14.4.1. Further Reading
    • 14.5. Example Basic Plugin with Functionality for Package Settings
  • 15. Packages
    • 15.1. Locations
    • 15.2. Overriding
      • 15.2.1. Overriding Whole Files from a Zipped Package
    • 15.3. Creating New Packages
    • 15.4. Sublime Text Packages vs Python Packages
    • 15.5. Handling Package Plugin Complexity
    • 15.6. Troubleshooting Packages
      • 15.6.1. Safe Mode
      • 15.6.2. Diagnosing Trouble from the Data Directory
        • 15.6.2.1. Diagnosis by Isolating Packages
        • 15.6.2.2. Diagnosis by Isolating Customizations
  • 16. Input Handlers
    • 16.1. Flow of Execution
      • 16.1.1. TextInputHandler
      • 16.1.2. ListInputHandlers
      • 16.1.3. Example
  • 17. Event Listeners
    • 17.1. Creating an Event Listener
    • 17.2. Example
    • 17.3. Notes on on_query_context()
  • 18. Event list
    • 18.1. EventListener
      • EventListener.on_init()
      • EventListener.on_exit()
      • EventListener.on_new()
      • EventListener.on_new_async()
      • EventListener.on_associate_buffer()
      • EventListener.on_associate_buffer_async()
      • EventListener.on_clone()
      • EventListener.on_clone_async()
      • EventListener.on_load()
      • EventListener.on_load_async()
      • EventListener.on_reload()
      • EventListener.on_reload_async()
      • EventListener.on_revert()
      • EventListener.on_revert_async()
      • EventListener.on_pre_move()
      • EventListener.on_post_move()
      • EventListener.on_post_move_async()
      • EventListener.on_pre_close()
      • EventListener.on_close()
      • EventListener.on_pre_save()
      • EventListener.on_pre_save_async()
      • EventListener.on_post_save()
      • EventListener.on_post_save_async()
      • EventListener.on_modified()
      • EventListener.on_modified_async()
      • EventListener.on_selection_modified()
      • EventListener.on_selection_modified_async()
      • EventListener.on_activated()
      • EventListener.on_activated_async()
      • EventListener.on_deactivated()
      • EventListener.on_deactivated_async()
      • EventListener.on_hover()
      • EventListener.on_query_context()
      • EventListener.on_query_completions()
      • EventListener.on_text_command()
      • EventListener.on_window_command()
      • EventListener.on_post_text_command()
      • EventListener.on_post_window_command()
      • EventListener.on_new_window()
      • EventListener.on_new_window_async()
      • EventListener.on_pre_close_window()
      • EventListener.on_new_project()
      • EventListener.on_new_project_async()
      • EventListener.on_load_project()
      • EventListener.on_load_project_async()
      • EventListener.on_pre_save_project()
      • EventListener.on_post_save_project()
      • EventListener.on_post_save_project_async()
      • EventListener.on_pre_close_project()
    • 18.2. ViewEventListener
      • ViewEventListener.on_load()
      • ViewEventListener.on_load_async()
      • ViewEventListener.on_reload()
      • ViewEventListener.on_reload_async()
      • ViewEventListener.on_revert()
      • ViewEventListener.on_revert_async()
      • ViewEventListener.on_pre_move()
      • ViewEventListener.on_post_move()
      • ViewEventListener.on_post_move_async()
      • ViewEventListener.on_pre_close()
      • ViewEventListener.on_close()
      • ViewEventListener.on_pre_save()
      • ViewEventListener.on_pre_save_async()
      • ViewEventListener.on_post_save()
      • ViewEventListener.on_post_save_async()
      • ViewEventListener.on_modified()
      • ViewEventListener.on_modified_async()
      • ViewEventListener.on_selection_modified()
      • ViewEventListener.on_selection_modified_async()
      • ViewEventListener.on_activated()
      • ViewEventListener.on_activated_async()
      • ViewEventListener.on_deactivated()
      • ViewEventListener.on_deactivated_async()
      • ViewEventListener.on_hover()
      • ViewEventListener.on_query_context()
      • ViewEventListener.on_query_completions()
      • ViewEventListener.on_text_command()
      • ViewEventListener.on_post_text_command()
    • 18.3. TextChangeListener
      • TextEventListener.on_text_changed()
      • TextEventListener.on_text_changed_async()
      • TextEventListener.on_revert()
      • TextEventListener.on_revert_async()
      • TextEventListener.on_reload()
      • TextEventListener.on_reload_async()
  • 19. Dialog Boxes and User Messaging
  • 20. Clipboard Utilities Available to Plugins
  • 21. View Settings List Example
  • 22. Paths
  • 23. Glossary
  • 24. Notes
    • 24.1. Features I Would Like
Sublime Text QuickRef
  • 10. Menus
  • View page source
Previous Next

10. Menus

Sublime Text has a number of different menus. All of them can be customized.

The Main Menu is the row of click-able words just under each Window’s Title Bar. The Main Menu’s default definition can be found in the Default Package’s Main.sublime-menu file.

Context Menus are a pop-up menus that open as a result of right-clicking any of several objects in the Sublime Text GUI. (Some keyboards also have the ability to open Context Menus.)

The objects in Sublime Text that can host a Context Menu are (Context Menu names are in parentheses):

  • Sheets

    • Views (Context)

    • Images (Image Context)

    • Tabs (Tab Context)

  • Side Bar

    • OPEN FILES list (Tab Sidebar Context)

    • FOLDERS

      • Mount Points (Side Bar Mount Point)

      • Folders and Files, possible multiple items selected (Side Bar)

  • Status Bar

    • Encoding Status (Encoding)

    • Line Ending Status (Line Endings)

    • Indentation Status (Indentation)

    • Current Syntax Status (Syntax)

  • Overlay Panels

    • Console (Console Input Widget)

    • Find-in-Files Panel (Find in Files)

    • Other input panels (Widget Context)

Each Menu’s content can be found (and customized) in Package Resource files named:

<menu_name>.sublime-menu

The default version of these are in the Default Package, and customizations of these can be found in various other Packages.

To view them: Tools > Command Palette > View Package File: and type in “sublime-menu”. This will display a list of all menu resource files known to Sublime Text.

All of these menus are customizable, but how to do so is neither intuitive, nor is it per the current documentation (or at minimum the current documentation on it is unclear). Here’s how to do it.

10.1. Customizing Menus

If you haven’t already done so, go ahead and open Sublime Text’s default main menu:

Tools > Command Palette > View Package File > type “sublime-menu Main”

to select it, and hit [Enter] to open it.

Notice that it is read only. Also notice that it “appears” to be in the folder

<data_path>/Packages/Default/

but if you look on your file system, you will find that there is no such directory! That’s because Sublime Text uses that file from

<executable_path>/Packages/Default.sublime-package

which contains that file internally and shows it to you as if it was in the <data_path>/Packages/Default/ directory. You can both copy text from it into the clipboard as well as perform a File > Save As... on it if you want it somewhere on your file system, perhaps so you can do searches on it (and other menus) using Find-in-Files.

To customize any of these menus, like many other customization actions for Sublime Text, you must create a valid JSON file in your <data_path>/Packages/User/ directory using the EXACT same file name. Example: Main.sublime-menu. If you use any other file name, Sublime Text ignores it, since the file name is how Sublime Text tells what menu you are adding to or modifying.

Once your file is there, you simply add the parts of the menu that you want to add or change. The top-level is always a JSON array object, and its elements are Menu Item JSON objects with the structure shown below.

For context menus (menus that pop-up when you right-click something), whatever menu-item objects you create in your JSON file simply gets added to the bottom of the context menu. For the main menu, however, the structure is a little different:

  • you only need to include menu items that you want to add, but

  • you have to match both the STRUCTURE and the SEQUENCE in the default Main.sublime-menu file, or else Sublime Text will silently not show them.

10.2. Menu-Item Structure

Menus in Sublime Text are defined by files ending in .sublime-menu. As noted above, the filename must exactly match the default filename of the menu you are modifying, and be stored in your <data_path>/Packages/User/ directory. Menus use Sublime-relaxed-JSON format, with the top-level structure being an array. Each contained object in the array is a “Menu Item”: a JSON object containing information to define the text and behaviors of the displayed menu entry.

Example:

[
    {
        "caption": "File",
        "mnemonic": "F",
        "id": "file",
        "children":
        [
            { "command": "new_file", "caption": "New File", "mnemonic": "N" },

            { "command": "prompt_open_file", "caption": "Open File…", "mnemonic": "O", "platform": "!OSX" },
            { "command": "prompt_open_folder", "caption": "Open Folder…", "platform": "!OSX" },
            { "command": "prompt_open", "caption": "Open…", "platform": "OSX" }
        ]
    }
]

As you can see, Menu Items can be nested in a tree structure. To carry out an action, “leaf” Menu Items contain “command” elements that lead to commands that Sublime Text knows about. (You can create new commands using Plugins.) If Sublime Text doesn’t know about them, they will be disabled (grayed out).

Supported keys:

“caption”:

The text of the menu entry.

“mnemonic”:

The character to use as the key to press to activate the entry. This only applies to Windows and Linux. Must match the case of the character in the “caption”.

“command”:

A string of the command to execute when the entry is activated.

“args”:

A JSON object of args to send to the command.

“children”:

A JSON array of Menu-Item objects, which, when not empty, creates a submenu.

“id”:

A unique string for the menu entry. This is used for menu entries with “children” to allow others to add additional child entries.

“platform”:

One of the strings: “OSX”, “!OSX”, “Windows”, “!Windows”, “Linux” or “!Linux”. Controls what platforms the entry is shown on.

Each menu entry requires at minimum, the key “caption” for a non-functionality entry. “command” is required for an entry that performs an action.

Menu Items that have a caption value of “-” will be shown as a divider in the menu.

10.3. Adding to Existing Sub-Menus

To add to an existing sub-menu, you have to “build out” the existing structure using “empty” menu items. To build an “empty” menu item, simply create its structure with the existing “id” key with matching value, and include a “children” element with an array.

Important:

The structure you build has to match both the SEQUENCE and the STRUCTURE of the Main Menu. If you don’t, Sublime Text will silently not show it, and won’t say why.

There is one exception to this: if you create a top-level Menu Item, it will be shown on the right side of the normal (default) top-level Menu Items, no matter where you put it in the structure (so long as it is a top-level Menu Item). It’s probably best to put it last (to match the shown structure) in case the Sublime Text developers decide to change or restrict that behavior.

Example to add to the Preferences > Package Settings sub-menu:

{
    "id": "preferences",
    "children":
    [
        {
            "id": "package-settings",
            "children":
            [
                {
                    "caption": "Your Package Name",
                    "children":
                    [
                        {
                            "caption": "Documentation",
                            "command": "open_url",
                            "args": {
                                "url": "https://your-site.com/YourPackage/"
                            }
                        },

                        { "caption": "-" },

                        {
                            "caption": "Settings",
                            "command": "edit_settings",
                            "args": {
                                "base_file": "${packages}/YourPackage/YourPackage.sublime-settings",
                                "default": "{\n\t$0\n}\n"
                            }
                        },

                        { "caption": "-" },

                        {
                            "caption": "Key Bindings",
                            "command": "edit_settings",
                            "args": {
                                "base_file": "${packages}/YourPackage/Default ($platform).sublime-keymap",
                                "default": "[\n\t$0\n]\n"
                            }
                        },
                    ]
                }
            ]
        }
    ]
},

10.4. Dynamically Changing Menu Items

Dynamic Menu-Item state can be implemented by overriding certain inherited methods in the Command class (in whatever Plugin implements it). Command arguments beyond self are passed as keyword arguments.

Action

Method to Override

Inherited Value

disabling Menu Item

is_enabled(self) returning False

True

hiding Menu Item

is_visible(self) returning False

True

adding a check mark

is_checked(self) returning True

False

changing its caption

description(self) returning caption string

empty string

Menu Items are also disabled when the Command is associated with a Key Binding, and the Key Binding’s Selector evaluates to False.

Note

In order for the description(self) method to have an effect, the Menu Item object in the .sublime-menu file must either:

  • have a “caption” entry that provides an empty string, or

  • have no “caption” entry.

10.5. Side Bar “Magic”

If you add your own Menu Items to the Side Bar context menu, you will want to know that you can use certain arguments with your commands:

“files”: []:

If your command has a files argument, it will receive an array containing the full path of each file that was selected when the right-click was performed.

“dirs”: []:

If your command has a dirs argument, it will receive an array containing the full path of each directory that was selected when the right-click was performed.

“paths”: []:

If your command has a paths argument, it will receive an array containing the full path of each file and directory that was selected when the right-click was performed.

10.6. Other Context Menu “Magic”

For all other context menus, calling the command copy_path will receive the full path of the file in the current View (or None if its Buffer is not stored on disk).

Example:

[
    {
        "caption": "Your Copy Path",
        "command": "copy_path"
    }
]

10.7. Lastly

In case you were not already aware, it is customary (though not required) to add an ellipsis (“...”) to captions whose commands launch a dialog box or open a panel to get information before the command is carried out. That helps the user know that when he clicks Menu Items that do not have this, to expect that the command will be carried out immediately, whereas with Menu Items with the “...”, he can expect some type of intermediate dialog box or panel to show up first before any action is taken.

10.8. Further Reading

See https://www.sublimetext.com/docs/menus.html and https://docs.sublimetext.io/reference/menus.html for more details.

Previous Next

© Copyright 2025-2026 WGA Crystal Research, Inc. All rights reserved. Last updated on 21-Feb-2026.

Built with Sphinx using a theme provided by Read the Docs.