LoveQuicksilver - Quicksilver Blog

Print to Quicksilver with Printopia

Get images and PDFs out of iOS and into Quicksilver with a couple of taps


image

Printopia is an excellent way to print from an iOS device. It costs some bucks, but it’s a lot cheaper than buying an AirPlay printer. Files needn’t go straight to a printer though. As files are routed through a Mac, Printopia also provides an option to open them in any app of the user’s choosing – including Quicksilver.

Go to Printopia’s System Preferences pane, click the ‘+’ icon, and then ‘Send to Application’ to add Quicksilver.




Select a document or image on an iOS device and find the Print button. Select ‘Send to Quicksilver’ from the list of printers, and tap ‘Print’.

image
An Image in iOS…

The file will appear in Quicksilver shortly. Do with it as you will.



… and now in Quicksilver


@LoveQuicksilver

Comments

Developing Plugins for Quicksilver

Quicksilver Plugin

We don’t normally talk about the development changes we make under the hood for Quicksilver, but without our developers making awesome plugins, Quicksilver wouldn’t be what it is today.

Recently we’ve been working hard to make it as easy as possible for new developers to create plugins for Quicksilver. As a testament to this, you’ll see that the list of ‘developer changes’ in the changelog is almost as long as the ‘features’ and ‘fixes’ list for recent versions of Quicksilver.

For now, let’s skip past those changes (if you want to know more abou them, either check out their corresponding pull request on Github, or ask in the Quicksilver Developer Groups (see link below), and look at some of the bigger things we’ve done over the past years to give anyone and everyone as much help as possible in creating plugins.

Plugin Documentation

Who ever said documentation wasn’t important?
Over the years, Rob McBroom (a Quicksilver lead dev) has meticulously compiled a comprehensive Plugin Reference on getting started with plugins, and an overview of what you need to define in a plugin’s Info.plist so that you (the developer of a brand new Quicksilver plugin) can get the most out of your plugin. The Info.plist has always been the tricky bit in creating plugins (here’s an example .plist file from the iTunes plugin to show how complicated things can really get), but Rob’s overview makes life so much easier.

If you ever get the smallest urge to create a plugin, this is where you want to start.

XCode Plugin Template

Discussed in the Plugin Development Reference is the XCode Plugin project template. This is a handy template (.xctemplate file) that you can drop into Xcode to make setting up a new plugin project much, much easier.

New Quicksilver Plugin

From the plugin reference, here’s the steps you need to take:

  1. Get the Xcode Project template from the GitHub repository
  2. Copy Quicksilver Plug-in.xctemplate to ~/Library/Developer/Xcode/Templates/Application Plug-in
  3. Create a new project in Xcode. You should see “Quicksilver Plug-in” in the “Application Plug-in” category.
  4. There are three types to choose from. Standard, Scripting Bridge (which is like Standard but adds the Scripting Bridge framework), and Interface which is mainly useless for now.

Make sure you take a look at the plugin reference though, as there are a few more steps and niggles that you’ll need to complete before you’re ready to go.

Existing Plugins

When the current development team jumped on board to save Quicksilver, documentation on existing plugins was few and far between. Comments in code were non existent, and things were just a right pickle, to be perfectly honest.
Things are much better now, with it much easier to dive straight into the code of one of the existing plugins to find out how something or other was done.

Programming at ease

We’ve tried to make writing plugins as simple and bash-my-head-against-the-wall-free in recent months. Now, when writing plugins, you can define new QSObjects and Actions based on UTIs of objects. We hope to expand this further in the future by converting all Quicksilver ‘types’ to conform to the UTI API.

One of the most convenient feature of Quicksilver is the comma trick. Previously, developers would have to write two bits of code for each and every action (QSAction) depending on whether one or more than one object was selected (using the comma trick). Now you can use the same code and just iterate over an array of QSObjects (be it an array that contains 1 QSObjects or 10, it doesn’t matter). Here’s some code to show how easy it is to implement the comma trick in one of your plugins:

// 'dObject' is the 'direct object' sent to the action method from Quicksilver's 1st pane when the user executes your plugin's action
for (QSobject *eachObject in [dObject splitObject]) {
	// do something with data from eachObject in the 'comma trick' list. e.g. email it, trash it, display it large type...
}

And there we have it, a quick look at developing plugins for Quicksilver. If there’s positive feedback about the post, and people want to know more, we’ll make sure to get a series of blog posts out from start to finish on creating plugins for Quicksilver.
Also: stay tuned… we’ll be arranging a Quicksilver code meet up in the not too distant future!

References:

Comments

Quicksilver: An Interview with the Developers

image

With the release of Quicksilver v1.0, I sat with Quicksilver’s lead developers (at our respective far-flung computers) to gather their thoughts on this historic occasion, and to find out a bit more about Quicksilver behind the scenes.

image
Patrick Robertson and Rob McBroom

Rob and Patrick have been at the forefront of the machine that’s driven this 1.0 release, so let’s hear what they have to say:

LoveQuicksilver: What makes Quicksilver worthy of a 1.0 status?

Patrick: Now that users can upload their crash reports to us, we’ve fixed tons of lingering bugs that we would never have known about otherwise. Stability is what v1.0 boasts, but accessibility should not be forgotten. We’ve worked to simplify Quicksilver and add great documentation (a new manual is coming out!), meaning Quicksilver can be picked up by anyone much more easily than before.

Rob: All the major known bugs are OS X bugs, not Quicksilver bugs. :-)

