Notepad++ plugin

Share your advanced PureBasic knowledge/code with the community.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Notepad++ plugin

Post by eddy »

Hi,
Here is my first attempt to create Notepad++ plugin

How to install : copy DLL into plugins folder of notepad++

Code: Select all

;unicode - DLL - compiler x86

Structure NppData
   *_nppHandle
   *_scintillaMainHandle
   *_scintillaSecondHandle
EndStructure                 

Structure ShortcutKey
   _isCtrl.b
   _isAlt.b
   _isShift.b
   _key.i
EndStructure

Structure FuncItem Align 4
   _itemName.s{64}
   *_pFunc
   _cmdID.i
   _init2Check.b
   *_pShortcutKey.ShortcutKey
EndStructure

; ==================================
; 2 MANDATORY DLL PROCEDURES
; ==================================
Declare Test()

ProcedureDLL AttachProcess(Instance)
   ;
   ;<< When Notepad++ is installing this plugin >>
   ; YOUR INIT CODE HERE
   ;
   Global NppData.NppData
   Global PluginName.s="My Custom Plugin Name"
   Global Dim FuncsArray.FuncItem(4)   ;menu with 4 items
   With FuncsArray(0)                  ;1) menu item with shortcut key
      \_itemName="Settings..."
      \_pFunc=@test()
      \_pShortcutKey=AllocateStructure(ShortcutKey)
      \_pShortcutKey\_isCtrl=#True
      \_pShortcutKey\_isShift=#True
      \_pShortcutKey\_isAlt=#True
      \_pShortcutKey\_key=#VK_NEXT
   EndWith                             ;2) menu separator
   With FuncsArray(1)
      \_itemName=""
   EndWith
   With FuncsArray(2)                  ;3) menu item with checked box
      \_itemName="Custom Option 1"
      \_pFunc=@Test()
      \_init2Check=#True
   EndWith
   With FuncsArray(3)                  ;4) menu item with unchecked box
      \_itemName="Custom Option 2"
      \_pFunc=@Test()
      \_init2Check=#False
   EndWith
EndProcedure

ProcedureDLL DetachProcess(Instance)
   ;
   ;<< When Notepad++ is uninstalling this plugin >>
   ; YOUR CLEANUP CODE HERE
   ;
   Protected i
   For i=0 To ArraySize(FuncsArray())
      FreeStructure(FuncsArray(i)\_pShortcutKey)
   Next
EndProcedure

; ==================================
; 5 MANDATORY NOTEPAD++ PROCEDURES
; ==================================

ProcedureCDLL.i isUnicode()
   ProcedureReturn #True
EndProcedure

ProcedureCDLL.s getName()
   ProcedureReturn PluginName
EndProcedure

ProcedureCDLL.i getFuncsArray(*FuncsArraySize.Integer)
   *FuncsArraySize\i=ArraySize(FuncsArray())
   ProcedureReturn @FuncsArray()
EndProcedure

ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
   NppData\_nppHandle=*NppHandle
   NppData\_scintillaMainHandle=*ScintillaMainHandle
   NppData\_scintillaSecondHandle=*ScintillaSecondHandle
   ;
   ;<< When Notepad++ info has changed >>
   ; YOUR CODE HERE
   ;
EndProcedure

ProcedureCDLL beNotified(*SCNotification.SCNotification)
   ;
   ;<< When Notepad++ scintilla notification has been received >>
   ; YOUR CODE HERE
   ;
EndProcedure

ProcedureCDLL.i messageProc(Message, wParam, lParam)
   ;
   ;<< When Notepad++ windows message has been received >>
   ; YOUR CODE HERE
   ;
   ProcedureReturn #True
EndProcedure

; ==================================
; YOUR PLUGIN PROCEDURES
; ==================================
Procedure Test()
   MessageRequester("PB Plugin for notepad++", "Test...")
EndProcedure
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Notepad++ plugin

Post by eddy »

Update
- menu creation
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
Tenaja
Addict
Addict
Posts: 1948
Joined: Tue Nov 09, 2010 10:15 pm

Re: Notepad++ plugin

Post by Tenaja »

Thanks for sharing that, eddy. I am going to save it for later...I know a couple years ago I would have appreciated having that available.
dige
Addict
Addict
Posts: 1247
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Re: Notepad++ plugin

Post by dige »

Thank you eddy! Well suited for learning purposes.
"Daddy, I'll run faster, then it is not so far..."
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

how to get #NPPM_GETCURRENTSCINTILLA?
only WM_SIZE (=5) comes to messageProc
TassyJim
Enthusiast
Enthusiast
Posts: 151
Joined: Sun Jun 16, 2013 6:27 am
Location: Tasmania (Australia)

Re: Notepad++ plugin

Post by TassyJim »

I have recently been playing with this plugin so it was easy for me to do a test.

From the NPP source file "Notepad_plus_msgs.h"

I came up with this:

Code: Select all

Protected NPPMSG.l =  #WM_USER + 1000
Protected NPPM_GETCURRENTSCINTILLA.l = NPPMSG + 4
Protected NPPM_GETNBOPENFILES.l = NPPMSG + 7
n =SendMessage_(NppData\_nppHandle, NPPM_GETNBOPENFILES, 0,0)


This test returns the number of open files plus one so I assume that it will correctly return NPPM_GETCURRENTSCINTILLA also.
I used GETNBOPENFILES because it was easy for me to see it working!

(WM_USER = 1024)

Jim
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

Look here

C++

Code: Select all

static HWND getCurrentScintilla()
{
	int which = 0;
	SendNpp(NPPM_GETCURRENTSCINTILLA, SCI_UNUSED, (LPARAM)&which);
	return (which == 0) ? nppData._scintillaMainHandle : nppData._scintillaSecondHandle;
}
Happened

Code: Select all

