Stuff I’ve made (and actually use)

[Tweet]

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 my td 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 type rake anymore, instead using the simpler r 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)"