diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 7e8bb4efb8..433a436057 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -164,7 +164,7 @@ type eoDisableScrollArrows, //TODO Disables the scroll bar arrow buttons when you can't scroll in that direction any more eoDragDropEditing, // Allows you to select a block of text and drag it within the document to another location eoDropFiles, //TODO Allows the editor accept file drops - eoEnhanceHomeKey, //TODO enhances home key positioning, similar to visual studio + eoEnhanceHomeKey, // home key jumps to line start if nearer, similar to visual studio eoGroupUndo, //TODO When undoing/redoing actions, handle all continous changes of the same kind in one call instead undoing/redoing each command separately eoHalfPageScroll, // When scrolling with page-up and page-down commands, only scroll a half page at a time eoHideShowScrollbars, //TODO if enabled, then the scrollbars will only show when necessary. If you have ScrollPastEOL, then it the horizontal bar will always be there (it uses MaxLength instead) @@ -9122,38 +9122,40 @@ var OldPos: TPoint; NewPos: TPoint; begin + OldPos:=LogicalCaretXY; + NewPos:=OldPos; + if not (eoEnhanceHomeKey in fOptions) and (CaretX>1) then begin // not at start of line -> jump to start of line - CaretX:=1; - exit; - end; - - // calculate line start position - FirstNonBlank:=-1; - if CaretY<=Lines.Count then begin - s:=fLines[CaretXY.Y-1]; - - // search first non blank char pos - FirstNonBlank:=1; - while (FirstNonBlank<=length(s)) and (s[FirstNonBlank] in [#32, #9]) do - inc(FirstNonBlank); - if FirstNonBlank>length(s) then - FirstNonBlank:=-1; - end else - s:=''; - if FirstNonBlank>=1 then begin - // this line is not blank - LineStart:=FirstNonBlank; - end else begin - // this line is blank - // -> use automatic line indent - LineStart:=GetLineIndentProposal(CaretY,true); - end; - - OldPos:=LogicalCaretXY; - NewPos:=Point(LineStart,OldPos.Y); - if (eoEnhanceHomeKey in fOptions) and (OldPos.Xlength(s) then + FirstNonBlank:=-1; + end else + s:=''; + if FirstNonBlank>=1 then begin + // this line is not blank + LineStart:=FirstNonBlank; + end else begin + // this line is blank + // -> use automatic line indent + LineStart:=GetLineIndentProposal(CaretY,true); + end; + + NewPos.X:=LineStart; + if (eoEnhanceHomeKey in fOptions) and (OldPos.X>1) and (OldPos.X<=NewPos.X) + then begin + NewPos.X:=1; + end; end; MoveCaretAndSelection(OldPos, NewPos, Selection); diff --git a/ide/editoroptions.pp b/ide/editoroptions.pp index 4d0a696476..42ccf3e483 100644 --- a/ide/editoroptions.pp +++ b/ide/editoroptions.pp @@ -313,6 +313,7 @@ type FindTextAtCursorCheckBox:TCheckBox; UseSyntaxHighlightCheckBox:TCheckBox; CopyWordAtCursorOnCopyNoneCheckBox:TCheckBox; + EnhanceHomeKeyCheckBox:TCheckBox; ShowGutterHintsCheckBox:TCheckBox; MouseLinksCheckBox: TCheckBox; BlockIndentComboBox:TComboBox; @@ -1191,6 +1192,7 @@ begin eoDoubleClickSelectsLine:SynEditOptName:='DoubleClickSelectsLine'; eoDragDropEditing:SynEditOptName:='DragDropEditing'; eoDropFiles:SynEditOptName:='DropFiles'; + eoEnhanceHomeKey:SynEditOptName:='EnhanceHomeKey'; eoHalfPageScroll:SynEditOptName:='HalfPageScroll'; eoKeepCaretX:SynEditOptName:='KeepCaretX'; eoPersistentCaret:SynEditOptName:='PersistentCaret'; @@ -1317,6 +1319,7 @@ begin eoDoubleClickSelectsLine:SynEditOptName:='DoubleClickSelectsLine'; eoDragDropEditing:SynEditOptName:='DragDropEditing'; eoDropFiles:SynEditOptName:='DropFiles'; + eoEnhanceHomeKey:SynEditOptName:='EnhanceHomeKey'; eoHalfPageScroll:SynEditOptName:='HalfPageScroll'; eoKeepCaretX:SynEditOptName:='KeepCaretX'; eoPersistentCaret:SynEditOptName:='PersistentCaret'; @@ -2411,6 +2414,7 @@ begin SetOption(DoubleClickLineCheckBox,eoDoubleClickSelectsLine); SetOption(DragDropEditingCheckBox,eoDragDropEditing); SetOption(DropFilesCheckBox,eoDropFiles); + SetOption(EnhanceHomeKeyCheckBox,eoEnhanceHomeKey); SetOption(HalfPageScrollCheckBox,eoHalfPageScroll); SetOption(KeepCaretXCheckBox,eoKeepCaretX); SetOption(PersistentCaretCheckBox,eoPersistentCaret); @@ -3679,6 +3683,17 @@ begin end; inc(y,ChkBoxH); + EnhanceHomeKeyCheckBox:=TCheckBox.Create(Self); + with EnhanceHomeKeyCheckBox do begin + Name:='EnhanceHomeKeyCheckBox'; + Parent:=EditorOptionsGroupBox; + SetBounds(x,y,ChkBoxW,Height); + Caption:=dlgHomeKeyJumpsToNearestStart; + Checked:=eoEnhanceHomeKey in EditorOpts.SynEditOptions; + OnClick:=@GeneralCheckBoxOnClick; + end; + inc(y,ChkBoxH); + // BlockIndentComboBox:=TComboBox.Create(Self); @@ -3919,6 +3934,11 @@ begin end; inc(y,ChkBoxH); + with EnhanceHomeKeyCheckBox do begin + SetBounds(x,y,ChkBoxW,Height); + end; + inc(y,ChkBoxH); + // with BlockIndentComboBox do begin diff --git a/ide/lazarusidestrconsts.pas b/ide/lazarusidestrconsts.pas index de8b6d3430..275b1e53af 100644 --- a/ide/lazarusidestrconsts.pas +++ b/ide/lazarusidestrconsts.pas @@ -778,6 +778,7 @@ resourcestring dlgFindTextatCursor = 'Find text at cursor'; dlgUseSyntaxHighlight = 'Use syntax highlight'; dlgCopyWordAtCursorOnCopyNone = 'Copy word on copy none'; + dlgHomeKeyJumpsToNearestStart = 'Home key jumps to nearest start'; dlgBlockIndent = 'Block indent:'; dlgUndoLimit = 'Undo limit:'; dlgTabWidths = 'Tab widths:';