diff --git a/src/ce_editoroptions.pas b/src/ce_editoroptions.pas index 86b94892..526ae4b2 100644 --- a/src/ce_editoroptions.pas +++ b/src/ce_editoroptions.pas @@ -61,6 +61,7 @@ type fAutoCLoseCurlyBrace: TBraceAutoCloseStyle; fPhobosDocRoot: TCEPathname; fAlwaysAdvancedFeatures: boolean; + fAutoClosedPairs: TAutoClosePairs; // procedure setPhobosDocRoot(value: TCEPathname); procedure setFont(value: TFont); @@ -80,6 +81,7 @@ type published property alwaysAdvancedFeatures: boolean read fAlwaysAdvancedFeatures write fAlwaysAdvancedFeatures; property autoCloseCurlyBrace: TBraceAutoCloseStyle read fAutoCLoseCurlyBrace write fAutoCLoseCurlyBrace default TBraceAutoCloseStyle.autoCloseNever; + property autoClosedPairs: TAutoClosePairs read fAutoClosedPairs write fAutoClosedPairs default[]; property autoDotDelay: integer read fAutoDotDelay write SetautoDotDelay; property background: TColor read fBackground write fBackground default clWhite; property blockIndentation: Integer read fBlockIdent write fBlockIdent default 4; @@ -273,7 +275,8 @@ begin // fAlwaysAdvancedFeatures:=srcopt.fAlwaysAdvancedFeatures; fResetFontSize:=srcopt.fResetFontSize; - fAutoCLoseCurlyBrace := srcopt.fAutoCLoseCurlyBrace; + fAutoCloseCurlyBrace := srcopt.fAutoCloseCurlyBrace; + fAutoClosedPairs := srcopt.fAutoClosedPairs; fCompletionMenuWidth:=srcopt.fCompletionMenuWidth; fCompletionMenuLines:=srcopt.fCompletionMenuLines; fCompletionMenuCaseCare:=srcopt.fCompletionMenuCaseCare; @@ -629,6 +632,7 @@ begin anEditor.Font.Size := savedSize; anEditor.autoCloseCurlyBrace := fAutoCLoseCurlyBrace; + anEditor.autoClosedPairs := fAutoClosedPairs; anEditor.completionMenu.TheForm.Width := fCompletionMenuWidth; anEditor.completionMenu.LinesInWindow := fCompletionMenuLines; anEditor.completionMenu.CaseSensitive := fCompletionMenuCaseCare; diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index 9d1944ab..ba10c859 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -32,6 +32,21 @@ type autoCloseOnNewLineLexically ); + TAutoClosedPair = ( + autoCloseSingleQuote, + autoCloseDoubleQuote, + autoCloseBackTick, + autoCloseSquareBracket + ); + + TAutoClosePairs = set of TAutoClosedPair; + +const + + autoClosePair2Char: array[TAutoClosedPair] of char = (#39, '"', '`', ']'); + +type + TIdentifierMatchOptions = set of TIdentifierMatchOption; TBreakPointModification = (bpAdded, bpRemoved); @@ -149,6 +164,7 @@ type fPhobosDocRoot: string; fAlwaysAdvancedFeatures: boolean; fIsProjectDescription: boolean; + fAutoClosedPairs: TAutoClosePairs; procedure decCallTipsLvl; procedure setMatchOpts(value: TIdentifierMatchOptions); function getMouseFileBytePos: Integer; @@ -178,6 +194,7 @@ type function lexCanCloseBrace: boolean; procedure handleStatusChanged(Sender: TObject; Changes: TSynStatusChanges); procedure gotoToChangedArea(next: boolean); + procedure autoClosePair(value: TAutoClosedPair); protected procedure DoEnter; override; procedure DoExit; override; @@ -247,6 +264,7 @@ type property ddocDelay: Integer read fDDocDelay write setDDocDelay; property autoDotDelay: Integer read fAutoDotDelay write setAutoDotDelay; property autoCloseCurlyBrace: TBraceAutoCloseStyle read fAutoCloseCurlyBrace write fAutoCloseCurlyBrace; + property autoClosedPairs: TAutoClosePairs read fAutoClosedPairs write fAutoClosedPairs; end; procedure SetDefaultCoeditKeystrokes(ed: TSynEdit); @@ -1332,6 +1350,31 @@ begin true: result := mainYes; end; end; + +procedure TCESynMemo.autoClosePair(value: TAutoClosedPair); +var + i, p: integer; + tk0, tk1: PLexToken; +begin + // TODO: editor SelStart doesnt match exactly, see why, also a problem in lexCanCloseBrace(). + if value <> autoCloseSquareBracket then + begin + p := selStart; + lex(Lines.Text, fLexToks); + for i:=0 to fLexToks.Count-2 do + begin + tk0 := fLexToks[i]; + tk1 := fLexToks[i+1]; + if (tk0^.offset+1 <= p) and (tk1^.offset+1 > p) then + if tk0^.kind = TLexTokenKind.ltkString then + exit; + end; + end; + BeginUndoBlock; + ExecuteCommand(ecChar, autoClosePair2Char[value], nil); + ExecuteCommand(ecLeft, #0, nil); + EndUndoBlock; +end; {$ENDREGION} {$REGION DDoc & CallTip --------------------------------------------------------} @@ -1896,6 +1939,14 @@ begin c := Key; inherited; case c of + #39: if autoCloseSingleQuote in fAutoClosedPairs then + autoClosePair(autoCloseSingleQuote); + '"': if autoCloseDoubleQuote in fAutoClosedPairs then + autoClosePair(autoCloseDoubleQuote); + '`': if autoCloseBackTick in fAutoClosedPairs then + autoClosePair(autoCloseBackTick); + '[': if autoCloseSquareBracket in fAutoClosedPairs then + autoClosePair(autoCloseSquareBracket); '(': showCallTips(false); ')': if fCallTipWin.Visible then decCallTipsLvl; '{': diff --git a/wiki/wiki.txt b/wiki/wiki.txt index 6431289d..2f0292ac 100644 --- a/wiki/wiki.txt +++ b/wiki/wiki.txt @@ -87,6 +87,8 @@ or `chmod a+x` the file in a console. ## Build the sources +_warning, these instructions are not valid for the development version. Instead [follow these](https://github.com/BBasile/Coedit/wiki/Building-the-development-version)_ + Download and setup the tools: * [Download](http://lazarus.freepascal.org/index.php?page=downloads) and setup the latest Lazarus version (1.6) and FPC + FPC sources (3.0.0) for your platform.