Search code examples
pythonsublimetext3sublime-text-plugin

Sublime plugin for executing a command


I been writing markdown files lately, and have been using the awesome table of content generator (github-markdown-toc) tool/script on a daily basis, but I'd like it to be regenerated automatically each time I press Ctrl+s, right before saving the md file in my sublime3 environment.

What I have done till now was to generate it from the shell manually, using:

gh-md-toc --insert my_file.md

So I wrote a simple plugin, but for some reason I can't see the result I wanted. I see my print but the toc is not generated. Does anybody has any suggestions? what's wrong?

import sublime, sublime_plugin
import subprocess

class AutoRunTOCOnSave(sublime_plugin.EventListener):
    """ A class to listen for events triggered by ST. """

    def on_post_save_async(self, view):
        """
        This is called after a view has been saved. It runs in a separate thread
        and does not block the application.
        """

        file_path = view.file_name()

        if not file_path:
            return
        NOT_FOUND = -1
        pos_dot = file_path.rfind(".")
        if pos_dot == NOT_FOUND:
            return
        file_extension = file_path[pos_dot:]
        if file_extension.lower() == ".md": #
            print("Markdown TOC was invoked: handling with *.md file")
            subprocess.Popen(["gh-md-toc", "--insert ",  file_path])

Solution

  • I figured out, since gh-md-toc is a bash script, I replaced the following line:

    subprocess.Popen(["gh-md-toc", "--insert ",  file_path])
    

    with:

    subprocess.check_call("gh-md-toc --insert %s" % file_path, shell=True)
    

    So now it works well, on each save.