New Hyper Key

For quite a while now, I’ve had Caps Lock mapped to Escape. At first it was just out of convenience — as a vim user, I use Escape much more than Caps Lock. With the new MacBook Pro keyboards it’s somewhat of a necessity.

I had a great, but complex, setup that I copied from Brett Terpstra where Caps Lock was Escape if you pressed it by itself, but Control + Option + Command + Shift if you held it down with another key. This worked great for global hotkeys, especially when combined with an app like Snap, because that complex combination of keys is uncommon anywhere else. When Sierra was introduced, the super glue and duct tape fell apart, and the global hotkeys stopped working.

It looks like this was recently fixed with Karabiner Elements though; and it’s much easier now. There are some pre-made rules on the author’s website. I copied the caps lock recipe to GitHub for posterity. After installing Karabiner Elements from Github, you can automatically install the caps lock rules with a specially crafted link:

karabiner://karabiner/assets/complex_modifications/import?url=https://gist.githubusercontent.com/joshbetz/ef03e49e5d45ce34c8e23945260b122c/raw/54b65daa0377083b62a1c8219315457f087f18d8/caps_lock.json

https://gist.github.com/joshbetz/ef03e49e5d45ce34c8e23945260b122c

Go Configure

I’ve been dabbling in Golang on and off for a little while now. Recently I was looking for a package to read and parse configuration files with the following requirements in mind:

  1. Be fast.
  2. Use environment variables and JSON files (in that order).
  3. Support hot reloading.

I looked at some of the popular configuration packages, but didn’t see anything that I loved. Many of them don’t meet the requirements I had in mind or are more complex than I’d like.

So, I decided to write config — I know, it’s a great name. It’s pretty simple. We cache values in memory to minimize disk IO. On SIGHUP (or any time you call config.Reload()), we clear the cache, so you can update the configuration without restarting your app.

Usage looks something like this:

func main() {
	c := config.New("config.json")

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		var value string
		c.Get("value", &value)
		fmt.Fprintf(w, "Value: %s", value)
	})

	http.ListenAndServe(":3000", nil)
}

There are more examples and details on the API in the README on Github.

If you have questions or ideas, issues and pull requests are welcome on Github. Let me know if you use it!

Writing Mode in Vim

I write quite a lot of Markdown on a daily or weekly basis. From meeting notes to documentation — most of the stuff I write for work that’s not code starts in Markdown. I used to use Byword, but it’s another app to switch between. After the last MacBook refresh, there were a few apps I installed immediately and it has pretty much stayed that way.

I’ve been using Vim to edit Markdown, which is fine, but was missing some things. So, I went hunting for the proper vimscript to enable things like soft line-wrapping and spell check. Needless to say, you can do more than that.

Goyo

One of the first things I found way Goyo. Goyo does “distraction-free writing in Vim” and does most of the work — disabling line numbers, vim-airline, soft-wrapping text at 80 characters, and centering it in the terminal window. You have to enable it with :Goyo after you open Vim, but I always want it enabled when I’m editing Markdown, so I wrote some vimscript:

" Goyo
function! s:auto_goyo()
    if &ft == 'markdown' && winnr('$') == 1
        Goyo 80
    elseif exists('#goyo')
        Goyo!
    endif
endfunction

function! s:goyo_leave()
    if winnr('$') < 2
        silent! :q
    endif
endfunction

augroup goyo_markdown
    autocmd!
    autocmd BufNewFile,BufRead * call s:auto_goyo()
    autocmd! User GoyoLeave nested call goyo_leave()
augroup END

vim-markdown

Next, I installed vim-markdown for syntax highlighting. Since most of my Markdown files have the .md extension, I need to tell Vim to treat them as Markdown.

autocmd BufNewFile,BufReadPost *.md set filetype=markdown

One of the vim-markdown features is to allow highlighting of other languages in code blocks:

let g:markdown_fenced_languages = ['javascript', 'go', 'php']

Spell Check

And, finally, I enabled spell checking in ~/.vim/ftplugin/markdown.vim with:

" Spell check
setlocal spell
highlight clear SpellBad
highlight SpellBad term=standout ctermfg=1 term=underline cterm=underline

josh.blog

I moved this site over to an awesome new .blog domain a few weeks ago. You can get your own at get.blog or any number of other registrars.

Today I decided to build a new WordPress theme to go along with the new domain. It’s been a while since I built a WordPress theme. For the last few years I had been using the default themes that ship with WordPress. It was fun to play designer again for a few hours.

I’m starting with something very simple — there’s not even support for comments yet. Though, I have a few ideas I’d like to experiment with if I have time. If you would like to use the theme or contribute, it’s over on GitHub.

2017 Resolutions

Happy New Year! I’ve spent the last week reflecting on 2016 and thinking about what I’d like to change in the coming year. You can probably see there’s an accidental theme. There are no professional goals, which wasn’t on purpose, but I think even one or two of these would positively impact my focus during the day.

Meditate regularly

I’m going to use Headspace at least once a week. The idea is to meditate every day before work, but I know I will miss some days and that’s fine.

Run a half marathon

And also train for it. I have this terrible habit of signing up for races with the idea that it will force me to run more and then just running the race out of shape.

The half marathon isn’t really in question. I guess the real resolution is to train for it.

Read more books and less news

I find books — especially paperbacks — to be more relaxing and calming. Right now I’m reading Modern Romance by Aziz Ansari. He writes in the same voice he performs and it’s pretty hilarious. I’m very late to the game on this one, but highly recommend it if you liked his Netflix special.

For news, I’d like an app that sends notifications about actual, important, breaking news. I had high hopes for the Apple News app, but they let publishers decide what justifies a push notification.

https://twitter.com/jshbz/status/773888526374973440

I’ve started to use the news as a crutch, like Facebook or Twitter, when I’m bored. The fact is that most of it isn’t important enough, also like Facebook and Twitter, that I need to know it in the next 24 hours — or ever.

Play more music

I tried to be specific for most of these, but the music thing is hard. Realistically, I have a couple months of Saturdays left until I’d rather be on a bike ride than playing guitar. I learned a few new songs over the holiday break and generally find it’s a good way to clear my mind when it’s too cold to go for a run.