Community
    • Login

    How to get breakpoint list ?

    Scheduled Pinned Locked Moved Notepad++ & Plugin Development
    23 Posts 5 Posters 5.8k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Gregory D.G
      Gregory D.
      last edited by

      I just need help for notepad++ plugin development in c++, you redirect me to scintilla api documentation, which has nothing to do with c++.

      @Alan-Kilborn said in How to get breakpoint list ?:

      I did point you to the documentation, and a specific function in those docs, but then in your follow-on posting you seemed to ignore that and went with a different function

      Sorry I followed your link and see that SCI_MARKERGET returns the bookmark at a specific line, perfect for a test. I tested and it doesn’t work. But even if you’re convinced I’m a bad programmer, you think I would have more chance with SCI_MARKERNEXT that seems more advanced.
      If you tell me why I get “0”, I’ll can understand and make both work, but you doesn’t seem to know c++, then just tell me that.

      1 Reply Last reply Reply Quote 0
      • Gregory D.G
        Gregory D. @Michael Vincent
        last edited by Gregory D.

        @Michael-Vincent Thank you for the code, what I don’t understand is how to turn that in c++, the functino is ::SendMessage(getCurrScintilla(), <MESSAGE>, wParam, lParam)), then I need to put pos, mask and the result in wparam and lparam, 3 parameters into 2 ?

        Michael VincentM 1 Reply Last reply Reply Quote 0
        • Gregory D.G
          Gregory D.
          last edited by Gregory D.

          @Gregory-D said in How to get breakpoint list ?:

          long line = 0;
          int marker = 0;
          ::SendMessage(curScintilla, SCI_MARKERGET, line, (LPARAM)&marker);

          This is :

          long line = 0;
          int marker=::SendMessage(curScintilla, SCI_MARKERGET, line, 0);
          

          Right ?

          1 Reply Last reply Reply Quote 0
          • Michael VincentM
            Michael Vincent @Gregory D.
            last edited by Michael Vincent

            @Gregory-D

            I think maybe you’re not connecting the dots. The Scintilla docs @Alan-Kilborn linked are crucial since the Notepad++ editing component is based on Scintilla. As for “translating” my NppExec script to C++:

            [...]
            
            HWND getCurScintilla()
            {
                int which = -1;
                ::SendMessage( nppData._nppHandle, NPPM_GETCURRENTSCINTILLA, 0,
                               ( LPARAM )&which );
                return ( which == 0 ) ? nppData._scintillaMainHandle :
                       nppData._scintillaSecondHandle;
            }
            
            [...]
            int line = 0;
            int mask = 1<<24;
            SendMessage(getCurScintilla(), SCI_MARKERNEXT, line, mask);
            

            That should get you the first bookmark since N++ uses 24 as the bookmark marker and thus bitshitfted 24 is the mask the Scintilla call requires. You’ll need to put your own C++ code / logic around that to determine if you’ve found them all and how to find the next one, but again, my NppExec “pseudo” code should help you with that - as will the Scintilla docs.

            Cheers.

            Michael VincentM Gregory D.G 2 Replies Last reply Reply Quote 2
            • Michael VincentM
              Michael Vincent @Michael Vincent
              last edited by

              @Michael-Vincent said in How to get breakpoint list ?:

              SendMessage(getCurScintilla(), SCI_MARKERNEXT, line, mask);

              sorry:

              int markerAtLine = ::SendMessage(getCurScintilla(), SCI_MARKERNEXT, line, mask);
              

              Cheers.

              1 Reply Last reply Reply Quote 1
              • Gregory D.G
                Gregory D. @Michael Vincent
                last edited by

                @Michael-Vincent said in How to get breakpoint list ?:

                The Scintilla docs @Alan-Kilborn linked are crucial since the Notepad++ editing component is based on Scintilla. As for “translating” my NppExec script to C++:

                I’m sure about that, but what Alan Kilborn doesn’t understand is that my problem is not about Scintilla api that is documented but with the c++ conversion.
                Then right code is:

                				long line = 1;
                				int mask = (1 << 24);
                				int result=::SendMessage(curScintilla, SCI_MARKERNEXT, line, mask);
                

                You helped me, thanks.

                Michael VincentM 1 Reply Last reply Reply Quote 0
                • Michael VincentM
                  Michael Vincent @Gregory D.
                  last edited by

                  @Gregory-D said in How to get breakpoint list ?:

                  Then right code is:

                  Yup - methinks that’s correct.

                  Cheers.

                  1 Reply Last reply Reply Quote 1
                  • Alan KilbornA
                    Alan Kilborn
                    last edited by Alan Kilborn

                    Tangential to the topic, but not quite off-topic:

                    I started working with an older version of Visual Studio recently, due to what is used for certain projects at work.

                    I notice that its breakpointing symbol is VERY similar to Notepad’s bookmark image, the main difference being coloring:

                    f93d525e-93a7-4a2c-9890-145ab778a422-image.png

                    In the past I’ve had a passing thought of “where did the design for the N++ bookmark come from?” as it isn’t a stock Scintilla indicator symbol like those shown HERE (with a little “scrolldown” from where that link goes).

                    Perhaps this “red” older-Visual-Studio BP symbol (shown above) was the origin of the N++ bookmark symbol.

                    The obvious stock Scintilla choice (had it been used) would have been:

                    06636eee-70c1-41af-95d2-0980fe38644f-image.png

                    BTW, current VS (2019) BP symboling is much less “fancy”; appears rather flat:

                    0142c89a-c1d3-45d0-b448-5f7675597295-image.png

                    Michael VincentM 1 Reply Last reply Reply Quote 2
                    • Michael VincentM
                      Michael Vincent @Alan Kilborn
                      last edited by

                      @Alan-Kilborn said in How to get breakpoint list ?:

                      The obvious stock Scintilla choice (had it been used) would have been:

                      Do you have NppExec (or Python Script) that allows a script to run at startup?

                      SCI_SENDMSG SCI_MARKERDEFINE 24 SC_MARK_BOOKMARK
                      SCI_SENDMSG SCI_MARKERSETFORE 24 255
                      SCI_SENDMSG SCI_MARKERSETBACK 24 255
                      

                      (Python Scrip implementation will vary ;-)

                      51712cda-f98a-4ef9-a53f-1ff0492dc7ab-image.png

                      Cheers.

                      Alan KilbornA 1 Reply Last reply Reply Quote 4
                      • Alan KilbornA
                        Alan Kilborn @Michael Vincent
                        last edited by

                        @Michael-Vincent

                        Yes, that is good information.
                        The Pythonscript implementation is very similar and straightforward.

                        BTW, I wasn’t complaining about Notepad++'s default bookmark symbol image in any way. Just wondering/commenting on its possible origins. It hadn’t occurred to me that the origins might be with an earlier VS version.

                        Michael VincentM 1 Reply Last reply Reply Quote 2
                        • Michael VincentM
                          Michael Vincent @Alan Kilborn
                          last edited by

                          @Alan-Kilborn said in How to get breakpoint list ?:

                          BTW, I wasn’t complaining about Notepad++'s default bookmark symbol image in any way

                          Didn’t think you were :-) it was more of an exercise to see if I could do it. I have an NppExec ‘marker’ script that adds different colored “bookmarks” by placing normal bookmarks and then converting them. So I though it’d be possible to just change the default symbol / color.

                          Cheers.

                          1 Reply Last reply Reply Quote 3
                          • BambofyB
                            Bambofy
                            last edited by Bambofy

                            Sorry to bump this really old thread but the NppExec scripts above weren’t working for me, so i tried to write one myself. Here it is, when it finishes running it will echo a string which can be copied into another file.

                            cls
                            set local currentline = 0
                            set local breakpoints = ""
                            :repeat
                            sci_sendmsg SCI_MARKERNEXT $(currentline) 0xFFFFFF
                            // If marker next fails then we exit.
                            if $(MSG_RESULT) == -1) 
                                exit
                            // Next marker exists.
                            else 
                                // Check if the market has looped back to 0.
                                if $(MSG_RESULT) < $(currentline)
                                    echo $(breakpoints)
                                    exit
                                else
                                    // Increment the resulting line by 1.
                                    set local currentline ~ $(MSG_RESULT) + 1
                                    set local breakpoints = ${breakpoints} $(FILE_NAME) $(currentline) \r\n
                                endif
                                goto repeat
                            endif
                            
                            
                            

                            I couldn’t quite figure out how to make NppExec write to a file, so if anyone can add that i’d be really grateful.

                            PeterJonesP 1 Reply Last reply Reply Quote 0
                            • PeterJonesP
                              PeterJones @Bambofy
                              last edited by PeterJones

                              @Bambofy ,

                              I’m not sure why you completely reworked @Michael-Vincent’s script, instead of just fixing the third line to

                              SET LOCAL MASK ~ (1<<24) -1
                              

                              It seems that would have been a lot less work for you than redoing all the logic, slightly differently.

                              (I’m also really surprised that Michael’s code worked for him a few years ago; I don’t believe the definition of the MASK field of SCI_MARKERNEXT has changed in the last three years.)

                              As far as redirecting the NppExec output to a file, did you look in Plugins > NppExec > Help/Manual, looking at section 4.5? Because section 4.5 is completely devoted to how to redirect output in NppExec, so that would seem like a natural place to start. As a hint, if you previously had

                              echo HI
                              

                              you could replace it with

                              cmd /c echo HI > outputfile.txt
                              

                              to redirect it to overwrite outputfile.txt,
                              or

                              cmd /c echo HI >> outputfile.txt
                              

                              to redirect it to append to outpputfile.txt

                              PeterJonesP 1 Reply Last reply Reply Quote 0
                              • PeterJonesP
                                PeterJones @PeterJones
                                last edited by PeterJones

                                @PeterJones,

                                (I’m also really surprised that Michael’s code worked for him a few years ago; I don’t believe the definition of the MASK field of SCI_MARKERNEXT has changed in the last three years.)

                                Nevermind. The definition of Notepad++'s MARK_BOOKMARK has changed in the last three years. Specifically, in v8.4.6 in Sept 2022, it was changed from 24 to 20 to work with Scintilla 5.3.0.

                                So just changing that single line to

                                SET LOCAL MASK ~ 1<<20
                                

                                would have been sufficient.

                                In case you don’t understand: 3 years ago, when Michael wrote the script, bookmarks used mark#24, so SET LOCAL MASK ~ 1<<24 set the mask to 0x1000000, so if bit #24 matched, it would say the line number.

                                With v8.4.6 and newer, that marker is in bit #20, so if you only are looking at bit#24, it’s not going to find it. Your code, with 0xFFFFFF on the other hand, was looking at all marker numbers from 0 to 23, so it would find marker#20 as the bookmark line. But it would also find any of the other markers on those lines, even the ones that aren’t bookmarks – so it would find markers you weren’t looking for. If you file happened to have other marker types – like if you had any hidden lines due to View > Hide Lines or code folding in your active lexer – then it would report false matches.

                                Marker Number References

                                • Scintilla reserves #25-31 for folding margins
                                • Scintilla reserves #21-24 for Change History
                                • Notepad++ reserves #16-20 for “internal use” (specifically, 18 & 19 for hidden lines, and 20 for bookmarks, with two more for future use)
                                • Notepad++ allows #0-15 for plugins to use, but makes no guarantee that two plugins won’t try to make use of the same marker.
                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post
                                The Community of users of the Notepad++ text editor.
                                Powered by NodeBB | Contributors