LoveQuicksilver: What’s next for Quicksilver?

Rob: When Quicksilver asks a plugin for objects to add to the catalog, there’s an assumption the plugin can create those objects instantly. Sometimes that isn’t the case. We need to be able to ask the plugin for objects, but let it send the results back whenever it wants. Sort-of related, plugins need a way to recreate objects on-the-fly when they’re not in the catalog. Anything not in the catalog is currently lost after a restart, so they can’t be used with triggers, synonyms, etc.

Interfaces are too hard to customise, and the way the results are displayed in a separate panel creates a dated appearance in my opinion. But, you know, hard to customise.

“The true power of Quicksilver comes from our plugin developers”

Patrick: We need to make it as easy as possible for developers and users to create plugins and AppleScript extensions for Quicksilver. The true power of Quicksilver comes from our plugin developers, so I’ll be happy once we have a strong dev community back on our side creating great plugins, and over the coming months I’m going to be working hard to try and achieve this – we can always make things simpler for new developers!

Rob: Proxy objects can’t be used in the third pane. They should be there. Pretty self-explanatory, I think. The reason they aren’t is because the simple act of including them in the results causes them to be “resolved” (the process that figures out what they refer to at any given moment). For some, this is fairly slow. Doing several at once compounds the problem and introduces delays we find unacceptable.

LoveQuicksilver: It’d be great to use folder synonyms in the third pane as well as the first. Any other practical examples of functionality that improvements to proxy objects could bring?

Rob:

File ⇥ Move To… ⇥ Finder Selection

Text ⇥ Find With… ⇥ Current Website (Safari)

image
Not yet

LoveQuicksilver: Now for a question close to your hearts – why did you start developing QS?

Rob: I learned Objective-C because I didn’t want Quicksilver to stop working – it’s as simple as that. I continue to spend time on Quicksilver because I want it to work well for me on my machine.

Patrick: I started to help save the project, but now it’s also fun to work with our inspiring community around the globe. A community that really appreciates what we do and shows their support in so many ways – translations for Quicksilver, donations or just kind words of thanks.

“I didn’t want Quicksilver to stop working – it’s as simple as that

LoveQuicksilver: It’s great to hear how passionate you are about the project! Something I’m sure many users are keen to know is: What is the state of Quicksilver Development?

Rob: I don’t know what it was like at the height of the Blacktree days, but, as far as I know, it’s better now than ever. Enormous changes and improvements are being made every couple of months. It could always be better. We could use more people, or better yet, the same people with more time. :-)

image

LoveQuicksilver: Historically, I believe, Quicksilver was difficult to code for due to its unstructured nature, out-of-date code and lack of documentation. What changes have you made to make it easier for potential contributors to get involved?

Patrick: When I joined the project five years ago, it was almost impossible to start developing. One of my own personal ambitions has been to make it really easy for new developers to dive straight into the code. This meant moving over to GitHub (arguably the best version control site around), and much better documentation. Developing for Quicksilver has never been easier.

Rob: Yeah! There’s now detailed a reference for creating plugins, which is great for new developers. The core application is still mostly undocumented, but the code is much cleaner now. If it’s difficult finding your way around the code, there are always a few of us who know our way around and can answer questions for new developers. Not many people are asking, though!

“Developing for Quicksilver has never been easier”

LoveQuicksilver: What would you like to see developed in Quicksilver?

Rob: The ultimate interface for me would be one based on WebKit. Every part of the interface would be an HTML <div> or whatever, and any user would be able to customise the appearance using CSS (including animations and 3D transformations). I don’t know how realistic that would be, but I would be much happier tweaking CSS than spending an hour and a half in Xcode just trying to figure out where a box even comes from! And of course this would open up interface customisation to a ton more people.

image
Easier to make interfaces

