Alfred

Setting up a secondary keyboard for macros

After setting up several keyboard shortcuts within Alfred and Keyboard Maestro, it became clear that I was putting together some bizarre key combinations and odd hand gestures to make sure I wasn’t interfering with other applications. Then it occurred to me, don’t video and audio editors have dedicated keyboards for shortcuts? Can the same thing be done for keyboard macros?

The answer is, yes it can. And rather easily too, using a standard keyboard and Karabiner Elements.

You don’t have to buy a specialty keyboard or programmable keypad or anything else. You can use any USB keyboard you have lying around. I have dozens from all the Windows machines I’ve ordered throughout the years.

This also works for a Bluetooth keyboard, so it doesn’t have to be wired.

The easiest way to configure this is install Karabiner Elements and go to the devices tab. Turn off all the other keyboard except the secondary one you plan to use for macros.

Then select the Complex Modifications tab, and enable the option for Caps Lock key to act like “command+control+option+shift”.

And that’s it. If you click into Keyboard Maestro and for the Hotkey Trigger, hold Caps Lock and click another key, it will be seen as Command Control Option Shift + Letter.

Because we disabled the other keyboard in Karabiner, this only works for the secondary keyboard. Pressing Caps Lock and another key on your main keyboard behaves the way you could expect. It toggles the uppercase of the letter.

This works for the standard letter keys, numbers, the number pad and the Home, End, PgUp, PgDn, etc.

You should now have 50-80 macros keys to program depending on keyboard.

karabiner-elements-deviceskarabiner-elements-caps-lockkeyboard-maestro-test

Other articles of interest:

Three months of working remotely

I've crossed over the three month mark of working from home. And despite circumstances, I'm thoroughly enjoying it.

By not being stuck in traffic I have so much more time available. I've been able to exercise with more frequency and still have plenty of time in the evening to play games, watch a movie, or work on side projects like Affinity, Inkle, or doing fun research with DevonAgent.

Not to mention, I've saved a ton of money by not eating out and not buying gas. No sympathy for the oil companies I'm afraid.

I've also been working on getting my organization groove on. I've made dozen of changes and improvements to my notes, folder and database structure within DevonThink. I've even moved a lot of documentation into DevonThink that was lingering in different folders on the drive. Everything in one place, very tidy.

I've created several new Alfred and Keyboard Maestro workflows which have been some nice little timesavers. (Clicking the Save button on a site 150 times using KM, is both fun, and educational)

I've added quite a few new text expansions to TypeIt4Me for both Katalon automation, SQL, and template text for Jira. And I've fixed the mess that was my SnippetsLab library.

Taskpaper is getting quite a workout. I've really put that at the center of my workflow for working on tickets and test cases.

And finally, I've made some nice search and replace modules for TextSoap. I've been doing them by hand, but now I've taken the time to automate that as well.

So all this extra time, as well as uninterrupted time has given me quite a few productivity boosts.

Other articles of interest:

Integrating DevonAgent Pro with Alfred

DevonAgent Pro is one of the greatest search engine tools I’ve used and I want to integrate that power into Alfred. I want to use Alfred’s search bar to pick a search type and pass over the parameters. Turns out it’s not that hard, just not well documented.

To make it all work, you need the following two commands:

- x-devonagent://runPlugin?identifier=com.devon-technologies.images.plugin&query={query}
- x-devonagent://runSearchSet?name=Deeper&query={query}

The first command uses a DevonAgent Plugin to perform the search, the second uses a Search Set.

To use these in Alfred, use the Web Search function under the Features tab. Enter the above command in the Search URL field. Also, select the option for Encode Spaces as %20.

alfred-devonagent

Now you can set up separate keywords to use different kinds of searches, which could be for images, deep dive searches, code searches, a specific engine, or anything else DevonAgent supports.

To give a bit more of an explanation of the commands, we’ll start with Plugins. You can find the plugin name to use by going to Window -> Plugins & Scanners. On that screen, click the plugin you want to work with. The name you enter for “identifier” on the command line is listed in the Identifier field. The one listed above is for Google Images.

devon-plugin

The Search Set name can be found using Window ->Search Sets. By default, DevonAgent has several built in such as Deep, Deeper, and Fast. You can either use one of those, or create your own.

