• NppCppMSVS: A Visual Studio Project Template for a Notepad++ C++ Plugin

    5
    7 Votes
    5 Posts
    254 Views
    Lycan ThropeL

    @Coises ,
    This was much easier to follow, and it’s installed and I saw that it was there. Thanks. That’s it for now, as I’ve already burned my candle on both ends for now and am needing sleep, so…will play more later with your instructions to see how it fares. Thanks for the assist.

  • Yet Another C++ Plugin Template...

    11
    4 Votes
    11 Posts
    908 Views
    ThosRTannerT

    @Alan-Kilborn fairly mature. I have a couple of other tweaks to do while trying to do a version of the linter plugin, which needed some extra functionality to make a few things simpler.

    That and it’s not really a template of course. It’s a library you can use.

  • Columns++ version 1.2: better Unicode search

    15
    6 Votes
    15 Posts
    667 Views
    guy038G

    Hi, @coises and All,

    I think this will be the last answer concerning your Columns++_v1.2 plugin !

    Here is the recapitulation of the way to access the invisible characters, whatever the file type :

    For ANSI files : just one possible syntax for these collating names :

    [[.NUL.][.SOH.][.STX.][.ETX.][.EOT.][.ENQ.][.ACK.][.alert.][.backspace.][.tab.][.newline.][.vertical-tab.][.form-feed.][.carriage-return.][.SO.][.SI.][.DLE.][.DC1.][.DC2.][.DC3.][.DC4.][.NAK.][.SYN.][.ETB.][.CAN.][.EM.][.SUB.][.ESC.][.IS4.][.IS3.][.IS2.][.IS1.][.DEL.]] which returns 33 matches, against the Total_ANSI.txt file, wihich contains the 256 characters of the Win-1252 encoding

    Note that the lowercase syntax is NOT allowed, in ANSI files, for ANY collating names, presently in UPPER case

    Note also that the four chars, from \x1c to \x1f must be referred as from IS4 to IS1, in UPPER case ( and NOT from fs to us ! )

    For UTF-8 files : two possible syntaxes for these collating names :

    [[.nul.][.soh.][.stx.][.etx.][.eot.][.enq.][.ack.][.bel.][.bs.][.ht.][.lf.][.vt.][.ff.][.cr.][.so.][.si.][.dle.][.dc1.][.dc2.][.dc3.][.dc4.][.nak.][.syn.][.etb.][.can.][.em.][.sub.][.esc.][.fs.][.gs.][.rs.][.us.][.del.][.pad.][.hop.][.bph.][.nbh.][.ind.][.nel.][.ssa.][.esa.][.hts.][.htj.][.lts.][.pld.][.plu.][.ri.][.ss2.][.ss3.][.dcs.][.pu1.][.pu2.][.sts.][.cch.][.mw.][.spa.][.epa.][.sos.][.sgci.][.sci.][.csi.][.st.][.osc.][.pm.][.apc.][.nbsp.][.shy.][.alm.][.sam.][.ospm.][.mvs.][.nqsp.][.mqsp.][.ensp.][.emsp.][.3/msp.][.4/msp.][.6/msp.][.fsp.][.psp.][.thsp.][.hsp.][.zwsp.][.zwnj.][.zwj.][.lrm.][.rlm.][.ls.][.ps.][.lre.][.rle.][.pdf.][.lro.][.rlo.][.nnbsp.][.mmsp.][.wj.][.(fa).][.(it).][.(is).][.(ip).][.lri.][.rli.][.fsi.][.pdi.][.iss.][.ass.][.iafs.][.aafs.][.nads.][.nods.][.idsp.][.zwnbsp.][.iaa.][.ias.][.iat.][.sflo.][.sfco.][.sfds.][.sfus.]] which return 120 matches, against the Total_Chars.txt file

    [[.nul.][.soh.][.stx.][.etx.][.eot.][.enq.][.ack.][.alert.][.backspace.][.tab.][.newline.][.vertical-tab.][.form-feed.][.carriage-return.][.so.][.si.][.dle.][.dc1.][.dc2.][.dc3.][.dc4.][.nak.][.syn.][.etb.][.can.][.em.][.sub.][.esc.][.fs.][.gs.][.rs.][.us.][.del.][.pad.][.hop.][.bph.][.nbh.][.ind.][.nel.][.ssa.][.esa.][.hts.][.htj.][.lts.][.pld.][.plu.][.ri.][.ss2.][.ss3.][.dcs.][.pu1.][.pu2.][.sts.][.cch.][.mw.][.spa.][.epa.][.sos.][.sgci.][.sci.][.csi.][.st.][.osc.][.pm.][.apc.][.nbsp.][.shy.][.alm.][.sam.][.ospm.][.mvs.][.nqsp.][.mqsp.][.ensp.][.emsp.][.3/msp.][.4/msp.][.6/msp.][.fsp.][.psp.][.thsp.][.hsp.][.zwsp.][.zwnj.][.zwj.][.lrm.][.rlm.][.ls.][.ps.][.lre.][.rle.][.pdf.][.lro.][.rlo.][.nnbsp.][.mmsp.][.wj.][.(fa).][.(it).][.(is).][.(ip).][.lri.][.rli.][.fsi.][.pdi.][.iss.][.ass.][.iafs.][.aafs.][.nads.][.nods.][.idsp.][.zwnbsp.][.iaa.][.ias.][.iat.][.sflo.][.sfco.][.sfds.][.sfus.]] which returns 120 matches, against the Total_Chars.txt file

    -Note that the Uppercase syntax is allowed, in UTF-8 files, for ANY collating name, presently in LOWER case

    Finally, for an ANSI file, containing the 256 chars of the Win-1252 encoding and converted as an UTF-8 file ( Encoding > Convert to UTF-8 ), two syntaxes are possible :

    [[.nul.][.soh.][.stx.][.etx.][.eot.][.enq.][.ack.][.bel.][.bs.][.ht.][.lf.][.vt.][.ff.][.cr.][.so.][.si.][.dle.][.dc1.][.dc2.][.dc3.][.dc4.][.nak.][.syn.][.etb.][.can.][.em.][.sub.][.esc.][.fs.][.gs.][.rs.][.us.][.del.][.pad.][.hop.][.ri.][.ss3.][.dcs.][.osc.][.nbsp.][.shy.]] which returns 40 matches, agasint the Total_UTF-8.txt file

    [[.nul.][.soh.][.stx.][.etx.][.eot.][.enq.][.ack.][.alert.][.backspace.][.tab.][.newline.][.vertical-tab.][.form-feed.][.carriage-return.][.so.][.si.][.dle.][.dc1.][.dc2.][.dc3.][.dc4.][.nak.][.syn.][.etb.][.can.][.em.][.sub.][.esc.][.fs.][.gs.][.rs.][.us.][.del.][.hop.][.ri.][.ss3.][.dcs.][.osc.][.nbsp.][.shy.]] which returns 40 matches, against the Total_UTF-8.txt file

    Note that the Uppercase syntax is allowed, in UTF-8 files, for ANY collating name, presently in LOWER case

    Now, against the Total_ANSI.txt file, containing the first 256 UNICODE characters, we get these results :

    (?s). ANY character => 256 (?-s). ANY character different from LIKE-BREAKS => 253 = [^\x0A\x0C\x0D] [[:unicode:]] = \p{unicode} an OVER \x{00FF} character => 0 = [^\x00-\xFF}] [[:cntrl:]] = \p{cntrl} a CONTROL code character => 39 = [\x00-\x1F\x7F\x81\x8D\x8F\x90\x9D\xAD] [[:space:]] = \p{space} a WHITE-SPACE character => 7 = [\t\n\x0B\f\r\x20\xA0] [[:blank:]] = \p{blank} a BLANK character => 3 = [\t\x20\xA0] [[:upper:]] = \p{upper} an UPPER case letter => 60 = [A-ZŠŒŽŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ] [[:lower:]] = \p{lower} a LOWER case letter => 65 = [a-zƒšœžªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ] [[:digit:]] = \p{digit} a DECIMAL number => 13 = [0-9²³¹] [[:word:]] = \p{word} a WORD character => 139 = [[:alnum:]]|\x5F = \p{alnum}|\x5F [[:punct:]] = \p{punct} any PUNCTUATION or SYMBOL character => 80 = [\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E\x82\x84-\x87\x89\x8B\x91-\x97\x9B\xA1-\xBF\xD7\xF7] [[:alpha:]] = \p{alpha} any LETTER character => 125 = (?-i)[[:upper:][:lower:]] [[:alnum:]] = \p{alnum} an ALPHANUMERIC character => 138 = (?-i)[[:upper:][:lower:][:digit:]] [[:graph:]] = \p{graph} any VISIBLE character => 212 = [^\x00-\x1F\x20\x7F\x80\x81\x88\x8D\x8F\x90\x98\x99\x9D\xA0] [[:print:]] = \p{print} any PRINTABLE character => 219 = [[:graph:][:space:]] = [^\x00-\x1F\x20\x7F\x80\x81\x88\x8D\x8F\x90\x98\x99\x9D\xA0]|[[:space:]] [[:xdigit:]] an HEXADECIMAL character => 22 = [0-9A-Fa-f] = (?i)[0-9A-F]

    Remark : the [[:unicode:]] class; for characters OVER \x{00FF}, must correspond to the C1_DEFINED type from Ctype 1 list here.

    From this same article, and after I realized that the POSIX classes are not totally independent, I deduced this layout :

    C1_DEFINED Other characters 0 C1_CNTRL Control characters 39 C1_SPACE Space characters 2 ( only the SPACE and NBSP chars, OUT of 7, as ALL other are ALREADY included in the CNTRL chars class ) C1_UPPER Uppercase 60 C1_LOWER Lowercase 65 C1_DIGIT Decimal digits 13 C1_PUNCT Punctuation 73 ( and NOT 80, because the \xAD char is ALREADY included in the CNTRL chars class because the \xAA, \xB5 and \xBA are ALREADY included in the LOWER chars class because the \xB2, \xB3 and \xB9 are ALREADY included in the DIGIT chars class ) ----- TOTAL : 252 chars

    So, if I exclude, from my Total_ANSI.txt file, all the following classes with the S/R :

    FIND [[:cntrl:][:space:][:upper:][:lower:][:digit:][:punct:]]

    REPLACE Leave EMPTY

    Either, with your plugin or with native N++, it remains 4 characters ( 256 - 252 ) which are the ( \x{20AC} ), ˆ ( \x{02C6} ), ˜ ( \x{02DC} ) and ( \x{2122} ) characters

    Moreover, absolutely no POSIX character class and no UNICODE character class, of course, can find these 4 characters !

    Thus, the only way to find out one of these 4 characters, in an ANSI file, is to use the regex [\x80\x88\x98\x99] or to use the characters themselves :-((

    In this article, it is also said :

    Printable | Graphic characters and blanks (all C1_* types except C1_CNTRL). Thus …

    So, from the previous total of chars of my Total_ANSI.txt file, the [[:print:]] class should detect 252 - 39, so 213 matches.

    Thus, as [[graph:]] = [[:print:]] - [[space:]], this means that [[:graph:]] should be : 213 - 2, so 211 matches.

    But current result is 212 matches. The difference of one unit comes from the \xAD char whith is, both, part of the [[:cntrl:]] and [[graph:]] POSIX character classes !

    If we remember of the 4 lacking chars, which, obviously, are visible and printable, this means that [[:graph:]] and [[:print:] should return, respectively 215 ( 211 + 4 ) and 217 ( 213 + 4 ) matches, for ANSI files.

    And it easy to verify that [[:print:]] + [[:cntrl:]] = 217 + 39 = 256 !

    Just for info : from the Total_UTF-8.txt file, containing these same chars, we get these results :

    (?s). ANY character => 256 (?-s). ANY character different from LIKE-BREAKS => 254 = [^\x0A\x0D] [[:ascii:]] an UNDER \x{0080} character => 128 = [\x{0000}-\x{007F}] = \p{ascii} [[:unicode:]] = \p{unicode} an OVER \x{00FF} character => 27 = [^\x00-\xFF}] = [\x{20AC}\x{201A}\x{0192}\x{201E}\x{2026}\x{2020}\x{2021}\x{02C6}\x{2030}\x{0160}\x{2039}\x{0152}\x{017D}\x{2018}\x{2019}\x{201C}\x{201D}\x{2022}\x{2013}\x{2014}\x{02DC}\x{2122}\x{0161}\x{203A}\x{0153}\x{017E}\x{0178}] [[:cntrl:]] = \p{cntrl} a CONTROL code character => 38 = [\x00-\x1F\x7F\x81\x8D\x8F\x90\x9D] = \p{Cc} [[:space:]] = \p{space} a WHITE-SPACE character => 7 = [\t\n\x0B\f\r\x20\xA0] [[:blank:]] = \p{blank} a BLANK character => 3 = [\t\x{0020}\x{00A0}] = \p{Zs}|\t [[:upper:]] = \p{upper} an UPPER case letter => 60 = [A-ZŠŒŽŸÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ] = \p{Lu} [[:lower:]] = \p{lower} a LOWER case letter => 63 = [a-zƒšœžµßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ] = \p{Ll} [[:digit:]] = \p{digit} a DECIMAL number => 10 = [0-9] = \p{Nd} [[:word:]] = \p{word} a WORD character => 137 = \p{L*}|\p{Nd}|_ [[:graph:]] = \p{graph} any VISIBLE character => 215 = [^\x00-\x1F\x20\x7F\x81\x8D\x8F\x90\x9D\xA0\xAD] = (?![\x20\xA0\xAD])\P{Cc} [[:print:]] = \p{print} any PRINTABLE character => 222 = [[:graph:][:space:]] = [^\x00-\x1F\x20\x7F\x81\x8D\x8F\x90\x9D\xA0\xAD]|[[:space:]] [[:punct:]] = \p{punct} any PUNCTUATION or SYMBOL character => 73 = \p{P*}|\p{S*} = [\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E\x{20AC}\x{201A}\x{201E}\x{2026}\x{2020}\x{2021}\x{2030}\x{2039}\x{2018}\x{2019}\x{201C}\x{201D}\x{2022}\x{2013}\x{2014}\x{02DC}\x{2122}\x{203A}\xA1-\xA9\xAB\xAC\xAE-\xB1\xB4\xB6-\xB8\xBB\xBF\xD7\xF7] [[:alpha:]] = \p{alpha} any LETTER character => 126 = \p{L*} = \p{Lu}|\p{Ll}|[ˆªº] [[:alnum:]] = \p{alnum} an ALPHANUMERIC character => 136 = \p{L*}|\p{Nd} [[:xdigit:]] an HEXADECIMAL character => 22 = [0-9A-Fa-f] = (?i)[0-9A-F]

    Best regards,

    guy038

  • Gcode text file analyzing

    8
    0 Votes
    8 Posts
    229 Views
    Michael VincentM

    @Holger-Suchi said in Gcode text file analyzing:

    Maybe there is already available a plugin that does the following (or could be a basis to mod):

    @PeterJones

    There aren’t any general-purpose GCode plugins available, to my knowledge.

    There is https://github.com/NCalu/NCneticNpp

    Not sure it’s in Plugin Admin so you need to go looking and manually install.

    UPDATE: Also never used it myself so have no idea if it’s of any use - I don’t do any GCode work at all myself.

    Cheers.

  • batch script run in place

    2
    0 Votes
    2 Posts
    123 Views
    PeterJonesP

    @Chris-Robertson ,

    You didn’t say, but for the sake of my answer, I will assume when you say “I can run my script in place”, you mean “I use the Run > Run menu command to run cmd /c "$(FILE_NAME)" (or similar) to run the active file using its default assocation” or maybe “I have saved that Run > Run command into the Run menu, and maybe have a keyboard shortcut for it”. If I have misinterpreted your statement, you will have to clarify with much more detail.

    The Notepad++ macro system can record certain actions then play them back. Unfortunately, as explained in our FAQ: Automating Notepad++, certain commands – like those from plugins, and the user-defined commands that you save in the Run menu (or even calls to other macros) – cannot be recorded . However, that same FAQ explains that you can trick the macro system to run non-recordable commands by manually editing the macro, as described in that second post. So you could manually create a macro that runs the File > Save then runs the dynamic menuCmdID assigned to your Run command or Plugin command, that you can find using UISpy!

    Alternatively, the NppExec plugin is designed for being a “shell scripting” language for Notepad++, allowing running various N++ commands and various filesystem commands. I have saved the following NppExec script as RunMyself, which saves the active file, changes to that file’s directory, and runs that file:

    NPP_SAVE cd "$(CURRENT_DIRECTORY)" cmd /c "$(FILE_NAME)"

    … and I use Shortcut Mapper to set its keyboard shortcut to F5 (and relegate the Run>Run command to Ctrl+Shift+F5, because I’d rather have the easiest shortcut be for the actions I use the most)

    You could do a similar script for the PythonScript plugin or other of the scripting plugins, but IMO, NppExec is best suited when you are trying to do just a sequence of actions that are too complex for Macros, but don’t have the logic or computational needs of a full programming language like Python.

  • Help w/ console.run editor output

    3
    0 Votes
    3 Posts
    106 Views
    4SHAKEN4

    @Ekopalypse Great, that will suffice for what I’m trying to do. Thank you!

  • [New Plugin] CSV Lint

    81
    6 Votes
    81 Posts
    71k Views
    Bas de ReuverB

    The CSV Lint plug-in was updated to v0.4.6.8. Just missed the Notepad++ 8.7.8 update, but that’s no problem it’ll automatically be available in the next update. It’s a small update anyway, as I don’t really have the time to work on the plug-in at the moment due to work related stuff. So for now I just wanted to get some minor updates out the door, hopefully more updates in the near future.

    Sort Data, enumeration columns now sort according to code index Metadata scripts, now includes sort examples SQL scripts, placeholders for column comments Settings button on docked window
  • Columns++: Where regex meets Unicode (Here there be dragons!)

    27
    6 Votes
    27 Posts
    2k Views
    CoisesC

    @guy038

    Thank you so much for all your testing!

    As I think you’ve seen, I decided to release a nominally “stable” version that has only a few small changes from the fourth experimental version and with (I think) up-to-date documentation.

    I will be taking a closer look at the equivalence classes, and your tests and references will be very helpful. I also need to sort out the situation with digraphs and ligatures. (Unicode distinguishes between the two, and I might be forgetting a third thing — all cases where what we normally think of as multiple characters act as one, sometimes visually, sometimes for collation even when they are visually separate.) Particularly vexing is that this should affect character ranges depending on the active locale; e.g., in Slovak, “ch” sorts between “h” and “i”; in Spanish, it sorts between “c” and “d” and in English, it isn’t a digraph at all, just two letters. So [[.ch.]-i] should match “f” in Spanish but not in Slovak… and in English it makes no sense at all, because ch isn’t a digraph in English.

    This sort of thing is why I decided to table the whole notion until I can rest and regroup.

  • Run python script (pythonscript plugin) with a shortcut?

    9
    1 Votes
    9 Posts
    11k Views
    Franklin DelgadoF

    @Scott-Sumner said in Run python script (pythonscript plugin) with a shortcut?:

    @Mikhail-V said:

    How do I run specific script with a keyboard shortcut?

    To elaborate on @Claudia-Frank 's answer:

    Go to Plugins (menu) -> Python Script -> Configuration. The Python Script Shortcut Configuration window will appear.

    In the Scripts area at the top of the Python Script Shortcut Configuration window, locate and select the script you want to bind to a shortcut (and/or toolbar button).

    Between the Scripts box and the Menu items (or Toolbar icons) caption there is an Add button. To get your script added as a menu item (necessary to bind a keycombo to it via the “Shortcut Mapper”), press the Add button (the one above the Menu items caption). Very similar but hopefully obvious what to do for a toolbar button.

    Once you click OK to dismiss the Python Script Shortcut Configuration window, you should be able to go into Plugins (menu) -> Python Script (just point to that and let the menu cascade open) and then see your script at this level of the menu (between the Scripts-> and Configuration entries). Seeing your script appear here is key to being able to tie it to a shortcut keycombo.

    Restart Notepad++. This allows the “Shortcut Mapper” to see that you’ve changed the Plugins (menu) -> Python Script menu contents.

    Now go to Settings (menu) -> Shortcut Mapper… and select the Plugin commands tab. Scrolling down somewhat you should see your script in the Name column (along with “Pythonscript” in the Plugin column). Go ahead and select your script and assign a keycombo to it just like you would for any other command.

    excelente muchas gracias tu aporte

  • [New Plugin] NppOpenAI

    42
    8 Votes
    42 Posts
    27k Views
    S

    wow, this sounds like a great tool, cant wait to use it.

    i wonder if it will be possible to add support for google code assist, they have just opened up free access for individual developers.

    also abillity to use the latest grok (3) would be cool too.

  • is anyone working on a google code assist plugin?

    3
    0 Votes
    3 Posts
    99 Views
    S

    @PeterJones wow, cool! thanks for the info! yes im sure some bright spark will add a config to enable using code assist. i will look into it, cheers!

  • Import Tkinter in PythonScript on Window

    8
    0 Votes
    8 Posts
    193 Views
    Philippe DestrumelP

    I have to go, but I will continue tomorrow.
    Thank you again for your answers.

  • 1 Votes
    15 Posts
    956 Views
    Mark OlsonM

    @4SHAKEN
    In the future you should wrap your code snippets in ``` blocks.

    if foo: blah = -3 return bar() # notice syntax highlighting, indentation preserved else: return zut()
  • 2 Votes
    1 Posts
    79 Views
    No one has replied
  • 1 Votes
    17 Posts
    387 Views
    CoisesC

    @Alan-Kilborn said in Correct event / 'trigger when' to determine which tab is active after NPP start?:

    Two points:

    What is the true definition of NPPN_READY? Ready for what? Should notifications received before NPPN_READY not be acted upon, or buffered by the plugin until NPPN_READY is received, and then acted upon?

    I don’t think there is a “true” definition other than the code itself. In general, NPPN_READY is a place to do things you only want to do once, but after “most” of the Notepad++ environment is set up — for example, the menus are already built, the tool bars are set up (I think NPPN_TBMODIFICATION comes before NPPN_READY; and you noted that NPPN_SNAPSHOTDIRTYFILELOADED comes before NPPN_READY), I believe dockable panels are up —but the message loop hasn’t yet started and user interaction hasn’t yet become possible.

    Looking over my own plugin, I recall that I ignore NPPN_BUFFERACTIVATED messages before NPPN_READY, but I did need to call my buffer activated process during NPPN_READY, because an NPPN_BUFFERACTIVATED message didn’t reliably come afterward.

    I can work with N++ the way it is, but I’m a scripter, and if PythonScript isn’t forwarding me notifications before it itself receives NPPN_READY, because someone judged that that’s what NPPN_READY means, then I can explore that via a PythonScript “issue”.

    If plugins were never supposed to process messages before NPPN_READY, Notepad++ wouldn’t send them. I have no idea if PythonScript has its reasons for ignoring all messages before NPPN_READY — there might be one-time setup that it does in NPPN_READY that leaves it unable to function earlier — but there is no general expectation that plugins should do that.

  • Populate "Find in Files" - Result Window

    14
    1 Votes
    14 Posts
    288 Views
    PeterJonesP

    … and there’s 2 of my 3 guesses shot down. So that means Don is going to accept the issue/PR without hassle, right? that way, I’m 3/3?!

  • Getting Markdown headers in the function list panel

    2
    0 Votes
    2 Posts
    153 Views
    PeterJonesP

    @Bill-M said in Getting Markdown headers in the function list panel:

    I installed this under my functionlist folder for notepad++

    Did you also update your overrideMap.xml to point to that file? or did you just put your XML in that folder? https://npp-user-manual.org/docs/config-files/#function-list describes

    And when you do, make sure that you have the userDefinedLangName attribute in the new tag in overrideMap.xml match the exact name of the UDL. For example, the pre-installed Markdown UDL that ship with Notepad++ are named Markdown (preinstalled) and Markdown (preinstalled dark mode). If you set userDefinedLangName="Markdown", it would not properly associate with either of the actual UDL that ship with Notepad++.

    For my UDL header list,

    <!-- Other parser definitions here -->

    That’s surprising, and might also be causing you a problem. Since v7.9.1 in 2020, the old functionList.xml was split into separate files in the functionList\ directory; each XML file in that directory should only have one <parser>.

    For example, in my %AppData%\Notepad++\functionList\ directory, I have a file called udl_markdown.xml which looks like,

    <?xml version="1.0" encoding="UTF-8"?> <!-- ==========================================================================\ | | To learn how to make your own language parser, please check the following | link: | https://npp-user-manual.org/docs/function-list/ | \=========================================================================== --> <NotepadPlus> <functionList> <parser displayName="Markdown (preinstalled)" id="Markdown (preinstalled)" commentExpr=""> <function mainExpr="(?x-s)(^\h*\K[#]+\h*(.*?)$|^(.*)(?=[\r\n]+^([-=])\4{2,}\s*$))"/> </parser> </functionList> </NotepadPlus>

    and then in my override map, alongside the example UDL overrides that ship with the default, I added

    <association id= "udl_markdown.xml" userDefinedLangName="Markdown (preinstalled)"/>

    After saving those files, and restarting Notepad++, I successfully have FunctionList show me the # header lines (as well as header lines that have a line of plain text followed by a line of 3 or more --- or ===, as that’s an alternative header nomenclature in some markdown variants) – I’ve been successfully using that for years now.

    commentExpr="(#+)"

    Oh, that might be another gotcha. When the function list parser is looking, if it matches the comment expression, things found within that comment will not be searched for function names. So by saying that #+ is your comment, the FunctionList parser will ignore anything that’s one or more # characters. This means it will probably not ever be able to match your #{1,6} in your function’s mainExpr… I would highly recommend using commentExpr="" rather than giving it a value.

    If I update my <assocation ...> to point to the new definition, and modify your definition to be

    <?xml version="1.0" encoding="UTF-8"?> <NotepadPlus> <functionList> <!-- Markdown headers: Match any line starting with 1-6 "#" characters --> <parser id="md_headers" displayName="Markdown (preinstalled)" ext="md" commentExpr=""> <function mainExpr="(?-s)^[ \t]*(#{1,6}[ \t].+)$"> <functionName> <nameExpr expr="(#{1,6}[ \t].+)" /> </functionName> </function> </parser> </functionList> </NotepadPlus>

    … then it works for me.

    So, to sum up the things I’ve seen:

    you must set an <association ...> tag in your overrideMap.xml, making sure that userDefinedLangName’s value is the exact name of your UDL (probably Markdown (preinstalled) or Markdown (preinstalled dark mode)) and that id is the exact name of your file in the functionList\ directory you should only have one <parser> per functionList\_____.xml file if you define commentExpr, then the parser will not look for function names (or in your case, markdown headers), so make sure you don’t set that to something that interferes with recognizing your headers (I would recommend commentExpr="" , because you don’t need the parser to ignore anything)
  • Adding TCL to functionlist panel

    2
    0 Votes
    2 Posts
    132 Views
    PeterJonesP

    @Bill-M ,

    A Perl script to create a powershell script to create and copy an XML file? That seems a bit indirect. If you’re going to invoke the perl interpreter, why not have your Perl code write the XML to the right location directly? And if you don’t know how to accomplish the same thing in Perl (which it definitely can do), why not just share the powershell script directly instead of “dynamically” generating it using static strings in Perl?

    But that’s neither here nor there, so nevermind.

    Could somebody at notepad++ please add this by default to notepad++:

    The script is obviously not going to be added to Notepad++, nor anything that behaves like that script. If you wanted to take the XML that’s generated by your nested script and have that functionList XML added to the Notepad++ distribution by default, the User Manual has an entire section on how to "Contribute your new or enhanced parser rule to the Notepad++ codebase. So follow those instructions if you want Notepad++ to ship with your TCL functionList definition.

  • Some more options for search & replace dialog

    9
    0 Votes
    9 Posts
    418 Views
    CoisesC

    @Mark-Olson said in Some more options for search & replace dialog:

    I assume that the text portion of the StyledTextFull buffer is UTF8-encoded (if you discard the style bytes), right?

    Not necessarily. I looked at the Scintilla code a bit; there are, internally, two buffers, one containing the text and one containing the style bytes. While there is an API to access the text buffer directly (which I use), there is nothing I can find that does the same for the style bytes. Instead, SCI_GETSTYLEDTEXTFULL steps through both buffers simultaneously, copying first the text byte and then the style byte to the output buffer supplied in the call. (Unless I have misread the code — which is possible, since I didn’t spend a lot of time looking at it — though the documentation for SCI_GETSTYLEDTEXTFULL says it interleaves text characters and style bytes, it actually interleaves text bytes and style bytes.)

    The text could be ANSI or UTF-8 — you have to check SCI_GETCODEPAGE, which in Notepad++ will be either zero (system default code page, aka “ANSI”) or CP_UTF8.

    I had temporarily forgotten that you won’t be working in C++. I doubt that it is practical (maybe not even possible) to write a Boost::Regex iterator in “managed” code. It would probably make more sense to reverse what Scintilla does and split the returned value into a text buffer and a style buffer. Then you could scan the style bytes to determine what ranges to search, and either use whatever regex facilities are available in C# to scan the text, or just ignore the text bytes and use Scintilla find and replace to scan the ranges you identified from the style buffer.

    Given the way Scintilla stores styles (as bytes that correspond one-for-one with the text — unlike indicators, which the documentation says “are stored in a format similar to run length encoding which is efficient in both speed and storage for sparse information”), there is probably no way much faster than scanning byte for byte — it’s just a trade-off between speed (getting it all with one Scintilla call) and memory (getting it byte by byte, so you don’t have to make large copies).

  • Avoid "Document changed outside, reload?" message box

    3
    1 Votes
    3 Posts
    184 Views
    mkupperM

    @Henrik-Haftmann, when you do Ctrl+S from within Notepad++ are you always or nearly always then immediately getting a file-modified pop-up, This may well be something we can look into.

    I had thought that when you do Ctrl+S that Notepad++ writes the file to disk and it then immediately gets the file’s mtime and size from the disk to use as a baseline for the file-modified logic. If your file system is then changing the mtime to better match someone’s granularity standard then can that behavior be changed? How do applications know when the file system is done with fiddling with the mtime?

    Your proposal about comparing the file content means that Notepad++ would need to first make a copy of the file the instant someone starts making changes to the file. Notepad++ probably would start making the copy the moment you open the file. We need a copy of the original file to do the comparison you proposed.

    Computing a hash would have less overhead

    If it were my problem to deal with and I was forced to deal with a file system that keeps fiddling with the mtimes then I would set it up so that I use Notepad++ with local on-disk copies of files and I’d have a background application that synchronizes the local disk files to the external file system. That background application would only change the local disk mtime if and only if the content of the file on the external file system is modified. Basically, I would make my machine part of the AFS network but it would hide the part about that mtimes change.