So I ended up scripting a little mock up demo of this, which I won’t post unless there’s interest, but really there’s only a couple of new things that need to happen after a search match to make this work:
find the number of lines shown on screen
set the first visible line to a correct value (based upon the starting line of a find match, and the number of lines shown on screen, and of course the desired effect specified by the OP)
hmm, maybe it gets a tad more complicated if text between the match and the top of screen has folded/hidden lines…
However, looking at how N++ moves the display/selection when a match is found, there seems to be a lot going on with the logic, so I’m not sure how well any changes would fit in.