From fdadfc810b6e9476ae15bc2630ae3b226b3e6e0a Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Thu, 26 Jun 2014 16:23:02 +0200 Subject: [PATCH] r11 --- README.md | 4 +- lazproj/coedit.lpi | 9 ++- src/ce_common.pas | 9 ++- src/ce_d2syn.pas | 149 +++++++++++++++++++++++++++++++---------- src/ce_main.lfm | 23 +++++++ src/ce_main.pas | 30 ++++++++- src/ce_project.pas | 4 ++ src/ce_projinspect.pas | 5 +- src/ce_search.lfm | 116 +++++++++++++++++++------------- src/ce_search.pas | 58 ++++++++++++---- src/ce_synmemo.pas | 3 +- src/ce_widgettypes.pas | 2 + 12 files changed, 301 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index 867bc2cb..2209ae47 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Coedit is a simple IDE for the [D2](http://dlang.org) lang. (**Co** mpile & **Ed Current features ---------------- -- multi platform (Win/Linux/Macos). +- multi platform (Win/Linux). - projects. - multiple project configurations (set of switches and options). - compile, run directly from the UI. @@ -34,7 +34,7 @@ Coedit must be build from the sources: - both [dmd](http://dlang.org/download.html) and [Lazarus](http://www.lazarus.freepascal.org) must be setup. - open "coedit.lpr" in *Lazarus*, set the build mode to *Release* - press the Run button (or build) -- in coedit open *"lazproj\test\coeditproj\test.coedit"* from the project menu. +- run coedit and project, open *"lazproj\test\coeditproj\test.coedit"* from the project menu to give a brief try. Preview ------- diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index 0e50dd57..a4fdb8cb 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -54,7 +54,8 @@ - + @@ -74,7 +75,7 @@ - + @@ -95,7 +96,8 @@ - + @@ -250,6 +252,7 @@ + diff --git a/src/ce_common.pas b/src/ce_common.pas index bda20ffa..20f8329c 100644 --- a/src/ce_common.pas +++ b/src/ce_common.pas @@ -7,6 +7,10 @@ interface uses Classes, SysUtils, ActnList, dialogs, forms; +const + + DdiagFilter = 'D source|*.d|D interface|*.di|All files|*.*'; + type (** @@ -275,9 +279,4 @@ begin {$HINTS ON}{$WARNINGS ON} end; -operator =(lhs,rhs: TPoint): boolean; -begin - exit( (lhs.x = rhs.x) and (lhs.y = rhs.y) ); -end; - end. diff --git a/src/ce_d2syn.pas b/src/ce_d2syn.pas index c83ce6ff..421aa2fb 100644 --- a/src/ce_d2syn.pas +++ b/src/ce_d2syn.pas @@ -39,22 +39,46 @@ const type + + {$IFDEF USE_DICT_LINKEDCHARMAP} + PCharMap = ^TCharMap; + TCharMap = record + chars: array [Byte] of PCharMap; + end; + + // slightly fatest then a hash-based-dictionary but huge memory use. + TD2Dictionary = object + private + fRoot: TCharMap; + fTerm: NativeInt; + fFreeList: array of pointer; + fLongest, fShortest: NativeInt; + procedure addEntry(const aValue: string); + public + constructor create; + destructor destroy; + function find(const aValue: string): boolean; + end; + {$ELSE} {$IFDEF USE_DICT_GPERF} + // TODO: a perfect hash dictionnary based on gperf + {$ELSE} TD2DictionaryEntry = record filled: Boolean; values: array of string; end; - - // TODO: rather gperf ? TD2Dictionary = object private - fLongest: NativeInt; - fEntries: array[0..255] of TD2DictionaryEntry; + fLongest, fShortest: NativeInt; + fEntries: array[Byte] of TD2DictionaryEntry; function toHash(const aValue: string): Byte; procedure addEntry(const aValue: string); public constructor create; + destructor destroy; function find(const aValue: string): boolean; end; + {$ENDIF} + {$ENDIF} TTokenKind = (tkCommt, tkIdent, tkKeywd, tkStrng, tkBlank, tkSymbl, tkNumbr, tkCurrI); @@ -98,7 +122,7 @@ type procedure setCurrIdent(const aValue: string); procedure doChanged; published - // Defines which kind of ranges can be folded, among curly brackets, block comments and nested comments + // Defines which kind of range can be folded, among curly brackets, block comments and nested comments property FoldKinds: TFoldKinds read fFoldKinds write setFoldKinds; property WhiteAttrib: TSynHighlighterAttributes read fWhiteAttrib write setWhiteAttrib; property NumbrAttrib: TSynHighlighterAttributes read fNumbrAttrib write setNumbrAttrib; @@ -217,70 +241,120 @@ begin result := (s = '>>>=') or (s = '!<>='); end; +{$IFDEF USE_DICT_LINKEDCHARMAP} +constructor TD2Dictionary.create; +var + value: string; + i: NativeInt; +begin + fTerm := 1; + for i := 0 to 255 do fRoot.chars[i] := nil; + for value in D2Kw do + addEntry(value); +end; + +destructor TD2Dictionary.destroy; +var + i: NativeInt; +begin + for i := 0 to high(fFreeList) do + FreeMem(fFreeList[i]); +end; + +procedure TD2Dictionary.addEntry(const aValue: string); +var + len, i, j: NativeInt; + currMap: PCharMap; + newMap: PCharMap; +begin + len := length(aValue); + if len > fLongest then fLongest := len; + if len < fShortest then fShortest := len; + currMap := @fRoot; + for i := 1 to len do + begin + if (currMap^.chars[Byte(aValue[i])] = nil) then + begin + newMap := new(PCharMap); + for j := 0 to 255 do newMap^.chars[j] := nil; + setLength(fFreeList, length(fFreeList) + 1); + fFreeList[high(fFreeList)] := newMap; + currMap^.chars[Byte(aValue[i])] := newMap; + end; + if i < len then currMap := currMap^.chars[Byte(aValue[i])]; + end; + currMap^.chars[0] := @fTerm; +end; + +function TD2Dictionary.find(const aValue: string): boolean; +var + len, i: NativeInt; + currMap: PCharMap; +begin + len := length(aValue); + if len > fLongest then exit(false); + if len < fShortest then exit(false); + currMap := @fRoot; + for i := 1 to len do + begin + if currMap^.chars[Byte(aValue[i])] = nil then exit(false); + if i < len then currMap := currMap^.chars[Byte(aValue[i])]; + end; + exit( currMap^.chars[0] = @fTerm ); +end; +{$ELSE} constructor TD2Dictionary.create; var value: string; begin for value in D2Kw do - begin addEntry(value); - end; +end; + +destructor TD2Dictionary.destroy; +begin end; {$IFDEF DEBUG}{$R-}{$ENDIF} function TD2Dictionary.toHash(const aValue: string): Byte; var - i, len: Integer; + i: Integer; begin result := 0; - len := length(aValue); - for i := 1 to len do - result += (Byte(aValue[i]) shl i) xor 63; + for i := 1 to length(aValue) do + result += (Byte(aValue[i]) shl (4 and (1-i))) xor 25; end; {$IFDEF DEBUG}{$R+}{$ENDIF} procedure TD2Dictionary.addEntry(const aValue: string); var - hash: word; + hash: Byte; begin - if find(aValue) then - exit; - + if find(aValue) then exit; hash := toHash(aValue); - assert(hash < 1024); - fEntries[hash].filled := true; setLength(fEntries[hash].values, length(fEntries[hash].values) + 1); fEntries[hash].values[high(fEntries[hash].values)] := aValue; if fLongest <= length(aValue) then fLongest := length(aValue); + if fShortest >= length(aValue) then + fShortest := length(aValue); end; function TD2Dictionary.find(const aValue: string): boolean; var - hash: word; + hash: Byte; i: NativeInt; begin - if length(aValue) > fLongest then - result := false - else - begin - hash := toHash(aValue); - if (not fEntries[hash].filled) then - result := false else - begin - for i:= 0 to high(fEntries[hash].values) do - begin - if fEntries[hash].values[i] = aValue then - begin - result := true; - exit; - end; - result := false; - end - end; - end; + result := false; + if length(aValue) > fLongest then exit; + if length(aValue) < fShortest then exit; + hash := toHash(aValue); + if (not fEntries[hash].filled) then exit(false); + for i:= 0 to high(fEntries[hash].values) do + if fEntries[hash].values[i] = aValue then exit(true); end; +{$ENDIF} constructor TSynD2Syn.create(aOwner: TComponent); @@ -342,6 +416,7 @@ end; destructor TSynD2Syn.destroy; begin + fKeyWords.destroy; inherited; end; diff --git a/src/ce_main.lfm b/src/ce_main.lfm index c6ed69c6..fd68f0d9 100644 --- a/src/ce_main.lfm +++ b/src/ce_main.lfm @@ -620,6 +620,15 @@ object CEMainForm: TCEMainForm object MenuItem21: TMenuItem Caption = '-' end + object MenuItem54: TMenuItem + Action = actEdIndent + end + object MenuItem53: TMenuItem + Action = actEdUnIndent + end + object MenuItem52: TMenuItem + Caption = '-' + end object MenuItem22: TMenuItem Action = actEdMacStartStop Bitmap.Data = { @@ -1663,6 +1672,20 @@ object CEMainForm: TCEMainForm ImageIndex = 21 OnExecute = actProjRunWithArgsExecute end + object actEdIndent: TAction + Category = 'Edit' + Caption = 'Indent' + ImageIndex = 16 + OnExecute = actEdIndentExecute + ShortCut = 24649 + end + object actEdUnIndent: TAction + Category = 'Edit' + Caption = 'Unindent' + ImageIndex = 17 + OnExecute = actEdUnIndentExecute + ShortCut = 24661 + end end object imgList: TImageList left = 64 diff --git a/src/ce_main.pas b/src/ce_main.pas index 0c9003fe..ce9aa953 100644 --- a/src/ce_main.pas +++ b/src/ce_main.pas @@ -44,6 +44,8 @@ type actEdUndo: TAction; actEdPaste: TAction; actEdCopy: TAction; + actEdIndent: TAction; + actEdUnIndent: TAction; Actions: TActionList; ApplicationProperties1: TApplicationProperties; imgList: TImageList; @@ -93,6 +95,9 @@ type MenuItem49: TMenuItem; MenuItem50: TMenuItem; MenuItem51: TMenuItem; + MenuItem52: TMenuItem; + MenuItem53: TMenuItem; + MenuItem54: TMenuItem; mnuItemWin: TMenuItem; MenuItem4: TMenuItem; MenuItem5: TMenuItem; @@ -106,6 +111,7 @@ type procedure actFileCompAndRunExecute(Sender: TObject); procedure actFileCompAndRunWithArgsExecute(Sender: TObject); procedure actFileSaveAllExecute(Sender: TObject); + procedure actEdIndentExecute(Sender: TObject); procedure actProjCompAndRunWithArgsExecute(Sender: TObject); procedure actProjCompileAndRunExecute(Sender: TObject); procedure actProjCompileExecute(Sender: TObject); @@ -131,6 +137,7 @@ type procedure actProjSaveExecute(Sender: TObject); procedure actEdUndoExecute(Sender: TObject); procedure actProjSourceExecute(Sender: TObject); + procedure actEdUnIndentExecute(Sender: TObject); procedure FormDropFiles(Sender: TObject; const FileNames: array of String); procedure FormShow(Sender: TObject); private @@ -285,6 +292,8 @@ begin {$ENDIF} actEdMacPlay.Enabled := true; actEdMacStartStop.Enabled := true; + actEdIndent.Enabled := true; + actEdUnIndent.Enabled := true; // actFileCompAndRun.Enabled := true; actFileCompAndRunWithArgs.Enabled := true; @@ -303,6 +312,8 @@ begin {$ENDIF} actEdMacPlay.Enabled := false; actEdMacStartStop.Enabled := false; + actEdIndent.Enabled := false; + actEdUnIndent.Enabled := false; // actFileCompAndRun.Enabled := false; actFileCompAndRunWithArgs.Enabled := false; @@ -474,7 +485,7 @@ begin // with TOpenDialog.Create(nil) do try - filter := 'D source|*.d|D interface|*.di|all files|*.*'; + filter := DdiagFilter; if execute then begin openFile(filename); @@ -512,10 +523,9 @@ begin // with TSaveDialog.Create(nil) do try + Filter := DdiagFilter; if execute then - begin saveFileAs(fEditWidg.editorIndex, filename); - end; finally free; end; @@ -640,7 +650,21 @@ begin end; end; +procedure TCEMainForm.actEdIndentExecute(Sender: TObject); +var + curr: TCESynMemo; +begin + curr := fEditWidg.currentEditor; + if assigned(curr) then curr.ExecuteCommand(ecBlockIndent, '', nil); +end; +procedure TCEMainForm.actEdUnIndentExecute(Sender: TObject); +var + curr: TCESynMemo; +begin + curr := fEditWidg.currentEditor; + if assigned(curr) then curr.ExecuteCommand(ecBlockUnIndent, '', nil); +end; {$ENDREGION} {$REGION run ******************************************************************} diff --git a/src/ce_project.pas b/src/ce_project.pas index 44e8e119..44d32f12 100644 --- a/src/ce_project.pas +++ b/src/ce_project.pas @@ -4,6 +4,10 @@ unit ce_project; interface +// TODO: pre/post compilation shell-script / process +// TODO: run opts, newConsole, catch output, etc +// TODO: configuration templates + uses Classes, SysUtils, ce_dmdwrap; diff --git a/src/ce_projinspect.pas b/src/ce_projinspect.pas index 31ae9f65..22d45c70 100644 --- a/src/ce_projinspect.pas +++ b/src/ce_projinspect.pas @@ -6,7 +6,8 @@ interface uses Classes, SysUtils, FileUtil, TreeFilterEdit, Forms, Controls, Graphics, - actnlist, Dialogs, ExtCtrls, ComCtrls, Menus, Buttons, ce_project, ce_widget; + actnlist, Dialogs, ExtCtrls, ComCtrls, Menus, Buttons, ce_project, + ce_common, ce_widget; type { TCEProjectInspectWidget } @@ -166,7 +167,7 @@ begin // with TOpenDialog.Create(nil) do try - filter := 'D source|*.d|D interface|*.di|all files|*.*'; + filter := DdiagFilter; if execute then fProject.addSource(filename); finally diff --git a/src/ce_search.lfm b/src/ce_search.lfm index 6730f897..e7c4035a 100644 --- a/src/ce_search.lfm +++ b/src/ce_search.lfm @@ -1,48 +1,37 @@ inherited CESearchWidget: TCESearchWidget - Left = 1338 - Height = 276 - Top = 697 - Width = 405 + Left = 1468 + Height = 237 + Top = 516 + Width = 394 Caption = 'Search & replace' - ClientHeight = 276 - ClientWidth = 405 + ClientHeight = 237 + ClientWidth = 394 inherited Back: TPanel - Height = 276 - Width = 405 - ClientHeight = 276 - ClientWidth = 405 + Height = 237 + Width = 394 + ClientHeight = 237 + ClientWidth = 394 inherited Content: TPanel - Height = 276 - Width = 405 - ClientHeight = 276 - ClientWidth = 405 + Height = 237 + Width = 394 + ClientHeight = 237 + ClientWidth = 394 object cbToFind: TComboBox[0] Left = 4 Height = 23 Top = 4 - Width = 397 + Width = 386 Align = alTop BorderSpacing.Around = 4 ItemHeight = 15 OnChange = cbToFindChange TabOrder = 0 end - object cbReplaceWth: TComboBox[1] - Left = 4 - Height = 23 - Top = 31 - Width = 397 - Align = alTop - BorderSpacing.Around = 4 - ItemHeight = 15 - OnChange = cbReplaceWthChange - TabOrder = 1 - end - object btnFind: TBitBtn[2] + object btnFind: TBitBtn[1] Left = 4 Height = 24 - Top = 192 - Width = 397 + Top = 153 + Width = 386 Align = alBottom BorderSpacing.Around = 4 Caption = 'btnFind' @@ -82,13 +71,13 @@ inherited CESearchWidget: TCESearchWidget FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } - TabOrder = 2 + TabOrder = 1 end - object btnReplace: TBitBtn[3] + object btnReplace: TBitBtn[2] Left = 4 Height = 24 - Top = 220 - Width = 397 + Top = 181 + Width = 386 Align = alBottom BorderSpacing.Around = 4 Caption = 'btnReplace' @@ -128,19 +117,19 @@ inherited CESearchWidget: TCESearchWidget 4766E69547FFE69A4EFFE2904122FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } - TabOrder = 3 + TabOrder = 2 end - object grpOpts: TGroupBox[4] + object grpOpts: TGroupBox[3] Left = 4 - Height = 130 - Top = 58 - Width = 397 + Height = 88 + Top = 61 + Width = 386 Align = alClient BorderSpacing.Around = 4 Caption = 'Options' - ClientHeight = 112 - ClientWidth = 393 - TabOrder = 4 + ClientHeight = 70 + ClientWidth = 382 + TabOrder = 3 object chkWWord: TCheckBox Left = 8 Height = 19 @@ -184,11 +173,11 @@ inherited CESearchWidget: TCESearchWidget TabOrder = 4 end end - object btnReplaceAll: TBitBtn[5] + object btnReplaceAll: TBitBtn[4] Left = 4 Height = 24 - Top = 248 - Width = 397 + Top = 209 + Width = 386 Align = alBottom BorderSpacing.Around = 4 Caption = 'btnReplaceAll' @@ -228,12 +217,49 @@ inherited CESearchWidget: TCESearchWidget 4766E69547FFE69A4EFFE2904122FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 } + TabOrder = 4 + end + object Panel1: TPanel[5] + Left = 4 + Height = 26 + Top = 31 + Width = 386 + Align = alTop + BorderSpacing.Around = 4 + BevelOuter = bvNone + ClientHeight = 26 + ClientWidth = 386 TabOrder = 5 + object cbReplaceWth: TComboBox + Left = 90 + Height = 23 + Top = 0 + Width = 296 + Align = alClient + ItemHeight = 15 + OnChange = cbReplaceWthChange + TabOrder = 0 + end + object chkEnableRep: TCheckBox + Left = 0 + Height = 26 + Top = 0 + Width = 90 + Align = alLeft + Caption = 'Replace with ' + OnChange = chkEnableRepChange + TabOrder = 1 + end end end end + inherited contextMenu: TPopupMenu + left = 216 + top = 16 + end object imgList: TImageList[2] - left = 32 + left = 248 + top = 16 Bitmap = { 4C690200000010000000100000007B7977007B7977007B7977FF73716FFF6D6B 69FF696665FF625F5EFF615E5D007E7C7A007B7977FF73716FFF6D6B69FF6966 diff --git a/src/ce_search.pas b/src/ce_search.pas index 3ffa2ef7..22ece626 100644 --- a/src/ce_search.pas +++ b/src/ce_search.pas @@ -19,6 +19,7 @@ type btnReplaceAll: TBitBtn; cbToFind: TComboBox; cbReplaceWth: TComboBox; + chkEnableRep: TCheckBox; chkPrompt: TCheckBox; chkWWord: TCheckBox; chkBack: TCheckBox; @@ -26,8 +27,10 @@ type chkCaseSens: TCheckBox; grpOpts: TGroupBox; imgList: TImageList; + Panel1: TPanel; procedure cbReplaceWthChange(Sender: TObject); procedure cbToFindChange(Sender: TObject); + procedure chkEnableRepChange(Sender: TObject); private fEditor: TCESynMemo; fToFind: string; @@ -35,6 +38,7 @@ type fActFindNext, fActReplaceNext: TAction; fActReplaceAll: TAction; fSearchMru, fReplaceMru: TMruList; + fCancelAll: boolean; function getOptions: TSynSearchOptions; procedure actFindNextExecute(sender: TObject); procedure actReplaceAllExecute(sender: TObject); @@ -56,24 +60,24 @@ implementation constructor TCESearchWidget.Create(aOwner: TComponent); begin - inherited; - fID := 'ID_FIND'; - // - fSearchMru := TMruList.Create; - fReplaceMru:= TMruList.Create; - // fActFindNext := TAction.Create(self); fActFindNext.Caption := 'Find'; fActFindNext.OnExecute := @actFindNextExecute; - btnFind.Action := fActFindNext; fActReplaceNext := TAction.Create(self); fActReplaceNext.Caption := 'Replace'; fActReplaceNext.OnExecute := @actReplaceNextExecute; - btnReplace.Action := fActReplaceNext; fActReplaceAll := TAction.Create(self); fActReplaceAll.Caption := 'Replace all'; fActReplaceAll.OnExecute := @actReplaceAllExecute; + inherited; + fID := 'ID_FIND'; + // + btnFind.Action := fActFindNext; + btnReplace.Action := fActReplaceNext; btnReplaceAll.Action := fActReplaceAll; + // + fSearchMru := TMruList.Create; + fReplaceMru:= TMruList.Create; end; destructor TCESearchWidget.Destroy; @@ -101,6 +105,12 @@ begin fToFind := cbToFind.Text; end; +procedure TCESearchWidget.chkEnableRepChange(Sender: TObject); +begin + if Updating then exit; + UpdateByEvent; +end; + procedure TCESearchWidget.cbReplaceWthChange(Sender: TObject); begin if Updating then exit; @@ -109,7 +119,7 @@ end; function TCESearchWidget.getOptions: TSynSearchOptions; begin - result := []; + result := [ssoRegExpr]; if chkWWord.Checked then result += [ssoWholeWord]; if chkBack.Checked then result += [ssoBackwards]; if chkCaseSens.Checked then result += [ssoMatchCase]; @@ -160,23 +170,45 @@ begin begin if fEditor.SearchReplace(fToFind, fReplaceWth, opts) = 0 then break; + if fCancelAll then + begin + fCancelAll := false; + break; + end; end; fEditor.OnReplaceText := nil; UpdateByEvent; end; +function dlgReplaceAll: TModalResult; +const + Btns = [mbYes, mbNo, mbYesToAll, mbNoToAll]; +begin + exit( MessageDlg('Coedit', 'Replace this match ?', mtConfirmation, Btns, '')); +end; + procedure TCESearchWidget.replaceEvent(Sender: TObject; const ASearch, AReplace: string; Line, Column: integer; var ReplaceAction: TSynReplaceAction); begin - ReplaceAction := raSkip; - if dlgOkCancel('Replace this match ?') = mrOK then - ReplaceAction := raReplace; + case dlgReplaceAll of + mrYes: ReplaceAction := raReplace; + mrNo: ReplaceAction := raSkip; + mrYesToAll: ReplaceAction := raReplaceAll; + mrCancel, mrClose, mrNoToAll: + begin + ReplaceAction := raCancel; + fCancelAll := true; + end; + end; end; procedure TCESearchWidget.UpdateByEvent; begin fActFindNext.Enabled := fEditor <> nil; - fActReplaceNext.Enabled := fEditor <> nil; + fActReplaceNext.Enabled := (fEditor <> nil) and (chkEnableRep.Checked); + fActReplaceAll.Enabled := (fEditor <> nil) and (chkEnableRep.Checked); + cbReplaceWth.Enabled := (fEditor <> nil) and (chkEnableRep.Checked); + cbToFind.Enabled := fEditor <> nil; // cbToFind.Items.Assign(fSearchMru); cbReplaceWth.Items.Assign(fReplaceMru); diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index 12e56eca..75bbf3c6 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -38,7 +38,8 @@ begin TabWidth := 4; Options := [ eoAutoIndent, eoBracketHighlight, eoGroupUndo, eoTabsToSpaces, - eoTrimTrailingSpaces, eoDragDropEditing, eoShowCtrlMouseLinks]; + eoTrimTrailingSpaces, eoDragDropEditing, eoShowCtrlMouseLinks, + eoEnhanceHomeKey, eoTabIndent]; Options2 := [eoEnhanceEndKey, eoFoldedCopyPaste, eoOverwriteBlock]; // Gutter.LineNumberPart.ShowOnlyLineNumbersMultiplesOf := 5; diff --git a/src/ce_widgettypes.pas b/src/ce_widgettypes.pas index 610c63ce..64e0952a 100644 --- a/src/ce_widgettypes.pas +++ b/src/ce_widgettypes.pas @@ -9,6 +9,8 @@ uses type + // TODO: interface for document content access/modification + (** * An implementer is informed when a new document is added, focused or closed. *)