aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaDoc.html5
-rw-r--r--include/Scintilla.h1
-rw-r--r--include/Scintilla.iface3
-rw-r--r--src/Editor.cxx36
-rw-r--r--src/Editor.h2
-rw-r--r--src/KeyMap.cxx2
6 files changed, 37 insertions, 12 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 7bc2d8b25..a5e84ec19 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -3463,6 +3463,11 @@ struct TextToFind {
<td><code>SCI_BACKTAB</code></td>
</tr>
+
+ <tr>
+ <td><code>SCI_SELECTIONDUPLICATE</code></td>
+
+ </tr>
</tbody>
</table>
diff --git a/include/Scintilla.h b/include/Scintilla.h
index a82c00fda..b4ed329f7 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -606,6 +606,7 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_TOGGLECARETSTICKY 2459
#define SCI_SETPASTECONVERTENDINGS 2467
#define SCI_GETPASTECONVERTENDINGS 2468
+#define SCI_SELECTIONDUPLICATE 2469
#define SCI_STARTRECORD 3001
#define SCI_STOPRECORD 3002
#define SCI_SETLEXER 4001
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 2c2272cd1..d20604819 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -1638,6 +1638,9 @@ set void SetPasteConvertEndings=2467(bool convert,)
# Get convert-on-paste setting
get bool GetPasteConvertEndings=2468(,)
+# Duplicate the selection. If selection empty duplicate the line containing the caret.
+fun void SelectionDuplicate=2469(,)
+
# Start notifying the container of all key presses and commands.
fun void StartRecord=3001(,)
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 85212aa80..f4ef99b5a 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -3886,6 +3886,7 @@ void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lPar
case SCI_LINEENDRECTEXTEND:
case SCI_PAGEUPRECTEXTEND:
case SCI_PAGEDOWNRECTEXTEND:
+ case SCI_SELECTIONDUPLICATE:
break;
// Filter out all others like display changes. Also, newlines are redundant
@@ -3999,15 +4000,26 @@ void Editor::LineTranspose() {
}
}
-void Editor::LineDuplicate() {
- int line = pdoc->LineFromPosition(currentPos);
- int start = pdoc->LineStart(line);
- int end = pdoc->LineEnd(line);
- char *thisLine = CopyRange(start, end);
- const char *eol = StringFromEOLMode(pdoc->eolMode);
- pdoc->InsertString(end, eol);
- pdoc->InsertString(end + istrlen(eol), thisLine, end - start);
- delete []thisLine;
+void Editor::Duplicate(bool forLine) {
+ int start = SelectionStart();
+ int end = SelectionEnd();
+ if (start == end) {
+ forLine = true;
+ }
+ if (forLine) {
+ int line = pdoc->LineFromPosition(currentPos);
+ start = pdoc->LineStart(line);
+ end = pdoc->LineEnd(line);
+ }
+ char *text = CopyRange(start, end);
+ if (forLine) {
+ const char *eol = StringFromEOLMode(pdoc->eolMode);
+ pdoc->InsertString(end, eol);
+ pdoc->InsertString(end + istrlen(eol), text, end - start);
+ } else {
+ pdoc->InsertString(end, text, end - start);
+ }
+ delete []text;
}
void Editor::CancelModes() {
@@ -4455,7 +4467,10 @@ int Editor::KeyCommand(unsigned int iMessage) {
LineTranspose();
break;
case SCI_LINEDUPLICATE:
- LineDuplicate();
+ Duplicate(true);
+ break;
+ case SCI_SELECTIONDUPLICATE:
+ Duplicate(false);
break;
case SCI_LOWERCASE:
ChangeCaseOfSelection(false);
@@ -7013,6 +7028,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
case SCI_LINEENDRECTEXTEND:
case SCI_PAGEUPRECTEXTEND:
case SCI_PAGEDOWNRECTEXTEND:
+ case SCI_SELECTIONDUPLICATE:
return KeyCommand(iMessage);
case SCI_BRACEHIGHLIGHT:
diff --git a/src/Editor.h b/src/Editor.h
index 6d2cbbdef..0ac6ec917 100644
--- a/src/Editor.h
+++ b/src/Editor.h
@@ -454,7 +454,7 @@ protected: // ScintillaBase subclass needs access to much of Editor
void PageMove(int direction, selTypes sel=noSel, bool stuttered = false);
void ChangeCaseOfSelection(bool makeUpperCase);
void LineTranspose();
- void LineDuplicate();
+ void Duplicate(bool forLine);
virtual void CancelModes();
void NewLine();
void CursorUpOrDown(int direction, selTypes sel=noSel);
diff --git a/src/KeyMap.cxx b/src/KeyMap.cxx
index 950916bd0..bfa6e2d78 100644
--- a/src/KeyMap.cxx
+++ b/src/KeyMap.cxx
@@ -140,7 +140,7 @@ const KeyToCommand KeyMap::MapDefault[] = {
{'L', SCI_CSHIFT, SCI_LINEDELETE},
{'T', SCI_CSHIFT, SCI_LINECOPY},
{'T', SCI_CTRL, SCI_LINETRANSPOSE},
- {'D', SCI_CTRL, SCI_LINEDUPLICATE},
+ {'D', SCI_CTRL, SCI_SELECTIONDUPLICATE},
{'U', SCI_CTRL, SCI_LOWERCASE},
{'U', SCI_CSHIFT, SCI_UPPERCASE},
{0,0,0},