Jump to content

Recommended Posts

58f5bbf703fc8_ScreenShot2017-04-18at12_39_32PM.png.6407a7a501d033462c2e363e9b709a59.png

 

 

I have re-implemented ctwise's excellent implementation of the Menu Search workflow in Swift.

 

This version is ever so slightly faster (at least on my machine :)) - YMMV.

 

Requires OSX 10.7+

 

Download

 

Setup

Accessibility must be enabled for Alfred in order for this to work properly.

 

For example, in macOS Sierra, this is configured using the Security and Privacy preference pane, under the Privacy tab with the Accessibility section selected. Alfred must be included in the list of apps allowed to control your computer. This step is required for the workflow to generate the list of menu items, and also click on a specific menu item. 

 

Here's a snapshot of what the preference pane might look like in macOS Sierra.

 

59057e636ca17_ScreenShot2017-04-30at11_26_16AM.png.fa2fd040b690744132ac9ab77c87a0a7.png

Usage

Type m in Alfred to list menu bar items for front most application You can filter menu items by name, or do a fuzzy search.

E.g

  • m new tab will match the menu item New Tab
  • m cw will match the menu item Close Window

Settings

You can change the workflow environment variables to fine tune menu listings

  • -show-disabled true/false controls if diabled menu items should be shown (default is false) - change this setting if certain items are not displayed, even though active

  • -show-apple-menu true/false if true, menus items under the apple menu will be shown (default is false)

  • -max-children number how many sub-menu items to load for each menu item (default is 30)

  • -max-depth number how many nested levels if sub menus should be listed (default is 10)

 

v1.6 and above

You can also have customised settings per app. Typing ms into Alfred will give you a list of options to configure your settings.txt config file. The workflow comes bundled with a sample configuration file for reference. Your app settings will override any workflow level variable settings you may have specified.

 

Here's the settings file I use for reference:

# always show disabled menu items
appFilters {
  app: "BibDesk"
  showDisabledMenuItems: true
}

# for Safari, ignore the History and Bookmarks
# menus since loading it take a lot of time
appFilters {
    app: "Safari"
    ignoreMenuPaths {
        path: "History"
    }
    ignoreMenuPaths {
        path: "Bookmarks"
    }
}

# For Finder alone, show the Apple menu entries,
# and ignore any recent entries listed in the 
# Apple > Recent Items menu
appFilters {
    app: "Finder"
    showAppleMenu: true
    ignoreMenuPaths {
    	path: "Apple"
	    path: "Recent Items"
    }
}

Change log

  • 1.0 - Initial Release

  • 1.1 - Added Fuzzy Text Matching for Menus

    If you have a menu item New Tab, then typing m nt in Alfred will match New Tab, since n and t matches the first letters of the menu text.

  • 1.1.1 - Changed run behaviour to terminate previous script, this makes the experience slightly more faster

  • 1.2 - Completely native menu clicking, removed reliance on AppleScript

    • 1.2.1 - Performance improvements when generating menus using direct JSON encoding
    • 1.2.2 - More performance improvements while filtering menu items
  • 1.3 - Added -async flag to allow threaded scanning and populating of menus

  • 1.4 - Added -cache setting to enable menu result caching and also set a timeout for cache invalidation

    • 1.4.1 - Invalidate cache (if present) after actioning a menu press
    • 1.4.2 - Slide the cache invalidation window forward in case we get invalidated by a near miss
    • 1.4.3 - Speed improvements to caching, text search and fuzzy matching
    • 1.4.4 - Added -no-apple-menu flag that will skip the apple menu items
    • 1.4.5 - Tuned fuzzy matcher, allows non-continuous anchor token search
  • 1.5 - Faster caching using protocol buffers

    • 1.5.1 - Reduced file creation for cache storage

    • 1.5.2 - Better support for command line apps that create menu bar owning applications

    • 1.5.3 - Protocol buffer everything - microscopic speed improvements, but hey...

    • 1.5.4 - Added various environment variables to fine tune menu listings

    • 1.5.5 - Tweaked ranking of search results for better menu listings

  • 1.6 - Per app customization via the `settings.txt` configuration file

 

 

Edited by Benzi
v1.6 changes

