Page 1 of 1

Macroing documentation

Posted: Mon Oct 24, 2005 3:46 pm
by martinlooker
Hi I'm trying to find the macroing documentation the help says it should be here:

http://www.zeusedit.com/archives

Specifically I'm looking to do a something like:

SearchReplace (search="^\t", replace="\t\t", RegExp=true, selection=true, All)

Now I can see the functions to set the search and replace strings, can I also set the regexp, replace in selection and replace all flags through macro functions ?

Posted: Mon Oct 24, 2005 11:23 pm
by jussij
Hi I'm trying to find the macroing documentation the help says it should be here: http://www.zeusedit.com/archives
This link no longer exists. The macro functions are now documented in the Zeus online help and you can also find lots of example in the zScript directory.
Now I can see the functions to set the search and replace string, can I also set the regexp, replace in selection and replace all flags through macro functions?
What you will need todo is copy the current marked area to a local variable, then do the search and replace using the string functions of the macro language and then paste the text back into the document.

For manipulation of the local variable you can use what ever language you find most comfortable (ie Python, Lua, JavaScrpt, VbScript etc).

As an example this macro: http://www.zeusedit.com/forum/viewtopic.php?t=221 does something similar in that it takes the selected text sends it to Artistic Style for reformating and then put it back into the document.

You just need to replace the Artistic Style step with a simple local variable search and replace function.

Jussi

Posted: Tue Oct 25, 2005 8:16 am
by martinlooker
Thanks for your help, again and on the tabbing issue, I'll try out the suggestion above.

I was hoping to do something like the following, (it only just occurred to me to use the keyboard functions to set the sensitivities etc)

SaveSearchOptions
SearchCaseSensitivitySet
SeearchRegExpSet
SearchScopeMarked
SetSearchString
SetReplaceString
>> Couldn't find a replace all function
RestoreSearchOptions

Do you have any plans to extend the built in macroing functions in order to surface paramters that affect that function ?

Breif had the translate ({pattern}, {replacement}, {global}, [regexp], [case], [block], [forward]) function effectively surfacing all the options of replacing for macroing purposes.

Posted: Tue Oct 25, 2005 9:54 am
by jussij
Do you have any plans to extend the built in macroing functions in order to surface parameters that affect that function?
Some sort of ReplaceAll macro function is definitely needed and this feature request has been added to the Zeus todo list.

The SetSearchString, SetSearchString functions already exist in the form of set_find_text and set_replace_text.

Just put the cursor on these words and use the Help, Quick Help menu for more details.

Cheers Jussi

Posted: Wed Oct 26, 2005 12:44 am
by jussij
The Lua macro shown below is one way of simulating this SearchReplace function.

Jussi

Code: Select all

--
--  Macro Name: SearchReplace.lua
--
-- Description: This macro implements this functionality:
--
--    SearchReplace (search="^\t", replace="\t\t", RegExp=true, selection=true, All) 
--
--       Usage: Mark some text area in a document and run this macro. The 
--              search and replace will be done on the marked area.
--
-- For more details refer to Lua Documentation:
--
--   General Documentation: http://www.lua.org/docs.html
--   Strings Documentation: http://www.lua.org/manual/5.0/manual.html#5.3
--
function SearchReplace(line_text) 

  -- debugging: count = number of replaces made
  -- local result, count = string.gsub(line_text, "^(\t)(.)", "xx:%2")
  -- message_box(1, result, count)

  -- search and replace the line of text replacing a starting tab with two tabs
  local result = string.gsub(line_text, "^(\t)(.)", "\t\t%2")

  -- add a zeus line feed character
  result = result .. "\r"

  -- return the new line
  return result
end

