mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-13 10:09:25 +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);
|
||||
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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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';
|
||||
|
Loading…
Reference in New Issue
Block a user