Community
    • Login

    Auto sort tabs (real-time)

    Scheduled Pinned Locked Moved Notepad++ & Plugin Development
    49 Posts 10 Posters 2.2k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Alan KilbornA
      Alan Kilborn @PeterJones
      last edited by Alan Kilborn

      @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.

      Alan KilbornA 1 Reply Last reply Reply Quote 1
      • Alan KilbornA
        Alan Kilborn @Alan Kilborn
        last edited by

        @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'), '')
        
        PeterJonesP Daniel TomberlinD 2 Replies Last reply Reply Quote 3
        • Alan KilbornA
          Alan Kilborn
          last edited by Alan Kilborn

          @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.

          1 Reply Last reply Reply Quote 1
          • PeterJonesP
            PeterJones @Alan Kilborn
            last edited by

            @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)

            1 Reply Last reply Reply Quote 1
            • Maxitrol - MatM
              Maxitrol - Mat
              last edited by

              looks like auto-sort is really a rocket science…

              Alan KilbornA 1 Reply Last reply Reply Quote 0
              • Alan KilbornA
                Alan Kilborn @Maxitrol - Mat
                last edited by

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

                looks like auto-sort is really a rocket science…

                Why do you say that?

                1 Reply Last reply Reply Quote 0
                • Daniel TomberlinD
                  Daniel Tomberlin @Alan Kilborn
                  last edited by Daniel Tomberlin

                  Regardless of other’s sense of entitlement, I certainly appreciate the free software of notepad++ :D

                  @alan-kilborn, I have a couple of questions:

                  • How could I modify this to work so I can get my tabs to sort by ‘creation date’ since I accidentally sorted by ‘Name’ when I hit that ‘Sort Tabs’ button in the existing feature? … Maybe there is a simpler method since I’m not in need of automation?

                  • Also, how does one run a script for notepad++?

                  Btw, there is another post for my particular request by @Ashil-Krishnan here, but no solution. However, @PeterJones referenced this post, which brought me here to inquire.

                  Thanks!

                  Alan KilbornA 3 Replies Last reply Reply Quote 0
                  • Daniel TomberlinD Daniel Tomberlin referenced this topic on
                  • Alan KilbornA
                    Alan Kilborn @Daniel Tomberlin
                    last edited by

                    @daniel-tomberlin said in Auto sort tabs (real-time):

                    sort by ‘creation date’

                    This may be problematic as tabs unsaved into the filesystem, with names such as new 1, new 3, etc. make determining a “creation date/time” difficult.

                    Daniel TomberlinD 1 Reply Last reply Reply Quote 0
                    • Alan KilbornA
                      Alan Kilborn @Daniel Tomberlin
                      last edited by

                      @daniel-tomberlin said in Auto sort tabs (real-time):

                      how does one run a script for notepad++?

                      Well presuming you mean a PythonScript, and thus that you have that plugin installed, and a script file created and saved, the most basic way of running it is to pull down this menu structure and select your desired script:

                      b4b66847-0268-4359-8a1b-55da24fa5832-image.png

                      You can also bind a script running to a keycombination for easier execution.

                      1 Reply Last reply Reply Quote 1
                      • Daniel TomberlinD
                        Daniel Tomberlin @Alan Kilborn
                        last edited by Daniel Tomberlin

                        @alan-kilborn, I see. I presume it would be the same for ‘modified date’ too. Well, I’ll keep my eye out in case you feel like conducting another “mental exercise.” ;)

                        Btw, thanks for the script tip!

                        Alan KilbornA 1 Reply Last reply Reply Quote 1
                        • Alan KilbornA
                          Alan Kilborn @Daniel Tomberlin
                          last edited by

                          @daniel-tomberlin said in Auto sort tabs (real-time):

                          Well, I’ll keep my eye out in case you feel like conducting another “mental exercise.”

                          Unlikely because I never work with unsaved tabs (such as the mentioned new 1, etal). I did the original script because I thought it might be of some use to me. I don’t tend to code “complicated things” for others if I have no use for them.

                          Daniel TomberlinD 1 Reply Last reply Reply Quote 0
                          • Daniel TomberlinD
                            Daniel Tomberlin @Alan Kilborn
                            last edited by

                            @alan-kilborn, ah, I understand.

                            Just an FYI, I did notice that the sessions.xml file in the Notepad++ folder under …\AppData\Roaming\ path does have a date at the end of the “backupFilePath” parameter. So the end of the path reads “…\new1@yyyy-mm-dd_123456,” however, saved file paths do not have anything populated in that parameter. There are also the parameters “originalFileLatModiTimestamp” and “originalFileLatModiTimestampHigh” that are “0” in the “new” tab, but have 8 numbers in the saved file, one negative and the other positive respectively. I may be able to figure out a way to manually sort my tabs by modifying the startPos=“2488” and endPos=“2488” in this file if I figure out what those numbers mean, including the number at the end of the aforementioned “backupFilePath” parameter too.

                            Btw, below is an example of what I’m seeing in case anyone has any answers here, but maybe answer on the other post as it is more appropriate.

                            <File firstVisibleLine="0" xOffset="0" scrollWidth="9423" startPos="120" endPos="120" selMode="0" offset="0" wrapCount="1" lang="SQL" encoding="-1" userReadOnly="no" filename="\\mypath\myfilename.sql" backupFilePath="" originalFileLastModifTimestamp="-386892058" originalFileLastModifTimestampHigh="30736076" mapFirstVisibleDisplayLine="-1" mapFirstVisibleDocLine="-1" mapLastVisibleDocLine="-1" mapNbLine="-1" mapHigherPos="-1" mapWidth="-1" mapHeight="-1" mapKByteInDoc="1140719616" mapWrapIndentMode="-1" mapIsWrap="no" />
                            
                            <File firstVisibleLine="6" xOffset="0" scrollWidth="3990" startPos="2488" endPos="2488" selMode="0" offset="0" wrapCount="18" lang="SQL" encoding="-1" userReadOnly="no" filename="new 1" backupFilePath="C:\Users\username\AppData\Roaming\Notepad++\backup\new 1@2020-09-01_101742" originalFileLastModifTimestamp="0" originalFileLastModifTimestampHigh="0" mapFirstVisibleDisplayLine="-1" mapFirstVisibleDocLine="-1" mapLastVisibleDocLine="-1" mapNbLine="-1" mapHigherPos="-1" mapWidth="-1" mapHeight="-1" mapKByteInDoc="0" mapWrapIndentMode="-1" mapIsWrap="no" />
                            

                            Anyway, thanks for the reply.

                            Alan KilbornA 1 Reply Last reply Reply Quote 0
                            • Alan KilbornA
                              Alan Kilborn @Daniel Tomberlin
                              last edited by

                              @daniel-tomberlin

                              Are you posting the exact same comment in TWO threads? If so I’d say “Why?” and also “That’s not a great idea”.

                              Daniel TomberlinD 1 Reply Last reply Reply Quote 1
                              • Daniel TomberlinD
                                Daniel Tomberlin @Alan Kilborn
                                last edited by

                                @alan-kilborn, not exactly. One is speaking to you with reference to the other post. I’m basically cross posting the code part since it’s related.

                                PeterJonesP 1 Reply Last reply Reply Quote 0
                                • Alan KilbornA
                                  Alan Kilborn @Daniel Tomberlin
                                  last edited by

                                  @daniel-tomberlin said in Auto sort tabs (real-time):

                                  since I accidentally sorted by ‘Name’ when I hit that ‘Sort Tabs’ button in the existing feature?

                                  It’s funny that you mention this.
                                  I did the same thing once.
                                  As a warning to myself for the future, I changed the text on that sort button:

                                  c9b53c9e-6631-4855-8385-4a96053f514d-image.png

                                  The first thought is that it will only change the ordering on the list on this window, NOT the real tab ordering.

                                  1 Reply Last reply Reply Quote 2
                                  • PeterJonesP
                                    PeterJones @Daniel Tomberlin
                                    last edited by

                                    @daniel-tomberlin said in Auto sort tabs (real-time):

                                    I’m basically cross posting the code part since it’s related.

                                    Please don’t. The regulars all read posts from all (or most) of the categories (I will admit: I filter out the “Boycott” section and a handful of other specific “ignore” settings, as reading those is not good for my blood pressure; other than that, I read every post; I am guessing others of the regulars are similar).

                                    All you have succeeded in doing is splitting your conversation into three different chunks, and people who are interested in your topic now have to go to three different locations to see the whole conversation, and to see what pieces have been addressed in which conversation.

                                    To help future readers, the three discussions (hopefully not “and counting”):

                                    1. Auto sort tabs (real-time) (this discussion) => this is where the sessions.xml sub-discussion started
                                    2. Sort tabs by creation date => forked to a second discussion, which sometimes has the same content posted in both discussions; in that thread, the startPos and endPos are described
                                    3. Need Explanation of a few Session.xml Parameters & Values => a brand new discussion to ask what the meaning of the originalFileLastModifTimestamp and originalFileLastModifTimestampHigh attributes, despite that having already been mentioned here in #1 and over in #2 (albeit with misspellings in some of the instances of the attribute names); Alan kindly did some investigation for Daniel, and showed the MS canonical docs that likely correspond to those two entries.
                                    Daniel TomberlinD 1 Reply Last reply Reply Quote 1
                                    • Daniel TomberlinD
                                      Daniel Tomberlin @PeterJones
                                      last edited by

                                      @peterjones, sorry… I tried my best to not hijack a thread with another issue, which is why I approached it this way since I had 3 different questions to hash out. I don’t see this happening in the future and will just make a new post with my need and only focus on questions related to other posts without expanding outside of the scope… Btw, I couldn’t update that typo because of the 3 minute rule, but since the shared code was correct, I figured it would be figured out.

                                      1 Reply Last reply Reply Quote 0
                                      • Maxitrol - MatM Maxitrol - Mat deleted this topic on
                                      • PeterJonesP PeterJones restored this topic on
                                      • First post
                                        Last post
                                      The Community of users of the Notepad++ text editor.
                                      Powered by NodeBB | Contributors