Create Search Set by combining different sites and plugins. When done, use your Search Set name in the command line. Also, if your Search Set has spaces, enter the full name without using quotes.

You can now start a search with DevonAgent using Alfred.

Other articles of interest:

Wait for a Volume to Mount or Unmount/Eject in AppleScript

In working with Alfred, I've created a workflow that loads files from a Volume (DMG) file. In order for this to work correctly, I need the script to wait until the volume is actually loaded and visible in Finder before continuing.

This can be done a few different ways, but here is the AppleScript code I'm using which works with Alfred or Keyboard Maestro. It's based on several examples I found.

The first script gets the name of the mounted volumes and keeps looping until the expected volume shows up in the list.

The second script is the opposite. It keeps looping and trying to eject the disk until the name isn't in the list of mounted volumes.

Wait for Volume to be Mounted

set mountedDisk1 to list disks
set thevolume1 to "Insert Volume Name Here"
set wasmounted to false
set counter to 0
set max_number_of_iteration to 30

--activate
--use activate to bring dialog to front
if mountedDisk1 contains thevolume1 then
    set wasmounted to true
end if

if wasmounted is false then
    delay 1
    tell application "Finder"
        if (not (exists (disk thevolume1))) then
            repeat until (mountedDisk1 contains thevolume1 or counter is greater than max_number_of_iteration)
            set mountedDisk1 to list disks
            if mountedDisk1 contains thevolume1 then
                --successful
            end if
            delay 1
            set counter to counter + 1
            end repeat
        end if
    end tell
end if

Wait for Volume to be Unmounted/Ejected

set mountedDisk1 to list disks
set thevolume1 to "Insert Volume Name Here"
set wasmounted to false
set counter to 0
set max_number_of_iteration to 30

--activate
--use activate to bring dialog to front
if mountedDisk1 contains thevolume1 then
    set wasmounted to true
end if

if wasmounted is true then
    delay 1
    tell application "Finder"
    eject disk thevolume1
        if ((exists (disk thevolume1))) then
            repeat until (mountedDisk1 does not contain thevolume1 or counter is greater than max_number_of_iteration)
            set mountedDisk1 to list disks
            if mountedDisk1 contains thevolume1 then
                eject disk thevolume1
            end if
            delay 1
            set counter to counter + 1
            end repeat
        end if
    end tell
end if

Adapted from:
https://macscripter.net/viewtopic.php?id=29886
https://stackoverflow.com/questions/14266855/applescript-to-mount-drive-and-once-finished-report-if-successful

Other articles of interest:

It’s all about templates, macros and workflows in 2020

Over this holiday break I have been excitedly playing with Alfred and Keyboard Maestro to the point where I might be wasting time trying to find ways to save time.

In reality, I've created multiple workflows in each application to accomplish some trivial, but still useful tasks.

While looking up some examples for Keyboard Maestro, I followed the demo and set my machine to empty the system trash every Friday night at 10pm. Yes, the system does it, but this is more efficient.

I took that idea and set Keyboard Maestro to empty the trash in DevonThink Office at the same time. Keyboard Maestro can enter keystrokes and press dialog buttons. That's nice!

It even adds the extra option to make sure the system was idle in case I was doing something.

Because I've done it more than once manually, I built a Keyboard Maestro workflow to copy files out of my Dropbox folder to my local system so they could be used by DevonThink.

Again, these are rather trivial tasks, but they are solid learning blocks and they perform useful work. Work that I don't have to worry about.

I took that same idea and applied it to Alfred. I've created several keywords to make consistent work environments. One Alfred workflow for automation starts Katalon, CodeRunner, SnippetsLab, Github Desktop and opens the project in Finder.

It's hardly a chore to start some apps, but it means I don't have to go looking for an app. It's already running. When I need it, it's there, and my flow isn't disrupted.

The same is true for my writing apps. I type a keyword and Scrivener, WordWeb, WordPress, TextSoap and MWeb are all launched. My writing project is loaded and is ready to go. I could even add options to close apps like Messages, Slack and email so my focus doesn't wander.

Again, not difficult, but consistent. And a consistent environment means I can get more done with less distraction.

Another workflow that came up was specifically because I was at home.

