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... Read more...