I’ve come to realize that I often have it all wrong.
I like to think that I am pretty open-minded, but looking back on my life, there
are a ton of things that I turned my nose up at initially, only to come around
on them later. From cheese (the food) to Docker
containers, the list of things I wrote off at first but eventually ended up
loving is a mile long.
Read more... Rustaceans have been spoiled by Rust’s clap
(or, at least, I think they have).
The derive macros, the ergonomics, the fact that you can describe an entire CLI
with a struct and be done with it — it’s really nice.
I’ve never actually used (never tried Rust), but every time I see an example, I
think “I wish Go had this.”
Go’s standard flag package works, and
urfave/cli is the one I reach for when I need
more, but neither has that declarative feel.
So I wrote glap.
Define your CLI with a struct and some tags:
type CLI struct {
Config string `glap:"config,short=c,required,help=Path to config file"`
Verbose bool `glap:"verbose,short=v,help=Enable verbose output"`
Port int `glap:"port,short=p,default=8080,help=Port to listen on"`
Output string `glap:"output,short=o,possible=json|text|yaml,default=text,help=Output format"`
}
Parse it, use it. Subcommands, env var fallback, validators, groups,
conflicts/requires, colored help, shell completions — all there.
It’s still beta, but it’s working well for me.
Read more... The blog has officially been given comment support.
While the articles themselves are markdown files in the repository and are
pre-rendered to json during the build process, the comments are stored in a
database. Authentication is provided by GitHub OAuth.
For the time being, I’m going to have it so that I need to approve comments when
they are posted. Hopefully with the GitHub OAuth requirement there won’t be too
much spam. Guess we shall find out - that was the reason I removed comment
support in the first place.
Unfortunately, I no longer have the comments from older vimtips.org articles.
Not sure what happened to them.
I guess when I turned them off I forgot to back them up.
Oh well 😉
Read more... When I was making the current version of this blog, there was a lot of
discussion on Twitter around improving load times and responsiveness on dynamic
websites, complete with lots of demonstrations of instant load times even for
things that access the database, like searches.
I decided to see what I could pull off with this little site, served from a
cheap VPS. I was able to get it to a perfect score on Lighthouse, and indeed, if
you click around on the links or use the search box, you will see that things
load pretty much instantly.

Read more... When copying code blocks to share on GitHub or other platforms, preserving
proper indentation can be tricky.
I created a NeoVim function that automatically normalizes indentation when
copying, making your shared code snippets clean and consistent.
Here’s how to set it up!
Read more... I’ve enhanced Neovim’s character navigation motions (f, F, t, T) by
integrating them with hop.nvim.
The default behavior remains unchanged when there’s only one occurrence of the
target character, or when using a count prefix (like 3f). However, when
multiple matches exist, hop.nvim automatically labels each occurrence, making it
much easier to jump directly to your desired location.
Read more... Doot is a simple, zero dependency (except Python 3, which comes installed on
most *nix operating systems) task runner.
Similar to make, but meant to be used for non-C style projects.
Read more...
There have been many plugin managers in the Vim ecosystem over the years.
I’ve used quite a number of them, but
lazy.nvim is the one I’ve enjoyed the
most, by far. It’s easy, it’s concise, there’s a ton of “hidden” little tricks,
and it allows me to easily separate my plugin configuration into separate files
(which was sort of a pain in previous plugin managers).
Most of these this information can be found in the lazy.nvim README, but without
just getting your hands dirty, it can be difficult to understand how it all
comes together. That’s where this article comes in.
Read more... Do you use distroless?
Have you tried to build a distroless docker image for your Go project, only to
see an error like /bin/foo: no such file or directory? Maybe you spent a bunch
of time trying to figure out why that file isn’t there, only to find out that it
IS there, but you’re still getting the error?
This post is for you!
Read more... I’ve been wanting to revive my blog for a while now, I’ve had a desire to write
some things about NeoVim in particular.
Of course, I decided to write it myself instead of using something like Medium.
For me, it’s an opportunity to learn something new, in this case, several new
things.
Read more... At Ender Labs, pretty much everyone but me uses a Mac.
In the last year or so, I’ve started to realize that there must be some new Mac
app or function that, via a hotkey, allows you to select an arbitrary region of
your screen, create a screenshot, and then automatically uploads it to a hosting
service.
I know this, without doing any research, because in irc/slack/gtalk I’ve
started receiving screenshots as responses to questions I ask.
These screenshots arrive fairly quickly after said question is asked.
Read more... Welp, my simple human test, where you had to type “vim” to enter comments on
this blog, finally failed to keep out the spam.
Surprisingly, it did work for 6 years before I had problems.
Read more... Due to the recent news Regarding Stallman’s heart attack, I ended up on the
wikipedia page for The Cathedral and the Bazaar, and I was reading the
“Guidelines for creating good opensource software”.
Number 3 says:
Read more... A few years ago
I posted SupaCount to the Android
market. Shortly after that, I stopped posting updates for three years.
Read more... Yesterday, after many years of using Vim, I’ve finally realized what the purpose
of Vim Tabs is. My friend asked me to post this article, because she was also
stumped by their functionality.
Read more... SupaCount 0.1.0 published to the Android Market.
I don’t suspect that it’ll be a highly successful app, being that it’s a utility
that most people won’t need.
However, being my first app on any of the mobile markets, it’ll be interesting
to see what happens.
There are, at the very least, hundreds of thousands of people (200,000+ people
bought a Motorola Droid the first week it was released) with access to the
market.
Read more... So, I got a Droid, which for me, meant that I had to start learning the
Android SDK. In my
opinion, the best way to learn something like this is to write an application.
It’s how Exaile and
JBother came to be, and now, it’s how
SupaCount came to be.
Read more... This month is my company’s national convention.
This combined with a secret project I’m working on after hours means I basically
have no time to work on Exaile until October.
So, no thanks to me, Exaile 0.3.0.1 has been released.
This one is brought to you by the other members of the team, and is a bugfix
release for 0.3.0. This includes fixing the bug that was causing 0.2.14->0.3
migration problems for most people.
Enjoy!
Read more... Yup, you probably heard it here last.
I’ve been super busy irl, and just haven’t had the time to throw up a blog entry
just yet, but 0.3.0 final is out and you can grab it from the Exaile
downloads page.
Read more...