Cool Go Programming Language Plugins for Sublime Text

in programming •  7 years ago  (edited)

You can install these plugins via Preferences > Browse Packages > User and create [toolname].py file for every tool. Then in Preferences > Key Bindings, add the keybinding provided or add keybinding of your choice.

1. gorename

The gorename command performs precise type-safe renaming of identifiers in Go source code.

Installation

go get golang.org/x/tools/cmd/gorename

Plugin

import sublime
import sublime_plugin
from subprocess import call
import threading

class Rename(threading.Thread):
    def __init__(self, offset, word):
        threading.Thread.__init__(self)
        self.offset = offset
        self.word = word

    def run(self):
        call(["/Users/anarchyrucks/go/bin/gorename", "-offset", self.offset, "-to", self.word])
        print(self.offset)
        self.view.run_command("gs_fmt")


class GoRenameCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        word = ""
        for region in self.view.sel():
            word = self.view.substr(self.view.word(region))
        self.view.window().show_input_panel("Go Rename:", word, self.do_rename, None, None)

    def do_rename(self, word):
        filepath = self.view.file_name()
        name = filepath.split('/')[-1]
        row, col = self.view.rowcol(self.view.sel()[0].begin())
        offset = self.view.text_point(row, col)
        offset_arg = filepath + ":#" + str(offset)
        ren = Rename(offset_arg, word)
        ren.start()

Key binding

{ "keys": ["super+shift+r"],"command": "go_rename" }

2. gokeyify

gokeyify turns unkeyed struct literals T{1, 2, 3} into keyed ones T{A: 1, B: 2, C: 3}.

Install

go get honnef.co/go/tools/cmd/keyify

Plugin

import sublime
import sublime_plugin
from subprocess import Popen, PIPE
import json

class GoKeyifyCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        filepath = self.view.file_name()
        name = filepath.split('/')[-1]
        row, col = self.view.rowcol(self.view.sel()[0].begin())
        offset = self.view.text_point(row, col)
        offset_arg = filepath + ":#" + str(offset)

        process = Popen(["/Users/anarchyrucks/go/bin/keyify", "-json", offset_arg], stdout=PIPE)
        output_bytes, err = process.communicate()
        if err != None:
            print("Couldn't get the output")
            return
        else:
            output = output_bytes.decode('utf-8')
            try:
                json_output = json.loads(output)
                start = json_output['start']
                end = json_output['end']
                replacement = json_output['replacement']
                select_region = sublime.Region(start, end)
                self.view.replace(edit, select_region, replacement)
                self.view.run_command("gs_fmt")
            except:
                print("Couldn't find/parse struct")

Key binding

{ "keys": ["super+shift+k"],"command": "go_keyify" }

3. goalternate

Switch between the _test.go file and the .go program file with a single command.

Plugin

import sublime
import sublime_plugin
import os
import time
import threading

class Eraser(threading.Thread):
    def __init__(self, view):
        threading.Thread.__init__(self)
        self.view = view
    def run(self):
        time.sleep(5)
        print("here")
        self.view.erase_status("1")

class GoAlternateCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        filepath = self.view.file_name()
        name = filepath.split('/')[-1]
        path = filepath.split(name)[0]
        if name.endswith("_test.go"):
            altpath = path + name.split("_test.go")[0] + ".go"
            if os.path.isfile(altpath):
                self.view.window().open_file(altpath)
                return
        else:
            altpath = path + name.split('.go')[0] + "_test.go"
            if os.path.isfile(altpath):
                self.view.window().open_file(altpath)
                return
        self.view.set_status("1", "Alternate file not found")
        er = Eraser(self.view)
        er.start()

Key binding

{
    "keys": ["alt+super+t"],
    "command": "go_alternate",
    "context": [
      {
        "key": "selector",
        "operator": "equal",
        "operand": "source.go"
      }
    ]
}

4. gomodifytags

Add json:"keyName" automatically for your struct field tags.
Convert

type Name struct {
    First string
    Last  string
}

to

type Name struct {
    First string `json:"first"`
    Last  string `json:"last"`
}

with a single command.

Install

go get github.com/fatih/gomodifytags

Plugin

import sublime
import sublime_plugin
from subprocess import Popen, PIPE
import json

def replace(self, edit, process):
    output_bytes, err = process.communicate()
    if err != None:
        print("Couldn't get the output")
        return
    else:
        output = output_bytes.decode('utf-8')
        try:
            json_output = json.loads(output)
            start_line = json_output['start']
            end_line = json_output['end']
            print(start_line, end_line)
            start = self.view.text_point(start_line - 1, 0)
            end = self.view.text_point(end_line + 1, 0)
            print(start, end)

            lines = json_output['lines']

            replacement = ""
            for line in lines:
                replacement += line + "\n"
            if replacement != "":
                select_region = sublime.Region(start, end)
                self.view.replace(edit, select_region, replacement)
                self.view.run_command("gs_fmt")
        except:
            print("Couldn't find/parse struct")

class GoAddTagsCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        filepath = self.view.file_name()
        name = filepath.split('/')[-1]

        row, col = self.view.rowcol(self.view.sel()[0].begin())
        offset = self.view.text_point(row, col)

        process = Popen(["/Users/anarchyrucks/go/bin/gomodifytags", "-file", filepath, "-offset", str(offset), "-add-tags", "json", "-format", "json", "-transform", "camelcase"], stdout=PIPE)
        replace(self, edit, process)

class GoRemoveTagsCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        filepath = self.view.file_name()
        name = filepath.split('/')[-1]

        row, col = self.view.rowcol(self.view.sel()[0].begin())
        offset = self.view.text_point(row, col)

        process = Popen(["/Users/anarchyrucks/go/bin/gomodifytags", "-file", filepath, "-offset", str(offset), "-remove-tags", "json", "-format", "json", "-transform", "camelcase"], stdout=PIPE)
        replace(self, edit, process)

Key binding

{ "keys": ["super+alt+a"],"command": "go_add_tags" }
{ "keys": ["super+alt+r"],"command": "go_remove_tags" }

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Congratulations @anarchyrucks! You have completed some achievement on Steemit and have been rewarded with new badge(s) :

You made your First Comment
You got a First Reply
Award for the number of upvotes
Award for the number of upvotes received

Click on any badge to view your own Board of Honnor on SteemitBoard.
For more information about SteemitBoard, click here

If you no longer want to receive notifications, reply to this comment with the word STOP

By upvoting this notification, you can help all Steemit users. Learn how here!

Quite useful. Thanks for posting these.

thanks!!!

कमेन्ट् हो यो :पि

हो हो

Congratulations @anarchyrucks! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Do not miss the last post from @steemitboard:

The Steem community has lost an epic member! Farewell @woflhart!
SteemitBoard - Witness Update
Do not miss the coming Rocky Mountain Steem Meetup and get a new community badge!
Vote for @Steemitboard as a witness to get one more award and increased upvotes!