Auto sort tabs (real-time)



  • Yep, the same script that works with PS3 does not uninstall the callback when you using PS2.



  • @Ekopalypse said in Auto sort tabs (real-time):

    Yep, the same script that works with PS3 does not uninstall the callback when you using PS2.

    Thanks for the confirmation.
    I keep forgetting about PS3.
    But, in truth, I have a few project where I need non-UTF8 encodings, so I’m a bit afraid to make the jump anyway.
    I will make a note in my copy of the script that it can’t be uninstalled under PS2.
    But, if it is something that someone will use, I don’t think they’ll uninstall it, and will set up the install part in startup.py.



  • @Alan-Kilborn said in Auto sort tabs (real-time):

    The ideal way would be to tie it into the “buffer activated” callback.

    So I ended up doing this to the script.
    To avoid the script “retriggering” itself, I added a new member variable in the init:

    self.is_installed = False

    and then changed the callback function (its name, too!) a bit:

        def buffer_activated_callback(self, args):
            if self.in_callback: return  # the script moving tabs around will cause more callbacks to trigger; prevent this
            self.in_callback = True
            ...
            ...what it was doing before...
            ...
            self.in_callback = False
    

    It seems to work okay.
    If there’s interest, I can republish the entire script with the mods.



  • @Alan-Kilborn said in Auto sort tabs (real-time):

    I added a new member variable in the init:\

    self.is_installed = False
    ...
        if self.in_callback:
    

    Was that a typo in the first line, or am I confused and those are two separate things?

    Assuming that first line should have been self.in_callback = False, I was able to see that work for me.

    It’s fun to try to “fight” it: try to rearrange the tabs manually while the script is in effect. ;-) But I guess the kind of person who would want this running all the time would not be the kind who would try to fight it, so wouldn’t accidentally trigger the fight.

    Good work on that.

    Given that it was multiple changes (adding a variable, changing method name, changing the notification it’s hooked to), it might be good to re-publish, so that future readers won’t make mistakes while piecing the script together, and then complain at you that it doesn’t work.

    Thanks for the fun diversion.



  • @PeterJones said in Auto sort tabs (real-time):

    Was that a typo in the first line

    Yep, dammit. Sorry.

    it might be good to re-publish

    OK, will do.



  • @PeterJones

    It’s fun to try to “fight” it: try to rearrange the tabs manually while the script is in effect. ;-)

    I certainly did NOT do any type of testing like that!
    If it fails during something of that nature, well, sorry, but the user is to blame in that case. :-)

    and then complain at you that it doesn’t work.

    Hey, how did you make that little complain-at-you popup text?


    Okay, so here’s an “a” version of the script, with all the changes previously discussed:

    # -*- coding: utf-8 -*-
    
    from Npp import editor, notepad, NOTIFICATION
    import os
    
    class SFTBFa(object):
    
        def __init__(self):
            self.installed = False
            self.in_callback = False
    
        def install(self):
            if not self.installed:
                notepad.callback(self.buffer_activated_callback, [NOTIFICATION.BUFFERACTIVATED])
                self.installed = True
    
        def uninstall(self):
            if self.installed:
                notepad.clearCallbacks(self.buffer_activated_callback)  # <---- may not work until PS 3.0.4+; see https://github.com/bruderstein/PythonScript/issues/153
                self.installed = False
    
        def is_installed(self):
            return self.installed
    
        def buffer_activated_callback(self, args):
            if self.in_callback: return  # the script moving tabs around will cause more callbacks to trigger; prevent this
            self.in_callback = True
            current_view = notepad.getCurrentView()
            other_view = 1 if current_view == 0 else 0
            if notepad.getCurrentDocIndex(other_view) == 4294967295L: other_view = None
            curr_view_paths_list = []; curr_view_sorted_paths_list = []
            other_view_paths_list = []; other_view_sorted_paths_list = []
            for (filename, _, index_in_view, view) in notepad.getFiles():
                if view == current_view:
                    curr_view_paths_list.append(filename)
                    curr_view_sorted_paths_list.append(filename)
                else:
                    other_view_paths_list.append(filename)
                    other_view_sorted_paths_list.append(filename)
            curr_view_sorted_paths_list.sort(key=lambda x: x.rsplit(os.sep, 1)[-1].upper())
            curr_view_already_sorted = True if curr_view_paths_list == curr_view_sorted_paths_list else False
            other_view_sorted_paths_list.sort(key=lambda x: x.rsplit(os.sep, 1)[-1].upper())
            other_view_already_sorted = True if other_view_paths_list == other_view_sorted_paths_list else False
            if not (curr_view_already_sorted and other_view_already_sorted):
                processed_other_view = False
                if other_view != None and not other_view_already_sorted:
                    self.rearrange_tabs_in_view(other_view, other_view_sorted_paths_list)
                    processed_other_view = True
                processed_current_view = False
                if not curr_view_already_sorted:
                    self.rearrange_tabs_in_view(current_view, curr_view_sorted_paths_list)
                    processed_current_view = True
                if processed_other_view and not processed_current_view:
                    # leave the view we started in as the active one:
                    notepad.activateIndex(current_view, notepad.getCurrentDocIndex(current_view))
            self.in_callback = False
    
        def rearrange_tabs_in_view(self, view, sorted_name_list):
            notepad.activateIndex(view, notepad.getCurrentDocIndex(view))  # get switched into the correct view
            remembered_active_filename = notepad.getCurrentFilename()
            destination_index = 0
            num_of_tabs = len(sorted_name_list)
            while destination_index < num_of_tabs:
                current_order_list = []
                for (filename, _, index_in_view, v) in notepad.getFiles():
                    if v == view: current_order_list.append(filename)
                curr_location_index = current_order_list.index(sorted_name_list[destination_index])
                move_left_count = curr_location_index - destination_index
                if move_left_count > 0:
                    notepad.activateFile(current_order_list[curr_location_index])
                    for _ in range(move_left_count): notepad.menuCommand(MENUCOMMAND.VIEW_TAB_MOVEBACKWARD)
                destination_index += 1
            notepad.activateFile(remembered_active_filename)
    
    if __name__ == '__main__':
    
        if 'sftbf_a' not in globals(): sftbf_a = SFTBFa()
    
        # each running of the script toggles install/uninstall:
        sftbf_a.uninstall() if sftbf_a.is_installed() else sftbf_a.install()
        notepad.messageBox('SortFileTabsByFilename {}INSTALLED!'.format('' if sftbf_a.is_installed() else 'UN'), '')
    


  • @Alan-Kilborn said in Auto sort tabs (real-time):

    how did you make that little complain-at-you popup text?

    I think that I may have…

    Well, not quite, because when I click on mine it takes me somewhere (bad) whereas clicking on @PeterJones 's it doesn’t go anywhere.



  • @Alan-Kilborn said in Auto sort tabs (real-time):

    Hey, how did you make that little complain-at-you popup text?

    See How to Markdown Code on this forum. 😉

    No, really, it’s there:

    This is a simple [here](https://www.google.com “go Google!”) link with custom hover pop-up text

    The popup hover text is the “title” text of the link. It’s also described at the no-longer-officially-linked daringfireball markdown spec

    And then, while I’m typing, you said

    I think that I may have [figured it out myself]…

    Congrats. Of course, if I weren’t wanting the bragging rights, I wouldn’t have been able to post this reply, since you went and figured it out.

    Well, not quite,

    Oh, sure, you realize you had a problem while I am still writing about your problem. Let me type this reply! 😠

    [text](# "hover") will do what you want. The # is the HTML shortcut for “go to the unnamed anchor on the current page”, which has been HTML shorthand for “do nothing with this link” forever (or, at least, from early forms of HTML in the 90s)



  • looks like auto-sort is really a rocket science…



  • @Maxitrol-Mat said in Auto sort tabs (real-time):

    looks like auto-sort is really a rocket science…

    Why do you say that?


Log in to reply