SynEdit: multi caret, option to prevent ecDelete from joining lines (skip delete linebreak)

git-svn-id: trunk@58193 -
This commit is contained in:
martin 2018-06-08 21:44:44 +00:00
parent 228a45c5a8
commit 5ab71e4e90
7 changed files with 44 additions and 10 deletions

View File

@ -5084,6 +5084,7 @@ begin
Application.AddOnIdleHandler(@IdleScanRanges, False); Application.AddOnIdleHandler(@IdleScanRanges, False);
exit; exit;
end; end;
//TODO: exit if in paintlock ???
if not assigned(FHighlighter) then begin if not assigned(FHighlighter) then begin
if ATextChanged then begin if ATextChanged then begin
fMarkupManager.TextChanged(FChangedLinesStart, FChangedLinesEnd, FChangedLinesDiff); fMarkupManager.TextChanged(FChangedLinesStart, FChangedLinesEnd, FChangedLinesDiff);
@ -6738,7 +6739,7 @@ begin
end; end;
end; end;
end; end;
ecDeleteChar: ecDeleteChar, ecDeleteCharNoCrLf:
if not ReadOnly then begin if not ReadOnly then begin
if SelAvail and (not FBlockSelection.Persistent) and (eoOverwriteBlock in fOptions2) then if SelAvail and (not FBlockSelection.Persistent) and (eoOverwriteBlock in fOptions2) then
SetSelTextExternal('') SetSelTextExternal('')
@ -6752,7 +6753,9 @@ begin
Counter:=GetCharLen(Temp,LogCaretXY.X); Counter:=GetCharLen(Temp,LogCaretXY.X);
FTheLinesView.EditDelete(LogCaretXY.X, CaretY, Counter); FTheLinesView.EditDelete(LogCaretXY.X, CaretY, Counter);
SetLogicalCaretXY(LogCaretXY); SetLogicalCaretXY(LogCaretXY);
end else begin end
else
if Command = ecDeleteChar then begin
// join line with the line after // join line with the line after
if CaretY < FTheLinesView.Count then begin if CaretY < FTheLinesView.Count then begin
Helper := StringOfChar(' ', LogCaretXY.X - 1 - Len); Helper := StringOfChar(' ', LogCaretXY.X - 1 - Len);

View File

@ -249,6 +249,7 @@ const
ecInsertLine = 510; // Break line at current position, leave caret ecInsertLine = 510; // Break line at current position, leave caret
ecChar = 511; // Insert a character at current position ecChar = 511; // Insert a character at current position
ecSmartUnindent = 512; // NOT regocniced as command, used for group-undo, set by beautifier ecSmartUnindent = 512; // NOT regocniced as command, used for group-undo, set by beautifier
ecDeleteCharNoCrLf= 513; // Delete char at cursor (i.e. delete key), but do not join lines
ecImeStr = 550; // Insert character(s) from IME ecImeStr = 550; // Insert character(s) from IME

View File

