Moving And Selecting Around
Notepad++ inherits from the rich collection of commands the Scintilla component exposes in order to move the cursor, current line, or both around, and for making these moves extend the selection. Not all of them are mapped to key combinations, because the obvious available ones are simply too few. This page will review the available commands, how they are named in the Shortcut Mapper, and how to trigger them from the keyboard by default.
|SCI_LINEUP||Move cursor up one line||Up Arrow|
|SCI_LINEDOWN||Moves the cursor down one line||Down arrow|
|SCI_CHARLEFT||Moves cursor to previous position||Left arrow|
|SCI_CHARRIGHT||Moves cursor to next position||Right arrow|
Can you think of reasons to remap them? A prank, perhaps. Or a broken keyboard.
Moving on the same line
There are many shades of it. For instance, what does "moving to the beginning of the line" mean?
- Moving to the first character?
- Moving to the first visible character?
- Moving to the first non-whitespace character?
- Moving to the first character of the current subline (an offshoot from a long wrapped line)?
and so on. There are Scintilla commands for everything in this respect.
|SCI_WORDLEFT||Move to next word start on the left||Ctrl+Left arrow|
|SCI_WORDRIGHT||Move to next word start on the right||Ctrl+Right arrow|
|SCI_WORDLEFTEND||Move to next end of word on the left||None|
|SCI_WORDRIGHTEND||Move to next end of word on the right||None|
|SCI_WORDPARTLEFT||Move to the next capitalisation change on the left||Ctrl+/|
|SCI_HOME||Move to column 1 of the line||None|
|SCI_HOMEDISPLAY||Move cursor to first visible character||Alt+Home|
|SCI_HOMEWRAP||Move to column 1 on the current line, even if it is a wrap offshoot||None|
|SCI_VCHOME||Goes to the first non whitespace of the line. If it was there already, move to first character of line||None|
|SCI_VCHOMEWRAP||Same, but "line" can be a sub-line from a wrapped document line||Home|
|SCI_LINEEND||Move to last character of the line||None|
|SCI_LINEEENDDISPLAY||Move cursor to last visible character||Alt+End|
|SCI_LINEENDWRAP||Move to last character on the current line, even if it is a wrap offshoot||End|
By the way, a word is a maximal contiguous sequence of word characters on the same line. What are word characters then? You would expect this to include all lowercase and uppercase Latin-1 letters, digits and underscores. It does, but has to consider accented letters and underscores. For non-Western languages, the definition will be somewhat different. That definition can be made dynamically using a macro.
As expected, an underscore or digit is considered to be a capitalisation change. However, a digit and an underscore are assumed to be of the same capitalisation kind, presumably of type "other" as opposed to "lowercase" or uppercase".
The / in the above default shortcuts must be the one on the main keyboard; Numpad / is different. If / is a shifted key, that key will work, so on some European keyboards, you get Ctrl+(Shift+)/ by hitting Ctrl+(Shift+):. However, when \ is gotten through AltGr-8, the Ctrl-\ shortcut is out of reach and must be remapped.
Moving further up or down
|SCI_PAGEDOWN||Go forth one page||PageDown|
|SCI_PAGEUP||Go back one page||PageUp|
|SCI_STUTTEREDPAGEDOWN||Move to last line of display||None|
|SCI_STUTTEREDPAGEUP||Move to top line of display||None|
|SCI_PARADOWN||Move to previous start of paragraph||Ctrl+]|
|SCI_PARADOWN||Move to next start of paragraph||Ctrl-[|
|SCI_DOCUMENTEND||Move to last line of document||Ctrl+End|
|SCI_DOCUMENTSTART||Move to first line of document||Ctrl+Home|
|Search -> Go to line||Goes to either a specified line or position in the dialog it pops up. Double-clicking the location part on the Status bar also works.||None|
|Search -> Next bookmark||Move to the next Line bookmark||F2|
|Search -> Previous bookmark||Move to the previous Line bookmark||Shift+F2|
|Search -> Jump Up -> n-th style||Move to the previous word marked using the n-th style||Ctrl+Shift+n|
|Search -> Jump Down -> n-th style||Move to the next word marked using the n-th style||Ctrl+n|
For the Jump Up and Jump Down commands, the default Find style can be used as well, in which case n is 0. Otherwise it ranges from 1 to 5.
A paragraph starts at a non-empty line which follows an empty line (or is the first line in document).
Note that the Change Markers plugin enables one to jump from changed line to changed line, with a distinction being made between saved and unsaved changes.
Starting a selection
To start a selection, you can simply use commands that extend the selection (see next sections) starting from the current caret position. However, a number of mouse actions may simplify or enrich this staple feature:
- Clicking an unselected place cancels all selections.
- Clicking on a margin that reacts to mouse clicks, typically all but the fold and bookmark margins, selects the whole line at the same horizontal position.
- Triple-clicking on a line selects it all.
- Double-clicking a word will select it, and possibly trigger Smart Highlighting if enabled.
- Ctrl-double clicking on some text finds the surrounding token delimiters (by default, '(' and ')') and highlights the whole text in between. Escaped parenthess are taken as delimiters. However, if " is chosen as delimier both sides, escaped double quotes are ignored. Multi-line selections are allowed optionally, and not by default.Change the deliiters from Settings -> Preferences -> Delimiter.
- Search -> Select All Between Matching Braces is active when caret is on a brace, and performs the selection including both braces. A companion command is Search -> Go to Matching Brace.
- Shift+clicking some place extends the active stream selection up to that point. If the current selection is a rectangle, it will add a stream selection to the rectangle area.
- Crl+clicking somewhere will start a new selection there. If the current selection is not a rectangle, this will not cancel the previous selection(s), while a simple click would.
- Alt+clicking somewhere starts a rectangular selection, cancelling any existing selection.
- Using Edit -> Begin/End Select will mark (but not visually) the starting point of a selection. The menu entry gets checked when you do. When you hit this menu item again, all text between current position and memorised position is selected - the caret is at the end position.
When multiple selections are cut or copied to the clipboard, their text is plainly concatenated from the top of document to the bottom, without an intervening separator.
Typing into one of multiple selections causes the typed text to replace each elementary selection. This feature is called Multi-Editing.
The main actions starting a rectangular selection are summarised in a small dialog box summoned by Edit -> Column Mode....
Extending stream selection
It is very common to associate to a cursor move a selection-extending move. Add "EXTEND" to any move command to get the comand that moves with selection extension. Thus SCI_VCHOME becomes SCI_VCHOMEEXTEND.
When defining or remapping cursor moves, it is expected that the associated selection extension command has the same shortcut with the Shift modifier added in. While this consistency rule is not enforced, breaking it could easily confuse users.
Other selection commands
|SCI_SELECTALL||Select whole document in stream mode||Ctrl+A|
|SCI_SELECTIONDUPLICATE||Inserts a copy of the selection at the caret, the copy becoming the selection||Ctrl+D|
|SCI_SWAPMAINANCHORCARET||Toggles caret between start and end of selection||None|
|SCI_ROTATESELECTION||Moves the active selection to the next selected range||None|
Actually, if there is no selection, or if the selection is rectangular, SCI_SELECTIONDUPLICATE duplicates the current line.
In addition, if there is a single stream selection spanning more than one line, the Edit -> Line operations -> Move Up/Down current line commands will move the lines that are part of the selection. Otherwise they just move the current line.
The "next" selection, when using SCI_ROTATESELECTION, is in chronological order, not in text order. However, multiple selections are sent to the clipboard in text order. There is no built-in rotate-back command.
Extending a rectangular selection
The rule is as simple as above, except that the suffix becomes "RECTEXTEND". Thus SCI_LINEDOWN becomes SCI_LINEDOWNRECTEXTEND. However, this doesn't work for all move commands. Here is the list of the commands that extend a rectangular selection:
The expected shortcut for such a message is formed from the base move with the Alt and Shift modifiers added. For example, SCI_PAGEDOWNRECTEXTEND is mapped to Alt+Shift+PageDown.
Changing selection mode
The following synthetic macro changes the mode of an existing selection. Insert this right before the </Macros> tag in shortcuts.xml:
<Macro name="CurrSelMode" Ctrl="yes" Alt="yes" Shift="no" Key="100"> <Action type="0" message="2422" wParam=mode lParam="0" sParam=""/> </Macro>
mode is either 0 for stream (default), 1 for rectangular, or 2 for full lines. Who knows, besides being fun, this macro could even be useful.
Scrolling is a quite specific mode of navigation. Contrary to other means, the text you view when scrolling is not the active text, as the caret doesn't move. Nor is the selection affected. Scrolling covers these issues in more detail.
High level viewing
A different way to handle text is having it displayed completely on a dockable window. This is called the Document Map, which is available using View -> Document Map.
Clicking on any point in the Document Map will highlight a pageful of text, centred on the click point, and the active document will be positioned at the top of this page. The highlighting is translucent, which enables accurate yet fast navigation because the syntax highlighting is visible and guides you through the structured document.