last modified date in status bar?
-
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 likefrom 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 -
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
-
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 -
This might be a more direct link than Claudia’s…for what seems to be wanted for adjustment.
-
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? -
I think I found that, I added:
notepad.callback(StatusbarSelOverride, [NOTIFICATION.READY])
-
@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.
-
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.
-
@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.
-
Scott, the difference is that notepad++ is closed in my case, before opening the file, in that case only initial script doesn’t work
-
@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
-
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 -
…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 allNULL
for the characters read back from the status bar, use the updated code found in this 2024 post -
yes, it works CF
I tried BUFFERACTIVATED but it didn’t work
-
@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.
-
from Npp import editor, notepad, SCINTILLANOTIFICATION, NOTIFICATION, STATUSBARSECTION
import os
from datetime import datetimedef 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]) -
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.
-
I don’t think you need the original contents, if we’re talking about the first tab,
is DOCTYPE really that important for you?
If so, why?
I can’t think that’s important, that’s why I’m overwriting it -
Using LuaScript I’ve been able to keep the doc type and display the file modification time. Should be easily translatable to PythonScript.
Note this works with a yet-to-be released version of LuaScript
npp.AddEventHandler({"OnSave", "OnSwitchFile", "OnLangChange"}, function() -- Make sure it is a "real" file first if npp:GetCurrentDirectory() == "" then return end local text = npp.LanguageDescription[npp.BufferLangType[npp.CurrentBufferID]] .. " - " .. os.date('%d/%m/%Y %H:%M', winfile.attributes(npp:GetFullCurrentPath(), "modification")) npp.StatusBar[STATUSBAR_DOC_TYPE] = text end)
Gives the results:
-
unfortunately not, as python script hasn’t been updated with recent npp messages yet.
Cheers
Claudia