Multi-cursor editing
-
Ahh, yes - this was one of the reason to drop XP support as this
API is not supported by XP. -
@Ekopalypse said in Multi-cursor editing:
Ooopppss - did not happen to me yet.
Is it possible that a very, very large amount of data had to be selected?No, it wasn’t. It was late and I’m sorry but can’t exactly remember what was the selection to be made, surely the target were partial words. But don’t worry, maybe the issue had other causes. If I can reproduce it will let you know.
Best Regards
-
@guy038, @alan-kilborn, All
I tried to replicate your tests as long as I understood them, with just Notepad++ basic multiselection feature, that is, disabling the BMS plugin and without running Ekopalypse PS:
In the first test I created a null selection column by pressing Shift + Alt + Down Arrow 5 times. As soon as I moved the caret down with an arrow key, the multiselection got lost. End of test.
Second test. Created a null selection column pressing Cntrl + Click 5 times. Moved it down and arrived to line 14 with 5 cursors but misalignated. To resolve this unwanted result hit End and all the 5 cursors aligned at the end lines —or hit Home to get a similar output—. Then went up and got the same as before.
Conclusion: It matters how the multiselection is created. I’m really puzzled.
Best Regards
-
scintilla knows and uses different selection modes.
By using SHIFT+ALT+ARROWDOWN/UP you are creating a rectangular selection. By using CTRL+mouse_click you are creating the stream mode.
-
-Thank you. I was unaware of these different modes of selection, considered them as an unique mode, without any difference.
So the selection mode that is created by means of your Python plugin, for example, like in the gif animation you uploaded to this thread two days ago, seems to be a stream mode. Am I right?
-
@astrosofista said in Multi-cursor editing:
So the selection mode that is created by means of (PythonScript) plugin…seems to be a stream mode.
It’s not explicit in the Python code presented, but most of the P.S. functions that deal with creating selections assume you want stream mode. There are only a few functions that allow you to create column-block selections:
editor.setRectangularSelectionAnchor() editor.setRectangularSelectionAnchorVirtualSpace() editor.setRectangularSelectionCaret() editor.setRectangularSelectionCaretVirtualSpace()
-
-
Good to know, thank you :)
-
Thank you :)
-
@astrosofista said in Multi-cursor editing:
@Ekopalypse said in Multi-cursor editing:
Ooopppss - did not happen to me yet.
Is it possible that a very, very large amount of data had to be selected?No, it wasn’t. It was late and I’m sorry but can’t exactly remember what was the selection to be made, surely the target were partial words. But don’t worry, maybe the issue had other causes. If I can reproduce it will let you know.
Hi @Ekopalypse, All
I think I found the mentioned issue. When a character as a comma (
,
) is selected —shown at the top of the posted imagen— the Python script works as expected, but things go weird when you select a period or a dot (.
) and run the PS —at the bottom of the imagen—, as the multiselection now encompass all the characters of the document:Hope this helps.
-
Apparently the script is treating the
.
as the regular expression for “any single character”. Thus, when the script is run with only a.
character selected, you get a blinking (if so configured) caret at every position in the doc. This script modification corrects it:from Npp import editor first_line = editor.getFirstVisibleLine() editor.setSearchFlags(0) # <---------- the new line editor.setTarget(0, editor.getTextLength()) editor.multipleSelectAddEach() editor.rotateSelection() editor.setFirstVisibleLine(first_line)
I’m not sure of the complete set of possible arguments to
.setSearchFlags()
– it is not documented so well in the P.S. docs–but I found these in the Notepad++ source code:#define SCFIND_NONE 0x0 #define SCFIND_WHOLEWORD 0x2 #define SCFIND_MATCHCASE 0x4 #define SCFIND_WORDSTART 0x00100000 #define SCFIND_REGEXP 0x00200000 #define SCFIND_POSIX 0x00400000 #define SCFIND_CXX11REGEX 0x00800000
My modification to the script is using
SCFIND_NONE
. -
Definitively regex, or at least some of its functions are invoked in the original PS. I typed an
\s
at the end of the first paragraph —I mean the GNU License sample text—, then selected thebackslash
, run the script, then thes
and the script… PS ignored single characters and only take into consideration whole words, so when I selected the firstT
, PS did nothing, butThis
was selected and PS correctly matched the other two instances of the word.Anyway, the script modification you provided solved the issue. A big thanks for your assistance and fast reply.
Best Regards.
-
Thanks for testing and improving.
I haven’t noticed it yet but it makes sense.
The documentation for searchFlags is described here. -
@Ekopalypse said in Multi-cursor editing:
The documentation for searchFlags is described here.
Yes but that documentation falls flat when you need an actual number to pass to a function!
Is there some Python magic one can do to find these identifiers? What I mean is, if I do
dir(MENUCOMMAND)
in the P.S. console, I see:>>> dir(MENUCOMMAND) ['CLEAN_RECENT_FILE_LIST', 'EDIT_AUTOCOMPLETE', 'EDIT_AUTOCOMPLETE_CURRENTFILE', 'EDIT_AUTOCOMPLETE_PATH', 'EDIT_BEGINENDSELECT', ...
Some similar way of finding these “SCFIND_” things?
-
for readability you normally use FINDOPTION.NONE instead of the 0.
In order to get all values from such enum you can call its values method.
For example: FINDOPTION.values() would return{0: Npp.FINDOPTION.NONE, 1048576: Npp.FINDOPTION.WORDSTART, 2: Npp.FINDOPTION.WHOLEWORD, 4: Npp.FINDOPTION.MATCHCASE, 2097152: Npp.FINDOPTION.REGEXP, 8388608: Npp.FINDOPTION.CXX11REGEX, 4194304: Npp.FINDOPTION.POSIX}
-
@Ekopalypse said in Multi-cursor editing:
for readability you normally use FINDOPTION.NONE instead of the 0.
Yes, but you have to know that EXISTS first! :-)
To your point about “readability”…that’s why I was asking.
I would much rather NOT use the magic number of zero.I didn’t see anything that logically links
FINDOPTION
to the SCFIND nomenclature. Maybe I missed the connection. -
@Ekopalypse said in Multi-cursor editing:
For example: FINDOPTION.values() would return
Just a slight note for any future readers:
FINDOPTION.values()
at the Pythonscript console yields:>> FINDOPTION.values() Traceback (most recent call last): File "<console>", line 1, in <module> TypeError: 'dict' object is not callable
The proper thing to do is
FINDOPTION.values
(no parentheses). -
Ooopps - you are right, thx for reporting.
Seems I have wrapped it incorrectly with my python3 plugin.Yes, not every enum has really the same, but most of the time similar, name as the normal c-headers have.
To get all the enums you can run globals() in the console or from a script. -
-
I’m sorry, but it’s still an alpha version.
As long as not all functions/methods work as described
you’re not really gonna enjoy it.
Had a nasty plugin crash yesterday because instead using
an signed integer I used an unsigned one. :-(But there will be fewer and fewer open issues.
And since I was wrong with the release date several times,
I prefer not to give a forecast until when a beta version can be expected.The actual situation, Corona, has one advantage - I have more time to work on PySnack (That’s what I want to call it).