Home Download Buy Blog Forum Support

BracketHighlighter

Re: BracketHighlighter

Postby facelessuser on Sat Mar 17, 2012 2:00 pm

Don't worry. You can post your issue now or later. I don't drop everything when an issue pops up. These are hobby projects, if I am not having fun, I am not doing it. If I don't feel up to tackling something, I wait until I do feel like it.

Some people may have an expectation that a dev should jump on an issue right away, but I just like to let people know, I will get to it when I feel like it ;).

I'm not making money off this, so if someone has an issue that I don't feel like/don't have time to get to, they have to wait or try and fix it.

Make sure you give detailed explanation if it is some syntax specific to ruby (I don't use ruby); ideally post some example code so I can copy and test with it because I don't know ruby syntax well. It makes it much easier than me having to hand type example code from a jpeg :).
facelessuser
 
Posts: 1548
Joined: Tue Apr 05, 2011 7:38 pm

Re: BracketHighlighter

Postby facelessuser on Sun Mar 18, 2012 2:31 am

tito wrote:
C0D312 wrote:I still want to do some more playing around with the icons. For now, here's an HTML 'tag' icon: http://cl.ly/2M1x0e2g141X1Y1I1B3z

Might want to change it later, but that's it so far.


Looks good, Maybe we can add yet another package :D "GutterIcons" and collect there some nice similar polished icons for the different sizes and possible OS.
Providing an APi or something to use the icons, then other packages use these (if they whish) and the overall application will feel better.
Like 4 different linters using the same icons for displaying errors.


I was just goofing around, but if someone else wanted to use gutter icons I coded a simple script called fancy_regions.py

Code: Select all
import sublime
from glob import glob
from os.path import exists, normpath, join, basename

REGION_STYLES = {
    "solid": 0,
    "none": sublime.HIDDEN,
    "outline": sublime.DRAW_OUTLINED,
    "underline": sublime.DRAW_EMPTY_AS_OVERWRITE
}


class FancyRegions(object):
    def __init__(self, view):
        self.view = view
        self.__icon_path = "FancyRegions/icons"
        self.__icons = []
        self.__icons_cached = False

    def erase_regions(self, key):
        """
        Erase regions
        """

        self.view.erase_regions(key)

    def add_outline_regions(self, key, regions, scope="text", icon="none", flags=0):
        """
        Add outline regions
        """

        self.add_regions(key=key, regions=regions, scope=scope, style="outline", flags=flags)

    def add_underline_regions(self, key, regions, scope="text", icon="none", flags=0):
        """
        Add underline regions
        """

        self.add_regions(key=key, regions=regions, scope=scope, style="underline", flags=flags)

    def add_hidden_regions(self, key, regions, scope="text", icon="none", flags=0):
        """
        Add hidden regions
        """

        self.add_regions(key=key, regions=regions, scope=scope, style="none", flags=flags)

    def add_solid_regions(self, key, regions, scope="text", icon="none", flags=0):
        """
        Add solid regions
        """

        self.add_regions(key=key, regions=regions, scope=scope, style="solid", flags=flags)

    def add_regions(self, key, regions, scope='text', style="solid", icon="none", flags=0):
        """
        Add regions with defined styling to a view
        """

        # Default flag settings
        options = 0

        # Check style type
        if style in REGION_STYLES:
            options |= REGION_STYLES[style]

        # Convert regions suitable for underlining if style underline
        if style == "underline":
            regions = self.__underline(regions)

        # Set additional flags if given
        if flags:
            options |= flags

        # If icon is defined and exists, set the icon path
        icon_path = ""
        if icon != "" and icon != "none":
            if self.view.line_height() < 16:
                icon += "_small"

            if exists(normpath(join(sublime.packages_path(), self.__icon_path, icon + ".png"))):
                icon_path = "../%s/%s" % (self.__icon_path, icon)

        # Apply region(s)
        self.view.add_regions(
            key,
            regions,
            scope,
            icon_path,
            options
        )

    @property
    def icons(self):
        """
        Get list of available icons in current icon path
        """

        if self.__icons_cached:
            return self.__icons[:]
        else:
            if not self.index_icons():
                return self.__icons[:]
            else:
                return []

    @property
    def icon_path(self):
        """
        Return current path to icons (relative to Packages)
        """

        return self.__icon_path

    @icon_path.setter
    def icon_path(self, path):
        """
        Set current path to icons (relative to Packages)
        """

        file_path = path.replace('\\', '/').strip('/')
        full_path = normpath(join(sublime.packages_path(), file_path))
        if exists(full_path):
            self.__icon_path = file_path
            self.index_icons()

    def index_icons(self):
        """
        Search for icons in current icon path and store results
        """

        errors = False
        self.__icons = []
        file_path = normpath(join(sublime.packages_path(), self.__icon_path))
        if exists(file_path):
            self.__icons = [basename(png).rstrip(".png") for png in glob(file_path + "/*.png")]
            self.__icons_cached = True
        else:
            self.__icons = []
            self.__icons_cached = False
            errors = True
        return errors

    def __underline(self, regions):
        """
        Convert regions to individual empty regions for underlining
        """

        new_regions = []
        for region in regions:
            start = region.begin()
            end = region.end()
            while start < end:
                new_regions.append(sublime.Region(start))
                start += 1
        return new_regions


Allows you to do stuff like this: lets say you wanted to create an underlined region with the default scope and a custom icon found in the custom icon folder.

