PythonScript 2.0
-
As I’m afraid that the PythonScript project won’t really be maintained, I’m thinking about creating a new PythonScript plugin.
Since my knowledge of C/C++ is not very good and Boost brings further challenges, I was thinking about using either pybind11, pyo3, cython or cffi.
Now to the question: Does anyone already know one of the above and knows that it can be used or not? -
now this is a catchy title 😂😂😂
for your afraidness: i’m not aware that @chcg has ceased development on that.
who knows, maybe you could join in the future. -
I don’t know - I’m not really eager to learn C++ in depth. The little I need to know
by using one of the others mentioned might work but for the existing project there
is a lot of c++, boost and cpython knowledge needed to move it forward, especially
since there are a couple of changes in python3 api as well. -
The existing Pythonscript plugin is an awesome piece of work. It sure seems like it is worth it for it to continue living on in its current incarnation.
-
Hi, I’m still maintaining pythonscript, but at a rather low rate. Unfortunately @Claudia-Frank left N++, so a big part of contributions is missing. Currently the probably biggest blocker is the compatibility with the new plugin structure required for N++ 7.6.x and PluginAdmin to search/find the python.dll within the plugin dir, see https://github.com/bruderstein/PythonScript/issues/109
Additionally the next step would be https://github.com/bruderstein/PythonScript/issues/36
with initial work ar https://github.com/chcg/PythonScript/tree/python36_testAnd additionally get the webpage corrected https://github.com/bruderstein/PythonScript/issues/113
-
hi @chcg
Currently the probably biggest blocker is the compatibility with the new plugin structure required for N++ 7.6.x and PluginAdmin to search/find the python.dll within the plugin dir
a very, very theoretical quick and dirty plugins admin single target deployment solution for pythonscript, could be:
- deploy all files, including
python.dll
, toplugins\PythonScript
as single folder target. - the plugin itself then checks for existence of
instDir\python.dll
at every startup. - if
instDir\python.dll
does not exist and notepad++ is not elevated, show an alert popup: “Please restart Notepad++ in Administrator mode, to initialise PythonScript.” - if
instDir\python.dll
does not exist and notepad++ runs elevated, copyplugins\PythonScript\python.dll
toinstDir\python.dll
, and make an alert: “PythonScript initialisation complete. Please restart Notepad++ for the changes to take effect.”
- deploy all files, including
-
-
custom dialogs…could be ignored when including pywin32 into PythonScript.
In PS, I do some basic UI stuff that is missing from PS with the techniques shown here:
http://www.averdevelopment.com/python/EasyDialogs.html
Granted these are simple standard dialogs, but they fill gap.
Of course I think the custom dialogs mentioned would be a little different, but I thought I’d share my way of doing File Open, Save etc dialogs in PS when needed.
-
thank you, didn’t know about this site.
pywin32 advantage is not only the easy to build uis but although the already defined win api functions.
No need to check and see which function/structure needs to be create how but
have to admit, that the usage of a few functions is a little bit different to what msdn states.I think the custom dialogs mentioned would be a little different,
For example
-
Yea, I believe I tried pywin32 at some point and found it strange.
-
Example for ctypes:
https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/ReplaceDefaultReplaceDialog.pyCurrently already available is https://github.com/bruderstein/PythonScript/releases/download/v1.3.0/PythonScript_TclTk_1.3.0.0.zip
, see https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/Sorter.py -
Yea…except that Tk sucks. :(
In fact, most Python GUIs except PyQt and wxPython (or whatever it is called now) are so bad they aren’t useful. My opinions only, people, don’t go nuts on me.
-
you are absolutely right and I would say, there is a MUST DO READ those samples
for everyone starting investing pythonscript plugin as it nearly covers any aspect of
manipulating either notepad++ or scintilla or how to extend npp - as far as I can see.But using ctypes is … uncomfortable, as you have to declare every piece,
with the risk of making it wrong. pywin32 did this already for you and Tk is a different beast.
I haven’t found out how one can create a Tk UI which can be docked.
Please don’t get me wrong - not having pywin32 isn’t a showstopper at all - it is just convenient.
And, at any time, one could install a local python and replace the python dll with the one of the local installation and can benefit from pip. -
You mean like this stuff is “uncomfortable” when doing ctypes?:
self.WNDENUMPROC = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM) self.FindWindow = ctypes.windll.user32.FindWindowW self.EnumChildWindows = ctypes.windll.user32.EnumChildWindows self.GetClassName = ctypes.windll.user32.GetClassNameW self.GetWindowText = ctypes.windll.user32.GetWindowTextW self.GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW self.SetWindowText = ctypes.windll.user32.SetWindowTextW self.GetACP = ctypes.windll.kernel32.GetACP self.create_unicode_buffer = ctypes.create_unicode_buffer
It really isn’t that bad, once you get some boilerplate (word of the day!) worked up. :)
-
yes, but the real pain starts when you have to do something like this ;-)
LVS_ICON = 0x0 LVS_REPORT = 0x1 LVS_SMALLICON = 0x2 LVS_LIST = 0x3 LVS_TYPEMASK = 0x3 LVS_SINGLESEL = 0x4 LVS_SHOWSELALWAYS = 0x8 LVS_SORTASCENDING = 0x10 LVS_SORTDESCENDING = 0x20 LVS_SHAREIMAGELISTS = 0x40 LVS_NOLABELWRAP = 0x80 LVS_AUTOARRANGE = 0x100 LVS_EDITLABELS = 0x200 LVS_OWNERDATA = 0x1000 LVS_NOSCROLL = 0x2000 LVS_TYPESTYLEMASK = 0xFC00 LVS_ALIGNTOP = 0x0 LVS_ALIGNLEFT = 0x800 LVS_ALIGNMASK = 0xC00 LVS_OWNERDRAWFIXED = 0x400 LVS_NOCOLUMNHEADER = 0x4000 LVS_NOSORTHEADER = 0x8000 LVS_EX_GRIDLINES = 0x1 LVS_EX_SUBITEMIMAGES = 0x2 LVS_EX_CHECKBOXES = 0x4 LVS_EX_TRACKSELECT = 0x8 LVS_EX_HEADERDRAGDROP = 0x10 LVS_EX_FULLROWSELECT = 0x20 # applies to report mode only LVS_EX_ONECLICKACTIVATE = 0x40 LVS_EX_TWOCLICKACTIVATE = 0x80 LVS_EX_FLATSB = 0x100 # cannot be cleared - Win32 & IE4 and later LVS_EX_REGIONAL = 0x200 LVS_EX_INFOTIP = 0x400 LVM_FIRST = 0x1000 # ListView Messages LVM_GETBKCOLOR = LVM_FIRST + 0 LVM_SETBKCOLOR = LVM_FIRST + 1 LVM_GETIMAGELIST = LVM_FIRST + 2 LVM_SETIMAGELIST = LVM_FIRST + 3 LVM_GETITEMCOUNT = LVM_FIRST + 4 LVM_DELETEITEM = LVM_FIRST + 8 LVM_DELETEALLITEMS = LVM_FIRST + 9 LVM_GETCALLBACKMASK = LVM_FIRST + 10 LVM_SETCALLBACKMASK = LVM_FIRST + 11 LVM_GETNEXTITEM = LVM_FIRST + 12 LVM_SETITEMPOSITION = LVM_FIRST + 15 LVM_GETITEMPOSITION = LVM_FIRST + 16 LVM_HITTEST = LVM_FIRST + 18 LVM_ENSUREVISIBLE = LVM_FIRST + 19 LVM_SCROLL = LVM_FIRST + 20 LVM_REDRAWITEMS = LVM_FIRST + 21 LVM_ARRANGE = LVM_FIRST + 22 LVM_GETEDITCONTROL = LVM_FIRST + 24 LVM_DELETECOLUMN = LVM_FIRST + 28 LVM_GETCOLUMNWIDTH = LVM_FIRST + 29 LVM_SETCOLUMNWIDTH = LVM_FIRST + 30 LVM_GETHEADER = LVM_FIRST + 31 LVM_CREATEDRAGIMAGE = LVM_FIRST + 33 LVM_GETVIEWRECT = LVM_FIRST + 34 LVM_GETTEXTCOLOR = LVM_FIRST + 35 LVM_SETTEXTCOLOR = LVM_FIRST + 36 LVM_GETTEXTBKCOLOR = LVM_FIRST + 37 LVM_SETTEXTBKCOLOR = LVM_FIRST + 38 LVM_GETTOPINDEX = LVM_FIRST + 39 LVM_GETCOUNTPERPAGE = LVM_FIRST + 40 LVM_GETORIGIN = LVM_FIRST + 41 LVM_UPDATE = LVM_FIRST + 42 LVM_SETITEMSTATE = LVM_FIRST + 43 LVM_GETITEMSTATE = LVM_FIRST + 44 LVM_SETITEMCOUNT = LVM_FIRST + 47 LVM_SORTITEMS = LVM_FIRST + 48 LVM_SETITEMPOSITION32 = LVM_FIRST + 49 LVM_GETSELECTEDCOUNT = LVM_FIRST + 50 LVM_GETITEMSPACING = LVM_FIRST + 51 LVM_SETICONSPACING = LVM_FIRST + 53 LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54 LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55 LVM_GETSUBITEMRECT = LVM_FIRST + 56 LVM_SUBITEMHITTEST = LVM_FIRST + 57 LVM_SETCOLUMNORDERARRAY = LVM_FIRST + 58 LVM_GETCOLUMNORDERARRAY = LVM_FIRST + 59 LVM_SETHOTITEM = LVM_FIRST + 60 LVM_GETHOTITEM = LVM_FIRST + 61 LVM_SETHOTCURSOR = LVM_FIRST + 62 LVM_GETHOTCURSOR = LVM_FIRST + 63 LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 64 LVM_SETWORKAREA = LVM_FIRST + 65 LVM_GETSELECTIONMARK = LVM_FIRST + 66 LVM_SETSELECTIONMARK = LVM_FIRST + 67 LVM_GETWORKAREA = LVM_FIRST + 70 LVM_SETHOVERTIME = LVM_FIRST + 71 LVM_GETHOVERTIME = LVM_FIRST + 72 LVM_GETITEM = LVM_FIRST + 75 LVM_SETITEM = LVM_FIRST + 76 LVM_INSERTITEMW = LVM_FIRST + 77 LVM_INSERTITEM = LVM_INSERTITEMW LVM_FINDITEMW = LVM_FIRST + 83 LVM_FINDITEM = LVM_FINDITEMW LVM_GETSTRINGWIDTHW = LVM_FIRST + 87 LVM_GETSTRINGWIDTH = LVM_GETSTRINGWIDTHW LVM_EDITLABELW = LVM_FIRST + 118 LVM_EDITLABEL = LVM_EDITLABELW LVM_GETCOLUMNW = LVM_FIRST + 95 LVM_GETCOLUMN = LVM_GETCOLUMNW LVM_SETCOLUMNW = LVM_FIRST + 96 LVM_SETCOLUMN = LVM_SETCOLUMNW LVM_INSERTCOLUMNW = LVM_FIRST + 97 LVM_INSERTCOLUMN = LVM_INSERTCOLUMNW LVM_GETITEMTEXTW = LVM_FIRST + 115 LVM_GETITEMTEXT = LVM_GETITEMTEXTW LVM_SETITEMTEXTW = LVM_FIRST + 116 LVM_SETITEMTEXT = LVM_SETITEMTEXTW LVM_GETISEARCHSTRINGW = LVM_FIRST + 117 LVM_GETISEARCHSTRING = LVM_GETISEARCHSTRINGW LVM_GETBKIMAGEW = LVM_FIRST + 139 LVM_SETBKIMAGEW = LVM_FIRST + 138 # LVBKIMAGE = LVBKIMAGEW # LPLVBKIMAGE = LPLVBKIMAGEW LVM_SETBKIMAGE = LVM_SETBKIMAGEW LVM_GETBKIMAGE = LVM_GETBKIMAGEW LVCF_FMT = 0x1 LVCF_WIDTH = 0x2 LVCF_TEXT = 0x4 LVCF_SUBITEM = 0x8 LVCF_IMAGE = 0x10 LVCF_ORDER = 0x20 LVCFMT_LEFT = 0x0 LVCFMT_RIGHT = 0x1 LVCFMT_CENTER = 0x2 LVCFMT_JUSTIFYMASK = 0x3 LVCFMT_IMAGE = 0x800 LVCFMT_BITMAP_ON_RIGHT = 0x1000 LVCFMT_COL_HAS_IMAGES = 0x8000 LVIF_TEXT = 0x1 LVSCW_AUTOSIZE = -1 class LVCOLUMN(ctypes.Structure): _fields_ = [('mask', wintypes.UINT), ('fmt', wintypes.INT), ('cx', wintypes.INT), ('pszText', wintypes.LPWSTR), ('cchTextMax', wintypes.INT), ('iSubItem', wintypes.INT), ('iImage', wintypes.INT), ('iOrder', wintypes.INT), ('cxMin', wintypes.INT), ('cxDefault', wintypes.INT), ('cxIdeal', wintypes.INT), ] class LVITEM(ctypes.Structure): _fields_ = [('mask', wintypes.UINT), ('iItem', wintypes.INT), ('iSubItem', wintypes.INT), ('state', wintypes.UINT), ('stateMask', wintypes.UINT), ('pszText', wintypes.LPWSTR), ('cchTextMax', wintypes.INT), ('iImage', wintypes.INT), ('lParam', wintypes.LPARAM), ('iIndent', wintypes.INT), ('iGroupId', wintypes.INT), ('cColumns', wintypes.UINT), ('puColumns', PUINT), ('piColFmt', wintypes.INT), ('iGroup', wintypes.INT), ] class NMITEMACTIVATE(ctypes.Structure): _fields_ = [('hdr', LPNMHDR), ('iItem', wintypes.INT), ('iSubItem', wintypes.INT), ('uNewState', wintypes.UINT), ('uOldState', wintypes.UINT), ('uChanged', wintypes.UINT), ('ptAction', wintypes.POINT), ('lParam', wintypes.LPARAM), ('uKeyFlags', wintypes.UINT), ] LPNMITEMACTIVATE = ctypes.POINTER(NMITEMACTIVATE) ...
-
Even that isn’t that bad (all in a separate file that is imported), but I admit it will get a bit tedious when posting scripts here and just going to get the ones needed for the scripts. But overall I find ctypes an amazing thing. And the things that you can use it for in a PS under Notepad++…also amazing. :)
But some of the constructs get pretty tricky. I’ve used nulledge to find examples I need.
-
… and just going to get the ones needed for the scripts …
at the end that’s exactly where it is handy to have it already defined.
Of course, now that I have made it, I can use it but if I want to post a script which
would use it, it isn’t that easy anymore as I might have to undo some parts to make it work …But some of the constructs get pretty tricky. I’ve used nulledge to find examples I need.
To be honest, if I don’t understand how it should work I’m looking for VB6 examples :-)
Most of the time those can be used just by converting and using the right python syntax. -
So if you have some example scripts worth sharing guys you could create a PR at pythonscript and I will merge them.
-
The beauty of the code on nulledge is that it is already in Python. But oops, it appears that nulledge has gone 404. :( Maybe my future needs will have VB6 searches involved.