Procedure GetCurrentScintilla()
	Protected instance_sci
	SendMessage_(NppData\_nppHandle, #NPPM_GETCURRENTSCINTILLA, 0, @instance_sci)
	MessageRequester("GetCurrentScintilla", Str(instance_sci))
EndProcedure

Code: Select all

Procedure GetCurrentScintilla()
	Protected instance_sci
	SendMessage_(NppData\_nppHandle, #NPPM_GETCURRENTSCINTILLA, 0, @instance_sci)
	If instance_sci
		ProcedureReturn NppData\_scintillaSecondHandle
	Else
		ProcedureReturn NppData\_scintillaMainHandle
	EndIf
EndProcedure
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

I can not assign hotkeys... figured it out

Code: Select all

Structure ShortcutKey Align #PB_Structure_AlignC
	_isCtrl.b
	_isAlt.b
	_isShift.b
	_key.b ; the mistake was here
EndStructure
.....
\_pShortcutKey=AllocateStructure(ShortcutKey)
\_pShortcutKey\_isCtrl=#True
\_pShortcutKey\_isShift=#False
\_pShortcutKey\_isAlt=#True
; \_pShortcutKey\_key=#VK_NEXT
\_pShortcutKey\_key=$44
This is in the official template.

Code: Select all

struct ShortcutKey
{
	bool _isCtrl;
	bool _isAlt;
	bool _isShift;
	UCHAR _key;
};
.....
bool setCommand(size_t index, TCHAR *cmdName, PFUNCPLUGINCMD pFunc, ShortcutKey *sk = NULL, bool check0nInit = false);
.....
 funcItem[index]._pShKey = sk;
Maybe the problem is in the size of the structure?
Last edited by AZJIO on Thu Jul 22, 2021 8:23 pm, edited 1 time in total.
TassyJim
Enthusiast
Enthusiast
Posts: 151
Joined: Sun Jun 16, 2013 6:27 am
Location: Tasmania (Australia)

Re: Notepad++ plugin

Post by TassyJim »

Try

Code: Select all

Structure ShortcutKey
  _isCtrl.b
  _isAlt.b
  _isShift.b
  _key.a
EndStructure
The value for the key field is the #VK_ code so for F10 you need 121 etc

I needed to make one other change depending on whether I am compiling for 64 bit or 32 bit.

Code: Select all

CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  ProcedureCDLL setInfo(*Npp.NppData)
    NppData\_nppHandle=*Npp\_NppHandle
    NppData\_scintillaMainHandle=*Npp\_ScintillaMainHandle
    NppData\_scintillaSecondHandle=*Npp\_ScintillaSecondHandle
    ;MessageRequester("DLL",Str(NppData\_scintillaMainHandle))
    ;
    ;<< When Notepad++ info has changed >>
    ; YOUR CODE HERE
    ;
  EndProcedure
CompilerElse
  ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
    NppData\_nppHandle=*NppHandle
    NppData\_scintillaMainHandle=*ScintillaMainHandle
    NppData\_scintillaSecondHandle=*ScintillaSecondHandle
    ; MessageRequester("DLL",Str(*ScintillaMainHandle)+" "+Str(NppData\_scintillaMainHandle))
    ;
    ;<< When Notepad++ info has changed >>
    ; YOUR CODE HERE
    ;
  EndProcedure
  
CompilerEndIf
I am sure that I haven't done it correctly but it works for me so I am happy.

Jim
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

TassyJim wrote:The value for the key field is the #VK_ code so for F10 you need 121 etc

I needed to make one other change depending on whether I am compiling for 64 bit or 32 bit.

Code: Select all

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
	ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
		NppData\_nppHandle=*NppHandle
		NppData\_scintillaMainHandle=*ScintillaMainHandle
		NppData\_scintillaSecondHandle=*ScintillaSecondHandle
	EndProcedure
CompilerElse
	ProcedureCDLL setInfo(*Npp.NppData)
		CopyStructure(*Npp, NppData, NppData)
	EndProcedure
CompilerEndIf

Code: Select all

#VK_F10
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

NNP_Const.pb

Code: Select all

; notepad-plus-plus-7.6.3
; Notepad_plus_msgs.h
; menuCmdID.h

#ALL_OPEN_FILES = 0
#PRIMARY_VIEW = 1
#SECOND_VIEW = 2
#MODELESSDIALOGADD = 0
#MODELESSDIALOGREMOVE = 1
#MAIN_VIEW = 0
#SUB_VIEW = 1
#STATUSBAR_DOC_TYPE = 0
#STATUSBAR_DOC_SIZE = 1
#STATUSBAR_CUR_POS = 2
#STATUSBAR_EOF_FORMAT = 3
#STATUSBAR_UNICODE_TYPE = 4
#STATUSBAR_TYPING_MODE = 5
#NPPPLUGINMENU = 0
#NPPMAINMENU = 1
#DOCSTATUS_READONLY = 1
#DOCSTATUS_BUFFERDIRTY = 2

#VAR_NOT_RECOGNIZED = 0
#FULL_CURRENT_PATH = 1
#CURRENT_DIRECTORY = 2
#FILE_NAME = 3
#NAME_PART = 4
#EXT_PART = 5
#CURRENT_WORD = 6
#NPP_DIRECTORY = 7
#CURRENT_LINE = 8
#CURRENT_COLUMN = 9
#NPP_FULL_FILE_PATH = 10
#GETFILENAMEATCURSOR = 11

#IDM_FILE_PRINTNOW = 1001
#IDM_FILEMENU_EXISTCMDPOSITION = 22
#IDM_VIEW_GOTO_ANOTHER_VIEW = 10001
#IDM_VIEW_CLONE_TO_ANOTHER_VIEW = 10002
#IDM_VIEW_GOTO_NEW_INSTANCE = 10003
#IDM_VIEW_LOAD_IN_NEW_INSTANCE = 10004
; #IDM_FORMAT_CONVERT = 200

#WM_USER = 1024
#NPPMSG = #WM_USER + 1000

#NPPM_GETCURRENTSCINTILLA = (#NPPMSG + 4)
#NPPM_GETCURRENTLANGTYPE = (#NPPMSG + 5)
#NPPM_SETCURRENTLANGTYPE = (#NPPMSG + 6)
#NPPM_GETNBOPENFILES = (#NPPMSG + 7)
#NPPM_GETOPENFILENAMES = (#NPPMSG + 8)
#NPPM_MODELESSDIALOG = (#NPPMSG + 12)
#NPPM_GETNBSESSIONFILES = (#NPPMSG + 13)
#NPPM_GETSESSIONFILES = (#NPPMSG + 14)
#NPPM_SAVESESSION = (#NPPMSG + 15)
#NPPM_SAVECURRENTSESSION = (#NPPMSG + 16)
#NPPM_GETOPENFILENAMESPRIMARY = (#NPPMSG + 17)
#NPPM_GETOPENFILENAMESSECOND = (#NPPMSG + 18)
#NPPM_CREATESCINTILLAHANDLE = (#NPPMSG + 20)
#NPPM_DESTROYSCINTILLAHANDLE = (#NPPMSG + 21)
#NPPM_GETNBUSERLANG = (#NPPMSG + 22)
#NPPM_GETCURRENTDOCINDEX = (#NPPMSG + 23)
#NPPM_SETSTATUSBAR = (#NPPMSG + 24)
#NPPM_GETMENUHANDLE = (#NPPMSG + 25)
#NPPM_ENCODESCI = (#NPPMSG + 26)
#NPPM_DECODESCI = (#NPPMSG + 27)
#NPPM_ACTIVATEDOC = (#NPPMSG + 28)
#NPPM_LAUNCHFINDINFILESDLG = (#NPPMSG + 29)
#NPPM_DMMSHOW = (#NPPMSG + 30)
#NPPM_DMMHIDE = (#NPPMSG + 31)
#NPPM_DMMUPDATEDISPINFO = (#NPPMSG + 32)
#NPPM_DMMREGASDCKDLG = (#NPPMSG + 33)
#NPPM_LOADSESSION = (#NPPMSG + 34)
#NPPM_DMMVIEWOTHERTAB = (#NPPMSG + 35)
#NPPM_RELOADFILE = (#NPPMSG + 36)
#NPPM_SWITCHTOFILE = (#NPPMSG + 37)
#NPPM_SAVECURRENTFILE = (#NPPMSG + 38)
#NPPM_SAVEALLFILES = (#NPPMSG + 39)
#NPPM_SETMENUITEMCHECK = (#NPPMSG + 40)
#NPPM_ADDTOOLBARICON = (#NPPMSG + 41)
#NPPM_GETWINDOWSVERSION = (#NPPMSG + 42)
#NPPM_DMMGETPLUGINHWNDBYNAME = (#NPPMSG + 43)
#NPPM_MAKECURRENTBUFFERDIRTY = (#NPPMSG + 44)
#NPPM_GETENABLETHEMETEXTUREFUNC = (#NPPMSG + 45)
#NPPM_GETPLUGINSCONFIGDIR = (#NPPMSG + 46)
#NPPM_MSGTOPLUGIN = (#NPPMSG + 47)
#NPPM_MENUCOMMAND = (#NPPMSG + 48)
#NPPM_TRIGGERTABBARCONTEXTMENU = (#NPPMSG + 49)
#NPPM_GETNPPVERSION = (#NPPMSG + 50)
#NPPM_HIDETABBAR = (#NPPMSG + 51)
#NPPM_ISTABBARHIDDEN = (#NPPMSG + 52)
#NPPM_GETPOSFROMBUFFERID = (#NPPMSG + 57)
#NPPM_GETFULLPATHFROMBUFFERID = (#NPPMSG + 58)
#NPPM_GETBUFFERIDFROMPOS = (#NPPMSG + 59)
#NPPM_GETCURRENTBUFFERID = (#NPPMSG + 60)
#NPPM_RELOADBUFFERID = (#NPPMSG + 61)
#NPPM_GETBUFFERLANGTYPE = (#NPPMSG + 64)
#NPPM_SETBUFFERLANGTYPE = (#NPPMSG + 65)
#NPPM_GETBUFFERENCODING = (#NPPMSG + 66)
#NPPM_SETBUFFERENCODING = (#NPPMSG + 67)
#NPPM_GETBUFFERFORMAT = (#NPPMSG + 68)
#NPPM_SETBUFFERFORMAT = (#NPPMSG + 69)
#NPPM_HIDETOOLBAR = (#NPPMSG + 70)
#NPPM_ISTOOLBARHIDDEN = (#NPPMSG + 71)
#NPPM_HIDEMENU = (#NPPMSG + 72)
#NPPM_ISMENUHIDDEN = (#NPPMSG + 73)
#NPPM_HIDESTATUSBAR = (#NPPMSG + 74)
#NPPM_ISSTATUSBARHIDDEN = (#NPPMSG + 75)
#NPPM_GETSHORTCUTBYCMDID = (#NPPMSG + 76)
#NPPM_DOOPEN = (#NPPMSG + 77)
#NPPM_SAVECURRENTFILEAS = (#NPPMSG + 78)
#NPPM_GETCURRENTNATIVELANGENCODING = (#NPPMSG + 79)
#NPPM_ALLOCATESUPPORTED = (#NPPMSG + 80)
#NPPM_ALLOCATECMDID = (#NPPMSG + 81)
#NPPM_ALLOCATEMARKER = (#NPPMSG + 82)
#NPPM_GETLANGUAGENAME = (#NPPMSG + 83)
#NPPM_GETLANGUAGEDESC = (#NPPMSG + 84)
#NPPM_SHOWDOCSWITCHER = (#NPPMSG + 85)
#NPPM_ISDOCSWITCHERSHOWN = (#NPPMSG + 86)
#NPPM_GETAPPDATAPLUGINSALLOWED = (#NPPMSG + 87)
#NPPM_GETCURRENTVIEW = (#NPPMSG + 88)
#NPPM_DOCSWITCHERDISABLECOLUMN = (#NPPMSG + 89)
#NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR = (#NPPMSG + 90)
#NPPM_GETEDITORDEFAULTBACKGROUNDCOLOR = (#NPPMSG + 91)
#NPPM_SETSMOOTHFONT = (#NPPMSG + 92)
#NPPM_SETEDITORBORDEREDGE = (#NPPMSG + 93)
#NPPM_SAVEFILE = (#NPPMSG + 94)
#NPPM_DISABLEAUTOUPDATE = (#NPPMSG + 95)
#NPPM_REMOVESHORTCUTBYCMDID = (#NPPMSG + 96)
#NPPM_GETPLUGINHOMEPATH = (#NPPMSG + 97)


#NPPN_FIRST = 1000
#NPPN_READY = (#NPPN_FIRST + 1)
#NPPN_TBMODIFICATION = (#NPPN_FIRST + 2)
#NPPN_FILEBEFORECLOSE = (#NPPN_FIRST + 3)
#NPPN_FILEOPENED = (#NPPN_FIRST + 4)
#NPPN_FILECLOSED = (#NPPN_FIRST + 5)
#NPPN_FILEBEFOREOPEN = (#NPPN_FIRST + 6)
#NPPN_FILEBEFORESAVE = (#NPPN_FIRST + 7)
#NPPN_FILESAVED = (#NPPN_FIRST + 8)
#NPPN_SHUTDOWN = (#NPPN_FIRST + 9)
#NPPN_BUFFERACTIVATED = (#NPPN_FIRST + 10)
#NPPN_LANGCHANGED = (#NPPN_FIRST + 11)
#NPPN_WORDSTYLESUPDATED = (#NPPN_FIRST + 12)
#NPPN_SHORTCUTREMAPPED = (#NPPN_FIRST + 13)
#NPPN_FILEBEFORELOAD = (#NPPN_FIRST + 14)
#NPPN_FILELOADFAILED = (#NPPN_FIRST + 15)
#NPPN_READONLYCHANGED = (#NPPN_FIRST + 16)
#NPPN_DOCORDERCHANGED = (#NPPN_FIRST + 17)
#NPPN_SNAPSHOTDIRTYFILELOADED = (#NPPN_FIRST + 18)
#NPPN_BEFORESHUTDOWN = (#NPPN_FIRST + 19)
#NPPN_CANCELSHUTDOWN = (#NPPN_FIRST + 20)
#NPPN_FILEBEFORERENAME = (#NPPN_FIRST + 21)
#NPPN_FILERENAMECANCEL = (#NPPN_FIRST + 22)
#NPPN_FILERENAMED = (#NPPN_FIRST + 23)
#NPPN_FILEBEFOREDELETE = (#NPPN_FIRST + 24)
#NPPN_FILEDELETEFAILED = (#NPPN_FIRST + 25)
#NPPN_FILEDELETED = (#NPPN_FIRST + 26)




#RUNCOMMAND_USER = (#WM_USER + 3000)
#NPPM_GETFULLCURRENTPATH = (#RUNCOMMAND_USER + #FULL_CURRENT_PATH)
#NPPM_GETCURRENTDIRECTORY = (#RUNCOMMAND_USER + #CURRENT_DIRECTORY)
#NPPM_GETFILENAME = (#RUNCOMMAND_USER + #FILE_NAME)
#NPPM_GETNAMEPART = (#RUNCOMMAND_USER + #NAME_PART)
#NPPM_GETEXTPART = (#RUNCOMMAND_USER + #EXT_PART)
#NPPM_GETCURRENTWORD = (#RUNCOMMAND_USER + #CURRENT_WORD)
#NPPM_GETNPPDIRECTORY = (#RUNCOMMAND_USER + #NPP_DIRECTORY)
#NPPM_GETFILENAMEATCURSOR = (#RUNCOMMAND_USER + #GETFILENAMEATCURSOR)
#NPPM_GETCURRENTLINE = (#RUNCOMMAND_USER + #CURRENT_LINE)
#NPPM_GETCURRENTCOLUMN = (#RUNCOMMAND_USER + #CURRENT_COLUMN)
#NPPM_GETNPPFULLFILEPATH = (#RUNCOMMAND_USER + #NPP_FULL_FILE_PATH)









#IDM = 40000
#IDM_FILE = (#IDM + 1000)
#IDM_FILE_NEW = (#IDM_FILE + 1)
#IDM_FILE_OPEN = (#IDM_FILE + 2)
#IDM_FILE_CLOSE = (#IDM_FILE + 3)
#IDM_FILE_CLOSEALL = (#IDM_FILE + 4)
#IDM_FILE_CLOSEALL_BUT_CURRENT = (#IDM_FILE + 5)
#IDM_FILE_SAVE = (#IDM_FILE + 6)
#IDM_FILE_SAVEALL = (#IDM_FILE + 7)
#IDM_FILE_SAVEAS = (#IDM_FILE + 8)
#IDM_FILE_CLOSEALL_TOLEFT = (#IDM_FILE + 9)
#IDM_FILE_PRINT = (#IDM_FILE + 10)
#IDM_FILE_EXIT = (#IDM_FILE + 11)
#IDM_FILE_LOADSESSION = (#IDM_FILE + 12)
#IDM_FILE_SAVESESSION = (#IDM_FILE + 13)
#IDM_FILE_RELOAD = (#IDM_FILE + 14)
#IDM_FILE_SAVECOPYAS = (#IDM_FILE + 15)
#IDM_FILE_DELETE = (#IDM_FILE + 16)
#IDM_FILE_RENAME = (#IDM_FILE + 17)
#IDM_FILE_CLOSEALL_TORIGHT = (#IDM_FILE + 18)
#IDM_FILE_OPEN_FOLDER = (#IDM_FILE + 19)
#IDM_FILE_OPEN_CMD = (#IDM_FILE + 20)
#IDM_FILE_RESTORELASTCLOSEDFILE = (#IDM_FILE + 21)
#IDM_FILE_OPENFOLDERASWORSPACE = (#IDM_FILE + 22)
#IDM_FILE_OPEN_DEFAULT_VIEWER = (#IDM_FILE + 23)
#IDM_EDIT = (#IDM + 2000)
#IDM_EDIT_CUT = (#IDM_EDIT + 1)
#IDM_EDIT_COPY = (#IDM_EDIT + 2)
#IDM_EDIT_UNDO = (#IDM_EDIT + 3)
#IDM_EDIT_REDO = (#IDM_EDIT + 4)
#IDM_EDIT_PASTE = (#IDM_EDIT + 5)
#IDM_EDIT_DELETE = (#IDM_EDIT + 6)
#IDM_EDIT_SELECTALL = (#IDM_EDIT + 7)
#IDM_EDIT_BEGINENDSELECT = (#IDM_EDIT + 20)
#IDM_EDIT_INS_TAB = (#IDM_EDIT + 8)
#IDM_EDIT_RMV_TAB = (#IDM_EDIT + 9)
#IDM_EDIT_DUP_LINE = (#IDM_EDIT + 10)
#IDM_EDIT_TRANSPOSE_LINE = (#IDM_EDIT + 11)
#IDM_EDIT_SPLIT_LINES = (#IDM_EDIT + 12)
#IDM_EDIT_JOIN_LINES = (#IDM_EDIT + 13)
#IDM_EDIT_LINE_UP = (#IDM_EDIT + 14)
#IDM_EDIT_LINE_DOWN = (#IDM_EDIT + 15)
#IDM_EDIT_UPPERCASE = (#IDM_EDIT + 16)
#IDM_EDIT_LOWERCASE = (#IDM_EDIT + 17)
#IDM_EDIT_PROPERCASE_FORCE = (#IDM_EDIT + 67)
#IDM_EDIT_PROPERCASE_BLEND = (#IDM_EDIT + 68)
#IDM_EDIT_SENTENCECASE_FORCE = (#IDM_EDIT + 69)
#IDM_EDIT_SENTENCECASE_BLEND = (#IDM_EDIT + 70)
#IDM_EDIT_INVERTCASE = (#IDM_EDIT + 71)
#IDM_EDIT_RANDOMCASE = (#IDM_EDIT + 72)
#IDM_EDIT_REMOVEEMPTYLINES = (#IDM_EDIT + 55)
#IDM_EDIT_REMOVEEMPTYLINESWITHBLANK = (#IDM_EDIT + 56)
#IDM_EDIT_BLANKLINEABOVECURRENT = (#IDM_EDIT + 57)
#IDM_EDIT_BLANKLINEBELOWCURRENT = (#IDM_EDIT + 58)
#IDM_EDIT_SORTLINES_LEXICOGRAPHIC_ASCENDING = (#IDM_EDIT + 59)
#IDM_EDIT_SORTLINES_LEXICOGRAPHIC_DESCENDING = (#IDM_EDIT + 60)
#IDM_EDIT_SORTLINES_INTEGER_ASCENDING = (#IDM_EDIT + 61)
#IDM_EDIT_SORTLINES_INTEGER_DESCENDING = (#IDM_EDIT + 62)
#IDM_EDIT_SORTLINES_DECIMALCOMMA_ASCENDING = (#IDM_EDIT + 63)
#IDM_EDIT_SORTLINES_DECIMALCOMMA_DESCENDING = (#IDM_EDIT + 64)
#IDM_EDIT_SORTLINES_DECIMALDOT_ASCENDING = (#IDM_EDIT + 65)
#IDM_EDIT_SORTLINES_DECIMALDOT_DESCENDING = (#IDM_EDIT + 66)
#IDM_EDIT_OPENASFILE = (#IDM_EDIT + 73)
#IDM_EDIT_OPENINFOLDER = (#IDM_EDIT + 74)
#IDM_EDIT_SEARCHONINTERNET = (#IDM_EDIT + 75)
#IDM_EDIT_CHANGESEARCHENGINE = (#IDM_EDIT + 76)
#IDM_MACRO_STARTRECORDINGMACRO = (#IDM_EDIT + 18)
#IDM_MACRO_STOPRECORDINGMACRO = (#IDM_EDIT + 19)
#IDM_MACRO_PLAYBACKRECORDEDMACRO = (#IDM_EDIT + 21)
#IDM_EDIT_BLOCK_COMMENT = (#IDM_EDIT + 22)
#IDM_EDIT_STREAM_COMMENT = (#IDM_EDIT + 23)
#IDM_EDIT_TRIMTRAILING = (#IDM_EDIT + 24)
#IDM_EDIT_TRIMLINEHEAD = (#IDM_EDIT + 42)
#IDM_EDIT_TRIM_BOTH = (#IDM_EDIT + 43)
#IDM_EDIT_EOL2WS = (#IDM_EDIT + 44)
#IDM_EDIT_TRIMALL = (#IDM_EDIT + 45)
#IDM_EDIT_TAB2SW = (#IDM_EDIT + 46)
#IDM_EDIT_SW2TAB_LEADING = (#IDM_EDIT + 53)
#IDM_EDIT_SW2TAB_ALL = (#IDM_EDIT + 54)
#IDM_EDIT_STREAM_UNCOMMENT = (#IDM_EDIT + 47)
#IDM_MACRO_SAVECURRENTMACRO = (#IDM_EDIT + 25)
#IDM_EDIT_RTL = (#IDM_EDIT + 26)
#IDM_EDIT_LTR = (#IDM_EDIT + 27)
#IDM_EDIT_SETREADONLY = (#IDM_EDIT + 28)
#IDM_EDIT_FULLPATHTOCLIP = (#IDM_EDIT + 29)
#IDM_EDIT_FILENAMETOCLIP = (#IDM_EDIT + 30)
#IDM_EDIT_CURRENTDIRTOCLIP = (#IDM_EDIT + 31)
#IDM_MACRO_RUNMULTIMACRODLG = (#IDM_EDIT + 32)
#IDM_EDIT_CLEARREADONLY = (#IDM_EDIT + 33)
#IDM_EDIT_COLUMNMODE = (#IDM_EDIT + 34)
#IDM_EDIT_BLOCK_COMMENT_SET = (#IDM_EDIT + 35)
#IDM_EDIT_BLOCK_UNCOMMENT = (#IDM_EDIT + 36)
#IDM_EDIT_COLUMNMODETIP = (#IDM_EDIT + 37)
#IDM_EDIT_PASTE_AS_HTML = (#IDM_EDIT + 38)
#IDM_EDIT_PASTE_AS_RTF = (#IDM_EDIT + 39)
#IDM_EDIT_COPY_BINARY = (#IDM_EDIT + 48)
#IDM_EDIT_CUT_BINARY = (#IDM_EDIT + 49)
#IDM_EDIT_PASTE_BINARY = (#IDM_EDIT + 50)
#IDM_EDIT_CHAR_PANEL = (#IDM_EDIT + 51)
#IDM_EDIT_CLIPBOARDHISTORY_PANEL = (#IDM_EDIT + 52)
#IDM_EDIT_AUTOCOMPLETE = (50000 + 0)
#IDM_EDIT_AUTOCOMPLETE_CURRENTFILE = (50000 + 1)
#IDM_EDIT_FUNCCALLTIP = (50000 + 2)
#IDM_EDIT_AUTOCOMPLETE_PATH = (50000 + 6)
#IDM_OPEN_ALL_RECENT_FILE = (#IDM_EDIT + 40)
#IDM_CLEAN_RECENT_FILE_LIST = (#IDM_EDIT + 41)
#IDM_SEARCH = (#IDM + 3000)
#IDM_SEARCH_FIND = (#IDM_SEARCH + 1)
#IDM_SEARCH_FINDNEXT = (#IDM_SEARCH + 2)
#IDM_SEARCH_REPLACE = (#IDM_SEARCH + 3)
#IDM_SEARCH_GOTOLINE = (#IDM_SEARCH + 4)
#IDM_SEARCH_TOGGLE_BOOKMARK = (#IDM_SEARCH + 5)
#IDM_SEARCH_NEXT_BOOKMARK = (#IDM_SEARCH + 6)
#IDM_SEARCH_PREV_BOOKMARK = (#IDM_SEARCH + 7)
#IDM_SEARCH_CLEAR_BOOKMARKS = (#IDM_SEARCH + 8)
#IDM_SEARCH_GOTOMATCHINGBRACE = (#IDM_SEARCH + 9)
#IDM_SEARCH_FINDPREV = (#IDM_SEARCH + 10)
#IDM_SEARCH_FINDINCREMENT = (#IDM_SEARCH + 11)
#IDM_SEARCH_FINDINFILES = (#IDM_SEARCH + 13)
#IDM_SEARCH_VOLATILE_FINDNEXT = (#IDM_SEARCH + 14)
#IDM_SEARCH_VOLATILE_FINDPREV = (#IDM_SEARCH + 15)
#IDM_SEARCH_CUTMARKEDLINES = (#IDM_SEARCH + 18)
#IDM_SEARCH_COPYMARKEDLINES = (#IDM_SEARCH + 19)
#IDM_SEARCH_PASTEMARKEDLINES = (#IDM_SEARCH + 20)
#IDM_SEARCH_DELETEMARKEDLINES = (#IDM_SEARCH + 21)
#IDM_SEARCH_MARKALLEXT1 = (#IDM_SEARCH + 22)
#IDM_SEARCH_UNMARKALLEXT1 = (#IDM_SEARCH + 23)
#IDM_SEARCH_MARKALLEXT2 = (#IDM_SEARCH + 24)
#IDM_SEARCH_UNMARKALLEXT2 = (#IDM_SEARCH + 25)
#IDM_SEARCH_MARKALLEXT3 = (#IDM_SEARCH + 26)
#IDM_SEARCH_UNMARKALLEXT3 = (#IDM_SEARCH + 27)
#IDM_SEARCH_MARKALLEXT4 = (#IDM_SEARCH + 28)
#IDM_SEARCH_UNMARKALLEXT4 = (#IDM_SEARCH + 29)
#IDM_SEARCH_MARKALLEXT5 = (#IDM_SEARCH + 30)
#IDM_SEARCH_UNMARKALLEXT5 = (#IDM_SEARCH + 31)
#IDM_SEARCH_CLEARALLMARKS = (#IDM_SEARCH + 32)
#IDM_SEARCH_GOPREVMARKER1 = (#IDM_SEARCH + 33)
#IDM_SEARCH_GOPREVMARKER2 = (#IDM_SEARCH + 34)
#IDM_SEARCH_GOPREVMARKER3 = (#IDM_SEARCH + 35)
#IDM_SEARCH_GOPREVMARKER4 = (#IDM_SEARCH + 36)
#IDM_SEARCH_GOPREVMARKER5 = (#IDM_SEARCH + 37)
#IDM_SEARCH_GOPREVMARKER_DEF = (#IDM_SEARCH + 38)
#IDM_SEARCH_GONEXTMARKER1 = (#IDM_SEARCH + 39)
#IDM_SEARCH_GONEXTMARKER2 = (#IDM_SEARCH + 40)
#IDM_SEARCH_GONEXTMARKER3 = (#IDM_SEARCH + 41)
#IDM_SEARCH_GONEXTMARKER4 = (#IDM_SEARCH + 42)
#IDM_SEARCH_GONEXTMARKER5 = (#IDM_SEARCH + 43)
#IDM_SEARCH_GONEXTMARKER_DEF = (#IDM_SEARCH + 44)
#IDM_FOCUS_ON_FOUND_RESULTS = (#IDM_SEARCH + 45)
#IDM_SEARCH_GOTONEXTFOUND = (#IDM_SEARCH + 46)
#IDM_SEARCH_GOTOPREVFOUND = (#IDM_SEARCH + 47)
#IDM_SEARCH_SETANDFINDNEXT = (#IDM_SEARCH + 48)
#IDM_SEARCH_SETANDFINDPREV = (#IDM_SEARCH + 49)
#IDM_SEARCH_INVERSEMARKS = (#IDM_SEARCH + 50)
#IDM_SEARCH_DELETEUNMARKEDLINES = (#IDM_SEARCH + 51)
#IDM_SEARCH_FINDCHARINRANGE = (#IDM_SEARCH + 52)
#IDM_SEARCH_SELECTMATCHINGBRACES = (#IDM_SEARCH + 53)
#IDM_SEARCH_MARK = (#IDM_SEARCH + 54)
#IDM_MISC = (#IDM + 3500)
#IDM_FILESWITCHER_FILESCLOSE = (#IDM_MISC + 1)
#IDM_FILESWITCHER_FILESCLOSEOTHERS = (#IDM_MISC + 2)
#IDM_VIEW = (#IDM + 4000)
; #IDM_VIEW_TOOLBAR_HIDE = (#IDM_VIEW + 1)
#IDM_VIEW_TOOLBAR_REDUCE = (#IDM_VIEW + 2)
#IDM_VIEW_TOOLBAR_ENLARGE = (#IDM_VIEW + 3)
#IDM_VIEW_TOOLBAR_STANDARD = (#IDM_VIEW + 4)
#IDM_VIEW_REDUCETABBAR = (#IDM_VIEW + 5)
#IDM_VIEW_LOCKTABBAR = (#IDM_VIEW + 6)
#IDM_VIEW_DRAWTABBAR_TOPBAR = (#IDM_VIEW + 7)
#IDM_VIEW_DRAWTABBAR_INACIVETAB = (#IDM_VIEW + 8)
#IDM_VIEW_POSTIT = (#IDM_VIEW + 9)
#IDM_VIEW_TOGGLE_FOLDALL = (#IDM_VIEW + 10)
; #IDM_VIEW_USER_DLG = (#IDM_VIEW + 11)
#IDM_VIEW_LINENUMBER = (#IDM_VIEW + 12)
#IDM_VIEW_SYMBOLMARGIN = (#IDM_VIEW + 13)
#IDM_VIEW_FOLDERMAGIN = (#IDM_VIEW + 14)
#IDM_VIEW_FOLDERMAGIN_SIMPLE = (#IDM_VIEW + 15)
#IDM_VIEW_FOLDERMAGIN_ARROW = (#IDM_VIEW + 16)
#IDM_VIEW_FOLDERMAGIN_CIRCLE = (#IDM_VIEW + 17)
#IDM_VIEW_FOLDERMAGIN_BOX = (#IDM_VIEW + 18)
#IDM_VIEW_ALL_CHARACTERS = (#IDM_VIEW + 19)
#IDM_VIEW_INDENT_GUIDE = (#IDM_VIEW + 20)
#IDM_VIEW_CURLINE_HILITING = (#IDM_VIEW + 21)
#IDM_VIEW_WRAP = (#IDM_VIEW + 22)
#IDM_VIEW_ZOOMIN = (#IDM_VIEW + 23)
#IDM_VIEW_ZOOMOUT = (#IDM_VIEW + 24)
#IDM_VIEW_TAB_SPACE = (#IDM_VIEW + 25)
#IDM_VIEW_EOL = (#IDM_VIEW + 26)
#IDM_VIEW_EDGELINE = (#IDM_VIEW + 27)
#IDM_VIEW_EDGEBACKGROUND = (#IDM_VIEW + 28)
#IDM_VIEW_TOGGLE_UNFOLDALL = (#IDM_VIEW + 29)
#IDM_VIEW_FOLD_CURRENT = (#IDM_VIEW + 30)
#IDM_VIEW_UNFOLD_CURRENT = (#IDM_VIEW + 31)
#IDM_VIEW_FULLSCREENTOGGLE = (#IDM_VIEW + 32)
#IDM_VIEW_ZOOMRESTORE = (#IDM_VIEW + 33)
#IDM_VIEW_ALWAYSONTOP = (#IDM_VIEW + 34)
#IDM_VIEW_SYNSCROLLV = (#IDM_VIEW + 35)
#IDM_VIEW_SYNSCROLLH = (#IDM_VIEW + 36)
#IDM_VIEW_EDGENONE = (#IDM_VIEW + 37)
#IDM_VIEW_DRAWTABBAR_CLOSEBOTTUN = (#IDM_VIEW + 38)
#IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE = (#IDM_VIEW + 39)
#IDM_VIEW_REFRESHTABAR = (#IDM_VIEW + 40)
#IDM_VIEW_WRAP_SYMBOL = (#IDM_VIEW + 41)
#IDM_VIEW_HIDELINES = (#IDM_VIEW + 42)
#IDM_VIEW_DRAWTABBAR_VERTICAL = (#IDM_VIEW + 43)
#IDM_VIEW_DRAWTABBAR_MULTILINE = (#IDM_VIEW + 44)
#IDM_VIEW_DOCCHANGEMARGIN = (#IDM_VIEW + 45)
#IDM_VIEW_LWDEF = (#IDM_VIEW + 46)
#IDM_VIEW_LWALIGN = (#IDM_VIEW + 47)
#IDM_VIEW_LWINDENT = (#IDM_VIEW + 48)
#IDM_VIEW_SUMMARY = (#IDM_VIEW + 49)
#IDM_VIEW_FOLD = (#IDM_VIEW + 50)
#IDM_VIEW_FOLD_1 = (#IDM_VIEW_FOLD + 1)
#IDM_VIEW_FOLD_2 = (#IDM_VIEW_FOLD + 2)
#IDM_VIEW_FOLD_3 = (#IDM_VIEW_FOLD + 3)
#IDM_VIEW_FOLD_4 = (#IDM_VIEW_FOLD + 4)
#IDM_VIEW_FOLD_5 = (#IDM_VIEW_FOLD + 5)
#IDM_VIEW_FOLD_6 = (#IDM_VIEW_FOLD + 6)
#IDM_VIEW_FOLD_7 = (#IDM_VIEW_FOLD + 7)
#IDM_VIEW_FOLD_8 = (#IDM_VIEW_FOLD + 8)
#IDM_VIEW_UNFOLD = (#IDM_VIEW + 60)
#IDM_VIEW_UNFOLD_1 = (#IDM_VIEW_UNFOLD + 1)
#IDM_VIEW_UNFOLD_2 = (#IDM_VIEW_UNFOLD + 2)
#IDM_VIEW_UNFOLD_3 = (#IDM_VIEW_UNFOLD + 3)
#IDM_VIEW_UNFOLD_4 = (#IDM_VIEW_UNFOLD + 4)
#IDM_VIEW_UNFOLD_5 = (#IDM_VIEW_UNFOLD + 5)
#IDM_VIEW_UNFOLD_6 = (#IDM_VIEW_UNFOLD + 6)
#IDM_VIEW_UNFOLD_7 = (#IDM_VIEW_UNFOLD + 7)
#IDM_VIEW_UNFOLD_8 = (#IDM_VIEW_UNFOLD + 8)
#IDM_VIEW_FILESWITCHER_PANEL = (#IDM_VIEW + 70)
#IDM_VIEW_SWITCHTO_OTHER_VIEW = (#IDM_VIEW + 72)
#IDM_EXPORT_FUNC_LIST_AND_QUIT = (#IDM_VIEW + 73)
#IDM_VIEW_DOC_MAP = (#IDM_VIEW + 80)
#IDM_VIEW_PROJECT_PANEL_1 = (#IDM_VIEW + 81)
#IDM_VIEW_PROJECT_PANEL_2 = (#IDM_VIEW + 82)
#IDM_VIEW_PROJECT_PANEL_3 = (#IDM_VIEW + 83)
#IDM_VIEW_FUNC_LIST = (#IDM_VIEW + 84)
#IDM_VIEW_FILEBROWSER = (#IDM_VIEW + 85)
#IDM_VIEW_TAB1 = (#IDM_VIEW + 86)
#IDM_VIEW_TAB2 = (#IDM_VIEW + 87)
#IDM_VIEW_TAB3 = (#IDM_VIEW + 88)
#IDM_VIEW_TAB4 = (#IDM_VIEW + 89)
#IDM_VIEW_TAB5 = (#IDM_VIEW + 90)
#IDM_VIEW_TAB6 = (#IDM_VIEW + 91)
#IDM_VIEW_TAB7 = (#IDM_VIEW + 92)
#IDM_VIEW_TAB8 = (#IDM_VIEW + 93)
#IDM_VIEW_TAB9 = (#IDM_VIEW + 94)
#IDM_VIEW_TAB_NEXT = (#IDM_VIEW + 95)
#IDM_VIEW_TAB_PREV = (#IDM_VIEW + 96)
#IDM_VIEW_MONITORING = (#IDM_VIEW + 97)
#IDM_VIEW_TAB_MOVEFORWARD = (#IDM_VIEW + 98)
#IDM_VIEW_TAB_MOVEBACKWARD = (#IDM_VIEW + 99)
#IDM_FORMAT = (#IDM + 5000)
#IDM_FORMAT_TODOS = (#IDM_FORMAT + 1)
#IDM_FORMAT_TOUNIX = (#IDM_FORMAT + 2)
#IDM_FORMAT_TOMAC = (#IDM_FORMAT + 3)
#IDM_FORMAT_ANSI = (#IDM_FORMAT + 4)
#IDM_FORMAT_UTF_8 = (#IDM_FORMAT + 5)
#IDM_FORMAT_UCS_2BE = (#IDM_FORMAT + 6)
#IDM_FORMAT_UCS_2LE = (#IDM_FORMAT + 7)
#IDM_FORMAT_AS_UTF_8 = (#IDM_FORMAT + 8)
#IDM_FORMAT_CONV2_ANSI = (#IDM_FORMAT + 9)
#IDM_FORMAT_CONV2_AS_UTF_8 = (#IDM_FORMAT + 10)
#IDM_FORMAT_CONV2_UTF_8 = (#IDM_FORMAT + 11)
#IDM_FORMAT_CONV2_UCS_2BE = (#IDM_FORMAT + 12)
#IDM_FORMAT_CONV2_UCS_2LE = (#IDM_FORMAT + 13)
#IDM_FORMAT_ENCODE = (#IDM_FORMAT + 20)
#IDM_FORMAT_WIN_1250 = (#IDM_FORMAT_ENCODE + 0)
#IDM_FORMAT_WIN_1251 = (#IDM_FORMAT_ENCODE + 1)
#IDM_FORMAT_WIN_1252 = (#IDM_FORMAT_ENCODE + 2)
#IDM_FORMAT_WIN_1253 = (#IDM_FORMAT_ENCODE + 3)
#IDM_FORMAT_WIN_1254 = (#IDM_FORMAT_ENCODE + 4)
#IDM_FORMAT_WIN_1255 = (#IDM_FORMAT_ENCODE + 5)
#IDM_FORMAT_WIN_1256 = (#IDM_FORMAT_ENCODE + 6)
#IDM_FORMAT_WIN_1257 = (#IDM_FORMAT_ENCODE + 7)
#IDM_FORMAT_WIN_1258 = (#IDM_FORMAT_ENCODE + 8)
#IDM_FORMAT_ISO_8859_1 = (#IDM_FORMAT_ENCODE + 9)
#IDM_FORMAT_ISO_8859_2 = (#IDM_FORMAT_ENCODE + 10)
#IDM_FORMAT_ISO_8859_3 = (#IDM_FORMAT_ENCODE + 11)
#IDM_FORMAT_ISO_8859_4 = (#IDM_FORMAT_ENCODE + 12)
#IDM_FORMAT_ISO_8859_5 = (#IDM_FORMAT_ENCODE + 13)
#IDM_FORMAT_ISO_8859_6 = (#IDM_FORMAT_ENCODE + 14)
#IDM_FORMAT_ISO_8859_7 = (#IDM_FORMAT_ENCODE + 15)
#IDM_FORMAT_ISO_8859_8 = (#IDM_FORMAT_ENCODE + 16)
#IDM_FORMAT_ISO_8859_9 = (#IDM_FORMAT_ENCODE + 17)
; #IDM_FORMAT_ISO_8859_10 = (#IDM_FORMAT_ENCODE + 18)
; #IDM_FORMAT_ISO_8859_11 = (#IDM_FORMAT_ENCODE + 19)
#IDM_FORMAT_ISO_8859_13 = (#IDM_FORMAT_ENCODE + 20)
#IDM_FORMAT_ISO_8859_14 = (#IDM_FORMAT_ENCODE + 21)
#IDM_FORMAT_ISO_8859_15 = (#IDM_FORMAT_ENCODE + 22)
; #IDM_FORMAT_ISO_8859_16 = (#IDM_FORMAT_ENCODE + 23)
#IDM_FORMAT_DOS_437 = (#IDM_FORMAT_ENCODE + 24)
#IDM_FORMAT_DOS_720 = (#IDM_FORMAT_ENCODE + 25)
#IDM_FORMAT_DOS_737 = (#IDM_FORMAT_ENCODE + 26)
#IDM_FORMAT_DOS_775 = (#IDM_FORMAT_ENCODE + 27)
#IDM_FORMAT_DOS_850 = (#IDM_FORMAT_ENCODE + 28)
#IDM_FORMAT_DOS_852 = (#IDM_FORMAT_ENCODE + 29)
#IDM_FORMAT_DOS_855 = (#IDM_FORMAT_ENCODE + 30)
#IDM_FORMAT_DOS_857 = (#IDM_FORMAT_ENCODE + 31)
#IDM_FORMAT_DOS_858 = (#IDM_FORMAT_ENCODE + 32)
#IDM_FORMAT_DOS_860 = (#IDM_FORMAT_ENCODE + 33)
#IDM_FORMAT_DOS_861 = (#IDM_FORMAT_ENCODE + 34)
#IDM_FORMAT_DOS_862 = (#IDM_FORMAT_ENCODE + 35)
#IDM_FORMAT_DOS_863 = (#IDM_FORMAT_ENCODE + 36)
#IDM_FORMAT_DOS_865 = (#IDM_FORMAT_ENCODE + 37)
#IDM_FORMAT_DOS_866 = (#IDM_FORMAT_ENCODE + 38)
#IDM_FORMAT_DOS_869 = (#IDM_FORMAT_ENCODE + 39)
#IDM_FORMAT_BIG5 = (#IDM_FORMAT_ENCODE + 40)
#IDM_FORMAT_GB2312 = (#IDM_FORMAT_ENCODE + 41)
#IDM_FORMAT_SHIFT_JIS = (#IDM_FORMAT_ENCODE + 42)
#IDM_FORMAT_KOREAN_WIN = (#IDM_FORMAT_ENCODE + 43)
#IDM_FORMAT_EUC_KR = (#IDM_FORMAT_ENCODE + 44)
#IDM_FORMAT_TIS_620 = (#IDM_FORMAT_ENCODE + 45)
#IDM_FORMAT_MAC_CYRILLIC = (#IDM_FORMAT_ENCODE + 46)
#IDM_FORMAT_KOI8U_CYRILLIC = (#IDM_FORMAT_ENCODE + 47)
#IDM_FORMAT_KOI8R_CYRILLIC = (#IDM_FORMAT_ENCODE + 48)
#IDM_LANG = (#IDM + 6000)
#IDM_LANGSTYLE_CONFIG_DLG = (#IDM_LANG + 1)
#IDM_LANG_C = (#IDM_LANG + 2)
#IDM_LANG_CPP = (#IDM_LANG + 3)
#IDM_LANG_JAVA = (#IDM_LANG + 4)
#IDM_LANG_HTML = (#IDM_LANG + 5)
#IDM_LANG_XML = (#IDM_LANG + 6)
#IDM_LANG_JS = (#IDM_LANG + 7)
#IDM_LANG_PHP = (#IDM_LANG + 8)
#IDM_LANG_ASP = (#IDM_LANG + 9)
#IDM_LANG_CSS = (#IDM_LANG + 10)
#IDM_LANG_PASCAL = (#IDM_LANG + 11)
#IDM_LANG_PYTHON = (#IDM_LANG + 12)
#IDM_LANG_PERL = (#IDM_LANG + 13)
#IDM_LANG_OBJC = (#IDM_LANG + 14)
#IDM_LANG_ASCII = (#IDM_LANG + 15)
#IDM_LANG_TEXT = (#IDM_LANG + 16)
#IDM_LANG_RC = (#IDM_LANG + 17)
#IDM_LANG_MAKEFILE = (#IDM_LANG + 18)
#IDM_LANG_INI = (#IDM_LANG + 19)
#IDM_LANG_SQL = (#IDM_LANG + 20)
#IDM_LANG_VB = (#IDM_LANG + 21)
#IDM_LANG_BATCH = (#IDM_LANG + 22)
#IDM_LANG_CS = (#IDM_LANG + 23)
#IDM_LANG_LUA = (#IDM_LANG + 24)
#IDM_LANG_TEX = (#IDM_LANG + 25)
#IDM_LANG_FORTRAN = (#IDM_LANG + 26)
#IDM_LANG_BASH = (#IDM_LANG + 27)
#IDM_LANG_FLASH = (#IDM_LANG + 28)
#IDM_LANG_NSIS = (#IDM_LANG + 29)
#IDM_LANG_TCL = (#IDM_LANG + 30)
#IDM_LANG_LISP = (#IDM_LANG + 31)
#IDM_LANG_SCHEME = (#IDM_LANG + 32)
#IDM_LANG_ASM = (#IDM_LANG + 33)
#IDM_LANG_DIFF = (#IDM_LANG + 34)
#IDM_LANG_PROPS = (#IDM_LANG + 35)
#IDM_LANG_PS = (#IDM_LANG + 36)
#IDM_LANG_RUBY = (#IDM_LANG + 37)
#IDM_LANG_SMALLTALK = (#IDM_LANG + 38)
#IDM_LANG_VHDL = (#IDM_LANG + 39)
#IDM_LANG_CAML = (#IDM_LANG + 40)
#IDM_LANG_KIX = (#IDM_LANG + 41)
#IDM_LANG_ADA = (#IDM_LANG + 42)
#IDM_LANG_VERILOG = (#IDM_LANG + 43)
#IDM_LANG_AU3 = (#IDM_LANG + 44)
#IDM_LANG_MATLAB = (#IDM_LANG + 45)
#IDM_LANG_HASKELL = (#IDM_LANG + 46)
#IDM_LANG_INNO = (#IDM_LANG + 47)
#IDM_LANG_CMAKE = (#IDM_LANG + 48)
#IDM_LANG_YAML = (#IDM_LANG + 49)
#IDM_LANG_COBOL = (#IDM_LANG + 50)
#IDM_LANG_D = (#IDM_LANG + 51)
#IDM_LANG_GUI4CLI = (#IDM_LANG + 52)
#IDM_LANG_POWERSHELL = (#IDM_LANG + 53)
#IDM_LANG_R = (#IDM_LANG + 54)
#IDM_LANG_JSP = (#IDM_LANG + 55)
#IDM_LANG_COFFEESCRIPT = (#IDM_LANG + 56)
#IDM_LANG_JSON = (#IDM_LANG + 57)
#IDM_LANG_FORTRAN_77 = (#IDM_LANG + 58)
#IDM_LANG_BAANC = (#IDM_LANG + 59)
#IDM_LANG_SREC = (#IDM_LANG + 60)
#IDM_LANG_IHEX = (#IDM_LANG + 61)
#IDM_LANG_TEHEX = (#IDM_LANG + 62)
#IDM_LANG_SWIFT = (#IDM_LANG + 63)
#IDM_LANG_ASN1 = (#IDM_LANG + 64)
#IDM_LANG_AVS = (#IDM_LANG + 65)
#IDM_LANG_BLITZBASIC = (#IDM_LANG + 66)
#IDM_LANG_PUREBASIC = (#IDM_LANG + 67)
#IDM_LANG_FREEBASIC = (#IDM_LANG + 68)
#IDM_LANG_CSOUND = (#IDM_LANG + 69)
#IDM_LANG_ERLANG = (#IDM_LANG + 70)
#IDM_LANG_ESCRIPT = (#IDM_LANG + 71)
#IDM_LANG_FORTH = (#IDM_LANG + 72)
#IDM_LANG_LATEX = (#IDM_LANG + 73)
#IDM_LANG_MMIXAL = (#IDM_LANG + 74)
#IDM_LANG_NIMROD = (#IDM_LANG + 75)
#IDM_LANG_NNCRONTAB = (#IDM_LANG + 76)
#IDM_LANG_OSCRIPT = (#IDM_LANG + 77)
#IDM_LANG_REBOL = (#IDM_LANG + 78)
#IDM_LANG_REGISTRY = (#IDM_LANG + 79)
#IDM_LANG_RUST = (#IDM_LANG + 80)
#IDM_LANG_SPICE = (#IDM_LANG + 81)
#IDM_LANG_TXT2TAGS = (#IDM_LANG + 82)
#IDM_LANG_VISUALPROLOG = (#IDM_LANG + 83)
#IDM_LANG_EXTERNAL = (#IDM_LANG + 165)
#IDM_LANG_EXTERNAL_LIMIT = (#IDM_LANG + 179)
#IDM_LANG_USER = (#IDM_LANG + 180)
#IDM_LANG_USER_LIMIT = (#IDM_LANG + 210)
#IDM_LANG_USER_DLG = (#IDM_LANG + 250)
#IDM_ABOUT = (#IDM  + 7000)
#IDM_HOMESWEETHOME = (#IDM_ABOUT  + 1)
#IDM_PROJECTPAGE = (#IDM_ABOUT  + 2)
#IDM_ONLINEHELP = (#IDM_ABOUT  + 3)
#IDM_FORUM = (#IDM_ABOUT  + 4)
#IDM_PLUGINSHOME = (#IDM_ABOUT  + 5)
#IDM_UPDATE_NPP = (#IDM_ABOUT  + 6)
#IDM_WIKIFAQ = (#IDM_ABOUT  + 7)
#IDM_HELP = (#IDM_ABOUT  + 8)
#IDM_CONFUPDATERPROXY = (#IDM_ABOUT  + 9)
#IDM_CMDLINEARGUMENTS = (#IDM_ABOUT  + 10)
#IDM_ONLINESUPPORT = (#IDM_ABOUT  + 11)
#IDM_DEBUGINFO = (#IDM_ABOUT  + 12)
#IDM_SETTING = (#IDM + 8000)
; #IDM_SETTING_TAB_SIZE = (#IDM_SETTING + 1)
; #IDM_SETTING_TAB_REPLCESPACE = (#IDM_SETTING + 2)
; #IDM_SETTING_HISTORY_SIZE = (#IDM_SETTING + 3)
; #IDM_SETTING_EDGE_SIZE = (#IDM_SETTING + 4)
#IDM_SETTING_IMPORTPLUGIN = (#IDM_SETTING + 5)
#IDM_SETTING_IMPORTSTYLETHEMS = (#IDM_SETTING + 6)
#IDM_SETTING_TRAYICON = (#IDM_SETTING + 8)
#IDM_SETTING_SHORTCUT_MAPPER = (#IDM_SETTING + 9)
#IDM_SETTING_REMEMBER_LAST_SESSION = (#IDM_SETTING + 10)
#IDM_SETTING_PREFERECE = (#IDM_SETTING + 11)
#IDM_SETTING_PLUGINADM = (#IDM_SETTING + 15)
#IDM_SETTING_SHORTCUT_MAPPER_MACRO = (#IDM_SETTING + 16)
#IDM_SETTING_SHORTCUT_MAPPER_RUN = (#IDM_SETTING + 17)
#IDM_SETTING_EDITCONTEXTMENU = (#IDM_SETTING + 18)
#IDM_TOOL = (#IDM + 8500)
#IDM_TOOL_MD5_GENERATE = (#IDM_TOOL + 1)
#IDM_TOOL_MD5_GENERATEFROMFILE = (#IDM_TOOL + 2)
#IDM_TOOL_MD5_GENERATEINTOCLIPBOARD = (#IDM_TOOL + 3)
#IDM_TOOL_SHA256_GENERATE = (#IDM_TOOL + 4)
#IDM_TOOL_SHA256_GENERATEFROMFILE = (#IDM_TOOL + 5)
#IDM_TOOL_SHA256_GENERATEINTOCLIPBOARD = (#IDM_TOOL + 6)
#IDM_EXECUTE = (#IDM + 9000)
#IDM_SYSTRAYPOPUP = (#IDM + 3100)
#IDM_SYSTRAYPOPUP_ACTIVATE = (#IDM_SYSTRAYPOPUP + 1)
#IDM_SYSTRAYPOPUP_NEWDOC = (#IDM_SYSTRAYPOPUP + 2)
#IDM_SYSTRAYPOPUP_NEW_AND_PASTE = (#IDM_SYSTRAYPOPUP + 3)
#IDM_SYSTRAYPOPUP_OPENFILE = (#IDM_SYSTRAYPOPUP + 4)
#IDM_SYSTRAYPOPUP_CLOSE = (#IDM_SYSTRAYPOPUP + 5)

Code: Select all

How to get constants?

Open the file "Notepad_plus_msgs.h"

Replacement using regular expression
#define\h+?((?:NPP[MN]|IDM)_[A-Z_\d]+?)\h*?\(([A-Z_\d]+?\h*?\+\h*?[A-Z_\d]+?)\)
#\1 = (#\2)
We get strings like a constant format in PureBasic

Search for constants in the previous result using group output
#(?:NPP[MN]|IDM)_[A-Z_\d]+?\h*?=\h*?\(#[A-Z_\d]+?\h*?\+\h*?[A-Z_\d]+?\)

we get 121 constant

Repeat the same with the file "menuCmdID.h" and we get 446 constants

We repeat the same 2-step search for both files again.
#define\h+?([A-Z_\d]+?)\h+?(\d+)
#\1 = \2

#[A-Z_\d]+? = \d+
Notepad++ plugin_template.pb

Code: Select all

; Все плаги сейчас в юникоде, поэтому этот исходник в юникоде
EnableExplicit

Structure NppData Align #PB_Structure_AlignC
	*_nppHandle
	*_scintillaMainHandle
	*_scintillaSecondHandle
EndStructure

Structure ShortcutKey Align #PB_Structure_AlignC
	_isCtrl.b
	_isAlt.b
	_isShift.b
	_key.b
EndStructure

Structure FuncItem Align #PB_Structure_AlignC
	_itemName.s{64}
	*_pFunc
	_cmdID.l ; тут я поменял i на l, иначе в x64 не работает
	_init2Check.b
	*_pShortcutKey.ShortcutKey
EndStructure

; ==================================
; 2 Обязательные процедуры DLL (AttachProcess, DetachProcess)
; ==================================
Declare item1()
Declare item2()
Declare itemError()
Declare NppMenuCommand(command)
Declare GetCurrentScintilla()
Declare ScintillaMsg(*point, msg, param1 = 0, param2 = 0)

; Константы NPP для вызовов функций
; Описание команд и уведомлений NPP http://docs.notepad-plus-plus.org/index.php/Messages_And_Notifications
; числовые значения констант NPP https://github.com/editorconfig/editorconfig-notepad-plus-plus/blob/master/src/Notepad_plus_msgs.hpp
; числовые значения констант Scintilla https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/scintilla/include/Scintilla.h

XIncludeFile "NNP_Const.pb"
;{
; Константы для получения экземпляра Scintilla
; #WM_USER = 1024
; #NPPMSG = #WM_USER + 1000
; #NPPM_GETCURRENTSCINTILLA = #NPPMSG + 4 ; для получения экземпляра Scintilla в режиме отображения сразу двух документов
; #NPPM_SETMENUITEMCHECK = #NPPMSG + 40 ; для установки / снятия галки с пункта меню

; Константы вызова меню
; #NPPM_MENUCOMMAND = 2024 + 48
; #IDM = 40000
; #IDM_SEARCH = (#IDM + 3000)
; #IDM_SEARCH_TOGGLE_BOOKMARK = (#IDM_SEARCH + 5) ; Переключить закладку в строке
; #IDM_SEARCH_REPLACE = (#IDM_SEARCH + 3)		  ; показать окно поиска изамены

; Константы чтобы получить имя файла
; #FILE_NAME = 3
; #RUNCOMMAND_USER = (#WM_USER + 3000)
; #NPPM_GETFILENAME = #RUNCOMMAND_USER + #FILE_NAME

; Константы уведомления
; #NPPN_FIRST = 1000
; #NPPN_BUFFERACTIVATED = (#NPPN_FIRST + 10) ; пполезное уведомление при смене вкладки
; #NPPN_READY = (#NPPN_FIRST + 1)			   ; уведомление что NPP и плагины загружены и можно обрабатывать уведомления
;}

; глобальные константы
Global *sciptr, post_processing = 1
; *sciptr - указатель Scintilla текущего документа
Global NppData.NppData ; создаём структуру NppData (3 дескриптора, NPP, Scintilla1, Scintilla2)
; Global PluginName.s = "Plugin name" ; Имя плагина, отображается в меню плагинов, см. getName() ниже

PrototypeC ScintillaDirect(sciptr, msg, param1 = 0, param2 = 0)
Global Scintilla.ScintillaDirect = 0

; Начало блока: фатальная ошибка
; Это чтобы при фатальных ошибках выводить осмысленное сообщение с указанием строки, файла, типа ошибки
; Добавилось 4 Кб к DLL (зависит от числа команд/строк в исходнике), по крайней мере на время теста полезно.
Procedure FatalError()
	Protected Result.s

	Result = "Ошибка программы"
; 	Result = "Program error"

	CompilerIf #PB_Compiler_LineNumbering
		Result + " в строке " + ErrorLine() + ", файла: " + GetFilePart(ErrorFile())
; 		Result + " in line " + ErrorLine() + ", of file: " + GetFilePart(ErrorFile())
	CompilerElse
		CompilerError "Включите в настройках компилятора поддержку OnError"
; 		CompilerError "Turn on compiler support OnError"
	CompilerEndIf

	Result + Chr(10) + Chr(10) + "Ошибка типа: " + Chr(34) + ErrorMessage() + Chr(34)
; 	Result + Chr(10) + Chr(10) + "Type Error: " + Chr(34) + ErrorMessage() + Chr(34)
	MessageRequester("Ошибка программы!", Result, #MB_OK | #MB_ICONERROR)
; 	MessageRequester("Program error!", Result, #MB_OK | #MB_ICONERROR)
EndProcedure
; Конец блока: фатальная ошибка

ProcedureDLL AttachProcess(Instance)

	; << Когда Notepad++ задействовал этот плагин при запуске Notepad++ >>
	; Ваш код инициализации здесь

	OnErrorCall(@FatalError()) ; вызывает процедуру FatalError(), если произойдёт ошибка. Отсюда начинаем использовать её.


; 	If Scintilla
		Global Dim FuncsArray.FuncItem(2)   ; массив FuncsArray по структуре FuncItem, являющейся пунктами меню
		With FuncsArray(0)					; 1) задаём элементы структуры, это будет пункт меню с горячей клавишей (которая не работает)
			\_itemName = "item 1"			; Задаём имя пункта, отображается в меню плагина, дочерний к "Plugin name"
			\_pFunc = @item1()				; Задаём имя процедуры item1, которая будет выполнятся при клике на пункте
			\_pShortcutKey = AllocateStructure(ShortcutKey) ; выделяем память для структуры горячей клавиши
			\_pShortcutKey\_isCtrl = #True				  ; Будет ли нажат Ctrl (#True / #False)
			\_pShortcutKey\_isShift = #True				  ; Будет ли нажат Shift (#True / #False)
			\_pShortcutKey\_isAlt = #True					  ; Будет ли нажат Alt (#True / #False)
			\_pShortcutKey\_key = #VK_NEXT				  ; Собственно клавиша
		EndWith
		; Делаем аналог предыдущего пункта
		With FuncsArray(1)
			\_itemName = "item 2" ; Задаём имя 2-го пункта
			\_pFunc = @item2()	  ; Задаём имя процедуры item2 для 2-го пункта
	; 		\_init2Check = #True ; Здесь задаём будет ли элемент отмечен галкой,
	; 		\_init2Check = #False ; но это не значит, что изменение этого поля структуры будет влиять, см. ниже NPPM_SETMENUITEMCHECK
								  ; клавиши не создаём, они всё равно не работают
		EndWith
	; 	With FuncsArray(2) ; Пункт-разделитель, учитывайте индексы
	; 		\_itemName = ""
	; 	EndWith
	; Пунктов можно делать сколько угодно, просто добавляем индекс к item, к элементу массива, и к размеру создаваемого массива (Dim)
; 	Else ; если не получили функцию Scintilla, то добавляем один пункт в виде сообщения об ошибке
; 		Global Dim FuncsArray.FuncItem(1)
; 		With FuncsArray(0)
; 			\_itemName = "Error"
; 			\_pFunc = @itemError()
; 		EndWith
; 	EndIf
EndProcedure

ProcedureDLL DetachProcess(Instance)

	; << Когда Notepad++ удаляет этот плагин >>
	; Ваш код очистки здесь

	Protected i
	For i = 0 To ArraySize(FuncsArray())
		FreeStructure(FuncsArray(i)\_pShortcutKey)
	Next
EndProcedure

; ==================================
; 5 Обязательные процедуры Notepad++
; ==================================

; NPP спрашивает, является ли плагин в юникоде, возвращаем "ДА"
ProcedureCDLL.i isUnicode()
	ProcedureReturn #PB_Compiler_Unicode
EndProcedure

; NPP спрашивает имя плагина
ProcedureCDLL.s getName()
; 	ProcedureReturn PluginName
	ProcedureReturn "Plugin name" ; передаём имя плагина явно, чтобы не плодить переменных
EndProcedure

; NPP спрашивает, элементы меню, чтобы встроить их в меню "Плагины"
ProcedureCDLL.i getFuncsArray(*FuncsArraySize.Integer)
	*FuncsArraySize\i = ArraySize(FuncsArray()) ; Возвращаем ему размер массива структур пунктов меню
	ProcedureReturn @FuncsArray()			  ; Возвращаем указатель на массив структур пунктов меню
EndProcedure

; Компиляция взависимости от x86 или x64
; setInfo выполняется при запуске программы и передаёт плагинам дескрипторы NPP, Scintilla1, Scintilla2
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86

	ProcedureCDLL setInfo(*NppHandle, *ScintillaMainHandle, *ScintillaSecondHandle)
		; Здесь мы заполняем элементы нашей структуры NppData, то есть получаем от NPP дескприторы NPP, Scintilla1, Scintilla2
		NppData\_nppHandle = *NppHandle
		NppData\_scintillaMainHandle = *ScintillaMainHandle
		NppData\_scintillaSecondHandle = *ScintillaSecondHandle

		; получаем указатель на функцию Scintilla_DirectFunction
		Scintilla = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTFUNCTION, 0, 0)
		; << Когда инфа Notepad++ изменилась >>
		; Ваш код здесь

	EndProcedure

CompilerElse ; иначе для x64

	ProcedureCDLL setInfo(*Npp.NppData)

		CopyStructure(*Npp, NppData, NppData) ; копируем структуру переданную из NPP в нашу
		
		Scintilla = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTFUNCTION, 0, 0)
		; << Когда инфа Notepad++ изменилась >>
		; Ваш код здесь
	EndProcedure

CompilerEndIf


; УВЕДОМЛЕНИЯ, что мы получаем в структуре SCNotification
; Переписываем данные из структуры в переменные
; code=             *SCNotification.SCNotification\nmhdr\code
; pos=              *SCNotification.SCNotification\Position
; ch=               *SCNotification.SCNotification\ch
; modificationType= *SCNotification.SCNotification\modifiers
; text=             *SCNotification.SCNotification\text
; Length=           *SCNotification.SCNotification\length
; linesAdded=       *SCNotification.SCNotification\linesAdded
; message=          *SCNotification.SCNotification\message
; wParam=           *SCNotification.SCNotification\wParam
; lParam=           *SCNotification.SCNotification\lParam
; line=             *SCNotification.SCNotification\line
; foldLevelNow=     *SCNotification.SCNotification\foldLevelNow
; foldLevelPrev=    *SCNotification.SCNotification\foldLevelPrev
; margin=           *SCNotification.SCNotification\margin
; listType=         *SCNotification.SCNotification\listType
; x=                *SCNotification.SCNotification\x
; y=                *SCNotification.SCNotification\y

ProcedureCDLL beNotified(*SCNotification.SCNotification)
	Protected i
	; Если вы не используете уведомления, а только пункты меню, просто удалите конструкцию от "With *SCNotification" до "EndWith"
	; << Когда было получено уведомление scintilla Notepad++ >>
	; Ваш код здесь

	With *SCNotification
		Select \nmhdr\code
; 			Case #NPPN_READY ; Notepad++ загружен, теперь можно обрабатывать уведомления
; 				post_processing = 0 ; флаг полезен если используются уведомления, чтобы они не работали когда NPP в процессе запуска
			Case #NPPN_BUFFERACTIVATED ; реагируем на смену вкладки
				*sciptr = SendMessage_(GetCurrentScintilla(), #SCI_GETDIRECTPOINTER, 0, 0) ; дескриптор текущего экземпляра scintilla
; 				мы можем получать *sciptr при выполнении пункта меню, а не запрашивать его при смене вкладки, это зависит как часто происходит запрос
; 			Case #SCN_SAVEPOINTLEFT ; точка сохранения оставлена, файл требует сохранения
; 				flag_not_save = 1
; 			Case #SCN_SAVEPOINTREACHED ; произошло сохранение документа
; 				flag_not_save = 0
; 			Case #SCN_MODIFIED ; реакция на модификацию документа (плаг пометки изменений)
; 				Select #True
; 					Case Bool(\modificationType & 1) ; если в типе модификации есть флаг вставки SC_MOD_INSERTTEXT, то (ввод символа или Ctrl+V)
; 						If post_processing ; пример запрета уведомления на запуске
; 							ProcedureReturn
; 						EndIf
; 					Case Bool(\modificationType & 2) ; если в типе модификации есть флаг удаления SC_MOD_DELETETEXT, то (удаление символа или выделенного)
; 						If post_processing ; пример запрета уведомления на запуске
; 							ProcedureReturn
; 						EndIf
; 				EndSelect
; 			Case #NPPN_LANGCHANGED ; изменить синтаксис документа, например с AutoIt3 на PureBasic
; 				SetWindowTitle(#Window_0, GetExt())
; 			Case #SCN_CHARADDED ; реакция на ввод символа (плаг автозавершение)
; 				Select \ch
; 					Case 'a' To 'z',  'A' To 'Z', '0' To '9', '_'
; 						SetWindowTitle(#Window_0 , Chr(\ch))
; 					Default
; 						SetWindowTitle(#Window_0 , Chr(\ch))
; 				EndSelect
		EndSelect
		; Придумать вывод в консоль

; 	Что мы можем получить в уведомлении
; 	LineStart = ScintillaMsg(*sciptr, #SCI_LINEFROMPOSITION, \position)			  ; Получаем номер строки начала вставки
; 	LineEnd = ScintillaMsg(*sciptr, #SCI_LINEFROMPOSITION, \position + \Length)	  ; Получаем номер строки конец вставки
; 	LengthDoc = ScintillaMsg(*sciptr, #SCI_GETLENGTH) ; длина текста
; 	CountLine = ScintillaMsg(*sciptr, #SCI_GETLINECOUNT) ; возвращает количество строк
; 	For i = 0 To CountLine
; 		выполнить пошаговые операции со строками
; 	Next

	EndWith
EndProcedure


ProcedureCDLL.i messageProc(Message, wParam, lParam)

	; << Когда было получено windows-сообщение Notepad++ >>
	; Ваш код здесь

	ProcedureReturn #True
EndProcedure

; ==================================
; Ещё несколько системных процедур
; ==================================

; Это оболочка функции Scintilla, полученной из SciLexer.dll, 
; проверяет, что существует указатель функции и указатель экземляра
; А также передаёт по умолчанию последние два параметра если пользователь их не задал явно.
; !!! Если заранее сделать проверку Scintilla на запуске и учёт обязательных 4-х параметров, то от оболочки можно избавиться !!!
Procedure ScintillaMsg(*point, msg, param1 = 0, param2 = 0)
	If Scintilla And *point
		ProcedureReturn Scintilla(*point, msg, param1, param2) ; Scintilla - прототип функции Scintilla_DirectFunction
	Else
		ProcedureReturn 0
	EndIf
EndProcedure

; Процедура для определения текущего окна Scintilla, одного из двух
Procedure GetCurrentScintilla()
	Protected instance_sci
	SendMessage_(NppData\_nppHandle, #NPPM_GETCURRENTSCINTILLA, 0, @instance_sci)
	If instance_sci
		ProcedureReturn NppData\_scintillaSecondHandle
	Else
		ProcedureReturn NppData\_scintillaMainHandle
	EndIf
EndProcedure

; любой пункт меню можно выполнить используя константы #IDM_...
Procedure NppMenuCommand(IDM_COMMAND)
	SendMessage_(NppData\_nppHandle, #NPPM_MENUCOMMAND, 0, IDM_COMMAND)
EndProcedure

; ==================================
; Ваши процедуры плагина
; ==================================

Procedure item1()
	If post_processing
		post_processing = 0
		SendMessage_(NppData\_nppHandle, #NPPM_SETMENUITEMCHECK, FuncsArray(0)\_cmdID, 1) ; Пример переключения галки пункта меню
	Else
		post_processing = 1
		SendMessage_(NppData\_nppHandle, #NPPM_SETMENUITEMCHECK, FuncsArray(0)\_cmdID, 0)
	EndIf
EndProcedure

Procedure item2()
; 	Protected 
	ScintillaMsg(*sciptr, #SCI_GOTOLINE, 1)
	NppMenuCommand(#IDM_SEARCH_TOGGLE_BOOKMARK)
	ScintillaMsg(*sciptr, #SCI_GOTOPOS, 1)
EndProcedure

; Procedure itemError()
; 	MessageRequester("Ошибка", "Не удалось получить функцию", #MB_OK | #MB_ICONERROR)
; 	MessageRequester("Error", "Failed to get a function", #MB_OK | #MB_ICONERROR)
; EndProcedure
Last edited by AZJIO on Sun Jul 11, 2021 11:31 pm, edited 2 times in total.
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

You can download ready-made plugins here

The most advanced code highlighting plugin. Help and discussion here
Image

Also useful is TextA, which has several commands for processing text.

Both plugins have an external file for translating the program interface into your language.
Last edited by AZJIO on Fri May 05, 2023 7:57 pm, edited 1 time in total.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Notepad++ plugin

Post by Kwai chang caine »

Thanks for sharing all this numerous code 8)
ImageThe happiness is a road...
Not a destination
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

Due to the update of Notepad++ to version 8.0, SciLexer.dll is blocked from reopening (OpenLibrary). I have updated the example.

You need to make 3 changes:
Prototype -> PrototypeC
Remove OpenLibrary(0, "SciLexer.dll")
Scintilla = GetFunction(0, "Scintilla_DirectFunction")
->
Scintilla = SendMessage_(NppData\_scintillaMainHandle, #SCI_GETDIRECTFUNCTION, 0, 0)
Inside the "setInfo" procedure, after receiving the handle.

the discussion was here
AZJIO
Addict
Addict
Posts: 1316
Joined: Sun May 14, 2017 1:48 am

Re: Notepad++ plugin

Post by AZJIO »

Made a new plugin "Help" yandex upload.ee. A few Russian CHM files that I using. These files are listed in the ini file.

Updated old plugins
"TextA" yandex upload.ee
"Highlight" yandex upload.ee
"DB_RegExp" yandex upload.ee
"AutoCompletion" yandex upload.ee
"Change" yandex
Post Reply