home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / DOS / TEKST / AURORA2 / EXAMPLE.AML < prev    next >
Text File  |  1995-04-28  |  20KB  |  695 lines

  1.  
  2. /* ------------------------------------------------------------------ */
  3. /* Name:         EXAMPLE.AML                                          */
  4. /*                                                                    */
  5. /* Description:  AML examples and code fragments.                     */
  6. /*                                                                    */
  7. /* Usage:        This file is not an executable macro. It contains    */
  8. /*               AML examples and code fragments which can be used    */
  9. /*               in within other macro files.                         */
  10. /* ------------------------------------------------------------------ */
  11.  
  12.  
  13. // Example 1 --------------------------------------------------
  14.  
  15. // mark the entire file
  16. // (assigned to <f12> key - place in the "edit" object)
  17.  
  18.   key  <f12>
  19.     markline 1 (getlines)
  20.   end
  21.  
  22. // Example 2 --------------------------------------------------
  23.  
  24. // Demonstrates block marking without having the cursor resize the mark
  25. // (for compatability with the old 'DrawMark' config setting in v1.2)
  26.  
  27.   key  <alt l>
  28.                 markline
  29.                 stopmark    // stopmark closes the mark
  30.   key  <alt a>
  31.                 markchar
  32.                 stopmark
  33.   key  <alt b>
  34.                 markcolumn
  35.                 stopmark
  36.  
  37.  
  38. // Example 3 --------------------------------------------------
  39.  
  40. // block copy without moving the mark (provided for compatibility
  41. // with the old 'MoveMark' config setting in v1.2)
  42.  
  43.   // block copy
  44.   key  <alt c>
  45.     undobegin                // group together as one undoable operation
  46.     curr_mark = getmarkuse   // get the default markid
  47.     copymark curr_mark 'T'   // create temp copy of original mark
  48.     usemark 'T'              // use the temp mark
  49.     copyblock2               // copy marked text (moves the mark also)
  50.     destroymark              // destroy the temp mark
  51.     usemark curr_mark        // switch back to the original mark
  52.     undoend
  53.   end
  54.  
  55.  
  56. // Example 4 --------------------------------------------------
  57.  
  58. // Automark example - creates a temporary paragraph mark if
  59. // no mark exists (provided for compatibility with the old
  60. // AutoMark configuration setting in v1.2)
  61.  
  62.   // begin automark
  63.   function  begauto
  64.     if not mark? then        // if no mark exists...
  65.       set _am ON             // set a flag
  66.       markpara               // mark the current paragraph
  67.     end
  68.   end
  69.  
  70.   // end automark
  71.   function  endauto
  72.     if _am then              // if flag was set..
  73.       set _am OFF            // unset flag
  74.       destroymark            // destroy the temporary mark
  75.     end
  76.   end
  77.  
  78.   // usage example (indent a block)
  79.   key  <shift f8>
  80.     begauto
  81.     shiftblock 1
  82.     endauto
  83.   end
  84.  
  85.  
  86. // Example 5 --------------------------------------------------
  87.  
  88. // define <home> and <end> key behaviour to match the the old
  89. // RepEnd config setting in v1.2 (provided for compatibility
  90. // with v1.2)
  91.  
  92.   // <home> key
  93.   key  <home>
  94.     if getcol == 1 then             // at col 1?
  95.       up                            // then move up 1 line
  96.     else
  97.       col 1                         // otherwise move to column 1
  98.     end
  99.   end
  100.  
  101.   // <end> key
  102.   key  <end>
  103.     end_of_line = getlinelen + 1    // get column after end-of-line
  104.     if getcol == end_of_line then   // are we there already?
  105.       down                          // move down 1 line
  106.       col  getlinelen + 1           // move to end-of-line on new line
  107.     else
  108.       col end_of_line               // move to end-of-line
  109.     end
  110.   end
  111.  
  112.  
  113. // Example 6 --------------------------------------------------
  114.  
  115. // Find the last string with wrap around (provided for compatibility
  116. // with the old 'SearchWrap' config setting in v1.2)
  117.  
  118.   function findlastw
  119.  
  120.     var  search_str
  121.     var  options
  122.  
  123.     // get last find string
  124.     history_str = gethiststr "_find"
  125.  
  126.     // do the search. If not found...
  127.     if not search2 history_str '' TRUE then
  128.  
  129.       // wrap to top or bottom
  130.       if (splitstr '' history_str ref search_str ref options ) >= 2 and
  131.          (pos 'r' options) then
  132.         row (getlines)
  133.         col getlinelen + 1
  134.       else
  135.         gotopos 1 1
  136.       end
  137.  
  138.       // do the search again
  139.       search2 history_str
  140.     end
  141.   end
  142.  
  143.   // usage example
  144.   key <ctrl l>  findlastw
  145.  
  146.  
  147. // Example 7 --------------------------------------------------
  148.  
  149. // Change the left and right cursor keys to wrap to the previous or
  150. // next line
  151.  
  152.   // cursorleft with wrap
  153.   key  <left>
  154.     if getcol == 1 then             // wrap if at column 1
  155.       if up then                    // ..and not at first line
  156.         col getlinelen + 1
  157.       end
  158.     else
  159.       left
  160.     end
  161.   end
  162.  
  163.   // cursorright with wrap
  164.   key  <right>
  165.     if getcol > getlinelen then     // wrap if at end-of-line
  166.       if down then                  // ..and not at last line
  167.         col 1
  168.       end
  169.     else
  170.       right
  171.     end
  172.   end
  173.  
  174.  
  175.  
  176. // Example 8 --------------------------------------------------
  177.  
  178. // change the <del> key to delete a block if marked,
  179. // otherwise delete a character
  180.  
  181.   key  <del>
  182.     if mark? then
  183.       deleteblock                      // delete block if it exists,
  184.     else
  185.       delchar2                         // otherwise delete a character
  186.     end
  187.   end
  188.  
  189.  
  190. // Example 9 --------------------------------------------------
  191.  
  192. // find the word at the cursor
  193. // (assigned to <ctrl f11>)
  194.  
  195.   key  <ctrl f11>
  196.     wordstr = getword           // get word using the default charset
  197.     if wordstr then
  198.       search2 wordstr           // find the word
  199.     else
  200.       say "no word at the cursor" 'b'
  201.     end
  202.   end
  203.  
  204.  
  205. // Example 10 -------------------------------------------------
  206.  
  207. // insert a ruler line above the current line
  208. // (assigned to <alt k> key)
  209.  
  210.   key  <alt k>
  211.     insabove "····+····1····+····2····+····3····+····4····+····5····+····6····+····7····+····8"
  212.   end
  213.  
  214.  
  215. // Example 11 -------------------------------------------------
  216.  
  217. // emulate the QEdit 'GetPrev' <ctrl -> command:  copies characters
  218. // from the line above the current line (assigned to <alt 4> key)
  219.  
  220.   key  <alt 4>
  221.     if getrow > 1 then                         // if after first line...
  222.       writetext (getchar (getcol) getrow - 1)  // get char and write it
  223.     end
  224.   end
  225.  
  226.  
  227. // Example 12 -------------------------------------------------
  228.  
  229. // Emulation of Brief-style <home> and <end> keys. These keys should
  230. // be placed in the 'edit' object:
  231.  
  232.   // brief <home> key emulation (br)
  233.   key <home>
  234.     col 1                                      // goto column 1
  235.     smark                                      // cua marking
  236.     keycode = getkey                           // get next key
  237.     if keycode == <home> then                  // <home> pressed 2nd time?
  238.       row (getviewtop)                         // goto to page top
  239.       smark                                    // cua marking
  240.       keycode = getkey                         // get next key
  241.       if keycode == <home> then                // <home> pressed 3rd time?
  242.         row 1                                  // goto to top of file
  243.         smark                                  // cua marking
  244.       else
  245.         queuekey keycode                       // execute key normally
  246.       end
  247.     else
  248.       queuekey keycode                         // execute key normally
  249.     end
  250.   end
  251.  
  252.   // brief <end> key emulation (br)
  253.   key <end>
  254.     col  getlinelen + 1                        // goto end-of-line
  255.     smark                                      // cua marking
  256.     keycode = getkey                           // get next key
  257.     if keycode == <end> then                   // <end> pressed 2nd time?
  258.       row (getviewbot)                         // goto to page bottom
  259.       smark                                    // cua marking
  260.       keycode = getkey                         // get next key
  261.       if keycode == <end> then                 // <end> pressed 3rd time?
  262.         row (getlines)                         // goto to bottom of file
  263.         smark                                  // cua marking
  264.       else
  265.         queuekey keycode                       // execute key normally
  266.       end
  267.     else
  268.       queuekey keycode                         // execute key normally
  269.     end
  270.   end
  271.  
  272.  
  273. // Example 13 -------------------------------------------------
  274.  
  275. // shows how to 'double-up' key usage for some keys by testing
  276. // for the <shift> key
  277.  
  278.   key  <alt k>
  279.     if shiftkey? then             // <alt shift k>
  280.       .
  281.       .
  282.     else                          // <alt k>
  283.       .
  284.       .
  285.     end
  286.   end
  287.  
  288.  
  289. // Example 14 -------------------------------------------------
  290.  
  291. // prompts the user for the name of a program and passes the word
  292. // at the cursor to it as the first parameter
  293.  
  294.   key  <shift f12>
  295.     parm = getword _CSetB                  // get word using charset CSetB
  296.     if parm then
  297.       program = ask "Program to execute"   // prompt user for program
  298.       if program then                      // program entered?
  299.         run  program + ' ' + parm  "ck"    // concatenate program with word
  300.       end                                  //   and execute it
  301.     else
  302.       say "no word at the cursor" 'b'      // no word found at the cursor
  303.     end
  304.   end
  305.  
  306.  
  307. // Example 15 -------------------------------------------------
  308.  
  309. // strip leading or trailing spaces from a string
  310.  
  311.   // return string 'charstring' without leading spaces
  312.   function  stripl (charstring)
  313.     return  charstring [posnot ' ' charstring : 0]
  314.   end
  315.  
  316.   // return string 'charstring' without trailing spaces
  317.   function  stript (charstring)
  318.     return  charstring [1 : posnot ' ' charstring 'r']
  319.   end
  320.  
  321.  
  322. // Example 16 -------------------------------------------------
  323.  
  324. // attach "properties" to a string value in the current object
  325. // (demonstrates the use of setx, lookup, unsetx)
  326.  
  327.   // set a property
  328.   function  setprop (string prop value)
  329.     setx  string + '-' + prop  value
  330.   end
  331.  
  332.   // get a property
  333.   function  getprop (string prop)
  334.     lookup  string + '-' + prop
  335.   end
  336.  
  337.   // delete a property
  338.   function  delprop (string prop)
  339.     unsetx  string + '-' + prop
  340.   end
  341.  
  342.  
  343. // Example 17 -------------------------------------------------
  344.  
  345. // modify the save-as prompt to change the file name
  346. // (replace function "asksaveas" in EXT.AML)
  347.  
  348.   function  asksaveas (options)
  349.     file = ask "Save " + (getname (getbufname)) + " as"  "_load"
  350.     if file then
  351.       file = qualify file (getbufname)
  352.       addhistory "_load" file
  353.       save file options   // save file with name "file"
  354.       setname file        // name current file "file"
  355.     end
  356.   end
  357.  
  358.  
  359. // Example 18 -------------------------------------------------
  360.  
  361. // Compute the factorial of a number (illustrates AML recursion)
  362.   function  fact (x)
  363.     if? x <= 1  1  x * (fact x - 1)
  364.   end
  365.  
  366.   // display the factorial of 6
  367.   say (fact 6)
  368.  
  369.  
  370. // Example 19 -------------------------------------------------
  371.  
  372. // generate a random number between a and b
  373. // (demonstrates the use of the rand function)
  374.  
  375.   function  random (a b)
  376.     a + (rand mod b - a + 1)
  377.   end
  378.  
  379.   // display random number between 500 and 3000
  380.   say (random 500 3000)
  381.  
  382.  
  383. // Example 20 -------------------------------------------------
  384.  
  385. // asynchronous beep
  386. // (set a timer to stop the beep - demonstrates the use of timers)
  387.  
  388.   function  beep2 (freq duration)
  389.     if not arg then
  390.       // stop the beep
  391.       beep
  392.     else
  393.       // beep indefinitely
  394.       beep freq
  395.       // call this function again after 'duration' milliseconds
  396.       settimer "beep" duration '' "beep2"
  397.     end
  398.   end
  399.  
  400.  
  401. // Example 21 -------------------------------------------------
  402.  
  403. // Check newly open files for tab chars. Expand tabs if found.
  404.  
  405.   // (Place this section of aml code at the end of the 'onopen'
  406.   // function in the 'edit' object in EXT.AML - The 'onopen' function
  407.   // is called after a file is loaded and before it is displayed)
  408.  
  409.   if not getbinarylen then        // only for non-binary files
  410.     markline 1 20                 // create a mark (first 20 lines)
  411.     if find (char 9) "bgn*" then  // search for tab char in the mark
  412.       markline 1 (getlines)       // extend the mark to end-of-file
  413.       tabblock _TabWidth          // expand tabs using TabWidth
  414.       bufferflag '-m'             // turn off buffer-modified flag
  415.     end
  416.     destroymark                   // destroy the temporary mark
  417.   end
  418.  
  419.  
  420. // Example 22 -------------------------------------------------
  421.  
  422. // toggle the case of the character at the cursor
  423. // (assigned to <alt k>)
  424.  
  425.   key <alt k>
  426.     ovltext (flipcase (getchar))     // toggle the character
  427.     right                            // move right one column
  428.   end
  429.  
  430.  
  431. // Example 23 -------------------------------------------------
  432.  
  433. // transpose the characters at the cursor
  434. // (assigned to <alt k>)
  435.  
  436.    // method 1: using a marked block
  437.    key <alt k>
  438.      undobegin        // beginning of an undoable group
  439.      usemark 'T'      // use temporary mark 'T'
  440.      markchar         // create a character mark
  441.      stopmark         // stop the cursor from extending the mark
  442.      right 2          // move right two columns
  443.      moveblock        // move the marked character
  444.      destroymark      // destroy the mark
  445.      usemark          // switch back to mark '*'
  446.      undoend          // end of an undoable group
  447.    end
  448.  
  449.   // method 2: using a string
  450.   key <alt k>
  451.     twochars = gettext (getcol) 2
  452.     ovltext (if? twochars [2] twochars [2] ' ') + twochars [1]
  453.     right
  454.   end
  455.  
  456.  
  457. // Example 24 -------------------------------------------------
  458.  
  459. // macro code fragment to synchronously dispatch all the events
  460. // currently in the event queue
  461.  
  462.   endprocess          // queue an internal 'queue quit' event
  463.   process             // process all events and return
  464.  
  465.  
  466. // Example 25 -------------------------------------------------
  467.  
  468. // macro code fragment to display a timed message box
  469.  
  470.   // set a timer (t1) to simulate the <esc> key one second from now
  471.   settimer "t1" 1000 '' <esc>
  472.  
  473.   // display a short-style message box
  474.   shortbox "timed message"
  475.  
  476.  
  477. // Example 26 -------------------------------------------------
  478.  
  479. // modify the prompt history menu to automatically enter selected
  480. // strings into the prompt
  481.  
  482.  
  483.   // replace the <pgup> and <pgdn> keys in the 'prompt' object
  484.   // in KBD.AML
  485.  
  486.   key  <pgup>
  487.     if askhistory then
  488.       queue <enter>
  489.     end
  490.   end
  491.  
  492.   key  <pgdn>  call <pgup>
  493.  
  494.   // ..also modify the <lbutton> function in the 'prompt' object
  495.   // in MOUSE.AML to handle mouse clicks on the prompt retrieve tab
  496.  
  497.   // left button down
  498.   function  <lbutton>
  499.      .
  500.      .
  501.     case getregion
  502.  
  503.       // modify this 'when' clause
  504.       when 14
  505.         if askhistory then
  506.           queue <enter>
  507.         end
  508.          .
  509.          .
  510.  
  511. // Example 27 -------------------------------------------------
  512.  
  513. // The following is an example of an external macro which can
  514. // be run from the command line (without actually starting the
  515. // editor). This macro replaces all occurrences of a search
  516. // string in a file:
  517.  
  518.   if loadbuf (arg 2) then                  // load a file
  519.     replace (arg 3) (arg 4) (arg 5) + 'a*' // replace all string(s)
  520.     savebuf (arg 2)                        // save the file
  521.   end
  522.  
  523. // assuming this macro was compiled to 'replace.x', the following
  524. // command will run the macro from the DOS command line:
  525.  
  526.   C>a -xreplace.x "myfile.txt" "apples" "oranges" 'i'
  527.          // replaces all occurrences of 'apples' with 'oranges',
  528.          // in 'myfile.txt', ignoring case
  529.  
  530.  
  531. // Example 28 -------------------------------------------------
  532.  
  533. // The following example shows how to locate a file in a path
  534. // defined by a DOS environment string:
  535.  
  536.    file = locatefile "program.exe" (getenv 'PATH')
  537.      // 'PATH' must be in caps
  538.  
  539.    msgbox "Filename is: " + file
  540.      // filename is fully qualified
  541.  
  542.  
  543. // Example 29 -------------------------------------------------
  544.  
  545. // To change the file manager to recognize unshifted characters as
  546. // command codes (like Aurora v1.2), modify the <char> key
  547. // definition in the fmgr object in KBD.AML:
  548.  
  549.   key  <char> (c)
  550.       .
  551.       .
  552.     // <shift-character> commands
  553.     elseif not shiftkey? then         // add 'not' to this line
  554.       .
  555.       .
  556.  
  557.   // (note that this will also change each file manager search
  558.   // 'hotkey' to <shift-hotkey>)
  559.  
  560.  
  561. // Example 30 -------------------------------------------------
  562.  
  563. // The following macro code shows how to put a simple real-time clock on
  564. // the edit window title bar:
  565.  
  566.   object edit
  567.      .
  568.     // called every second
  569.     function  onesec
  570.       settitle getbufname + ' ' + gettime
  571.     end
  572.      .
  573.      .
  574.   end
  575.  
  576.   // called when the editor is started
  577.   function  onentry
  578.       .
  579.     // set a timer to call 'onesec' every second
  580.     setrepeat 'sec' 1000 '' "onesec"
  581.       .
  582.       .
  583.   end
  584.  
  585.  
  586. // Example 31 -------------------------------------------------
  587.  
  588. // The following macro code shows how set an alarm to go off every
  589. // hour on the hour in edit windows and file manager windows
  590.  
  591.   object edit_fmgr
  592.      .
  593.     // called on the hour (Big Ben clock chime)
  594.     function  onhour
  595.       beep 330  600
  596.       beep 262  600
  597.       beep 294  600
  598.       beep 196 1200
  599.       beep 196  600
  600.       beep 294  600
  601.       beep 330  600
  602.       beep 262 1200
  603.     end
  604.      .
  605.      .
  606.   end
  607.  
  608.   // called when the editor is started
  609.   function  onentry
  610.      .
  611.     // set an alarm timer to call 'onhour' every hour on the hour
  612.     setalarm 'hr'
  613.        -1               // any year
  614.        -1               // any month
  615.        -1               // any day
  616.        -1               // any weekday
  617.        -1               // any hour
  618.         0               // only at zero minutes past the hour
  619.         0               // only at zero seconds past zero minutes
  620.        ''               // dispatch in the current event object
  621.        'onhour'         // execute the function 'onhour'
  622.      .
  623.      .
  624.   end
  625.  
  626.  
  627. // Example 32 -------------------------------------------------
  628.  
  629. // The following macro code shows how to create a persistent
  630. // real-time clock window which is updated every second:
  631.  
  632.   // create a new clock object descended from the 'win' object,
  633.   // so it can inherit the mouse handling and other capabilities
  634.   // of 'desktop' windows (like edit and file manager windows)
  635.   object  clock (win)
  636.  
  637.   // called every second to update the date and time
  638.   function tick
  639.     gotowindow "clock"
  640.     writestr getdate + ' ' + gettime  (color brightred on black)  4 2
  641.     gotowindow
  642.   end
  643.  
  644.   // destroy the timer if the clock window is closed
  645.   key <esc>
  646.     destroytimer "clk"
  647.     pass
  648.   end
  649.  
  650.   function "≡"
  651.     call <esc>
  652.   end
  653.  
  654.   // provide keyboard support for switching windows
  655.   key <ctrl a>
  656.     nextwindow
  657.   end
  658.  
  659.   // (be sure to change the object if unrelated code follows)
  660.   .
  661.   .
  662.  
  663.   object  edit
  664.  
  665.   // create the clock window and start the clock (this could actually
  666.   // be placed in any convenient object or function, or it could
  667.   // be an external macro)
  668.   key <alt k>
  669.     createwindow 'clock'
  670.     // route window events to the clock object above
  671.     setwinobj "clock"
  672.  
  673.     setframe ">b"
  674.     setwinctrl '≡'
  675.     setcolor  border_color   color white on gray
  676.     setcolor  text_color     color black on gray
  677.     settitle "Clock" 'c'
  678.     setborder "i1"
  679.     setshadow 2 1
  680.  
  681.     // center the window
  682.     width = (sizeof getdate + gettime) + 9
  683.     height = 4
  684.     ox = (getvidcols - width) / 2
  685.     oy = (getvidrows - height) / 2
  686.     sizewindow ox oy ox + width oy + height "ad"
  687.  
  688.     // simulate the first tick
  689.     sendobject "clock" "tick"
  690.     // start the clock timer
  691.     setrepeat 'clk' 1000 'clock' "tick"
  692.   end
  693.  
  694.  
  695.