Floating.Point Posted October 27, 2020 Posted October 27, 2020 What I need help building: Ok so I have a .css file on disk and I'd like to toggle the value of a specific class through an Alfred workflow. Basically I want Alfred to toggle between these 2 states: .markdown-source-view { font-family: 'Space Mono', monospace; } .markdown-source-view { font-family: 'Inter', Sans-Serif; } Hoping someone could help out, I have no idea how best to tackle such a thing? What I will use it for (if you're interested): I recently started using Obsidian for knowledge management (it's amazing). It allows for theming through custom css. I like to switch on monospace editing sometimes and have been manually switching between obsidian.css files to achieve this. An Alfred workflow would save so much time here.
dfay Posted October 27, 2020 Posted October 27, 2020 (edited) something like this should work - basically there are two versions of the file and Alfred calls a shell script to copy one or the other into a third active file. I found that was easier than trying to parse file contents. Edited October 27, 2020 by dfay
Floating.Point Posted October 28, 2020 Author Posted October 28, 2020 Hi dfay, Thanks for volunteering some time to help me out with this, I really appreciate it. The original workflow from the thread you linked is no longer available, so I wasn't 100% sure where to plug in your code. I've stripped out the unnecessary features from your code ( (hopefully correctly?) and plugged this into a Run NSAppleScript node like so: on alfred_script(q) try do shell script "cd '/Users/nathan/Dropbox/Maintenance/Notes/'; obsidian1.css > obsidian.css" on error do shell script "cd '/Users/nathan/Dropbox/Maintenance/Notes/'; obsidian2.css > obsidian.css" end try end alfred_script Unfortunately this throws an error. Here's the debug console: [14:47:51.984] Toggle Obsidian's .css[Hotkey] Processing complete [14:47:51.986] Toggle Obsidian's .css[Hotkey] Passing output '' to Run NSAppleScript [14:47:52.012] ERROR: Toggle Obsidian's .css[Run NSAppleScript] { NSAppleScriptErrorAppName = "Alfred 4"; NSAppleScriptErrorBriefMessage = "sh: obsidian2.css: command not found"; NSAppleScriptErrorMessage = "sh: obsidian2.css: command not found"; NSAppleScriptErrorNumber = 127; NSAppleScriptErrorRange = "NSRange: {124, 101}"; } Would you mind taking a look?
Floating.Point Posted October 28, 2020 Author Posted October 28, 2020 Oh wait, I'm an idiot 🤦♂️ Seems I hacked away an important part of the script: cat So now I've got this: on alfred_script(q) try do shell script "cd '/Users/nathan/Dropbox/Maintenance/Notes/'; cat obsidian1.css > obsidian.css" on error do shell script "cd '/Users/nathan/Dropbox/Maintenance/Notes/'; cat obsidian2.css > obsidian.css" end try end alfred_script So this is doing something now. But it's not toggling between the 2 states. It will successfully copy the contents of obsidian1.css into obsidian.css, but once it's in that state, the workflow won't change it to the contents of obsidian2.css
deanishe Posted October 28, 2020 Posted October 28, 2020 3 hours ago, Floating.Point said: But it's not toggling between the 2 states. No. It overwrites obsidian.css with obsidian1.css, and if that fails, it overwrites it with obsidian2.css. If you want to toggle something, you first need to know what state it's currently in. Personally, I'd make obsidian.css a symlink and change the file it points to, but applications don't always notice when symlinks change.
Floating.Point Posted October 28, 2020 Author Posted October 28, 2020 Hi deanishe, Thanks for jumping in, I appreciate your help. I just tested and unfortunately Obsidian app doesn't work when the the obsidian.css file is symlinked Quote If you want to toggle something, you first need to know what state it's currently in. Would you be willing to help work this out?
deanishe Posted October 28, 2020 Posted October 28, 2020 Here's a zsh script that should work. Run it in a Run Script with Language = /bin/zsh. #!/bin/zsh set -e # Script settings # directory containing all files (only used to set other paths) dir="/Users/nathan/Dropbox/Maintenance/Notes" # the two source files that will be toggled source1="${dir}/obsidian1.css" source2="${dir}/obsidian2.css" # the file one of the sources will be written to target="${dir}/obsidian.css" # where the current value is saved statefile="${dir}/.current.txt" ####################################################################### # End of settings # Don't edit below unless you know what you're doing! ####################################################################### current= if [[ -f "$statefile" ]]; then current="$( cat "$statefile" )" fi source="$source1" if [[ "$current" = "$source1" ]]; then source="$source2" fi command cp -f "$source" "$target" echo -n "$source" > "$statefile" echo "switched: $current --> $source" >&2 paulw, Floating.Point and dfay 2 1
Floating.Point Posted October 29, 2020 Author Posted October 29, 2020 Ok wow, thank you deanishe. It's no wonder you're carrying the badge "community hero"! This works perfectly. Thank you so much for taking the time to not only put this together, but to also make it so clear as to what needs to be edited to get it working. The inclusion of the warning after the settings is great I hope you have a great day Vero 1
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now