function key_macro()
  -- macro only works for read/write documents
  if is_read_only() == 1 then
    message("The current document is marked as read only!")
    beep()
    return
  end

  -- macro needs some marked text
  if (is_marked() == 0) then
    message("To use this macro you need to first mark some text.")
    beep()
    return 1
  end

  -- get the current marked text
  local marked_text = macro_tag("$M")

  -- NOTE: The Zeus lines of marked text will terminated by the \r\n 
  --       end of line marker so look for these markers and run the 
  --       search and replace on all lines found.

  -- run the search and replace
  local result = string.gsub(marked_text, "(.-)(\r\n)", SearchReplace)

  -- the result of the search and replace
  -- message_box(1, result, "Debugging")

  -- put add the result to the clipboard
  set_clipboard_text(result)

  -- paste the result back into document deleting the marked text
  MarkPaste()
end

key_macro()

Posted: Mon Oct 31, 2005 9:42 am
by martinlooker
Thanks for the above it is my most needed macro!

If I can just be cheeky and ask is there a way to then re-mark the text that is pasted into the document with the MarkPaste function so I can run this macro repeatedly ?

Posted: Mon Oct 31, 2005 2:04 pm
by jussij
There are a set of Zeus macro functions that return the currently marked area and also allow allow the cursor to be moved and the marked area set, so indirectly the answer is yes :)

For more information refer to the example macros in the zScript directory and the Zeus online help,

Cheers Jussi

Posted: Mon Oct 31, 2005 2:51 pm
by martinlooker
Ha ha well I knew I was being cheeky, I don't normally expect people to write my macros for me, I just thought it would take five minutes to add that versus half an hour for me to figure it out. The function descriptions could do with some expansion in places.

A few things that would have made this easier would be:
A MarkPaste option that marks the pasted text.
A method to find out what marking mode was used to make a selection, my additions placed Zeus into line marking mode.

Anyway below is the macro with my updates, if it proves useful to anyone else. If there is a more elegant way to store and reselect text I'd be intrested to hear it.

Code: Select all

--
--  Macro Name: zMartin_SearchReplaceIndent.lua
--
-- Description: This macro implements this functionality:
--
--    SearchReplace (search="^\t", replace="\t\t", RegExp=true, selection=true, All)
--
--       Usage: Mark some text area in a document and run this macro. The
--              search and replace will be done on the marked area.
--              Note that line marking mode is then used to re-mark
--              the indented lines.
--
-- For more details refer to Lua Documentation:
--
--   General Documentation: http://www.lua.org/docs.html
--   Strings Documentation: http://www.lua.org/manual/5.0/manual.html#5.3
--
function SearchReplace(line_text)

  -- debugging: count = number of replaces made
  -- local result, count = string.gsub(line_text, "^(\t)(.)", "xx:%2")
  -- message_box(1, result, count)

  -- search and replace the line of text replacing a starting tab with two tabs
  local result = string.gsub(line_text, "^(\t)(.)", "\t\t%2")

  -- add a zeus line feed character
  result = result .. "\r"

  -- return the new line
  return result
end

function key_macro()
  -- macro only works for read/write documents
  if is_read_only() == 1 then
    message("The current document is marked as read only!")
    beep()
    return
  end

  -- macro needs some marked text
  if (is_marked() == 0) then
    message("To use this macro you need to first mark some text.")
    beep()
    return 1
  end

  -- note the currently marked text
  local marked_left   = get_marked_left()
  local marked_top    = get_marked_top()
  local marked_right  = get_marked_right()
  local marked_bottom = get_marked_bottom()

  -- get the current marked text
  local marked_text = macro_tag("$M")

  -- NOTE: The Zeus lines of marked text will terminated by the \r\n
  --       end of line marker so look for these markers and run the
  --       search and replace on all lines found.

  -- run the search and replace
  local result = string.gsub(marked_text, "(.-)(\r\n)", SearchReplace)

  -- the result of the search and replace
  -- message_box(1, result, "Debugging")

  -- put add the result to the clipboard
  set_clipboard_text(result)

  -- paste the result back into document deleting the marked text
  MarkPaste()

  -- Re-mark the lines that were originally marked
  MarkLineReset()
  local markedstart = set_line_pos(marked_top, marked_left)
  MarkLineSetEx()
  local markedend = set_line_pos(marked_bottom, marked_right)
end

key_macro()