📄 synhighlighterpas.pas
字号:
if fTokenID <> tkFloat then // arithmetic
Break;
if not (FLine[Run - 1] in ['e', 'E']) then
Break; //float, but it ends here
end;
end;
Inc(Run);
end;
end; { NumberProc }
procedure TSynPasSyn.PointProc;
begin
fTokenID := tkSymbol;
inc(Run);
if fLine[Run] in ['.', ')'] then
Inc(Run);
end; { PointProc }
procedure TSynPasSyn.AnsiProc;
begin
case fLine[Run] of
#0: NullProc;
#10: LFProc;
#13: CRProc;
else
fTokenID := tkComment;
repeat
if (fLine[Run] = '*') and (fLine[Run + 1] = ')') then begin
Inc(Run, 2);
if fRange = rsAnsiAsm then
fRange := rsAsm
else
fRange := rsUnKnown;
break;
end;
Inc(Run);
until fLine[Run] in [#0, #10, #13];
end;
end;
procedure TSynPasSyn.RoundOpenProc;
begin
Inc(Run);
case fLine[Run] of
'*':
begin
Inc(Run);
if fRange = rsAsm then
fRange := rsAnsiAsm
else
fRange := rsAnsi;
fTokenID := tkComment;
if not (fLine[Run] in [#0, #10, #13]) then
AnsiProc;
end;
'.':
begin
inc(Run);
fTokenID := tkSymbol;
end;
else
fTokenID := tkSymbol;
end;
end;
procedure TSynPasSyn.SemicolonProc;
begin
Inc(Run);
fTokenID := tkSymbol;
if fRange in [rsProperty, rsExports] then
fRange := rsUnknown;
end;
procedure TSynPasSyn.SlashProc;
begin
Inc(Run);
if (fLine[Run] = '/') and (fDelphiVersion > dvDelphi1) then
begin
fTokenID := tkComment;
repeat
Inc(Run);
until fLine[Run] in [#0, #10, #13];
end
else
fTokenID := tkSymbol;
end;
procedure TSynPasSyn.SpaceProc;
begin
inc(Run);
fTokenID := tkSpace;
while FLine[Run] in [#1..#9, #11, #12, #14..#32] do inc(Run);
end;
procedure TSynPasSyn.StringProc;
begin
fTokenID := tkString;
Inc(Run);
while not (fLine[Run] in [#0, #10, #13]) do begin
if fLine[Run] = #39 then begin
Inc(Run);
if fLine[Run] <> #39 then
break;
end;
Inc(Run);
end;
end;
procedure TSynPasSyn.SymbolProc;
begin
inc(Run);
fTokenID := tkSymbol;
end;
procedure TSynPasSyn.UnknownProc;
begin
{$IFDEF SYN_MBCSSUPPORT}
if FLine[Run] in LeadBytes then
Inc(Run, 2)
else
{$ENDIF}
inc(Run);
fTokenID := tkUnknown;
end;
procedure TSynPasSyn.Next;
begin
fAsmStart := False;
fTokenPos := Run;
case fRange of
rsAnsi, rsAnsiAsm:
AnsiProc;
rsBor, rsBorAsm, rsDirective, rsDirectiveAsm:
BorProc;
else
fProcTable[fLine[Run]];
end;
end;
function TSynPasSyn.GetDefaultAttribute(Index: integer):
TSynHighlighterAttributes;
begin
case Index of
SYN_ATTR_COMMENT: Result := fCommentAttri;
SYN_ATTR_IDENTIFIER: Result := fIdentifierAttri;
SYN_ATTR_KEYWORD: Result := fKeyAttri;
SYN_ATTR_STRING: Result := fStringAttri;
SYN_ATTR_WHITESPACE: Result := fSpaceAttri;
SYN_ATTR_SYMBOL: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynPasSyn.GetEol: Boolean;
begin
Result := fTokenID = tkNull;
end;
function TSynPasSyn.GetToken: string;
var
Len: LongInt;
begin
Len := Run - fTokenPos;
SetString(Result, (FLine + fTokenPos), Len);
end;
function TSynPasSyn.GetTokenID: TtkTokenKind;
begin
if not fAsmStart and (fRange = rsAsm)
and not (fTokenId in [tkNull, tkComment, tkDirec, tkSpace])
then
Result := tkAsm
else
Result := fTokenId;
end;
function TSynPasSyn.GetTokenAttribute: TSynHighlighterAttributes;
begin
case GetTokenID of
tkAsm: Result := fAsmAttri;
tkComment: Result := fCommentAttri;
tkDirec: Result := fDirecAttri;
tkIdentifier: Result := fIdentifierAttri;
tkKey: Result := fKeyAttri;
tkNumber: Result := fNumberAttri;
tkFloat: Result := fFloatAttri;
tkHex: Result := fHexAttri;
tkSpace: Result := fSpaceAttri;
tkString: Result := fStringAttri;
tkChar: Result := fCharAttri;
tkSymbol: Result := fSymbolAttri;
tkUnknown: Result := fSymbolAttri;
else
Result := nil;
end;
end;
function TSynPasSyn.GetTokenKind: integer;
begin
Result := Ord(GetTokenID);
end;
function TSynPasSyn.GetTokenPos: Integer;
begin
Result := fTokenPos;
end;
function TSynPasSyn.GetRange: Pointer;
begin
Result := Pointer(fRange);
end;
procedure TSynPasSyn.SetRange(Value: Pointer);
begin
fRange := TRangeState(Value);
end;
procedure TSynPasSyn.ResetRange;
begin
fRange:= rsUnknown;
end;
procedure TSynPasSyn.EnumUserSettings(DelphiVersions: TStrings);
begin
{ returns the user settings that exist in the registry }
{$IFNDEF SYN_CLX}
with TBetterRegistry.Create do
begin
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly('\SOFTWARE\Borland\Delphi') then
begin
try
GetKeyNames(DelphiVersions);
finally
CloseKey;
end;
end;
finally
Free;
end;
end;
{$ENDIF}
end;
function TSynPasSyn.UseUserSettings(VersionIndex: integer): boolean;
// Possible parameter values:
// index into TStrings returned by EnumUserSettings
// Possible return values:
// true : settings were read and used
// false: problem reading settings or invalid version specified - old settings
// were preserved
{$IFNDEF SYN_CLX}
function ReadDelphiSettings(settingIndex: integer): boolean;
function ReadDelphiSetting(settingTag: string; attri: TSynHighlighterAttributes; key: string): boolean;
function ReadDelphi2Or3(settingTag: string; attri: TSynHighlighterAttributes; name: string): boolean;
var
i: integer;
begin
for i := 1 to Length(name) do
if name[i] = ' ' then name[i] := '_';
Result := attri.LoadFromBorlandRegistry(HKEY_CURRENT_USER,
'\Software\Borland\Delphi\'+settingTag+'\Highlight',name,true);
end; { ReadDelphi2Or3 }
function ReadDelphi4OrMore(settingTag: string; attri: TSynHighlighterAttributes; key: string): boolean;
begin
Result := attri.LoadFromBorlandRegistry(HKEY_CURRENT_USER,
'\Software\Borland\Delphi\'+settingTag+'\Editor\Highlight',key,false);
end; { ReadDelphi4OrMore }
begin { ReadDelphiSetting }
try
if (settingTag[1] = '2') or (settingTag[1] = '3')
then Result := ReadDelphi2Or3(settingTag,attri,key)
else Result := ReadDelphi4OrMore(settingTag,attri,key);
except Result := false; end;
end; { ReadDelphiSetting }
var
tmpAsmAttri : TSynHighlighterAttributes;
tmpCommentAttri : TSynHighlighterAttributes;
tmpIdentAttri : TSynHighlighterAttributes;
tmpKeyAttri : TSynHighlighterAttributes;
tmpNumberAttri : TSynHighlighterAttributes;
tmpSpaceAttri : TSynHighlighterAttributes;
tmpStringAttri : TSynHighlighterAttributes;
tmpSymbolAttri : TSynHighlighterAttributes;
iVersions : TStringList;
iVersionTag : string;
begin { ReadDelphiSettings }
{$IFDEF SYN_DELPHI_7_UP}
Result := False; // Silence the compiler warning
{$ENDIF}
iVersions := TStringList.Create;
try
EnumUserSettings( iVersions );
if (settingIndex < 0) or (settingIndex >= iVersions.Count) then
begin
Result := False;
Exit;
end;
iVersionTag := iVersions[ settingIndex ];
finally
iVersions.Free;
end;
tmpAsmAttri := TSynHighlighterAttributes.Create('');
tmpCommentAttri := TSynHighlighterAttributes.Create('');
tmpIdentAttri := TSynHighlighterAttributes.Create('');
tmpKeyAttri := TSynHighlighterAttributes.Create('');
tmpNumberAttri := TSynHighlighterAttributes.Create('');
tmpSpaceAttri := TSynHighlighterAttributes.Create('');
tmpStringAttri := TSynHighlighterAttributes.Create('');
tmpSymbolAttri := TSynHighlighterAttributes.Create('');
Result := ReadDelphiSetting( iVersionTag, tmpAsmAttri,'Assembler') and
ReadDelphiSetting( iVersionTag, tmpCommentAttri,'Comment') and
ReadDelphiSetting( iVersionTag, tmpIdentAttri,'Identifier') and
ReadDelphiSetting( iVersionTag, tmpKeyAttri,'Reserved word') and
ReadDelphiSetting( iVersionTag, tmpNumberAttri,'Number') and
ReadDelphiSetting( iVersionTag, tmpSpaceAttri,'Whitespace') and
ReadDelphiSetting( iVersionTag, tmpStringAttri,'String') and
ReadDelphiSetting( iVersionTag, tmpSymbolAttri,'Symbol');
if Result then
begin
fAsmAttri.AssignColorAndStyle( tmpAsmAttri );
fCharAttri.AssignColorAndStyle( tmpStringAttri ); { Delphi lacks Char attribute }
fCommentAttri.AssignColorAndStyle( tmpCommentAttri );
fDirecAttri.AssignColorAndStyle( tmpCommentAttri ); { Delphi lacks Directive attribute }
fFloatAttri.AssignColorAndStyle( tmpNumberAttri ); { Delphi lacks Float attribute }
fHexAttri.AssignColorAndStyle( tmpNumberAttri ); { Delphi lacks Hex attribute }
fIdentifierAttri.AssignColorAndStyle( tmpIdentAttri );
fKeyAttri.AssignColorAndStyle( tmpKeyAttri );
fNumberAttri.AssignColorAndStyle( tmpNumberAttri );
fSpaceAttri.AssignColorAndStyle( tmpSpaceAttri );
fStringAttri.AssignColorAndStyle( tmpStringAttri );
fSymbolAttri.AssignColorAndStyle( tmpSymbolAttri );
end;
tmpAsmAttri.Free;
tmpCommentAttri.Free;
tmpIdentAttri.Free;
tmpKeyAttri.Free;
tmpNumberAttri.Free;
tmpSpaceAttri.Free;
tmpStringAttri.Free;
tmpSymbolAttri.Free;
end; { ReadDelphiSettings }
{$ENDIF}
begin
{$IFNDEF SYN_CLX}
Result := ReadDelphiSettings( VersionIndex );
{$ELSE}
Result := False;
{$ENDIF}
end; { TSynPasSyn.UseUserSettings }
function TSynPasSyn.GetIdentChars: TSynIdentChars;
begin
Result := TSynValidStringChars;
end;
function TSynPasSyn.GetSampleSource: string;
begin
Result := '{ Syntax highlighting }'#13#10 +
'procedure TForm1.Button1Click(Sender: TObject);'#13#10 +
'var'#13#10 +
' Number, I, X: Integer;'#13#10 +
'begin'#13#10 +
' Number := 123456;'#13#10 +
' Caption := ''The Number is'' + #32 + IntToStr(Number);'#13#10 +
' for I := 0 to Number do'#13#10 +
' begin'#13#10 +
' Inc(X);'#13#10 +
' Dec(X);'#13#10 +
' X := X + 1.0;'#13#10 +
' X := X - $5E;'#13#10 +
' end;'#13#10 +
' {$R+}'#13#10 +
' asm'#13#10 +
' mov AX, 1234H'#13#10 +
' mov Number, AX'#13#10 +
' end;'#13#10 +
' {$R-}'#13#10 +
'end;';
end; { GetSampleSource }
class function TSynPasSyn.GetLanguageName: string;
begin
Result := SYNS_LangPascal;
end;
class function TSynPasSyn.GetCapabilities: TSynHighlighterCapabilities;
begin
Result := inherited GetCapabilities + [hcUserSettings];
end;
function TSynPasSyn.IsFilterStored: boolean;
begin
Result := fDefaultFilter <> SYNS_FilterPascal;
end;
procedure TSynPasSyn.SetDelphiVersion(const Value: TDelphiVersion);
begin
if fDelphiVersion <> Value then
begin
fDelphiVersion := Value;
if (fDelphiVersion < dvDelphi3) and fPackageSource then
fPackageSource := False;
DefHighlightChange( Self );
end;
end;
procedure TSynPasSyn.SetPackageSource(const Value: Boolean);
begin
if fPackageSource <> Value then
begin
fPackageSource := Value;
if fPackageSource and (fDelphiVersion < dvDelphi3) then
fDelphiVersion := dvDelphi3;
DefHighlightChange( Self );
end;
end;
initialization
MakeIdentTable;
{$IFNDEF SYN_CPPB_1}
RegisterPlaceableHighlighter(TSynPasSyn);
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -