A few days ago, the author of SideBarEnhancements slimmed down his package removing a lot of functionnality. One I used many times per day was the ability to copy a file path from the project root to then use in various commands such as mix test <filepath>, etc.

I wanted to create a standalone plugin that provided similar functionnality. Hopefully, this is quite simple to do:

We’ll need to:

  • write a Python script that Sublime Text can execute as a plugin
  • create a command palette entry for it

Creating the Python Plugin

Open Sublime Text and go to Tools > Developer > New Plugin.... This will open a new tab with a template for a new plugin. Then we’ll add the following:

import sublime
import sublime_plugin
import os

class CopyPathFromProjectRootCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        # Get the current file path
        file_path = self.view.file_name()
        if not file_path:
            sublime.status_message("No file to copy path from.")
            return
        
        # Find the project root
        window = self.view.window()
        folders = window.folders()
        project_root = None
        for folder in folders:
            if file_path.startswith(folder):
                project_root = folder
                break
        
        if not project_root:
            sublime.status_message("File is not in any of the loaded projects.")
            return
        
        # Get the relative path from project root and copy it to clipboard
        relative_path = os.path.relpath(file_path, project_root)
        sublime.set_clipboard(relative_path)
        sublime.status_message("Path copied to clipboard: " + relative_path)

Save the file (if you created the file using the above menu, it should already be in the right folder, User).

Creating an entry in the command palette

Create a new file named CopyPathFromProjectRoot.sublime-commands in the same folder, and add the following JSON code to this file:

[
    {
        "caption": "Copy Path From Project Root",
        "command": "copy_path_from_project_root"
    }
]

Usage

You now have a new command in the command palette, Copy Path From Project Root. You can use it to copy the relative path of the current file to the clipboard. That’s it!

You can also bind the command to a key combination, for example:

{
    "keys": ["ctrl+shift+c"],
    "command": "copy_path_from_project_root"
}

(add this to your user keybindings file)