LoveQuicksilver: Lots of people in the Quicksilver userbase are asking questions like “Why isn’t there a Sparrow/Twitter/Textmate 2/Duke Nukem/[insert app name] plugin?” What do you have to say to them?

Rob: Some people (probably a vocal minority) seem confused about why we aren’t working on a plugin for Sparrow, or Google Chrome before that, because surely so many user requests have gotten our attention, right? Unfortunately it doesn’t work like that. I don’t use those apps, so I have no need for those plugins. End of decision tree.

I’ve said something like this before, but for almost any open source project, you need someone that knows how to do it and someone who wants it done before something will happen – and of course they need to be the same person! It’s pretty common for the people who want it done to appeal to the people that know what to do. I think it’s only fair to make the opposite appeal. If you want something done, don’t tell me it’s important to you. Show me. I will spend hours and hours answering your programming questions on the mailing list, or looking over your code, but I’m not going to spend 20 minutes on a feature or plugin if I don’t need it. I’m not losing any sleep if that hurts some feelings. After all, I’m not asking anyone to do anything I didn’t do myself, and the barriers to entry are considerably lower now. :-)

“I will spend hours and hours answering your programming questions”

LoveQuicksilver: Wow! I expect you’ll be seeing more plugin developers jumping on board now right?! What have you learned while working on QS?

Patrick: Put simply – how to code. It may seem crazy, but I was driven to help keep Quicksilver functioning, and to do so I had to learn how to code. Another important thing has to be working internationally. The current development team spans 12 timezones (from Japan to the US East Coast) which makes discussion and collaboration difficult, but we make it work with the great tools we have – git, GitHub, IRC and good old mailing lists.

Rob: A little Cocoa and a lot of Git. Or at least that’s how it feels sometimes. I wouldn’t have guessed how much time goes into the work surrounding the work. That is, you probably spend 10% of the time programming and the other 90% reviewing issues reported by users, discussing changes with other devs, reviewing code from others, branching/merging/rebasing/committing stuff with Git, etc. Then there’s a web site and an update system to think about, documentation, and accounts to maintain. You get the idea.

I’ve also learned that when someone forks the project on GitHub, it doesn’t mean they’re interested in helping out. And I have no idea what it does mean. There are 112 forks and only a handful of people actually doing something with them.

LoveQuicksilver: It all sounds intriguing! Let’s cap things off with one more personal question for you: What’s your favourite thing about Quicksilver?

Rob: This will probably seem like such a stupid little thing to be excited about, but it’s what I immediately thought of when you asked the question, so it’s probably true. It has to be the way searching works; the fact that I can find “peanut butter” by typing “pb”, or “nbtr”, or whatever makes sense at the time. It doesn’t force me to start at the beginning of the term, nor does it force me to enter all letters in sequence, like “peanu”. That’s a huge part of the general theme in Quicksilver of not having to think. You just call it up and start smacking keys, and the right thing happens. Someone should write a Chinese proverb about that.

image

Maybe that general “wei wu wei” theme should be my answer, but I think there are two reasons the search behavior specifically stands out.

  1. It was one of the first things that got me interested in using Quicksilver (if not the first thing).
  2. After all these years of the idea being “out there” for anyone to copy, I can still count on one hand the applications that employ this type of searching.

As a result, Quicksilver remains special.

Patrick: The simple things are always the best, right? So for me it has to be the speed and huge scope of what Quicksilver can find. There’s nothing else out there that will find your Dad’s phone number, Bob Marley’s “Three Little Birds”, my Safari bookmarks… all these different things as quickly as Quicksilver. It’s partly to do with what Quicksilver concentrates on, and, as Rob says, Quicksilver’s awesome searching algorithm. This doesn’t mean I’m happy with the speed though – I’m still looking for ways to make it faster!

LoveQuicksilver: Great, thanks for your time Patrick and Rob!



And finally, I got in touch with Quicksilver’s creator Nicholas Jitkoff (né Alcor) to see what he had to say about this historic v1.0 release of Quicksilver:

“I’m amazed at what the Quicksilver team has accomplished since they took over the project a few years ago. They’ve created something truly worthy of a 1.0, taking Quicksilver from a flight of fancy to a fast, reliable productivity app. It has been a pleasure to use thanks to their frequent updates, countless refinements, and tireless effort.”

“They’ve created something truly worthy of a 1.0”

For those of you who remember, LifeHacker interviewed Nicholas all of 5 years ago on the state of Quicksilver. It’s amazing to see the turnaround in Quicksilver’s stability and development state since then.

image

There’s nothing more to say except that I hope you’re as happy with Quicksilver v1.0 as the development team and I are. Don’t forget to spread the word and share the love!


@LoveQuicksilver

Comments

Quicksilver Comes of Age