While working from home over the holiday break, I needed to share my screen a few times. It's no problem to do so, however, I wanted to shut down multiple apps so notification messages wouldn't pop up. This meant closing Messages, Mail, monitoring tools, Affinity Dashboard, and others.

No one needs to know that a pair of shoes I'm interested in has gone on sale. Nor do they need to see some scammer trying to tell me my iTunes account has been suspended and I need to log in to confirm ownership.

That is a horrible business presentation.

Now, I can use Alfred to close these apps without my need to remember the name of each one. When I'm finished, I restart them all, and restore the state of my machine.

I'm even working on creating shell scripts and triggers that emulate some of the functionality of Hazel. I can move and copy files based on their name or extension. I can have the action triggered by keyword or run on a schedule.

Using these two tools, I'm very quickly creating a set it and forget it mentality.

Just think of what will happen when I actually know what I'm doing!

Other articles of interest:

Recent Comments

  • Round and Round with the For..Next in Katalon Studio (1)
    • Sweet Ophaline Labador: Hello can you help me how to loop this scenario. Checking the elements is just the same. I want to check that the following function is available in www.siacargo.com: Track Shipment – clicking on this can...
  • How To Disable the Quicken Registration Prompt (30)
    • David: A BIG Thank you! I regularly reinstall Windows OS’s using different hardware configs. In short, Quicken 2011 (it’s March of 2020 as I write this) has been a program I’ve been very happy with and continue to use....
    • Karen L: Today I rang Reckon Australia again, got a different guy and he talked me through the process of getting me a new product key to enter since I already had the licence and it had been extended. Reckon have only extended it by 1...
    • Karen L: I have Australian Quicken 2008 on Windows 8.1. It keeps asking me to renew my licence which Reckon did for me however the activation won’t work. I tried this to disable the registration prompt however it did not stop the...
  • Parsing Strings in Katalon – Split, Substring and Readlines (6)
    • Don Pedro: String tempText=”Date Month January. Revenue $1,355,721.00″ println(tempText.split(“ \$”)[1]) You need to escape the $ with \$ The [1] on the split captures characters on the right of the split [0]...
    • Prasad: Hi, I need to get the substring from the below string ‘Date Month January. Revenue $1,355,721.00’ I want to extract text after $ value. Please help Thank you
  • Working with Dates and Date Formatting in Katalon Studio (15)
    • Sangeethaa: How to get previous day’s date(Yesterday’s date)? Actually I was using today.previous() before,it was working fine till today morning.Now its not retrieving right date. Can anyone please guide me on this.
    • Don Pedro: That could be a little tricky. First, is the text/format always going to be the same? You will need to do some parsing. Separate the first but of text at 2019. After that, split the text again to get rid of Central Standard...
    • Don Pedro: It should be of the same Date type as today. You could then do some calendar trickery with Calendar /*Calendar c = Calendar.getInstance(); //c.set(Calendar.MONTH, 1) //Set the month, 0=January, 11=December println...
    • josh: I’m testing a page with a string like “Updated November 21, 2019 16:25:32 PM Central Standard Time.” How might I capture the date and time and compare it to current time to verify that the update time was within...
    • zakir hussain: today = new Date() lastWeek = (today – 1.week) can u please help me in understanding what is the return type of lastweek? and I wanted to set nextyear date how can i do it
  • Output status messages and test information by writing to the Log File Viewer in Katalon Studio (6)
    • Saranya: Good One. Could you plz share link to access all your katalon related blogs. ThankQ
    • Rodrigo Calabretta: I’m using the KeywordUtil.markFailed or KeywordUtil.markError and my test stops is being shown as Error and If I use in the @afterTestCase the testCaseContext.getTestCaseSta tus() to show the status test case...
  • Setting up Environment Profiles in Katalon Studio (2)
    • Don Pedro: Not quite sure I understand. The term “Execution Profile” is normally used now, but they are still GlobalVariables and are created in the same way for version 7 as previous. You make a new execution profile, then...
  • Here is my drive cluster (2)
    • Don Pedro: While I still have those drives, the drive cluster looks nothing like that now. Almost all of my external drives have had the cases removed and they have been installed into a series of MediaSonic 8 Bay Drive Enclosures. I...