RFC / Beta Testers Wanted: pyscFilteredViewer
-
I’ve just run the following a few times:
from Npp import * console.show() console.clear() console.write(__file__ + "::" + __name__ + "\n") for i in range(10000): x = notepad.getLanguageDesc(notepad.getCurrentLang()) console.write( '#{:-4} => {}\n'.format( i, x ) )
and it hasn’t crashed yet, even when I do things like switch files/tabs, create a new file, and go from NPP to other apps and back while the 10000 loops are running…
I think it might be a combo of that call with something else, if there is an instability.
-
You are right, this was my first also (using the console), within the console I can’t see that problem
but I can say that an intermediate variable does not solve the problem as I got a crash while
using one. Currently I’m looking into callbacks. Will take some time - I’m coming back later. -
I guess I found the culprit.
If uncommenting this# y = notepad.getLanguageDesc(x)
then npp crashes.
I assume it is related to what has been reported as an issue as well.import random from Npp import editor, notepad, NOTIFICATION, MENUCOMMAND def on_lang_changed(args): x = notepad.getCurrentLang() # y = notepad.getLanguageDesc(x) y = editor.getLexerLanguage() print y notepad.clearCallbacks([NOTIFICATION.LANGCHANGED]) notepad.callback(on_lang_changed, [NOTIFICATION.LANGCHANGED]) LANGUAGES = [eval('MENUCOMMAND.{}'.format(x)) for x in dir(MENUCOMMAND) if x.startswith('LANG_') and not x.startswith('LANG_USER')] COUNTS = len(LANGUAGES) for i in range(1,1001): if i % 2 == 0: notepad.menuCommand(MENUCOMMAND.LANG_PYTHON) else: notepad.menuCommand(LANGUAGES[random.randint(0,COUNTS-1)])
-
it is the function itself as this simplified version crashes npp as well
from Npp import notepad, LANGTYPE LANGUAGES = LANGTYPE.values.values() for language in LANGUAGES: x = notepad.getLanguageDesc(language)
-
Final conclusion - it is a python script plugin bug because calling
via SendMessage does not crash (tried it 1000x)import ctypes from Npp import notepad, LANGTYPE LANGUAGES = LANGTYPE.values.values() SendMessage = ctypes.windll.user32.SendMessageW # #define NPPM_GETLANGUAGEDESC (NPPMSG + 84) NPPM_GETLANGUAGEDESC = 2024+84 # // INT NPPM_GETLANGUAGEDESC(int langType, TCHAR *langDesc) # // Get programming language short description from the given language type (LangType) # // Return value is the number of copied character / number of character to copy (\0 is not included) # // You should call this function 2 times - the first time you pass langDesc as NULL to get the number of characters to copy. # // You allocate a buffer of the length of (the number of characters + 1) then call NPPM_GETLANGUAGEDESC function the 2nd time # // by passing allocated buffer as argument langDesc npp_hwnd = ctypes.windll.user32.FindWindowW(u'Notepad++', None) for language in LANGUAGES: length = ctypes.windll.user32.SendMessageW(npp_hwnd, NPPM_GETLANGUAGEDESC, language, None) buffer = ctypes.create_unicode_buffer(length+1) return_value = ctypes.windll.user32.SendMessageW(npp_hwnd, NPPM_GETLANGUAGEDESC, language, ctypes.byref(buffer)) print buffer.value # crash # for language in LANGUAGES: # print notepad.getLanguageDesc(language)
-
Strange. I could not get a crash, or even weird behavior, using your “simplified version” (2019-01-24T19:06:19.201Z). With the code before that (2019-01-24T18:33:47.183Z), I never got a crash, but I did get one or two times when NPP prompted me that it was about to exit, and did I want to cancel – whether I said YES or NO to canceling, it stayed in NPP and the script continued looping.
Notepad++ v7.6.2 (64-bit) Build time : Jan 1 2019 - 00:02:38 Path : C:\usr\local\apps\notepad++\notepad++.exe Admin mode : OFF Local Conf mode : ON OS : Windows 10 (64-bit) Plugins : ComparePlugin.dll DSpellCheck.dll MarkdownViewerPlusPlus.dll mimeTools.dll NppConverter.dll NppExec.dll NppFTP.dll PythonScript.dll
I guess I’ll keep an eye out for crashes while using pyscFilteredViewer, and I’ll investigate that call as the culprit.
I’m reluctant to just switch to an alternate method, because the
getLanguageDesc()
method returns slightly different information thangetLexerLanguage()
, especially on UDL: “User Defined language file - CustomLanguageName
”, vs “user
”, and I filter at least one UDL regularly. ThegetLanguageDesc()
appears to match what’s normally put in theSTATUSBARSECTION.DOCTYPE
location. (If there were just agetStatusBar(statusBarSection)
to read back what was previously written withsetStatusBar(statusBarSection,text)
, that would get rid of the need forgetLanguageDesc()
in my utility. Added #3 to explore this more in the future) -
looks very promising
side note: the first thing i read this morning was “psychicFilteredReader” … i guess my coffee hadn’t kicked in yet 😂i didn’t have much time to test it enough for much feedback yet (no crash so far), but i’ll probably compile a static, stand alone one file pyscfr command executable (let’s call it phprun.exe or phpysc.exe for now) to render php files to stdout to fiddle around a bit more.
currently i only have suggestions for the guide:
first feedback about the documentation:
i’d simplify it a bit for newer users, it seems more info than necessary, and missing plug and play examples for the .ini at the “getting started” section.simplified Installation Procedure (on 7.6.2):
- extract pyscFilteredViewer-0.01-beta.zip and copy the containing folder
pyscFilteredViewer
to%AppData%\Notepad++\plugins\config\PythonScript\scripts
the current pyscfr manual explains a bit much about where to put the files (18 lines instead of 1-2), and it’s doubled as long as it would have been, by giving the user the choice on whether to install it to machine or user scripts, also leaving some users helpless, as they wouldn’t know which location is right for them.
any further explanation, or guide to an alternative script location, can be done at the end, after a simple getting started guide.
pyscFilteredViewer.ini template:
as it is a completely new product, it’s imperative to ensure an immediate, easy start for any new user, eg. by delivering prebuilt, functioning configuration files (pyscFilteredViewer.ini) to attract people to a new application.a default ini should be fully working, without relying that a new user understands what to do, in order to ensure a high acceptance count.
(unless it’s an already huge product, like apache, where the devs can say: everyone uses it, so learn it or leave it 😉)a distributed ini example would be:
[PHPFile] ; => this is the name of the section; it must be unique. Typically, based on the language Extension=.php ; => space-separated list of filename extensions, including the period. Language=PHP ; => this is the name of the language (from Notepad++'s perspective): for a UDL, use your "UserName" from the UDL dialog Command=C:\usr\local\bin\phpysc.exe "%1" ; => this is the filter command; %1 is the name of the active file/buffer; the command must result in the HTML being dumped to STDOUT
or even better, an ini using a working preview-ini.bat or exe which is already deployed from the pyscFilteredViewer folder in the zip, as it would always be in
%AppData%\Notepad++\plugins\config\PythonScript\scripts\ pyscFilteredViewer
instead of a non predictable location on each user’s unique setup as example.btw: nice, i like the emoji based ⇉📺⇉ in the readme.md 😃
- extract pyscFilteredViewer-0.01-beta.zip and copy the containing folder
-
btw: wasn’t there someone who recently said:
and I just don’t have the py-knowledge to keep up for long
? 😉👍
-
huh - that is strange as this is 100% reproducible at my side.
Later this day I will do further tests with clean npp and clean PS startup.py. -
Very strange - I download both latest npp and full PythonScript plugin zips.
Create a new minimal test script and boom - crash? 10 tries ten crashes.Notepad++ v7.6.2 (64-bit) Build time : Jan 1 2019 - 00:02:38 Path : D:\temp\clean_762_x64\notepad++.exe Admin mode : OFF Local Conf mode : ON OS : Windows 7 (64-bit) Plugins : DSpellCheck.dll mimeTools.dll NppConverter.dll PythonScript.dll
-
Thanks for the feedback. I do tend toward detailed wordiness. I’ll try to simplify, and maybe move the details to the end, or to supporting documentation.
-
oh, and
btw: wasn’t there someone who recently said:
and I just don’t have the py-knowledge to keep up for long
Yes, I said that. And I think I said elsewhere (I cannot find the exact quote: google-search no longer returns results inside the forum, and the forum search isn’t always as helpful as I’d like), I said something to the effect of “time to go practice my Python” – this is what I was working toward with that practice. :-)
-
Ah, there we go: this post: “Now back to studying Python”. That’s what I was looking for.
In languages I’m fluent in, pyscFilteredViewer would have been much faster for me to write. For Python, I still have to look up some basic syntax or command at least once per day, that would be at a Python expert’s fingertip muscle memory.
-
side note: the first thing i read this morning was “psychicFilteredReader” … i guess my coffee hadn’t kicked in yet 😂
Yeah, “pysc” is my shorthand prefix for PythonScript. I wanted something to indicate the intended audience (Notepad++ PythonScript), without getting too huge or getting in the way of the main name. I don’t know if I was successful. :-)
btw: nice, i like the emoji based ⇉📺⇉ in the readme.md 😃
Thanks. There’s no place for a real “icon” in a PythonScript, and didn’t want to have to design one anyway. I tried looking for a unicode “filter” symbol, but the standard Y-shaped filter icon doesn’t have a unicode-equivalent. Arrows through a display unit (like a TV) seemed a reasonable compromise.
I’ve added your suggestions as issues, so I won’t forget about them.
-
@Eko-palypse said,
Very strange - I download both latest npp and full PythonScript plugin zips.
Create a new minimal test script and boom - crash? 10 tries ten crashes.I have no idea why our systems are behaving differently. It seems odd that my couple of extra plugins would make my system more stable than yours.
Maybe Windows 7 is less stable than Win10? (Hard to believe, I know).
-
Thanks for the feedback. I do tend toward detailed wordiness. I’ll try to simplify, and maybe move the details to the end, or to supporting documentation.
wordiness comes only because it’s your own baby ;-)
if you answer any notepad++ question, you keep it as short and easy to read as possible, with a syntax always matched to the original poster’s capabilities.btw: i hope you don’t mind my feedback, i just think psychicFilteredReader ;-) has potential and a simplified guide might attract more unexperienced users.
pyscFilteredReader or pyscfr is a fine name, it will be easy to find in google at it is unique.
Yes, I said that. And I think I said elsewhere (I cannot find the exact quote: google-search no longer returns results inside the forum, and the forum search isn’t always as helpful as I’d like), I said something to the effect of “time to go practice my Python” – this is what I was working toward with that practice. :-)
>>> this <<< was your post i was referring to … because it was the last chat we had with scott around here … sigh :-(
-
I asked for feedback, why would I mind?
The name might change eventually.
You seem to have latched on Reader rather than Viewer. Other than the psychic connection, is there a reason you prefer FilteredReader to FilteredViewer?
I thought of it as a “filtered viewer”, because it based on using the “filtered” feature of PreviewHTML. But really, my script is neither doing the filtering (it delegates that to an external process) nor a viewer (it delegates that to an external process) – so it might not be the best name. Maybe something like “ConvertAndLaunch”. I don’t know. I don’t want it to include “HTML” in the name, even though right now it does “ConvertToHTMLAndLaunch”, because I’m hoping to make it allow other filter-destinations. Maybe “ConvertThenPreview”?
Hmm, it just hit me: if I do get the alternate destination, other than HTML, it’s basically become a generic utility that could not only be used for convert-from-X-to-HTML-and-view, but also compile-then-run, by using the compiler command (or
make
or whatever) for theCommand=
, and telling it that the output is an executable rather than HTML. Interesting. More things to ponder. -
I have done nothing except read the discussion here, and (again, with not further exploration) I keep thinking about how it might be similar to or different from Don’s porcine offering: https://github.com/npp-plugins/pork2sausage
-
I keep thinking about how it might be similar to or different from Don’s porcine offering: https://github.com/npp-plugins/pork2sausage
Thanks for that. Yeah, they are similar. The primary difference is that mine doesn’t replace the source file. For one of my primary use cases – rending the POD from inside my Perl code into an HTML document – it would be rather destructive to the Perl code to have it be replaced by HTML. :-)
-
@Peter-Jones I added it as addon example to https://github.com/bruderstein/PythonScript. Hope that is ok for your.