Difference between revisions of "Editor Macros PascalScript"

From Lazarus wiki
Jump to navigationJump to search
Line 140: Line 140:
 
|  
 
|  
 
[[Editor Macro Column Align Source]]
 
[[Editor Macro Column Align Source]]
 +
 +
 
|- style="vertical-align:top;"
 
|- style="vertical-align:top;"
 
|  
 
|  
Line 146: Line 148:
 
See http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883 for counting array elements.
 
See http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883 for counting array elements.
  
 +
 +
|- style="vertical-align:top;"
 +
|
 +
  Comments a procedure/function in [https://github.com/pasdoc/pasdoc/wiki PasDoc] format
 +
 +
example:
 +
 +
    function AddRadioButton(const aCaption: string; aChecked: boolean = False): TCheckBox;
 +
   
 +
Executing the macro with the caret in the line of function declaration will insert the comment before.
 +
 +
    { Description
 +
      @param(aCaption description )
 +
      @param(aChecked description )
 +
      @returns( description )
 +
      @raises( none )
 +
    }
 +
    function AddRadioButton(const aCaption: string; aChecked: boolean = False): TRadioButton;
 +
 +
[https://github.com/DomingoGP/LazarusMacroPasDoc https://github.com/DomingoGP/LazarusMacroPasDoc]
 +
|
 +
https://github.com/DomingoGP/LazarusMacroPasDoc/blob/master/MacroPasDocLazarus.txt
 
|-
 
|-
 
 
|}
 
|}

Revision as of 20:59, 21 August 2020

English (en) русский (ru)


General

The PascalScript macro functionality is available in Lazarus 1.1 and later. To use the feature you have to install the package EditorMacroScript, which includes the Pascal Script package. Pascal Script is provided by REM Objects. A minimum package is provided with the Lazarus 1.1 distribution.

See also IDE_Window:_Editor_Macros

Availability

This functionality is only available on selected platforms/architectures:

  • Windows
    • 32/64bit Intel/AMD
  • Linux
    • 32/64bit Intel/AMD
  • Mac
    • 32(/maybe 64)bit Intel/AMD
    • 32bit PPC

Simple actions

All simple Keyboard actions are represented as follows:

ecLeft;
Move Caret one to the left (in the editor that invoked the macro)
ecChar('a');
Inserts an 'a'

See the unit SynEditKeyCmds in package SynEdit, and IDECommands in IDEIntf for a full list. Or use the Recorder to get the names of actions.

Functions

   Function MessageDlg( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint) : Integer');
   Function MessageDlgPos( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer) : Integer');
   Function MessageDlgPosHelp( const Msg : string; DlgType : TMsgDlgType; Buttons : TMsgDlgButtons; HelpCtx : Longint; X, Y : Integer; const HelpFileName : string) : Integer');
   Procedure ShowMessage( const Msg : string);
   Procedure ShowMessagePos( const Msg : string; X, Y : Integer)');
   Function InputBox( const ACaption, APrompt, ADefault : string) : string');
   Function InputQuery( const ACaption, APrompt : string; var Value : string) : Boolean');

Objects provided

Scripts can refer to the invoking SynEdit via the identifier "Caller".

Caller: TSynEdit

The following methods and properties are available:

Caret
   property CaretX: Integer;
   property CaretY: Integer;
   property CaretXY: TPoint;
   property LogicalCaretXY: TPoint;
   property LogicalCaretX: Integer;
   procedure MoveCaretIgnoreEOL(const NewCaret: TPoint);
   procedure MoveLogicalCaretIgnoreEOL(const NewLogCaret: TPoint);
Selection
   property BlockBegin: TPoint;
   property BlockEnd: TPoint;
   property SelAvail: Boolean; // read only
   property SelText: string;
   property SelectionMode: TSynSelectionMode;
   procedure ClearSelection;
   procedure SelectAll;
   procedure SelectToBrace;
   procedure SelectWord;
   procedure SelectLine(WithLeadSpaces: Boolean);
   procedure SelectParagraph;


Search/Replace
   function SearchReplace(const ASearch, AReplace: string; AOptions: TSynSearchOptions): integer;
   function SearchReplaceEx(const ASearch, AReplace: string; AOptions: TSynSearchOptions; AStart: TPoint): integer;
   TSynSearchOptions = set of
   ( ssoMatchCase, ssoWholeWord,
     ssoBackwards,
     ssoEntireScope, ssoSelectedOnly,  // Default is From Caret to End-of-text (or begin-of-text if backward) 
     ssoReplace, ssoReplaceAll,        // Otherwise the function does a search only
     ssoPrompt,                        // Show the prompt before replacing
     ssoSearchInReplacement,           // continue search-replace in replacement (with ssoReplaceAll) // replace recursive
     ssoRegExpr, ssoRegExprMultiLine,
     ssoFindContinue                   // Assume the current selection is the last match, and start search behind selection
                                       // (before if ssoBackward) // Default is to start at caret (Only SearchReplace / SearchReplaceEx has start/end param)
   );

Returns the number of replacements done. When Searching, returns 1 if found, 0 if not found. If found the match will be selected (use BlockBegin/End).

 if Caller.SearchReplace('FindMe', ' ', []) > 0 then begin
   // Selection is set to the first occurrence of FindMe (searched from position of caret)
 end;
Text
   property Lines[Index: Integer]: string; // read only
   property LineAtCaret: string;  // read only
   procedure InsertTextAtCaret(aText: String; aCaretMode : TSynCaretAdjustMode);
   property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String              // Logical Points
   procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint;
                                  const AValue: String;
                                  aFlags: TSynEditTextFlags = [];
                                  aCaretMode: TSynCaretAdjustMode;
                                  aMarksMode: TSynMarksAdjustMode;
                                  aSelectionMode: TSynSelectionMode
                                 );
Clipboard
   procedure CopyToClipboard;
   procedure CutToClipboard;
   procedure PasteFromClipboard;
   property CanPaste: Boolean     // read only
Logical / Physical
   function LogicalToPhysicalPos(const p: TPoint): TPoint;
   function LogicalToPhysicalCol(const Line: String; Index, LogicalPos
                             : integer): integer;
   function PhysicalToLogicalPos(const p: TPoint): TPoint;
   function PhysicalToLogicalCol(const Line: string;
                                 Index, PhysicalPos: integer): integer;
   function PhysicalLineLength(Line: String; Index: integer): integer;

ClipBoard: TClipBoard

   property AsText: String;

Available Macros / Downloads

Editor macros
Description Link

A macro that aligns selected code to a specific token. It looks for a specific token in each selected line, and aligns each occurrence of it.

Select the 3 lines. If the selection starts right before the ":" then the ":" will be detected. A prompt will ask you to confirm the ":". Then all ":" will be aligned. (If you use a word for alignment, please note, that it will be matched regardless of word boundaries)

You can vertically align things like := or // or (

Editor Macro Column Align Source


A macro to count the boundaries in an array constant.

See http://forum.lazarus.freepascal.org/index.php/topic,27186.msg167883.html#msg167883 for counting array elements.


 Comments a procedure/function in PasDoc format

example:

   function AddRadioButton(const aCaption: string; aChecked: boolean = False): TCheckBox;
   

Executing the macro with the caret in the line of function declaration will insert the comment before.

   { Description
     @param(aCaption description )
     @param(aChecked description )
     @returns( description )
     @raises( none )
   }
   function AddRadioButton(const aCaption: string; aChecked: boolean = False): TRadioButton;

https://github.com/DomingoGP/LazarusMacroPasDoc

https://github.com/DomingoGP/LazarusMacroPasDoc/blob/master/MacroPasDocLazarus.txt