Page 1 of 1

Search without losing the MarkBlock anchor

Posted: Tue Feb 22, 2011 4:40 am
by dougclind
I'm trying to do something that should be simple but doesn't work. I need to make a macro where it sets an anchor and marks all the text up until it hits a specific character. That would be the "SearchNext()" character(s). But whenever you do SearchNext() it forgets about the Mark Block that you've set.

There's got to be a way to mark and then copy where the end of the copy text is some character. Can someone tell me how to do this?

Very irritating because I only need to write a macro every couple of years or so and then I have to research and relearn the freaking macro language every time!!! Very very aggravating.

Posted: Tue Feb 22, 2011 7:16 am
by jussij
I'm trying to do something that should be simple but doesn't work. I need to make a macro where it sets an anchor and marks all the text up until it hits a specific character.

The Lua code below does something like this.
That would be the "SearchNext()" character(s). But whenever you do SearchNext() it forgets about the Mark Block that you've set.
I think you have found a scripting bug. See the *** comment in the macro code below.

Let me know if this is not what you where after.
Very very aggravating.
That's what the forum is for ;)

Cheers Jussi

PS: This code was tested using the latest Zeus version.

Code: Select all

function key_macro()
  -- macro only works for documents
  local document = is_document()

  if document > 0 then
    -- ask for a user to supply a search string
    local pattern = user_input("Search string:", "")

    if string.len(pattern) > 0 then

        local FORWARD = 0
        local REVERSE = 1
        local MARKED  = 2
        local ENTIRE  = 3
        local ALL     = 4

        -- save the current search and replace options
        search_options_save()

        -- setup the search
        set_find_text(pattern)
        set_search_option("Scope", FORWARD);
        set_search_option("UseCase", 0)
        set_search_option("WholeWord", 0)
        set_search_option("RegExpress", 0)

        -- save current location
        local cursor1 = get_cursor_pos()
        local line1   = get_line_pos()

        -- look for the text
        if SearchNext() then
            -- NOTE: **** not sure why this is needed but it is **** 
            MarkHide()

            -- save current location
            cursor2 = get_cursor_pos()
            line2   = get_line_pos()

            -- move to the original location
            set_line_pos(line1, cursor1)

            -- start block mark mode from the current location
            MarkBlockSet()

            -- move to the original location
            set_line_pos(line2, cursor2)

            message("Search Pattern found.")
        else
            message("Search Pattern: '" .. pattern .. "' not found.")
        end

        -- restore the original search details
        search_options_restore()
    else
      message("Operation cancelled by user!")
    end
  else
    message("This macro only works for document files!")
    beep()
  end
end

key_macro() -- run the macro

Posted: Sun Feb 27, 2011 4:35 am
by dougclind
Thanks much Jussi! I used your code as a starting point to do what I needed and it does work.