add option to auto close a few pair of symbols, close

This commit is contained in:
Basile Burg 2016-07-05 08:42:54 +02:00
parent 2c7f681c58
commit 5931ce7ca9
3 changed files with 58 additions and 1 deletions

View File

@ -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;

View File

@ -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;
'{':

View File

@ -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.