Community
    • 登入

    last modified date in status bar?

    已排程 已置頂 已鎖定 已移動 General Discussion
    40 貼文 5 Posters 21.8k 瀏覽
    正在載入更多貼文
    • 從舊到新
    • 從新到舊
    • 最多點贊
    回覆
    • 在新貼文中回覆
    登入後回覆
    此主題已被刪除。只有擁有主題管理權限的使用者可以查看。
    • patrickdrdP
      patrickdrd
      最後由 編輯

      is it possible to have last modified date in status bar?

      it’s nice to have as a feature and useful sometimes,
      can it be displayed somehow in npp (settings or plugin)?

      Claudia FrankC 1 條回覆 最後回覆 回覆 引用 1
      • Claudia FrankC
        Claudia Frank @patrickdrd
        最後由 編輯

        @patrickdrd

        with python script like discussed here
        and code to get the last modified timestamp like

        import os
        from datetime import datetime
        
        modified_time = os.path.getmtime(notepad.getCurrentFilename())
        last_modified_date = datetime.fromtimestamp(modified_time)
        

        Cheers
        Claudia

        1 條回覆 最後回覆 回覆 引用 3
        • patrickdrdP
          patrickdrd
          最後由 編輯

          ok but how does this refresh when I save the file (new date should be shown)?

          Claudia FrankC 1 條回覆 最後回覆 回覆 引用 0
          • Claudia FrankC
            Claudia Frank @patrickdrd
            最後由 編輯

            @patrickdrd

            yes, I assume the uiupdate callback is sufficient as it is triggered quite often but in case
            it is needed, the notepad object provides also a filesaved callback.
            So something like

            from Npp import editor, notepad, SCINTILLANOTIFICATION, NOTIFICATION, STATUSBARSECTION
            import os
            from datetime import datetime
            
            def StatusbarSelOverride(args):
                modified_time = os.path.getmtime(notepad.getCurrentFilename())
                last_modified_date = datetime.fromtimestamp(modified_time)
                notepad.setStatusBar(STATUSBARSECTION.DOCSIZE, '{}'.format(last_modified_date))
            
            editor.callback(StatusbarSelOverride, [SCINTILLANOTIFICATION.UPDATEUI])
            notepad.callback(StatusbarSelOverride, [NOTIFICATION.FILESAVED])
            

            should do the trick, of course you need to adapt it to your needs - is just a quick tip
            on how to achieve your goal.

            Cheers
            Claudia

            1 條回覆 最後回覆 回覆 引用 2
            • patrickdrdP
              patrickdrd
              最後由 編輯

              yes, it’s pretty good!!

              some help with date formating?

              I would prefer dd/mm/yyyy hh:mm please :D

              e.g. 13/02/2018 15:14

              Claudia FrankC 1 條回覆 最後回覆 回覆 引用 0
              • Claudia FrankC
                Claudia Frank @patrickdrd
                最後由 Claudia Frank 編輯

                @patrickdrd

                using

                last_modified_date.strftime('%d/%m/%Y %H:%M')
                

                should do the trick.
                More infos, if other format is wanted can be seen here.

                Cheers
                Claudia

                Scott SumnerS 1 條回覆 最後回覆 回覆 引用 3
                • Scott SumnerS
                  Scott Sumner @Claudia Frank
                  最後由 編輯

                  This might be a more direct link than Claudia’s…for what seems to be wanted for adjustment.

                  1 條回覆 最後回覆 回覆 引用 3
                  • patrickdrdP
                    patrickdrd
                    最後由 編輯

                    why do I have to link anywhere inside the file in order for it to work?
                    I mean when I double click on a file from windows explorer,
                    I have set initialization atstartup,
                    does it need something else/more maybe?

                    1 條回覆 最後回覆 回覆 引用 0
                    • patrickdrdP
                      patrickdrd
                      最後由 編輯

                      I think I found that, I added:

                      notepad.callback(StatusbarSelOverride, [NOTIFICATION.READY])

                      Scott SumnerS 1 條回覆 最後回覆 回覆 引用 0
                      • Scott SumnerS
                        Scott Sumner @patrickdrd
                        最後由 編輯

                        @patrickdrd said:

                        notepad.callback(StatusbarSelOverride, [NOTIFICATION.READY])

                        Interesting. I found that I don’t need the “READY”–I don’t have to click inside the document tab to see the mod time updated after loading a file. I don’t use Explorer integration such that a double-click opens the file in Notepad++, but it works for me either via Explorer right-click or drag-n-drop from Explorer.

                        1 條回覆 最後回覆 回覆 引用 0
                        • SalviaSageS
                          SalviaSage
                          最後由 編輯

                          patrickdd, have you been able to add the modified date to the section 1 of the statusbar, where the language name is, without overriding the language name? if so, can you please post the full code? thanks.

                          Scott SumnerS 1 條回覆 最後回覆 回覆 引用 0
                          • Scott SumnerS
                            Scott Sumner @SalviaSage
                            最後由 編輯

                            @SalviaSage said:

                            section 1 of the statusbar

                            Just change .DOCSIZE to .DOCTYPE. No need to post more code.

                            That kind of change should be really obvious from the third posting I made (the one with the images of the status bar) in this thread.

                            1 條回覆 最後回覆 回覆 引用 1
                            • patrickdrdP
                              patrickdrd
                              最後由 編輯

                              Scott, the difference is that notepad++ is closed in my case, before opening the file, in that case only initial script doesn’t work

                              Scott SumnerS Claudia FrankC 2 條回覆 最後回覆 回覆 引用 1
                              • Scott SumnerS
                                Scott Sumner @patrickdrd
                                最後由 編輯

                                @patrickdrd said:

                                notepad++ is closed in my case, before opening the file

                                Yeah, that’s a case I don’t think about, or code for. Because, as the best program on my PC, Notepad++ never gets closed. :-D

                                1 條回覆 最後回覆 回覆 引用 2
                                • Claudia FrankC
                                  Claudia Frank @patrickdrd
                                  最後由 編輯

                                  @patrickdrd

                                  does READY callback work for you?
                                  It seems that this one can’t really be used when running on linux.
                                  BUFFERACTIVATED might be another callback which is useful in such cases.

                                  Cheers
                                  Claudia

                                  1 條回覆 最後回覆 回覆 引用 0
                                  • Scott SumnerS
                                    Scott Sumner
                                    最後由 PeterJones 編輯

                                    …without overriding the language name?

                                    Ah…so I guess I missed this part of @SalviaSage 's posting. Okay, so there is no prebuilt function to get the statusbar data, like there is to set the statusbar data…but we can create one:

                                    import ctypes
                                    from ctypes.wintypes import BOOL, HWND, LPARAM
                                    
                                    def npp_get_statusbar(statusbar_item_number):
                                    
                                        WNDENUMPROC = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM)
                                        FindWindow = ctypes.windll.user32.FindWindowW
                                        SendMessage = ctypes.windll.user32.SendMessageW
                                        EnumChildWindows = ctypes.windll.user32.EnumChildWindows
                                        GetClassName = ctypes.windll.user32.GetClassNameW
                                        create_unicode_buffer = ctypes.create_unicode_buffer
                                        WM_USER = 0x400; SB_GETTEXTLENGTHW = WM_USER + 12; SB_GETTEXTW = WM_USER + 13
                                    
                                        npp_get_statusbar.STATUSBAR_HANDLE = None
                                    
                                        def get_data_from_statusbar(statusbar_item_number):
                                            retcode = SendMessage(npp_get_statusbar.STATUSBAR_HANDLE, SB_GETTEXTLENGTHW, statusbar_item_number, 0)
                                            length = retcode & 0xFFFF
                                            type = (retcode >> 16) & 0xFFFF
                                            text_buffer = create_unicode_buffer(length)
                                            retcode = SendMessage(npp_get_statusbar.STATUSBAR_HANDLE, SB_GETTEXTW, statusbar_item_number, text_buffer)
                                            retval = '{}'.format(text_buffer[:length])
                                            return retval
                                    
                                        def EnumCallback(hwnd, lparam):
                                            curr_class = create_unicode_buffer(256)
                                            GetClassName(hwnd, curr_class, 256)
                                            if curr_class.value.lower() == "msctls_statusbar32":
                                                npp_get_statusbar.STATUSBAR_HANDLE = hwnd
                                                return False
                                            return True
                                    
                                        EnumChildWindows(FindWindow(u"Notepad++", None), WNDENUMPROC(EnumCallback), 0)
                                    
                                        return get_data_from_statusbar(statusbar_item_number) if npp_get_statusbar.STATUSBAR_HANDLE else None
                                    

                                    Thus to add the modification timestamp info to the first section of the status bar, one would call npp_get_statusbar(0) and then use the returned string (if not None) by adding the time to it, e.g.:

                                    notepad.setStatusBar(STATUSBARSECTION.DOCTYPE, npp_get_statusbar(0) + ' ' * 8 + last_modified_date)

                                    I’m sure the basis for this status bar code goes back to some @Claudia-Frank code, but I can’t find the reference to it right now. Sorry, CF.

                                    -----
                                    note from the future: if this code gives you all NULL for the characters read back from the status bar, use the updated code found in this 2024 post

                                    1 條回覆 最後回覆 回覆 引用 1
                                    • patrickdrdP
                                      patrickdrd
                                      最後由 patrickdrd 編輯

                                      yes, it works CF

                                      I tried BUFFERACTIVATED but it didn’t work

                                      1 條回覆 最後回覆 回覆 引用 1
                                      • SalviaSageS
                                        SalviaSage
                                        最後由 SalviaSage 編輯

                                        @patrickdrd, have you been able to get this working? I’ve been trying here from my end. I can’t get the last modified date to display on the statusbar. If you have been able to get this working, can you please post the code?

                                        Thank you.

                                        1 條回覆 最後回覆 回覆 引用 0
                                        • patrickdrdP
                                          patrickdrd
                                          最後由 編輯

                                          from Npp import editor, notepad, SCINTILLANOTIFICATION, NOTIFICATION, STATUSBARSECTION
                                          import os
                                          from datetime import datetime

                                          def StatusbarSelOverride(args):
                                          modified_time = os.path.getmtime(notepad.getCurrentFilename())
                                          last_modified_date = datetime.fromtimestamp(modified_time)
                                          notepad.setStatusBar(STATUSBARSECTION.DOCTYPE, ‘Mod: {:%d/%m/%Y %H:%M}’.format(last_modified_date))

                                          editor.callback(StatusbarSelOverride, [SCINTILLANOTIFICATION.UPDATEUI])
                                          notepad.callback(StatusbarSelOverride, [NOTIFICATION.FILESAVED])
                                          notepad.callback(StatusbarSelOverride, [NOTIFICATION.READY])

                                          1 條回覆 最後回覆 回覆 引用 0
                                          • SalviaSageS
                                            SalviaSage
                                            最後由 編輯

                                            I still can’t figure out how to add the timestamp and still keep the original contents of a statusbar section.

                                            Scott Sumner, I would appreciate it very much if you can fix this code and post it here. thank you.

                                            dailD 1 條回覆 最後回覆 回覆 引用 0
                                            • 第一個貼文
                                              最後的貼文
                                            The Community of users of the Notepad++ text editor.
                                            Powered by NodeBB | Contributors