mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-10 22:36:17 +02:00
SynEdit: multi caret, option to prevent ecDelete from joining lines (skip delete linebreak)
git-svn-id: trunk@58193 -
This commit is contained in:
parent
228a45c5a8
commit
5ab71e4e90
@ -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);
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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';
|
||||||
|
Loading…
Reference in New Issue
Block a user