• Columns++ version 1.2: better Unicode search

    15
    6 Votes
    15 Posts
    2k 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
    1k 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
    401 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
    479 Views
    4SHAKEN4

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

  • Columns++: Where regex meets Unicode (Here there be dragons!)

    27
    6 Votes
    27 Posts
    6k 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
    12k 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

  • is anyone working on a google code assist plugin?

    3
    0 Votes
    3 Posts
    459 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
    1k Views
    Philippe DestrumelP

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

  • 1 Votes
    15 Posts
    2k 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
    227 Views
    No one has replied
  • 1 Votes
    17 Posts
    2k 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
    2k 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
    487 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
    384 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
    1k 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
    465 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.

  • Undo preserving file's mtime

    2
    0 Votes
    2 Posts
    312 Views
    PeterJonesP

    @Henrik-Haftmann ,

    moderator aside:

    Does this “thought” really need a separate discussion from your other two topics? All three of your topics are, to my mind, about essentially the same thing – the mtime/ctime of a file, and how Notepad++ interacts with it (both in deciding whether document-has-been-changed and in how Notepad++ sets one or both of those times). If they are really all related, please keep everything in one of the existing topics, instead of creating a new topic for each thought. It makes it really hard to follow, and hides the fact that other people have replied to other of your thoughts, so eliminates or obfuscates context.

    Let me know which of the three you want as the “parent” conversation, and I can merge them all into one, unless you really believe they are completely distinct conversations which don’t rely on each other for context.

  • Preserve creation file date&time (ctime)

    3
    0 Votes
    3 Posts
    433 Views
    xomxX

    @Henrik-Haftmann

    I tried on my network NAS (webdav), created date/time did not change when I opened, updated & saved an old file using N++:

    npp-NAS-webdav-created-not-changed.png

  • 0 Votes
    6 Posts
    1k Views
    Mojtaba RezaeianM

    Hello Peter

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    So is your account the account named “Administrator”, or is it a normal user account that has administrator privileges? Because my Windows account is a normal user with Admin privileges. The two might not behave the same, depending on circumstances.

    No my account name is user, but with administrator privilages.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    I am curious exactly what steps you took to “update” Notepad++ if it installed a version that’s 2 years old

    Looking at Settings > Preferences > MISC, is the ☐ Enable Notepad++ auto-updater checkmarked or not?

    Thats because I forgot that I disabled auto updates for this reason and I did not expect its more than two years from that time now, but auto updates was enabled at first and selcted template changing was happening after updates so I disabled auto update and after disabling that option I remember notepad++ many times asked me for updating at begining of program and I remember I updated it manually (by accepting that update message) for a few times after disabling update but I decided to accept updates less often specially because of fear of loosing some options and requiring to set them again as like as selecting my prefered theme; and yes Auto update is disabled in my prefrences now, but this background loss was happend recently for a few time, and once exactly when I opened a ticked I thought my auto update option is on and it happend because of update but now I conclude that there must be somethingelse happening separate from updating of program which causes the templates reset too. but I can assure you I haven’t cleared my %appsdata% or restoring or cleaning windows manually and it must be very rare to automatically this happens in my system because I do not install such softwares to clean files or system for me and I do most of the things manually if I see a problem.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    When you updated to v8.4.8, which of the following happened?

    Notepad++ popped up a dialog telling that an update was available, and that update was v8.4.8

    oh yes recenly this happend and I ignored update I think this template change happens even if I ignore it !! I’m not sure about this but I can tell you for next time if such message come up and I ignore to see what happens.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    You went to Notepad++'s ? menu and chose Update Notepad++, and it downloaded and installed v8.4.8

    no I did not updated this way recently

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    You already had a copy of npp.8.4.8.Installer.x64.exe in your downloads directory, so you just ran that one

    No

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    You went to https://notepad-plus-plus.org/downloads/ , and instead of going to the first entry on that page, which would be v8.7.5, you instead scrolled way down on the page to “Download Notepad++ v8.4.8”

    No
    No
    No

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    You went to some other website other than notepad-plus-plus.org or github.com and downloaded Notepad++ v8.4.8 installer from there

    No because notepad++ have an update option in application and its easier than all.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    the version before that one would have been v8.7.4 from earlier in Dec 2024.

    Yess you giving me clues that the template reset is not depending my selection to update or not it always reset my template options after this update warning and make me think the program was automatically updated (Because I trust this app I do not care very much if it update now or later and some time I think I selected yes but in real I was selecting no because of fear of loosing options again and I was focusing to continue reading text file)

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    This still boggles my mind

    It was a suprise for me too, I really didn’t knew I havn’t updated this app for such long time (mostly because of template reset which was my logical address to conclude application is updated again so I must do select template again)

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    L:\Programs\Notepad\notepad++.exe

    Its correct! in my system “L:” means Large volume drive and I always create big L: partition on my partitionings, keep static large files and medias including small applications and every other things which not depends on harddisk speed and OS and can run on any computers and on slow and old hard disks, which are much cheaper and larger than new M.2 and fast volumes. The L: also is very unique letter and helps me to never loose application addresses and file locations after system change. I just change the old volume drive letter on my hard disk to L: which is rarely happens to be occupid on different systems so its kind of portable. Also V: is a similar unique drive letter for me which is always my chosen Vistual drive just for not mistaking with other drives for example DVD/CD drive or connected portable ones. And my windows drive is mostly C: or D:.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    As I said above, when you are a normal user who happens to have Admin power, you don’t have to run Notepad++ “As Administrator” – I almost never do, except when I need to edit a file in the c:\windows or c:\program files hierarchies. (Which is very rare, for me.) I believe that not using “As Administrator” is less likely to give you problems like what you’re having.

    Oh peter, You know a lot!! This is my case too… I’ll tell you why I did this. I sometime code in AHK(autohotkey) so I managed to setup notepad++ to open/edit some files and codes with just pressing a hotkey! saying more clear I have a large AHK file manually written to manage custom hotkeys on my windows and I open/edit many files even itself with its own hotkeys too. For acheiving this I need to run notepad++ from another application(Autohotkey.exe) which would be the parent for notepad++ on that moment and this caused to limit my access to edit some system files from hotkeys. For example when I want to add a line of code to windows system files (like “hosts” file) it gave me error of restricted user so I managed to do something to run notepad++ as adminstrator.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    That’s fine. I frequently run with a true portable. And, in fact, at work, I often used a portable copy but set my file associations and paths so that Windows could associate files with that portable, during a period when my employer made it a hassle to update Notepad++ when it was in C:\Program Files. (They eventually relented, so I went back to a normal installation.)

    I do not prefer this because after uninstall/reinstall I need to do my customizations windows and its apps relations to notepad++ again and they are too many, and I even can not remember all things I did after these years. For example now I can not remember what I did to give notepad++ administrator privilages when it is started from another app, I just searched google and used some tricks guys used and suggested to do this.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    Yes. That is Notepad++'s default behavior. But when you ran the installer, it did ask you whether you wanted to use AppData or not. You are the one who agreed to let it install there.

    So I can reinstall it again and choose right option. I think I can handle it now.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    I disagree vehemently with that statement. I’ve been using the same AppData directories on this computer through its original Windows 10 and all the Win10 updates, through the Windows 11 and all the updates there, and it has correctly maintained those settings. And the %AppData%\Notepad++ setting that I put in on Win10 were the ones I copied over from my previous computer, and probably from the computer before that. My AppData literally has a legacy on the order of a decade. If you think of a decade as being “temporary”, I am impressed with your longevity.

    I really respect your decition and opinion, I can not say anything other than thank you for your helpful messages guiding me a lot.

    @PeterJones said in Selected theme (in style configurator) resets back to default after every program update!:

    From step 4 on, all of Notepad++'s settings will be stored in L:\Programs\Notepad` instead of in the AppData hierarchy

    Now I ran to step 4 and downloaded latest install version after that but I could not find “AppData” checkbox in step after choosing “L:\Programs\Notepad” (and it was “c:\program files\notepad++” by default) so I stopped. Isn’t it better to copy and replace all files from zipped protable version to “L:\Programs\Notepad”??

  • New (incomplete) LSP client plugin

    59
    4 Votes
    59 Posts
    16k Views
    EkopalypseE

    @mpheath

    Thank you very much - and disabling it again in my init routine seems to solve the current problem, but I’m not sure if there isn’t an underlying issue here. I mean, why does this only happen when multiple documents are used in a single window? I will do some tests in the next few days.