Share this post


Link to post

You need to recompile using static linking. It's requiring a dynalib that I don't have:

 

Code 6: dyld: Library not loaded: @rpath/libswiftAppKit.dylib

  Referenced from: /Users/raguay/Dropbox (Personal)/Richard/rag/Alfred/Sync/Alfred.alfredpreferences/workflows/user.workflow.85FE278A-FF20-4A2A-919E-8DE7DC7D1C62/./menu

  Reason: image not found

Share this post


Link to post
2 hours ago, raguay.customct said:

You need to recompile using static linking. It's requiring a dynalib that I don't have:

 

Ah I see. I will update it shortly.

Share this post


Link to post
11 hours ago, raguay.customct said:

You need to recompile using static linking. It's requiring a dynalib that I don't have:

 

Code 6: dyld: Library not loaded: @rpath/libswiftAppKit.dylib

  Referenced from: /Users/raguay/Dropbox (Personal)/Richard/rag/Alfred/Sync/Alfred.alfredpreferences/workflows/user.workflow.85FE278A-FF20-4A2A-919E-8DE7DC7D1C62/./menu

  Reason: image not found

 

I updated the workflow - could you re-download and check if possible?

 

Share this post


Link to post

Great workflow! And I appreciate the rename. By the way, it might be helpful to increment the version number each time you update it.

Share this post


Link to post
8 hours ago, Lecter said:

Great workflow! And I appreciate the rename. By the way, it might be helpful to increment the version number each time you update it.

 

Duly noted. Wil do.

Share this post


Link to post
4 hours ago, raguay.customct said:

Thanks. It is working now. What framework are you using for the automation. I love that it is getting services too!

 

Nothing out of the ordinary - just the default AX... accessibility stuff from Apple.  

 

PS: The code is included in the workflow (also Github); mostly a port of @ctwise's objC code into Swift.

Share this post


Link to post

v1.1.0 - Added Fuzzy Text Matching for Menus

58f87c8acbc4c_ScreenShot2017-04-20at2_46_46PM.png.da34966ebfbb4baae3df0f2c66ca19a7.png

 

If you have a menu item New Tab, then typing m nt in Alfred will match New Tab, since n and t matches the first letters of the menu text.

 

 

Share this post


Link to post

This is great, thank you! I think the menu search workflow is one of the most powerful workflows. On my system (macOS 10.12.4, Alfred 3.3.2) your new implementation is quite much faster, and adding the power of fuzzy search makes it even more useful.

Share this post


Link to post

Great workflow! Definitely faster than the original one. Thank you!

 

However, to make it even faster, I suggest applying the following Run Behavior settings to the script filter:

  • Queue Mode: Terminate previous script
  • Queue Delay: Immediately after each character typed

I also found the icons a bit too dark to my taste and replaced them with the ones attached, if anyone wants them.

icon.png

apple-icon.png

Share this post


Link to post

 

v1.2 - Fully native menu clicking, removed AppleScript based solution

Well, I removed the AppleScript part of the workflow that automates the actual menu clicking, and replaced it with native code. (This is slightly faster, but not perceptibly so.)

 

Also, @targumanu's suggestion to terminate previous script for the run behaviour is now the default setting.

Share this post


Link to post

Thanks! It seems that it works much better than the previous AppleScript-based workflow that I used.

It would be nice if you could distribute workflow via packal or github releases, it's easier to track updates ?

Edited by artdev

Share this post


Link to post
3 hours ago, nhat said:

Thanks for the excellent workflow. You made it really snappy and a joy to use :)

 

You're welcome. Although you might want to re-download because I've tried to make it even more snappier

v1.4 - Caching

Menu results are cached for a very short duration, resulting in even faster filtering of menu items.

 

Check it out!

Share this post


Link to post

@BenziLove your work, but I ran into problem that only some of the menu item is available. Somehow the workflow didn't get all the item.

 

Most noticeable in "Edit" menu. It there a way to troubleshoot? I am on Sierra with workflow version 1.4

 

for example in "safari",  "copy" "paste" doesn't work (in fact non of the app can get "copy", "paste" to show up)

 

Also possible exclude the menu item from the "apple menu icon"? it clutter up the result (not a big deal really)

 

