Community
    • Login
    1. Home
    2. Popular
    Log in to post
    • All Time
    • Day
    • Week
    • Month
    • All Topics
    • New Topics
    • Watched Topics
    • Unreplied Topics
    • All categories
    • Mark BoonieM

      Show (or keep) subsets of a file

      Watching Ignoring Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
      15
      0 Votes
      15 Posts
      85 Views
      guy038G

      Hello, @mark-boonie, @coises, @peterjones and All,

      Oh…, I’m terribly sorry ! I ate and watched TV for a few hours, forgetting all about you !

      But, anyway, @mark-boonie, you cleverly found out the true solution !

      So, considering your INPUT text, below, pasted in a new tab :

      *Block start 00000000013FC200 00200280 00010000 00000000 00000001 00000000013FC210 00000002 CC5CDDA0 00000000 00000000 *Block end Extra stuff *Block start 00000000013FC200 00200280 00010000 00000000 00000002 00000000013FC210 00000002 CC5CDDA0 00000000 00000000 00000000013FC220 00000000 00000000 01266100 01266100 00000000013FC230 00808000 013FC2B8 00000000 00000000 *Block end *Block start 00000000013FC200 00200280 00020000 00000000 00000003 00000000013FC210 00000002 CC5CDDA0 00000000 00000000 00000000013FC220 00000000 00000000 01266100 01266100 00000000013FC230 00808000 013FC2B8 00000000 00000000 *Block end *Block start 00000000013FC200 00200280 00030000 00000000 00000004 00000000013FC210 00000002 CC5CDDA0 00000000 00000000 00000000013FC220 00000000 00000000 01266100 01266100 00000000013FC230 00808000 013FC2B8 00000000 00000000 *Block end Extra stuff *Block start 00000000013FC200 00200280 00010000 00000000 00000005 *Block end *Block start 00000000013FC200 00200280 00010000 00000000 00000006 *Block end

      Here is the final and minimum search regex which works in all cases, whatever a block or extra stuff ends your text without a final line-break :

      (?s)^\*Block start((?!\*Block start).)+?80 00010000.+?^\*Block end\R?(*SKIP)(*F)|(?-s)^.*\R?

      Of course, the \Q.....\E syntax is safer but, generally, just one or two characters must be escaped within your delimiters and/or your target string !

      You just have to remember to escape any of the 10 characters * + ? ( ) ^ $ | [ ] and the \ itself. For example, you do not need to escape your present target string at all, as it simply contains digits and space chars !

      But if your delimiters would have been [*start|string*] and [*end|string*] or your target string (0x3F5B+0x7), surrounding them with the \Q...\E would have been preferable !

      Best Regards,

      guy038

    • S

      autoupdater and connection temp.sh

      Watching Ignoring Scheduled Pinned Locked Moved Security
      37
      0 Votes
      37 Posts
      18k Views
      PeterJonesP

      @Martin-1 said in autoupdater and connection temp.sh:

      @PeterJones That is what i meant. I don’t understand what is being said in those links or what is being said above. hence the repeat of my questions.

      Then ask for clarification, rather than ask the same thing over and over.

      Besides, the https://notepad-plus-plus.org/news/clarification-security-incident/ link that @donho most recently posted seems pretty clear to me:

      Who Was Targeted?

      This was a highly selective attack by a state-sponsored group targeting specific high-value organizations. Security researchers confirmed that the vast majority of Notepad++ users were never affected - attackers filtered victims based on strategic value, not random distribution.

      For most users: Simply updating to the latest version is sufficient.

      If you are a member of a a high-value organization, then you need to find someone on your IT team who does understand all the technical details. (If you are unsure whether your organization would be considered “high value”, then it wouldn’t be.) If you are not, then you are part of the “for most users” group. And those instructions seem quite clear to me: manually update to v8.9.1.

    • Thorsten HeuerT

      Feature Request / Question: Soft Wrap at Vertical Edge (Column 80) regardless of window size

      Watching Ignoring Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
      16
      1 Votes
      16 Posts
      518 Views
      PeterJonesP

      @Alan-Kilborn ,

      Okay, since I didn’t know how to hook the message loop I found this old post by you (I remembered you had done it for the alt+scrollwheel, thankfully), and I was able to use that as a basis for a two-file solution to @fml2’s request

      file 1: MsgHooker.py

      # -*- coding: utf-8 -*- # original author: @Alan-Kilborn # reference: https://community.notepad-plus-plus.org/post/100127 # modified by: @PeterJones # - updated to add the .unhook() and .__del__() methods import platform from ctypes import (WinDLL, WINFUNCTYPE) from ctypes.wintypes import (HWND, INT, LPARAM, UINT, WPARAM) user32 = WinDLL('user32') GWL_WNDPROC = -4 # used to set a new address for the window procedure LRESULT = LPARAM WndProcType = WINFUNCTYPE( LRESULT, # return type HWND, UINT, WPARAM, LPARAM # function arguments ) running_32bit = platform.architecture()[0] == '32bit' SetWindowLong = user32.SetWindowLongW if running_32bit else user32.SetWindowLongPtrW SetWindowLong.restype = WndProcType SetWindowLong.argtypes = [ HWND, INT, WndProcType ] class MH(object): def __init__(self, hwnd_to_hook_list, hook_function, # supplied hook_function must have args: hwnd, msg, wparam, lparam # and must return True/False (False means the function handled the msg) msgs_to_hook_list=None, # None means ALL msgs ): self.users_hook_fn = hook_function self.msg_list = msgs_to_hook_list if msgs_to_hook_list is not None else [] self.new_wnd_proc_hook_for_SetWindowLong = WndProcType(self._new_wnd_proc_hook) # the result of this call must be a self.xxx variable! self.orig_wnd_proc_by_hwnd_dict = {} for h in hwnd_to_hook_list: self.orig_wnd_proc_by_hwnd_dict[h] = SetWindowLong(h, GWL_WNDPROC, self.new_wnd_proc_hook_for_SetWindowLong) v = self.orig_wnd_proc_by_hwnd_dict[h] #print(f"add {h:08x} => {v}") def __del__(self): self.unhook() def unhook(self): #print(f"unhook: self:{self} => <{self.orig_wnd_proc_by_hwnd_dict}>"); mykeys = [] for h in self.orig_wnd_proc_by_hwnd_dict.keys(): orig = self.orig_wnd_proc_by_hwnd_dict[h] print(f"\tdel {h:08x} => {orig}") SetWindowLong(h, GWL_WNDPROC, orig) mykeys.append(h) for h in mykeys: del self.orig_wnd_proc_by_hwnd_dict[h] def _new_wnd_proc_hook(self, hwnd, msg, wParam, lParam): retval = True # assume that this message will go unhandled (by us) need_to_call_orig_proc = True if len(self.msg_list) == 0 or msg in self.msg_list: retval = self.users_hook_fn(hwnd, msg, wParam, lParam) if not retval: need_to_call_orig_proc = False if need_to_call_orig_proc: retval = self.orig_wnd_proc_by_hwnd_dict[hwnd](hwnd, msg, wParam, lParam) return retval

      file 2: the main script:

      # encoding=utf-8 """in response to https://community.notepad-plus-plus.org/topic/27351/ Trying to implement @Coises idea for setting the wrap to exactly 80 """ from Npp import * import ctypes from ctypes import wintypes from MsgHooker import MH as MsgHook WM_SIZE = 0x0005 # Define the RECT structure to match Win32 API class RECT(ctypes.Structure): _fields_ = [ ("left", wintypes.LONG), ("top", wintypes.LONG), ("right", wintypes.LONG), ("bottom", wintypes.LONG) ] def width(self): return self.right - self.left def height(self): return self.bottom - self.top def pysc_setWrap80(ed=editor): #console.write("ed={}\n".format(ed)) WRAPCHARS = 80 # Setup the Win32 function prototype user32 = ctypes.windll.user32 user32.GetClientRect.argtypes = [wintypes.HWND, ctypes.POINTER(RECT)] user32.GetClientRect.restype = wintypes.BOOL def get_window_size(hwnd): # 2. Instantiate the RECT structure rect = RECT() # 3. Call GetClientRect passing the rect by reference if user32.GetClientRect(hwnd, ctypes.byref(rect)): # 4. Parse the results # Client coordinates: top-left is always (0,0) return rect else: raise Exception("GetClientRect failed") sz = get_window_size(ed.hwnd) #console.write("{} => {}\n".format(ed.hwnd, {"width": sz.width(), "height": sz.height()})) usableWidth = sz.width() for m in range(0, 1+ed.getMargins()): w = ed.getMarginWidthN(m) usableWidth -= w #console.write("m#{}: {} => usableWidth: {}\n".format(m, w, usableWidth)) widthWrappedChars = ed.textWidth(0,"_"*WRAPCHARS)+1 # one extra pixel to be able to show the VerticalEdge indicator line wantMargin = usableWidth - widthWrappedChars if wantMargin < 1: wantMargin = 0 #console.write("{}\n".format({"windowWidth": sz.width(), "usableWidth": usableWidth, "pixelsFor80Char": widthWrappedChars, "wantMargin": wantMargin})) ed.setMarginRight(wantMargin) ed.setMarginLeft(0) def HIWORD(value): return (value >> 16) & 0xFFFF def LOWORD(value): return value & 0xFFFF def pysc_size_callback( hwnd, msg, wParam, lParam): #console.write(f"cb(h:{hwnd}, m:{msg}, w:{wParam}, l:{lParam}) => {LOWORD(lParam)} x {HIWORD(lParam)}\n") if hwnd == editor1.hwnd: pysc_setWrap80(editor1) elif hwnd == editor2.hwnd: pysc_setWrap80(editor2) return True pysc_setWrap80(editor1) pysc_setWrap80(editor2) pysc_size_hook = MsgHook([ editor1.hwnd, editor2.hwnd ], pysc_size_callback, [WM_SIZE]) console.write("SetWrap80 registered WM_SIZE callback\n") def pysc_unsetWrap80(args=None): """ To stop pysc_unsetWrap80() """ editor1.setMarginRight(0) editor2.setMarginRight(0) global pysc_size_hook if pysc_size_hook: pysc_size_hook.unhook() del pysc_size_hook # use the following in the console (no #) to stop it from always wrapping at 80 # # pysc_unsetWrap80()

      You run the main script (or call it from startup.py) to get it to start watching for WM_SIZE, and when it gets that, it does the calcs needed to keep the wrap margin at 80 characters (+1 pixel so that the Vertical Edge line would be visible if you’ve got it on)

      Both scripts should go in the main %AppData%\Notepad++\plugins\Config\PythonScript\scripts directory (or equivalent for non-AppData setups, or you need to have added their parent directory to sys.path)

    • Magic MugsM

      Session migration

      Watching Ignoring Scheduled Pinned Locked Moved General Discussion
      2
      0 Votes
      2 Posts
      43 Views
      PeterJonesP

      @Magic-Mugs ,

      Assuming all your open files are real files, and all in the exact same folders on old and new machine, then just copy over %AppData%\Notepad++\session.xml

      If some of your files are the unsaved new # tabs, you will also need to copy over everything in %AppData%\Notepad++\backup\

      But if you want all the same settings from your old to your new, just copy over everything from %AppData%\Notepad++\

    • David Smith 2D

      How to change the colors used for html/css that is exported

      Watching Ignoring Scheduled Pinned Locked Moved General Discussion
      1
      0 Votes
      1 Posts
      20 Views
      No one has replied
    • PeterJonesP

      FAQ: February Security Announcement

      Watching Ignoring Scheduled Pinned until 3/1/26, 9:17 PM Locked Moved Security
      3
      2 Votes
      3 Posts
      347 Views
      PeterJonesP
      Clarification

      Since people still don’t seem to get it, despite all these, I will try to boil it down more.

      This was not some wide net, where they were trying to attack as many as they could. It was highly targeted, with only a very small number of targets.

      Are you a member of a high-value organization that might reasonably be targeted by a nation-state?

      If you know you are, then you need to have your IT follow the technical links from above, because they will be able to understand the “indicators of compromise”

      If you are unsure if you are a member of such a team, you probably are not. But the following can help you clarify:

      Is the team you are a part of outspoken in its criticism or opposition to one or more aggressive nation-states, especially if it’s mentioned in the announcements? Are you an individual user who is outspoken in your criticism or opposition to one or more aggressive nation-states, especially if it’s mentioned in the announcements?

      If your answer to either of those is NO, then you are not a member of a high-value organization.

      If you are not a member of a high-value organization

      The next steps are easy: run a virus/malware scanner, then install v8.9.1 from official sources, as described in How do I clean up, above.

      Short Version: Don’t Overthink This

      If you or your team is outspoken against the nation-state mentioned, or you know that your team is a high-value organization to such a nation-state, find the person on your team who is the IT security expert, and have them look for the indicators of compromise. If you are uncertain, then you almost certainly weren’t the target; but if you have an IT department, they can still look for indicators of compromise.

      Either way, the next steps are the same: run a virus/malware scanner, then manually install the newest version, and you will be safe going forward.