Bummer, but thanks Dan for clearing that up.
Actually, I think that could be done.
Rough outline of a macro:
- Copy the selection
- Find the position of the target character (semicolon in this case) within the string
- Calculate the position from the start of the string
- Do a Type Keystroke of LEFT-ARROW to move the cursor to immediately before the first character of the selected string
- Do a Repeat Action, with the count set to the value from #3, using a Type Keystroke of RIGHT-ARROW
This should position the cursor after the first semicolon.
You may have to do some adjustments on the counts.
Give it a shot, and if it doesn't work for you, post the macro you have (image and file), and we'll try to help.
What I don’t understand is how to do 2. and 3.? The position of the semicolon will be different depending on the text I will select (not always the same string, but always contains a semicolon where I need the cursor to be moved). How do I make KM calculate the position of the semicolon in a particular string?
Thanks.
This is dead simple using a script. If I can't find a non-script KM Action to do this, then I'll write the script for you. NBD.
Give me a day.
Thank you so much. Please don’t give yourself too much trouble over this, but it will certainly be greatly appreciated.
Hey Martin,
This task is a little easier if you think outside the box.
What the macro does:
- Copies the selected text.
- Replaces the first semicolon in the text on the Clipboard with itself and a newline.
- Pastes.
- Arrow-Up.
- Presses the Forward Delete key.
Voilà! No character counting required.
-Chris
Move Cursor to Right of Given Character in Selected Text v1.00.kmmacros (3.6 KB)
I've posted a method to count characters here:
I’m always amazed with the creativity people have on this forum. When I see potential solutions like yours, Chris, it just makes me smile. I never would have thought of your solution.
I need to remember to post more questions, to see if there’s better ways of doing things. In this forum, multiple heads truly are better than one.
@nadeama, I think this should do the job for you.
Please test the below macro, and let me know if it works for you.
Turns out that there is no easy way to find the position of a substring within a string using non-script KM Actions. So, I wrote a general purpose script to do this.
Hey Chris, great thinking outside the box.
Very clever.
However, there may be some limitations and undesired consequences to this approach:
- I don't think it would work in a single-line text field.
- Adding a linefeed might trigger some other effects in some apps
- Since the paste is plain text, it might remove the formatting of styled text in the original document.
Hi everyone,
Thanks so much for your solutions. You guys are great!
Chris, your inventive solution worked like a charm in TextEdit, but as Michael pointed out it was problematic in iTunes (where I want to use it) because of the single-line fields of the Get Info dialog.
Michael, your script did the trick. You just saved me hours and hours of manual text input when editing tags in iTunes (I do a lot of that). Thank you!
Keyboard Maestro is really amazing. I can’t believe I haven’t used it before for anything but launching apps with a keystroke.
Very nice, Chris!
I have used this technique to create this macro:
Position cursor behind entered character.kmmacros (11.4 KB)
Demo:
Nice, @ALYB. I got a little dizzy looking at your list of triggers, though, and wrote a different version that uses typed string trigger. You trigger it by typing two semi-colons and then the character in question, with no spaces, like so: ;;v
, etc.
ALYB.kmmacros (6.0 KB)
Yes, @cfriend I don’t like this long list of hotkeys either, and it costs a lot of hotkeys that are no longer available to other macros. Ideally I would press: one hotkey, character. But afaik this isn’t possible.
I will try this suggestion: Initiator + Multiple Keystroke Trigger - #3 by noisneil
Edit: Works okay.
Thanks! It worked for me too!
Hey Chris, I don't know if this belongs in a separate question or can just be added to this one.
I'm looking to move the cursor to immediately before the next open parenthesis and insert a couple of returns then immediately after a close parenthesis character and add another return. This moves the text within the parentheses along with the parenthesis onto their own line and out of the body of the text they are within so
...sdflsdkfjsldfj asldkfj (dsjfasdfjsl sldfjsldfk) dkjfhsdkfjhs sadfsdf... becomes
...sdflsdkfjsldfj asldkfj
(dsjfasdfjsl sldfjsldfk)
dkjfhsdkfjhs sadfsdf...
Running the macro would then go to the next instance and pull out the text in parentheses along the enclosing parentheses.
FYI this is cleaning a large book worth text with loads these edits.
I think I can figure out how to get regex to find the characters I want but don't know how to use what regex finds to move the cursor to before or after the output.
Thanks for looking at this.
The following should work. You can use a variable as your input instead of the sample text that I copied from your example. However if your text is inside a word processor with special formatting, this won't work. I couldn't tell if you were intending for this to work in a word processor or not. If so, the solution will be more complex.
Here's the text:
sed "s/(/\n\n(/g;s/)/)\n/g"
Any reason why you can't do a Search for (
and Replace with \n\n(
, followed by a Search for )
and Replace with )\n
, either using KM or just using your editor's standard S'nR dialog?
I see specifying that I'm doing this in Apple Pages was missing and needed.
I see I can do this with Page's SnR, and it'd be mighty slow and clunky. A macro would be much better.
Using Keyboard Maestro's Search and Replace, can I use the variable of the current text insertion point as the search beginning point and then search for ( and replace with \n\n( ?
If not, how do I set it up?
Here is a better sample text:
So it’s good that you’re pessimistic, and if you’re not pessimistic, that’s good too. (to Ruth) If you find yourself being that way, don’t try to change it.
Changed to:
So it’s good that you’re pessimistic, and if you’re not pessimistic, that’s good too.
(to Ruth)
If you find yourself being that way, don’t try to change it.
Thank you for addressing this.