I am trying to standardise my naming conventions in certain Evernote notes. Some are prefaced with a date in the format yyyy-MM-dd but due to a limitation in one of my apps, I need to switch to yyyy/MM/dd format. I reckon KM is the best approach and would like to basically:
position cursor anywhere in a string e.g. 2014-10-15
hit hot key trigger
KM selects the string e.g. 2014-10-15
KM replaces the string with yyyy/MM/dd e.g. 2014/10/15
The “position cursor anywhere” makes it somewhat difficult. If you can restrict yourself to clicking within the year it will dramatically simplify this. In that case, you would do:
Option-Shift-Left Arrow
Option-Shift-Right Arrow
Option-Shift-Right Arrow
Option-Shift-Right Arrow
Command-C
Pause may be needed here
Search and Replace Clipboard ‘-’ with ‘/’
Command-V <-- depending on the app, you may need a pause, or may get in to clipboard caching issues here
You imply but don’t specifically say that you’re working with the Title field in Evernote. Are you?
If so, then this task is simple.
------------------------------------------------------------------
# Get the title of the selected note in Evernote.
------------------------------------------------------------------
tell application "Evernote"
set _selection to selection
if length of _selection = 1 then
set _note to first item of _selection
else
error "Problem with number of notes selected!"
end if
tell _note
set _title to title
end tell
end tell
tell application "Keyboard Maestro Engine"
try
set value of variable "eNoteTitle" to _title
on error
make new variable with properties {name:"eNoteTitle", value:_title}
end try
end tell
------------------------------------------------------------------
# Set the title.
------------------------------------------------------------------
tell application "Evernote"
set _selection to selection
if length of _selection = 1 then
set _note to first item of _selection
else
error "Problem with number of notes selected!"
end if
tell _note
set title to newTitle
end tell
end tell
------------------------------------------------------------------
The first script gets the title of the selected note into a KM variable.
From there you find/replace in the variable using your correct date format.
The second script sets the title of the selected note.
Thank you Chris! I gather this an Apple script which I haven’t delved into yet. I take it this resolves the “click anywhere in the title” use case. I’m keen to have a play with this but think I need to learn a bit more about scripting and KM. Thanks!
…sherm
Yes. My scripts let you directly get and set the title without having to muck about with brute-forcing the UI. Not every application is scriptable of course, but when it's possible scripting is the better option for speed and reliability.
So. You can get the title with AppleScript and place it in a KM variable - massage it with KM - and put it back into Evernote with AppleScript - all from one KM macro.
Use the Applescript Editor app on your system to test AppleScripts. You can see results as they happen in applications and in the result pane of the editor.
Use an 'Execute AppleScript Action' in KM to add AppleScripts to a macro.
The 'Execute AppleScript Action' has two modes: run-text-script and run-script-file.
On my own system I always use run-script-file, because it's faster.
Becoming proficient with AppleScript takes some time, effort, a good book, and some mentoring.
The book I most often recommend (amongst 3 or 4):
Learn AppleScript: The Comprehensive Guide to Scripting and Automation on Mac OS X
Pardon my ignorance, but I can’t figure out how to set the value of newTitle. I’ve successfully passed the eNoteTitle to KB and replaced the text, but I can’t figure out how to pass the value back to the second script.
Here's a working example in which I've simplified the first AppleScript a bit by using the 'Execute AppleScript Action' itself to save the script output to a KM variable.
Although I've used text-scripts in this example, I always use script-files on my own system - because they are noticeably faster.
Now I have to figure out pattern matching so that I can extract yyyy/mm/dd and return yyyy-mm-dd. I’ve just gone with the heavy handed replace ‘/’ with ‘-’ which is fine if also a bit brutal. I’m thinking python might be the better tool for massaging text, although I don’t know if applescript or kbm works with python.
Also, is there a way to process a selection of notes. For example, take the top selection, process it and then remove from selection list, then process next until there is nothing selected.
If you want to do this efficiently then download and install the Satimage.osax (a small extension that adds regular expressions and other goodies to AppleScript).
tell application "Evernote"
set _sel to selection
repeat with theNote in _sel
tell theNote
set title to change "(\\d{4})/(\\d{2})/(\\d{2})" into "\\1-\\2-\\3" in (get title) with regexp
end tell
end repeat
end tell
Then you don't have to go KM(AppleScript-->KM-->AppleScript) - you can just run one Execute AppleScript Action.
Note that this script is very quick and dirty with no error-checking, but I want you to see how much you can do with very code.
If you choose to go that route let me know, and I'll write a script that has a few more smarts.
That is just awesome Chris! I download Smile to have a play and that come with the Satimage.osax. I saved your script to a file and created a KB macro which very quickly got a few hundred note titles changed. I also found some material so I can learn more about regular expressions.
So not only did I get the job done, I’m learning more about this stuff as I go. I’d love to see a script with more smarts so I can get a bit smarter too