• NppExec v0.8.11 has been released!

    3
    5 Votes
    3 Posts
    2k Views
    Vitalii DovganV
    NppExec v0.8.12.1 has been released! Glory to Ukraine! Glory to the heroes! improved: now WarningAnalyzer automatically removes “” around a file path/name fixed: the Console Output Filters dialog did not clear WarningAnalyzer’s cache improved: now Highlight’s [I], [B], [U] have Italic, Bold and Underline style Get it here: https://github.com/d0vgan/nppexec/releases/tag/NppExec_v08121
  • nppGitClone (14-16ko)

    5
    0 Votes
    5 Posts
    3k Views
    gcyrillusG
    @Michael-Vincent Thanks for the feedback ;) fixed with : https://github.com/gcyrillus/nppGitClone/releases/tag/V1.0.1
  • NppVim 1.14.0.0 Release : Added nppvim.rc support

    1
    1 Votes
    1 Posts
    774 Views
    No one has replied
  • [new plugin] AssistantIA alpha 0.0.0.1 looking for feedback

    5
    0 Votes
    5 Posts
    3k Views
    gcyrillusG
    @Michael-Vincent and anyone reading :) Besides the jokes, i’d like some real feedback about the plugin, the code and mainly about the fact that gemini assisted me … Be critical without trolling, do not be afraid to point out all of the funny code, nonsense and incoherence that a light IA can bring within your code unless there is some goods in it . Good jokes are also welcome ;)
  • Announcing Perl-based automation of Notepad++

    perl automation
    17
    6 Votes
    17 Posts
    12k Views
    PeterJonesP
    v0.012 released to CPAN Update for Notpead++ v8.5.4 - v8.9.6.4 Update Editor messages and enumerations (hashes) Update Notepad++ menu commands and messages Remove notepad->prompt() and the Win32::GUI dependency [#91] Please comment on Issue #92 if this call is important to you <https://github.com/pryrt/Win32-Mechanize-NotepadPlusPlus/issues/92> Improve test suite Get it working through Perl v5.42 Don’t test as many old versions (too much compute overhead) See CHANGES file for full history, including interveninng v0.009, v0.010, and v0.011 I don’t always post about new versions here (mostly because I get distracted and forget to). But I thought it was important on this one, because notepad->prompt() has been disabled in this version: if notepad->prompt() is important to you, please comment on https://github.com/pryrt/Win32-Mechanize-NotepadPlusPlus/issues/92 and stick with v0.011, which (until further notice) is the most recent version to include the notepad->prompt()
  • Npp Plugin - failing when "string" type is used

    5
    0 Votes
    5 Posts
    2k Views
    rdipardoR
    @medvidec It’s impossible to know for sure without seeing your code, but I doubt the issue has anything to do with Notepad++. If this “global variable” is supposed to be shared between multiple C++ source files, you have to do the following: declare the variable in a header file as extern, e.g.: // your_header.h #include <string> extern const std::string configFile; include “your_header.h” in every source file that uses configFile . provide a definition (at global scope) of configFile in one (and only one) of the source files that includes “your_header.h”: // source_file.cpp #include "your_header.h" // ... const std::string configFile = "/plugins/config/verilogConfig.txt"; // ... You can read about storage class specifiers to learn more.
  • [New Plugin] AI Chat — chat with LLMs directly inside Notepad++

    Moved
    1
    1 Votes
    1 Posts
    1k Views
    No one has replied
  • Where should I add license and copyrght information?

    8
    1 Votes
    8 Posts
    4k Views
    shouldersS
    I randomly found this new meta SPDX-License-Identifier: where you can add one line. // Copyright (c) 2026 Jane Smith // SPDX-License-Identifier: MIT https://spdx.org/licenses/ https://spdx.dev/learn/handling-license-info/ https://github.com/david-a-wheeler/spdx-tutorial Thought I might mention this as I have never heard of this standard. I assume it is still legal but, IANAL.
  • DAP client plugin

    16
    3 Votes
    16 Posts
    7k Views
    EkopalypseE
    @PeterJones It all sounded so logical to me when I wrote it, but now that I’m reading it again, I have to agree with you— that wasn’t my best explanation of how this is supposed to work. Thanks for clarifying, and yes, Prefer installed Python libraries and a local Python installation are necessary in this scenario. Regarding sys.path, yes, that makes sense. I should have tested all of this in a sandbox; then I would have noticed how my own setup differs from a standard installation. And yes, the procedure, which is ONLY necessary to debug PythonScript scripts, is that you have one Npp instance, in which the script is debugged—let’s call it instance A—and another, let’s call this instance B, in which the script to be debugged actually runs. So, Instance A starts the debugging session via Plugins->NppDebugger->Start. This results in a new Npp instance B being launched. Now, in Instance B, the script that configures debugpy must be started. This causes debugpy to launch another Python process pydevd which is the real python debugger. This means that NppDebugger, from Npp instance A, waits for debugpy in Npp instance B to start the Python debugger pydevd AND for debugpy to start a TCP server to which NppDebugger can then connect. NppDebugger(tcp client) <-> debugy(tcp server) <-intern-> debugy(tcp client) <-> pydevd(tcp server) As soon as NppDebugger establishes a connection, it begins communicating with debugpy via DAP messages. Is the long-term plan … Yes, ultimately, the plugin should be designed to minimize the need for manual configuration editing. For debuggers that work with compiled source code, such as gdb, delve, lldb, etc., this is usually a project-specific setting and something that a user must set at least once per project. I don’t see how the plugin could figure this out on its own. For PythonScript debugging, a simple variable substitution, as you mentioned, seems sufficient. @Lycan-Thrope said: They have a Trial Version If I find the time, I’ll give it a try… but that might take a while… :) @Lycan-Thrope said: What the heck, … :D - thank you :D
  • What if I made Notepad++ available for mobile?

    notepad starter android
    3
    0 Votes
    3 Posts
    2k Views
    Pull_it_allP
    @Em776102 not sure what your use is, for example in termux on android you can use nano. For most quick edits it’s enough I guess… Need something more advanced, use: Acode - code editor | OSS Surely it’s not our beloved notepad++, but quick search may reveal even more alternatives.
  • 1 Votes
    3 Posts
    2k Views
    Pull_it_allP
    @Abdellah-Hss Hello thanks for this input, I thought I had to provide all system versions in order to be accepted to admin plugin list. Today I’ve added ARM64 version and will fork the admin list to update it asap. Thanks for the feedback I actually didn’t know the way to publish it via official channel. Hopefully once I get through with this process it will make the list and be easier accesible. Edit I’ve just added the plugin to official list on x86, x64 and ARM64. Till the next update you can only install it via dll or bat installer I provided on github.
  • Run - Serurtiy Warming 8.9.6.1

    2
    0 Votes
    2 Posts
    729 Views
    PeterJonesP
    @Geoff-Taylor , That is the effect of one of the “security fixes” that prompted v8.9.6.1’s existence. See my reply to see more of the implications of the security changes, and note the discussion it spawned
  • HTML and CSS language color coding in the same document

    5
    0 Votes
    5 Posts
    1k Views
    rdipardoR
    This issue is one of the most consistently duplicated on the forum, for example: “Highlight HTML and CSS” “CSS comments should be in GREEN” “css formatting not working on embed style sheet…” etc. @peterjones’s initial reply is the correct one. You can also refer to this more detailed explanation regarding the current limitations of Lexilla. For now, a relatively simple way to edit HTML documents with embedded style and script highlighting is to use the tree-sitter plugin. Note that only “light” style themes are currently supported, and you will have to manually download and extract the configuration files to get it working. [image: 1779564282293-npptreesitter-v110.png]
  • Issues with the Preview HTML plugin

    17
    0 Votes
    17 Posts
    3k Views
    rdipardoR
    @Robk-Blue said: If I close the PreviewHTML pane before closing NP, it will work when I open the app next time. Yes, closing it before quitting will stop the Docking Manager from trying to relaunch it. I’m guessing you also have an active session of unsaved files? I’m not sure, but it could be that reloading files from a session doesn’t trigger a preview refresh the way that manually opening the file does. If it happens again, just save the file and reload it with Ctrl+R. Another thing is that your version of TextFX is really old. For reference, version 0.2.6 has been incompatible with Notepad++ for several years: https://sourceforge.net/p/npp-plugins/bugs/354 You should remove or rename the NppTextFX plugin folder, open the Plugins Admin installer, and download it again from the current source: [image: 1779246861901-npp-v893-plugin-list-v193.png]
  • Scripts to align text

    5
    4 Votes
    5 Posts
    6k Views
    sound-fxS
    I’ve added an option to pad to the right side of the selected character. This preserves the character’s position and instead aligns the non-space text to the right of the character. The default pads to the left side, so the character itself gets aligned. A complementary set of scripts, align_text_right.py and align_text_right_1.py, use this new option. Here’s the complete set of scripts. align_text.py: #------------------------------------------------------------------------ # If the character specified in the current selection is a white space, # then prompt the user to enter the alignment character (or characters), # using this character as the initial default. #------------------------------------------------------------------------ default_align_char = ',' from enum import Enum class PaddingSide(Enum): LEFT = 0 RIGHT = 1 def align_selected_text(max_align_char_count = None, padding_side = PaddingSide.LEFT): """Insert padding into the lines in the selection, as needed, to align up to max_align_char_count instances of a specific character or string of characters The default is to align all instances of the specific character. At present, the alignment character is taken as the character at the top of the current selection. You can uncomment some code below to change this policy to instead take the alignment character from within the selection at whichever end has the cursor. Either way, if that character is white space, the user is prompted to type the character (or characters). If you really wish to align on a white space character, you can just click OK at the prompt. When prompted to type the alignment character, the user may enter a sequence of characters, e.g., "-->", in which case the alignment is on the instances of that entire character sequence. For example, if the user enters "-->" at the prompt, then instances of the "-" character get aligned only if they're followed immediately by the characters "->", while instances of, say, "-1" and "- " remain unaltered. If there is no current selection, then aligns all lines in the editor. If there is a current selection, then aligns only the lines that are at least partially included in the selection, and the selection is changed to the entire block of newly-padded lines. Parameters ---------- max_align_char_count : positive integer, optional The maximum number of instances to align of the specific character. For example, set to 1 to align only the first instance of the character on each line. The default is to align all instances of the specific character. padding_side : instance of PaddingSide, optional Indicates which side of the character gets the padding. The default is PaddingSide.LEFT, so the character itself gets aligned. Set to PaddingSide.RIGHT to preserve the character's position and instead align the non-space text to the right of the character. """ from Npp import editor #---------------------------------------------------------------------------- # For the alignment character, take the character just inside the bounds of # the selection block (at either the start or the end, as determined below). #---------------------------------------------------------------------------- editor.targetFromSelection() selected_text = editor.getTargetText() #---------------------------------------------------------------------------- # Use this code to get the align_char unconditionally from the start # of the selection. If there is no selection, use the character at the # current cursor position; if that is unavailable, fall through to the # prompt below by treating the alignment character as whitespace. #---------------------------------------------------------------------------- if selected_text: align_char = selected_text[0] else: current_pos = editor.getCurrentPos() align_char = editor.getTextRangeFull(current_pos, current_pos + 1) if not align_char: align_char = ' ' #---------------------------------------------------------------------------- # Optionally use this code to get the align_char from within the selection # at whichever end has the cursor. #---------------------------------------------------------------------------- # if selected_text: # (startByte, endByte) = editor.getUserCharSelection() # if startByte == editor.getCurrentPos(): # align_char = selected_text[0] # else: # align_char = selected_text[-1] # else: # current_pos = editor.getCurrentPos() # align_char = editor.getTextRangeFull(current_pos, current_pos + 1) # if not align_char: # align_char = ' ' # If the character from the selection seems implausible as the # align_char, then prompt the user for it. if align_char.isspace(): from Npp import notepad global default_align_char align_char = notepad.prompt('Align character:', 'Enter Alignment Character', default_align_char) if align_char is not None: default_align_char = align_char #---------------------------------------------------------------------------- #%% Get the lines of text within the selected alignment block #---------------------------------------------------------------------------- (startLine, endLine) = editor.getUserLineSelection() startPos = editor.positionFromLine(startLine) endPos = editor.getLineEndPosition(endLine) text_lines = editor.getTextRangeFull(startPos, endPos).splitlines(True) #---------------------------------------------------------------------------- # Remember whether there is a user-selected block, so we can restore a # corresponding selection after aligning the text. #---------------------------------------------------------------------------- restore_selection = editor.getSelectionStart() != editor.getSelectionEnd() #---------------------------------------------------------------------------- # Align all instances of align_char within the lines of text #---------------------------------------------------------------------------- if align_char is not None: # Enable the following to save the align_char, however it was determined, # to be the default_align_char when prompting for it next time. # default_align_char = align_char if max_align_char_count is None: align_char_count = max(line.count(align_char) for line in text_lines) else: align_char_count = max_align_char_count start = 0 for instance in range(align_char_count): # Set the target column using the index of the align_char, ignoring # immediately preceding space, or the length of the line align_char_cols = [line.find(align_char, start) for line in text_lines] # Only lines that contain this instance participate in this pass. # A failed find() returns -1, and using that as a slice index would # make lines without this instance incorrectly affect the target. lines_with_instance = [(line, col) for (line, col) in zip(text_lines, align_char_cols) if col >= 0] if not lines_with_instance: break if padding_side == PaddingSide.LEFT: # Align the alignment character itself, removing any spaces # immediately to its left before inserting the required padding. target_col = max(len(line[:col].rstrip()) for (line, col) in lines_with_instance) for (idx, line) in enumerate(text_lines): align_char_col = align_char_cols[idx] if align_char_col >= 0: text_lines[idx] = line[:align_char_col].rstrip().ljust(target_col) \ + line[align_char_col:] start = target_col + len(align_char) elif padding_side == PaddingSide.RIGHT: # Align the non-space text after the alignment character. # Preserve the alignment character itself, but # replace any existing spaces after it with the required # padding. suffix_starts = [] for (line, col) in lines_with_instance: suffix_start = col + len(align_char) while suffix_start < len(line) and line[suffix_start] == ' ': suffix_start += 1 suffix_starts.append(suffix_start) target_col = max(suffix_starts) for (idx, line) in enumerate(text_lines): align_char_col = align_char_cols[idx] if align_char_col >= 0: suffix_start = align_char_col + len(align_char) while suffix_start < len(line) and line[suffix_start] == ' ': suffix_start += 1 text_lines[idx] = line[:align_char_col + len(align_char)].ljust(target_col) \ + line[suffix_start:] start = target_col else: raise ValueError('Unsupported padding_side: {}'.format(padding_side)) editor.setTarget(startPos, endPos) editor.replaceTarget(''.join(text_lines)) if restore_selection: startPos = editor.positionFromLine(startLine) endPos = editor.getLineEndPosition(endLine) editor.setSelectionStart(startPos) editor.setSelectionEnd(endPos) if __name__ == '__main__': align_selected_text() align_text_1.py: from align_text import align_selected_text align_selected_text(max_align_char_count = 1) align_text_right.py: from align_text import align_selected_text, PaddingSide align_selected_text(padding_side = PaddingSide.RIGHT) align_text_right_1.py: from align_text import align_selected_text, PaddingSide align_selected_text(max_align_char_count = 1, padding_side = PaddingSide.RIGHT)
  • 0 Votes
    3 Posts
    705 Views
    P
    Hi @rwieber79 , @peterjones , I’m just seeing this issue, thank you Peter for pinging me. @rwieber79 , just as a side note - please write directly to https://github.com/pnedev/comparePlus/issues in the future if you encounbter problems with ComparePlus - this way I’ll be notified more quickly about the issue. As to the issue itself - please try setting your Notepad++ rendering mode to GDI for the moment. You can do that from Notepad++ Settings - MISC. section (there is a drop-down menu there selecting the rendering which is DirectWrite by default). Then after restarting Notepad++ try again your crashing compare and please write back here if crash is still present. I am in a middle of a large ComparePlus code portions rework and some time in the near future I will release a new version which should not have problems with DirectWrite rendering. BR
  • AI Plugin

    3
    1 Votes
    3 Posts
    2k Views
    BlueSea KuoB
    @jw I suggest adding an option to select the AI module.
  • nppgzipfileviewer - improvements request

    2
    0 Votes
    2 Posts
    420 Views
    PeterJonesP
    @arnaud-derette , I have never used that plugin. But when I went to their homepage (https://github.com/Pascal-Krenckel/NppGZipFileViewer), they say, “This plugin is deprecated, please switch to CompressedFileViewer.” Once an author deprecates a plugin, there won’t be support for requests. I have put in a request to ask that the author remove the deprecated plugin from the Plugins Admin list (and, if they want, to add the replacement plugin into the list). But you should try their replacement plugin. And if it doesn’t improve your experience, you can go to the CompressedFileViewer’s issue tracker (https://github.com/Pascal-Krenckel/CompressedFileViewer/issues), and make your request(s) there.
  • 1 Votes
    2 Posts
    558 Views
    PeterJonesP
    @martin-honnen , Please be careful when forking and keeping the original name for an apparently-abandoned plugin. Sometimes, it turns out it wasn’t as abandoned as thought – something like that happened with NppConsole plugin (as obliquely mentioned in a recent Topic here): a few years ago, it appeared abandoned, so a regular here took the source code, and made their own fork, but kept the original name (thinking it would be safe, because it appeared to be no longer supported in the original channel); but then, fast forward a few more years, and the original author did provide their own upgrades to the original plugin – so now there are two competing development paths, each having version numbers not present in the chain for the other, which will make any future questions in the forum confusing, as to which NppConsole plugin is actually being talked about. Similarly, if morbac ever decides to come back to the plugin, then your fork and the original could have conflicting and/or confusing version numbers and naming. I would highly recommend coming up with your own name for your product, if you are planning to continue development and support on your version of the plugin. If it’s really just a one-off thing, and you aren’t planning on future bugfixes/improvements/support, then it’s up to you whether it’s worth the rename; but if you want to continue to work on the plugin, then I’d suggest the rename. OTOH: if you can get permission from @morbac to take over completely, then it’s safe to keep the original name, because you’ve got the permission. (It’s most clear, in cases like that, if you can get write permission to the original repo – @chcg was able to do with @bruderstein’s PythonScript, and that sense of continuity makes it more obvious that his is still the “official” PythonScript.)
  • A question about dark mode, plugins, and an owner-draw ComboBox

    3
    0 Votes
    3 Posts
    671 Views
    CoisesC
    @rdipardo said in A question about dark mode, plugins, and an owner-draw ComboBox: Try passing the control’s handle to the ::SetWindowTheme function provided by the uxtheme header, using L"DarkMode_CFD" as the pszSubAppName; to restore light mode, call it with the same arguments, but change pszSubAppName to a null pointer. Thanks, Robert. At first attempt, this doesn’t appear to solve the problem. The colors are right with just NPPM_DARKMODESUBCLASSANDTHEME; the problem is that the static control shows unknown text instead of the selected drop-down entry, and attempting to select from the drop-down produces bizarre highlighting and tracking instead of what is expected (and still doesn’t set the static control). Adding the SetWindowTheme call doesn’t change that. Removing NPPM_DARKMODESUBCLASSANDTHEME, of course, makes everything else light, and for the control in question, SetWindowTheme only seems to change the drop-down chevron. Interestingly, NPPM_DARKMODESUBCLASSANDTHEME does get all the colors right, including in the owner-drawn drop-down; it just breaks the functionality in the process. The problem goes away entirely if I remove the CBS_OWNERDRAWFIXED style (but then, of course, it doesn’t display as intended, showing the color associated with each indicator that can be selected). That’s why I feel like the problem is most likely to do with the sub-classing. I can’t find any clear documentation on how all that works. I don’t even know why the controls are being sub-classed, and not just themed. Maybe there is a way to exempt that control from sub-classing, and do whatever it is that the sub-classing does in my own code? A pointer to actual documentation on this design, how it works and how it is meant to be used would be wonderful, but I’m guessing no such thing exists. :-(