Hey that’s a useful feature indeed, and it can already be added by the user with rcmd’s Window Actions which support AppleScript. I actually have done that myself already for Firefox.
I could maybe try to implement the main part of the “find and switch to the tab if it exists” so that users can simply assign the URL.
Okay, I've worked it out and it works perfectly with no requirement for window actions. I created an AppleScript:
tell application "Safari"
repeat with w in windows
set mt to (tabs of w whose URL contains "https://mail.google.com/")
if mt ≠ {} then exit repeat
end repeat
if mt = {} then
if not (exists window 1) then
make new document with properties {URL:"https://mail.google.com"}
else
set mt to make new tab in window 1 with properties {URL:"https://mail.google.com"}
set the current tab of window 1 to mt
end if
else
set mt to item 1 of mt
set the current tab of w to mt
set the index of w to 1
end if
activate -- needed if not activated otherwise
end tell
Then:
1. I export the script as an app. In the dialog I set it to stay open.
2. I run the app.
3. I use the standard rcmd method to assign M to that application.
4. I quit the app.
5. I export the script as an app again. In the dialog I *do not* set it to stay open.
And done! Now I rcmd-M and if there is a mail.google.com tab, Safari switches to it and jumps to the front. If there is not a mail.google.com tab, the frontmost window gets a new tab set to mail.google.com. I haven't tested yet what happens if there is no window. It should create one with mail.google.com. I'll test that in a minute and if it doesn't work I'll correct it and update here.
I have rcmd installed and working, and I wrote this AppleScript:
tell application "Safari"
repeat with w in windows
set mt to (tabs of w whose URL contains "https://mail.google.com/")
if mt ≠ {} then exit repeat
end repeat
if mt ≠ {} then
set mt to item 1 of mt
set the current tab of w to mt
set the index of w to 1
end if
-- activate -- needed if not activated otherwise
end tell
How do I set up window actions in rcmd? I don't see that in the page on your site.
Hammerspoon is needed because App Store apps are sandboxed and can't focus specific windows, can't run arbitrary scripts and AppleScripts.
What that gives you is the ability to map Right Option+letter to specific windows or tabs of the currently focused app.
So in your case you could dorcmd-s for Safari then ralt-m for mail tab, ralt-h for HN tab and so on, and it can also open those tabs/windows if they aren't already open.
And you also get a visual switcher to see what your options are in case you tend to forget these shortcuts.
Ah, okay. Did you know that AppleScripts can be saved as "apps"? I'm happily launching the mail tab in safari by pressing rcmd-m without Hammerspoon or anything other than stock RCMD. That gives me everything I was looking for. It would be nice to be able to assign ralt-<letter> to launch different apps -- e.g. rcmd-m does gmail in Safari, ralt-m opens Messages. and rcmd+ralt-m could do something else entirely.
I've used Windows at times, but I don't miss window switching beyond the above use cases.
The solution I posted works for most use cases, but apparently Safari can have zombie windows with no tabs. I quit and restarted, and updated the script to handle the situation where there are no windows, but I need to wait until there are zombie tabs again to double-check that my fix for that works. Once that's done I'll post again.
Oh, that's interesting. Okay, I'm pulling the trigger. I used to write AppleScript in a previous life, so I think I can handle that part. (we'll see if I'm right...)
I could maybe try to implement the main part of the “find and switch to the tab if it exists” so that users can simply assign the URL.
Thanks for reminding about this use case!