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

View File

@ -249,6 +249,7 @@ const
ecInsertLine = 510; // Break line at current position, leave caret
ecChar = 511; // Insert a character at current position
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

View File

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

View File

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

View File

@ -366,4 +366,15 @@ object EditorGeneralOptionsFrame: TEditorGeneralOptionsFrame
Font.Style = [fsBold]
ParentFont = False
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

View File

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

View File

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