Code: Select all
import sublime
from fancy_regions import FancyRegions

fancy = FancyRegions(sublime.active_window().active_view())
region_list = [sublime.Region(0, 6)]
fancy.add_underline_regions('test_region', region_list, icon="some_icon")


It does common region types like solid, outline, underline, and it handles all of the custom icon stuff. You can even request a list of icons in the custom icon folder.

I could put this in a repository, but I am just not sure if anyone would actually use it or not. But I was just fooling around. :)
facelessuser
 
Posts: 1548
Joined: Tue Apr 05, 2011 7:38 pm

Re: BracketHighlighter

Postby ManFromEarth on Sun Mar 18, 2012 1:20 pm

hello, i use BracketHiglighter and i like it alot, can u maybe make this option:

default behavior in notepad++

Image

can u add that red line, so its filling the gap between brackets .to see more clearly block where ur cursor is :) would be awsame <3
ManFromEarth
 
Posts: 5
Joined: Sun Mar 18, 2012 1:17 pm

Re: BracketHighlighter

Postby C0D312 on Sun Mar 18, 2012 1:39 pm

Hmmm. Interesting. I was about to say that making that line would not be possible but then I realized, Yes it is. It might take some work, but with the custom gutter icons, a straight line isn't out of the question. I personally don't thing it's that important of a feature but could be an interesting exercise for the gutter's capabilities.
C0D312
 
Posts: 1063
Joined: Sun Jul 10, 2011 3:23 am

Re: BracketHighlighter

Postby facelessuser on Sun Mar 18, 2012 1:41 pm

COD312 wrote:Hmmm. Interesting. I was about to say that making that line would not be possible but then I realized, Yes it is. It might take some work, but with the custom gutter icons, a straight line isn't out of the question. I personally don't thing it's that important of a feature but could be an interesting exercise for the gutter's capabilities.


I don't think it is out of the realm of possibilities, but it does have some limitations.

ManFromEarth wrote:hello, i use BracketHiglighter and i like it alot, can u maybe make this option:

default behavior in notepad++

Image

can u add that red line, so its filling the gap between brackets .to see more clearly block where ur cursor is :) would be awsame <3


To be honest, this would only really work if no_multi_select_icons was enabled. Highlighting multi-select brackets like that would just be a mess; it just wouldn't work with how ST2 does things.

Tell you what, I will look into how good I could make it look with no_multi_select_icons enabled, and if I can get it to look decent, I might add it disabled by default.
facelessuser
 
Posts: 1548
Joined: Tue Apr 05, 2011 7:38 pm

Re: BracketHighlighter

Postby vitaLee on Sun Mar 18, 2012 1:47 pm

in this context, i was trying to recall if in previous Sublime versions the indent guides colored differently to indicate cursor location.
i was actully looking for this option a few months ago, guess it wasn't even there, wasn't it?
vitaLee
 
Posts: 150
Joined: Tue Dec 27, 2011 11:10 pm

Re: BracketHighlighter

Postby C0D312 on Sun Mar 18, 2012 2:03 pm

vitaLee wrote:in this context, i was trying to recall if in previous Sublime versions the indent guides colored differently to indicate cursor location.
i was actully looking for this option a few months ago, guess it wasn't even there, wasn't it?


Oh yeah. @Facelessuser, settting indent guides to draw_active is essentially the same thing and a lot cleaner. So you might not want to waste your day fiddling with something that's not really important/already implemented.
C0D312
 
Posts: 1063
Joined: Sun Jul 10, 2011 3:23 am

Re: BracketHighlighter

Postby facelessuser on Sun Mar 18, 2012 2:14 pm

C0D312 wrote:
vitaLee wrote:in this context, i was trying to recall if in previous Sublime versions the indent guides colored differently to indicate cursor location.
i was actully looking for this option a few months ago, guess it wasn't even there, wasn't it?


Oh yeah. @Facelessuser, settting indent guides to draw_active is essentially the same thing and a lot cleaner. So you might not want to waste your day fiddling with something that's not really important/already implemented.


Built in only does function blocks, not any bracket block. And trust me, it is supper easy to add (I'm not looking to spend a lot of time on anything today :)):

Cavet: when you space the lines further, they get further apart. But you can't get better than this though, it is a limitation with ST2.
Screen Shot 2012-03-18 at 8.07.28 AM.png
Screen Shot 2012-03-18 at 8.07.28 AM.png (31.4 KiB) Viewed 2357 times


General Impression?
facelessuser
 
Posts: 1548
Joined: Tue Apr 05, 2011 7:38 pm

Re: BracketHighlighter

Postby vitaLee on Sun Mar 18, 2012 2:15 pm

Oh yeah. @Facelessuser, settting indent guides to draw_active is essentially the same thing and a lot cleaner. So you might not want to waste your day fiddling with something that's not really important/already implemented.

thanks for the tip. :)
personally i think that indent guides in the gutter would be too much.
vitaLee
 
Posts: 150
Joined: Tue Dec 27, 2011 11:10 pm

Re: BracketHighlighter

Postby C0D312 on Sun Mar 18, 2012 2:23 pm

That was fast. I, personally, don't like it. Makes the gutter too busy; however, I'm impressed that it only took you a couple of minutes to implement.
C0D312
 
Posts: 1063
Joined: Sun Jul 10, 2011 3:23 am

PreviousNext

Return to Plugin Announcements

Who is online

Users browsing this forum: No registered users and 6 guests