I’ve published over 100 projects over the years. In posts here, as projects, on GitHub, sometimes just zip files to Twitter. A lot of them I create out of curiosity, then let them go. I want to take a quick stock of the other kind, projects that filled a need so well for me that I not only maintain them, I use them daily. While I’m looking to satisfy my own curiosity, I’ll just go ahead and highlight some of them.
This is definitely not a “Best of 2018” list. These projects are almost all older than last year, though almost all of them saw updates over the course of the year.
Part 1: apps and services
Out of all of my projects, only a few of them are full-fledged apps. This section is going to list my favorites of those (and likely the only ones that have survived multiple OS versions), as well as my more fleshed-out Services (a.k.a. Quick Actions, these days).
- Marked 2
- Marked isn’t just my favorite app to work on these days, it’s my favorite tool to use when I’m writing Markdown of any kind. But you probably knew that.
- SearchLink
- SearchLink is my favorite Service. It makes creating web links while you’re writing as simple as hitting a keyboard shortcut. No jumping to the browser, searching, copying, and jumping back. I seriously wouldn’t want to write without it.
- nvALT
- You probably know this one. While I struggle to get a replacement off the ground, I’ve kept nvALT running on the latest operating systems (and will for the foreseeable future). I don’t know where I’d be without it.
- MarkdownEditing
- While I turned over development of this Sublime Text package for Markdown writing, this was originally my project and I still use it every day. I’m using it (and SearchLink, Marked, and nvALT) right now as I write this.
- Marky
- Marky the Markdownifier isn’t perfect. There’s a lot I’d like to fix on it. But 90% of the time it makes it a simple task to turn web articles into Markdown, whether I just want to make things more readable in the browser or archive them in a text format.
- TextExpander Tools
- I’ve built a lot of TextExpander snippets over the years. I use TextExpander literally every time I type a sentence, and some of my favorites from my more complex snippets are available here.
- Markdown Service Tools
- The cleverly named collection of macOS Services for writing Markdown. From adding bold and emphasis to gathering a Markdown list of all your Safari/Chrome tabs, this collection proves useful to me every time I write, even in Markdown-specific apps with their own tools.
- KeyBindings
- I talk a lot about my key bindings. I won’t go into depth other than to say it allows me to add shortcuts and modifications to the entire macOS text system. I miss them immediately when working without them, so they seem relevant to this list.
Part 2: Terminal tools
I spend time on the command line every day (iTerm2 to be specific), so the CLI tools I’ve written get a workout. Here are (some of) the ones I use constantly. You can find an archive of all my exploits in the Bash Fun series. (It’s mostly bash stuff, but often shell-agnostic and I do include some other shells.)
- na
- My little interface to a TaskPaper file for each project. When I
cd
into a project, I automatically get a list of the top priority todo items for that project, and I can quickly add new todos, along with priority tags and notes. Together with mytd
function, this is how I handle all project-specific task management. - doing
- My “What Was I Doing” system. I really just built it so I could take a quick note about what I was working on when I detect myself getting distracted by a tangential project, it morphed into a fairly complete system for task, idea, and time tracking.
- reiki
- This is my interface to Ruby’s
rake
gem. I hardly ever typerake
anymore, instead using the simplerr
syntax provided by reiki. - where?
- Because I have so many scripts, aliases, and tools in my shell, I sometimes lose track of where a function or alias is coming from. Where catalogs all of my sourced files in Bash and allows me to quickly track down the file and line number where a function or alias is defined. It probably isn’t handy for everybody, but I use it frequently.
- Multi-purpose editor variable
- This one works transparently, always picking the right editor when the
$EDITOR
variable is invoked in my shell. I use it every day without even remembering that it’s there (until my markdown file automatically opens in MultiMarkdown Composer instead of Sublime). - newscript and editscript
- My two tools for quick-starting new scripts and editing existing scripts with fuzzy search and short commands.
- App Completion
- This trick lets me type
xc [tab]
and get a completion of all of the Xcode projects and playgrounds in the current folder, ready to open in Xcode with the press of the return key. I have it set up for everything from Xcode and Sublime to Acorn and ImageAlpha.
Part 3: Just the aliases
I’ve mentioned a bunch of my favorite Bash aliases over the years, and some of these are repeats/updates, but here’s a list of some of my favorite custom aliases that you might want to incorporate if you spend time in the shell.
Quick access to top
screens:
# top
alias cpu='top -o cpu'
alias mem='top -o rsize' # memory
Shortcuts for package managers:
# bundler
alias b="bundle"
alias bi="bundle install"
alias bu="bundle update"
function be() {
if [[ ! $1 =~ / ]]; then
bundle exec "bin/$1"
else
bundle exec $@
fi
}
# npm global install
alias npmg="npm install -g"
For doing a little config maintenance:
# Edit common config files
alias bp="subl ~/.bash_profile"
alias kb="subl ~/Library/KeyBindings/DefaultKeyBinding.dict"
# Reload bash settings
alias src="source ~/.bash_profile"
Working with git:
# Remove all traces of git from a folder
alias degit="find . -name '.git' -exec rm -rf {} \;"
# add and remove new/deleted files from git index automatically
alias gitar="git ls-files -d -m -o -z --exclude-standard | xargs -0 git update-index --add --remove"
# Git common
alias get="git clone"
alias gd="git diff"
alias gs="git status -bs"
# jump to top level of git repo
alias gt="cd \$(git rev-parse --show-toplevel)"
# Open the current git repo in Tower
alias tower="open \$(git rev-parse --show-toplevel) -a Tower"
Other tricks:
# Get current external IP
alias ip="curl icanhazip.com"
# copy the working directory path
alias cpwd='pwd|tr -d "\n"|pbcopy'
# Toggle wifi (add on or off after command)
alias wifi="networksetup -setairportpower en0"
# Use ack to locate TOD* and FIXM* lines in current folder tree
alias todos='ack --nobreak --nocolor "(TODO|FIXME):"|sed -E "s/(.*:[[:digit:]]+):.*((TODO|FIXME):.*)/\2 :>> \1/"|grep -E --color=always ":>>.*:\d+"'
# Quick Look a file from Terminal
alias ql="qlmanage -px &>/dev/null"
# Search running processes for a pattern
alias ps?="ps ax|grep -v grep|grep -iE"
alias psgrep='psgrep -saien'
# Print argument right aligned
alias right="printf '%*s' $(tput cols)"