Bye Bye ßeta


image

Quicksilver 1.0

After almost 10 years of testing, Quicksilver lays the beta tag to rest. (If the lack of an eszett brings a tear to your eye, you can always reminisce by hitting ⌥S on your keyboard). What does this release mean? It means more than just a change in the version numbering system - it signifies a maturity of Quicksilver and a sign of what’s to come.

For more info on this historic release day, you can read an interview with the lead developers where they discuss their thoughts on Quicksilver, but now it’s time to dive right in and see what Quicksilver’s getting on its release birthday.


Add files and folders to the catalog using the Add To Catalog action
A core feature of QS is direct access to only the things you care about. Now it’s easier then ever to add your latest fancy to the top-level catalog.

image
Visit the new entry’s catalog info panel to include its contents

Assign an alternate name to something by creating a synonym
Abbreviations are limited to letters contained within the target object’s name. Synonyms make it possible to use any name you like! Die-hard Address Book devotees rejoice.




Fixed the Add Trigger action, and the trigger type can be specified in the third pane
Get a new trigger straight into preferences. Make a command, press ⌃⏎ and search for ‘Add Trigger…’.

image

Assign the same trigger to different actions in different applications
Add apps in the ‘Scope’ field of the triggers’ information panels to use the same shortcut multiple times.

AppleScript Action enhancements
Custom actions now have the ability to handle files in both the first and third panes. Also, the type of objects that the action will appear for, and will subsequently display in pane 3 can be specified – making it a lot easier to mimic plugin functionality without lower-level coding skills.

image
An explanation of object types can be found here

The AppleScript action at the end of this post uses Sparrow to send an attachment to a specified email address. It will only appear for text objects in pane 1, and provides only files in pane 3.

image
Store email addresses on the Shelf for easy access

Recent Commands and the Last Command proxy are working
One excellent use for the Last Command proxy is doing repetitive tasks within an app that are normally done from the menubar. Assign ‘Last Command>Run’ to a trigger. Use the User Interface plugin to press a menu item. The Last Command is now that menu item. Your shortcut will work for as long as you can resist using QS for something else. But even then, you can just → in ‘Recent Commands (Catalog)’ to perform the task again.


Also shows how to add a trigger from the bezel

Release Notes have some style
Which is a good thing, as I can’t possibly reveal all the other goodies here. Have a look at QSApp.com.

Bug Fixes
And finally, there are over 40 different bugs and stability improvements in this release, more than in any other release. Quicksilver has well and truly left its old days behind!


So there’s a rundown of the latest and greatest things you can find in this version of Quicksilver, to finish off, here’s a quick word from lead developer Patrick:

Quicksilver 1.0 doesn’t just mean stability, it means the whole package: localisations for all our users; easy to use APIs for plugin and AppleScript extension developers; and a reliable, responsive support system.

It’s easier than ever for newcomers to contribute localizations, create plugins, add to the code base, or simply ask for help. Why not join the party or donate to the cause?


What next? Find out more in the interview with the developers. In the meantime, let us know your thoughts on this release, spread the word and above all - enjoy using Quicksilver!


@LoveQuicksilver





Example AppleScript using the new AppleScript features:
using terms from application "Quicksilver"
	on get direct types
		return {"NSStringPboardType"}
	end get direct types
	
	on get indirect types
		return {"NSFilenamesPboardType"}
	end get indirect types
	
	on process text _emailAddress with _attachment
		try
			-- Put your email address between the following quotes:
			set _myAddress to "johndoe@emailprovider.com"
			tell me to set _body to (current date) as text
			
			set _attachmentText to _attachment as text
			set _path to POSIX path of _attachmentText
			
			tell application "Sparrow"
				set _outgoingMessage to make new outgoing message with properties ¬
				{subject:_attachmentText, content:_body, sender:_myAddress}
				
				tell _outgoingMessage to make new to recipient with properties ¬
				{address:_emailAddress}
				tell _outgoingMessage to make new mail attachment with properties ¬
				{filename:_path}
				
				sendmessage _outgoingMessage with to recipient and mail attachment
			end tell
			
		on error a number b
			activate
			display dialog a with title "Sparrow Attachment"
		end try
	end process text
	
	on get argument count
		return 2
	end get argument count
end using terms from
Comments

EverTips: Evernote + Quicksilver = Quick shortcuts to common notes

evertips:

Evernote + Quicksilver

Do you have notes that you are use every single day? Sure, you can add them to the sidebar of the Mac Evernote client but there some notes should be in closer reach. Many times a day I make calls to coworkers throughout our office. I never seem to be able to remember people’s extensions so…

Comments


This search box is rubbish. Click this to search from Quicksilver instead.