Thanks !!

Edited by dunkaroo

Share this post


Link to post

@dunkaroo That's a bit odd. 

 

edit - see my post after this one as well

 

Troubleshooting

 

A - What gets displayed when you type in "m copy" into Alfred? Is it 'No menu items'?


B - Can you access Alfred's cache folder? In my case it is 

/Users/benzi/Library/Caches/com.runningwithcrayons.Alfred-3/Workflow Data/com.folded-paper.menu-bar-search/

You will need to change that path with your username. In the cache folder, two files will be created for every app once you trigger Menu Search for that app. For example, for TextEdit, it would be: 

  1. com.apple.TextEdit.items.txt
  2. com.apple.TextEdit.txt

Can you check if these files get created and if so share me the contents of these two text files? For this step, the Script Filter must have the default settings.

 

C - If you can edit the workflow, change the Script Filter command to the following, one option at a time and see if it makes any difference:

# option 1
./menu -query "{query}"

# option 2
./menu -async -query "{query}"

D - Delete all files from your cache folder and try again

E - Try downloading the latest version (see below) and see if it makes any difference.

 

 

Ignoring Apple menu items

 

If you re-download and install v1.4.4, I have included a new option to ignore the Apple menu items. You need to edit your workflow manually include this setting as it is not switched on by default. Open up the Script Filter, and change:

./menu -async -cache 10 -query "{query}"

to

./menu -async -cache 10 -no-apple-menu -query "{query}"

This should prevent apple menu items from showing up.

Edited by Benzi

Share this post


Link to post

@dunkaroo 

 

ALSO

 

You need to have text selected in the app for the Copy to show up / and something pasteable in the clipboard for Paste to appear.

 

This is because the menu search only searches and displays actionable menu items. You cannot copy if nothing is selected.

Edited by Benzi

Share this post


Link to post

@BenziI fix the problem by changing Alfred preference. Back to default "standard mode"

 

8rIComM.jpg

 

being able to fuzzy search on menu item is so freaking awesome, THANK YOU so much !!

Edited by dunkaroo

Share this post


Link to post

I also experienced one case where not all menu items were found, using the app BibDesk. The old menu bar search workflow, as part of the workflow "Key Clue" finds some menu items that are not shown by this new workflow (showing "No menu items"), e.g. the items that are subcommands to the "Copy As" item. Sorry but I did not have time to go through steps B-D outlined above (I have the latest version so step E is done) now, but wanted to quickly inform you about this.

Edited by cands

Share this post


Link to post
1 hour ago, cands said:

I also experienced one case where not all menu items were found, using the app BibDesk. The old menu bar search workflow, as part of the workflow "Key Clue" finds some menu items that are not shown by this new workflow (showing "No menu items"), e.g. the items that are subcommands to the "Copy As" item. Sorry but I did not have time to go through steps B-D outlined above (I have the latest version so step E is done) now, but wanted to quickly inform you about this.

 

@cands

 

Thanks for reporting this. I have downloaded BibDesk (Version 1.6.10 (4171)) and can reproduce the issue with the Copy As... menu.

 

I'll try to see if I can figure out why this is happening.

Share this post


Link to post

@cands 

 

BibDesk (programatically) reports all menus items under "Copy As..." to be inactive and disabled always. This is the reason why menu search is not able to pick up the sub menu items.

 

One workaround possible to to display all menu items (enabled or not) - but this means that if a menu item is truly disabled, actioning that from Alfred will not have any effect, and you will not be able to know beforehand if the item is indeed disabled or not. The workflow will blindly list all available menu item entries.

 

If you download and update the workflow to version 1.5.4, I have included some environment variables to control the default menu listing. In your case, because of BibDesk, you may want to set the value of "-show-disabled" to true

 

590087dd67715_ScreenShot2017-04-26at5_10_06PM.png.43a9488595abda61a0935b7a49e6899a.png

590087e9d4281_ScreenShot2017-04-26at5_10_16PM.png.afeee4667f67ae170ca42a2f230262d9.png

 

 

Note that this will affect all menus across all apps. I'll attempt to come up with a better solution, but not very hopeful at the moment.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...