@ -289,6 +289,11 @@ type
); );
TSynPluginMultiCaretStateFlags = set of TSynPluginMultiCaretStateFlag; TSynPluginMultiCaretStateFlags = set of TSynPluginMultiCaretStateFlag;
TSynMultiCaretOption = (
smcoDeleteSkipLineBreak // ecDeleteChar will not join lines
);
TSynMultiCaretOptions = set of TSynMultiCaretOption;
{ TSynEditUndoMultiCaret } { TSynEditUndoMultiCaret }
TSynEditUndoMultiCaret = class(TSynEditUndoItem) TSynEditUndoMultiCaret = class(TSynEditUndoItem)
@ -319,6 +324,7 @@ type
FEnableWithColumnSelection: Boolean; FEnableWithColumnSelection: Boolean;
FKeyStrokes: TSynPluginMultiCaretKeyStrokes; FKeyStrokes: TSynPluginMultiCaretKeyStrokes;
FOnBeforeCommand: TSynMultiCaretBeforeCommand; FOnBeforeCommand: TSynMultiCaretBeforeCommand;
FOptions: TSynMultiCaretOptions;
FStateFlags: TSynPluginMultiCaretStateFlags; FStateFlags: TSynPluginMultiCaretStateFlags;
FMouseActions: TSynPluginMultiCaretMouseActions; FMouseActions: TSynPluginMultiCaretMouseActions;
FSelY1, FSelY2, FSelX: Integer; FSelY1, FSelY2, FSelX: Integer;
@ -391,6 +397,7 @@ type
property DefaultMode: TSynPluginMultiCaretDefaultMode read FDefaultMode write SetDefaultMode default mcmMoveAllCarets; property DefaultMode: TSynPluginMultiCaretDefaultMode read FDefaultMode write SetDefaultMode default mcmMoveAllCarets;
property DefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode property DefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode
read FDefaultColumnSelectMode write SetDefaultColumnSelectMode default mcmCancelOnCaretMove; read FDefaultColumnSelectMode write SetDefaultColumnSelectMode default mcmCancelOnCaretMove;
property Options: TSynMultiCaretOptions read FOptions write FOptions;
property OnBeforeCommand: TSynMultiCaretBeforeCommand read FOnBeforeCommand write FOnBeforeCommand; property OnBeforeCommand: TSynMultiCaretBeforeCommand read FOnBeforeCommand write FOnBeforeCommand;
end; end;
@ -2352,7 +2359,7 @@ procedure TSynCustomPluginMultiCaret.ProcessAllSynCommand(Sender: TObject; After
var Handled: boolean; var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer; var Handled: boolean; var Command: TSynEditorCommand; var AChar: TUTF8Char; Data: pointer;
HandlerData: pointer); HandlerData: pointer);
procedure ExecCommandRepeated(AOnePerLine: Boolean = False); procedure ExecCommandRepeated(AOnePerLine: Boolean = False; AForceAll: Boolean = False);
var var
i, y: Integer; i, y: Integer;
p: TLogCaretPoint; p: TLogCaretPoint;
@ -2377,7 +2384,7 @@ procedure TSynCustomPluginMultiCaret.ProcessAllSynCommand(Sender: TObject; After
noChange := sfNoChangeIndicator in FStateFlags; noChange := sfNoChangeIndicator in FStateFlags;
Exclude(FStateFlags, sfNoChangeIndicator); Exclude(FStateFlags, sfNoChangeIndicator);
if noChange then begin if noChange and not AForceAll then begin
if Carets.MainCaretIndex >= 0 then if Carets.MainCaretIndex >= 0 then
RemoveCaret(Carets.MainCaretIndex) RemoveCaret(Carets.MainCaretIndex)
else else
@ -2544,15 +2551,16 @@ begin
exit; exit;
Action := ccaDefaultAction;
case Command of case Command of
ecCopy, ecCut: Action := ccaNoneRepeatCommand; ecCopy, ecCut: Action := ccaNoneRepeatCommand;
ecGotoMarker0..ecGotoMarker9: Action := ccaClearCarets; ecGotoMarker0..ecGotoMarker9: Action := ccaClearCarets;
ecSelectAll: Action := ccaClearCarets; ecSelectAll: Action := ccaClearCarets;
ecDeleteChar: if smcoDeleteSkipLineBreak in Options then
Command := ecDeleteCharNoCrLf;
else else
if Command >= ecUserFirst then if Command >= ecUserFirst then
Action := ccaNoneRepeatCommand Action := ccaNoneRepeatCommand;
else
Action := ccaDefaultAction;
end; end;
Flags := []; Flags := [];
if FOnBeforeCommand <> nil then if FOnBeforeCommand <> nil then
@ -2585,12 +2593,12 @@ begin
case Command of case Command of
// TODO: delete and smColumn -- only delete once // TODO: delete and smColumn -- only delete once
ecDeleteLastChar..ecDeleteLine, ecDeleteLastChar..ecDeleteLine, ecDeleteCharNoCrLf,
ecLineBreak..ecChar: ecLineBreak..ecChar:
begin begin
StartEditing; StartEditing;
if Editor.ReadOnly then exit; if Editor.ReadOnly then exit;
ExecCommandRepeated; ExecCommandRepeated(False, Command = ecDeleteCharNoCrLf);
end; end;
ecPaste: ecPaste:
begin begin

View File

@ -1343,6 +1343,7 @@ type
FCompletionLongLineHintType: TSynCompletionLongHintType; FCompletionLongLineHintType: TSynCompletionLongHintType;
FMultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode; FMultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode;
FMultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode; FMultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode;
FMultiCaretDeleteSkipLineBreak: Boolean;
FPasExtendedKeywordsMode: Boolean; FPasExtendedKeywordsMode: Boolean;
FHideSingleTabInWindow: Boolean; FHideSingleTabInWindow: Boolean;
FPasStringKeywordMode: TSynPasStringMode; FPasStringKeywordMode: TSynPasStringMode;
@ -1664,6 +1665,8 @@ type
read FMultiCaretOnColumnSelect write FMultiCaretOnColumnSelect default True; read FMultiCaretOnColumnSelect write FMultiCaretOnColumnSelect default True;
property MultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode property MultiCaretDefaultMode: TSynPluginMultiCaretDefaultMode
read FMultiCaretDefaultMode write FMultiCaretDefaultMode default mcmMoveAllCarets; read FMultiCaretDefaultMode write FMultiCaretDefaultMode default mcmMoveAllCarets;
property MultiCaretDeleteSkipLineBreak: Boolean
read FMultiCaretDeleteSkipLineBreak write FMultiCaretDeleteSkipLineBreak default False;
property MultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode property MultiCaretDefaultColumnSelectMode: TSynPluginMultiCaretDefaultMode
read FMultiCaretDefaultColumnSelectMode write FMultiCaretDefaultColumnSelectMode default mcmCancelOnCaretMove; read FMultiCaretDefaultColumnSelectMode write FMultiCaretDefaultColumnSelectMode default mcmCancelOnCaretMove;
@ -4523,6 +4526,7 @@ begin
FMultiCaretOnColumnSelect := True; FMultiCaretOnColumnSelect := True;
FMultiCaretDefaultMode := mcmMoveAllCarets; FMultiCaretDefaultMode := mcmMoveAllCarets;
FMultiCaretDefaultColumnSelectMode := mcmCancelOnCaretMove; FMultiCaretDefaultColumnSelectMode := mcmCancelOnCaretMove;
FMultiCaretDeleteSkipLineBreak := False;
// Display options // Display options
fEditorFont := SynDefaultFontName; fEditorFont := SynDefaultFontName;
@ -5756,6 +5760,9 @@ begin
TIDESynEditor(ASynEdit).MultiCaret.EnableWithColumnSelection := MultiCaretOnColumnSelect; TIDESynEditor(ASynEdit).MultiCaret.EnableWithColumnSelection := MultiCaretOnColumnSelect;
TIDESynEditor(ASynEdit).MultiCaret.DefaultMode := FMultiCaretDefaultMode; TIDESynEditor(ASynEdit).MultiCaret.DefaultMode := FMultiCaretDefaultMode;
TIDESynEditor(ASynEdit).MultiCaret.DefaultColumnSelectMode := FMultiCaretDefaultColumnSelectMode; TIDESynEditor(ASynEdit).MultiCaret.DefaultColumnSelectMode := FMultiCaretDefaultColumnSelectMode;
if FMultiCaretDeleteSkipLineBreak
then TIDESynEditor(ASynEdit).MultiCaret.Options := TIDESynEditor(ASynEdit).MultiCaret.Options + [smcoDeleteSkipLineBreak]
else TIDESynEditor(ASynEdit).MultiCaret.Options := TIDESynEditor(ASynEdit).MultiCaret.Options - [smcoDeleteSkipLineBreak];
end; end;
{$ENDIF} {$ENDIF}

View File

@ -366,4 +366,15 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
Font.Style = [fsBold] Font.Style = [fsBold]
ParentFont = False ParentFont = False
end end
object chkMultiCaretDelSkipCr: TCheckBox
AnchorSideLeft.Control = chkMultiCaretColumnMode
AnchorSideTop.Control = MultiCaretOnColumnSelection
AnchorSideTop.Side = asrBottom
Left = 218
Height = 19
Top = 273
Width = 146
Caption = 'chkMultiCaretDelSkipCr'
TabOrder = 20
end
end end

View File

@ -36,6 +36,7 @@ type
TEditorGeneralOptionsFrame = class(TAbstractIDEOptionsEditor) TEditorGeneralOptionsFrame = class(TAbstractIDEOptionsEditor)
chkMultiCaretColumnMode: TCheckBox; chkMultiCaretColumnMode: TCheckBox;
chkMultiCaretMode: TCheckBox; chkMultiCaretMode: TCheckBox;
chkMultiCaretDelSkipCr: TCheckBox;
MultiCaretGroupDivider: TDividerBevel; MultiCaretGroupDivider: TDividerBevel;
MultiCaretOnColumnSelection: TCheckBox; MultiCaretOnColumnSelection: TCheckBox;
CursorSkipsTabCheckBox: TCheckBox; CursorSkipsTabCheckBox: TCheckBox;
@ -150,6 +151,7 @@ begin
MultiCaretOnColumnSelection.Caption := dlgMultiCaretOnColumnSelection; MultiCaretOnColumnSelection.Caption := dlgMultiCaretOnColumnSelection;
chkMultiCaretColumnMode.Caption := dlgMultiCaretColumnMode; chkMultiCaretColumnMode.Caption := dlgMultiCaretColumnMode;
chkMultiCaretMode.Caption := dlgMultiCaretMode; chkMultiCaretMode.Caption := dlgMultiCaretMode;
chkMultiCaretDelSkipCr.Caption := dlgMultiCaretDelSkipCr;
// Block // Block
BlockGroupDivider.Caption := dlgBlockGroupOptions; BlockGroupDivider.Caption := dlgBlockGroupOptions;
@ -186,6 +188,7 @@ begin
MultiCaretOnColumnSelection.Checked := MultiCaretOnColumnSelect; MultiCaretOnColumnSelection.Checked := MultiCaretOnColumnSelect;
chkMultiCaretColumnMode.Checked := MultiCaretDefaultColumnSelectMode = mcmMoveAllCarets; chkMultiCaretColumnMode.Checked := MultiCaretDefaultColumnSelectMode = mcmMoveAllCarets;
chkMultiCaretMode.Checked := MultiCaretDefaultMode = mcmMoveAllCarets; chkMultiCaretMode.Checked := MultiCaretDefaultMode = mcmMoveAllCarets;
chkMultiCaretDelSkipCr.Checked := MultiCaretDeleteSkipLineBreak;
// block // block
PersistentBlockCheckBox.Checked := eoPersistentBlock in SynEditOptions2; PersistentBlockCheckBox.Checked := eoPersistentBlock in SynEditOptions2;
@ -254,7 +257,7 @@ begin
MultiCaretDefaultMode := mcmMoveAllCarets MultiCaretDefaultMode := mcmMoveAllCarets
else else
MultiCaretDefaultMode := mcmCancelOnCaretMove; MultiCaretDefaultMode := mcmCancelOnCaretMove;
MultiCaretDeleteSkipLineBreak := chkMultiCaretDelSkipCr.Checked;
// block // block
UpdateOptionFromBool(PersistentBlockCheckBox.Checked, eoPersistentBlock); UpdateOptionFromBool(PersistentBlockCheckBox.Checked, eoPersistentBlock);

View File

@ -1852,6 +1852,7 @@ resourcestring
dlgMultiCaretOnColumnSelection = 'Enable multi-caret for column selection'; dlgMultiCaretOnColumnSelection = 'Enable multi-caret for column selection';
dlgMultiCaretColumnMode = 'Navigation keys move all carets (column-select)'; dlgMultiCaretColumnMode = 'Navigation keys move all carets (column-select)';
dlgMultiCaretMode = 'Navigation keys move all carets'; dlgMultiCaretMode = 'Navigation keys move all carets';
dlgMultiCaretDelSkipCr = 'Skip delete key at EOL (do not join lines)';
dlgColorLink = '(Edit Color)'; dlgColorLink = '(Edit Color)';
dlgKeyLink = '(Edit Key)'; dlgKeyLink = '(Edit Key)';
dlgBracketHighlight = 'Bracket highlight'; dlgBracketHighlight = 'Bracket highlight';