14 hours agochore(nvim): update Corpus plug-in main master
Greg Hurrell [Fri, 24 Jun 2022 08:08:29 +0000 (10:08 +0200)] 
chore(nvim): update Corpus plug-in

* aspects/nvim/files/.config/nvim/pack/bundle/opt/corpus 1411cb6...5f57e8d (2):
  > chore: add .mailmap file
  > feat: don't sign autocommits

36 hours agochore(ssh): tweak work config
Greg Hurrell [Thu, 23 Jun 2022 10:13:37 +0000 (12:13 +0200)] 
chore(ssh): tweak work config

Add esbtools pattern to existing `Host` block. Technically, this won't
do anything because the block already contains a pattern with a matching
suffix. But just for completeness, and to match what's in the docs, may
as well make this explicit.

4 days agofeat(dotfiles): sign commits everywhere except codespaces
Greg Hurrell [Mon, 20 Jun 2022 08:44:20 +0000 (10:44 +0200)] 
feat(dotfiles): sign commits everywhere except codespaces

Follow-up to parent commit. Going to do this everywhere now just to get
those shiny green "Verified" badges in as many places as possible.

Note that because I have different keys on work and personal machines,
associated with different email addresses, this means that I'm going to
start making commits using my work address (ie. this commit is made on
my work machine, with my work key, so it needs to use my work address).

6 days agofeat(dotfiles): automatically sign commits on personal machines
Greg Hurrell [Sat, 18 Jun 2022 22:00:30 +0000 (00:00 +0200)] 
feat(dotfiles): automatically sign commits on personal machines

As described here:

I don't even have a signing key my work machine (mostly because I don't
want to go through the hoops of getting such a thing working on
Codespaces, although it would be easy enough to do it locally on my work

But recent changes in GitHub:

lead me to reconsider my long-help policy of not bothering to sign
commits, only tags. If GitHub is going to show signatures even as valid
after the corresponding keys have expired, then it seems that it is
worth doing after all.

Torvalds is well known for saying that signing commits is "stupid":

> Signing each commit is totally stupid. It just means that you automate
> it, and you make the signature worth less. It also doesn't add any
> real value, since the way the git DAG-chain of SHA1's work, you only
> ever need one signature to make all the commits reachable from that
> one be effectively covered by that one. So signing each commit is
> simply missing the point.

I think this is true in a sense, but the importance of GitHub's UI
decisions within the developer ecosystem shifts the balance. Sure,
auto-signing _does_ make each signature be "worth less", but at the same
time, I am _not_ worried about somebody else impersonating me. Even if
my commits are garbage, I am happy to attest to being the one who made
that garbage. For me, signing doesn't mean "this is good", but rather,
"this is me". GitHub's UI very much reinforces the reading that any
given commit was really made by the author.

The trade-offs in kernel development are different. For example, as it
says here:

> It is easy to create signed commits, but it is much more difficult
> to use them in Linux kernel development, since it relies on patches
> sent to the mailing list, and this workflow does not preserve PGP
> commit signatures. Furthermore, when rebasing your repository to
> match upstream, even your own PGP commit signatures will end up
> discarded. For this reason, most kernel developers don't bother
> signing their commits and will ignore signed commits in any external
> repositories that they rely upon in their work.

Even there, they go on to say:

> However, if you have your working git tree publicly available at
> some git hosting service (,,,
> or others), then the recommendation is that you sign all your git
> commits even if upstream developers do not directly benefit from this
> practice.

6 days agochore(nvim): update Command-T submodule
Greg Hurrell [Sat, 18 Jun 2022 21:49:03 +0000 (23:49 +0200)] 
chore(nvim): update Command-T submodule

* aspects/nvim/files/.config/nvim/pack/bundle/opt/command-t d554468...81dba1e (1):
  > Merge branch 'pull/390'

12 days agochore(nvim): update Ferret submodule
Greg Hurrell [Sun, 12 Jun 2022 21:19:18 +0000 (23:19 +0200)] 
chore(nvim): update Ferret submodule

Nothing in here I want/need, but I like to dog-food `HEAD` of `main`.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/ferret 35757c7...3d06430 (1):
  > feat: add `g:FerretCommandNames`

12 days agochore(aur): don't bother installing Chrome anymore
Greg Hurrell [Sun, 12 Jun 2022 15:22:29 +0000 (17:22 +0200)] 
chore(aur): don't bother installing Chrome anymore

Have had no reason/desire to use it since switching to Edge, so may as
well remove it.

13 days agochore: update encrypted files with new key
Greg Hurrell [Sat, 11 Jun 2022 18:40:07 +0000 (20:40 +0200)] 
chore: update encrypted files with new key

Companion to parent commit; this time with a new encryption subkey on
my personal machine, and for fun, I'm signing this commit with the new
signing subkey too (ie. with `-S4282ED4A05CC894D53A541C3F962DC1A1941CCC4`).

13 days agochore: re-encrypt encrypted files with new key
Greg Hurrell [Sat, 11 Jun 2022 14:42:57 +0000 (16:42 +0200)] 
chore: re-encrypt encrypted files with new key

As per:

My encryption subkeys have a 1-year expiry date on them. Each year, I
generate new encryption subkeys (I could also just edit the expiry on
the existing ones, but doing it this way gives a small forward-security
benefit). I didn't delete the old key; GPG will automatically use the
newest subkey of any given type if there are multiple keys to choose

I re-encrypted everything with `bin/git-cipher encrypt --force`. This is
with my work key, associated with my email address. A
later commit will do the same with a new personal key, associated with
my email address.

13 days agochore(homebrew): don't install Alfred any more
Greg Hurrell [Sat, 11 Jun 2022 11:26:52 +0000 (13:26 +0200)] 
chore(homebrew): don't install Alfred any more

Raycast now has dynamic placeholders in snippets:

as of version v1.36.0:

They aren't as powerful as Alfred's, yet (eg. you can only do `{date}`,
which will use the date format from your system preferences, but not
`{date:long}` etc), but I can live with that in the name of having one
less program running at startup.

2 weeks agofeat(backup): work around 1Password 404s for documents
Greg Hurrell [Tue, 7 Jun 2022 22:39:14 +0000 (00:39 +0200)] 
feat(backup): work around 1Password 404s for documents

As suggested in this thread:

> We currently have an open issue based on a similar bug report that
> will be investigated soon.
> The issue is that `op` returns 404 when trying to access items
> (including documents) that were created by someone who is no longer a
> part of the account.
> Would you be able to confirm/deny this by doing the following?
> - See if the archived document item is listed when running `op document
>   list --include-archive`
> - Try running a superfluous `op item edit documentItemID` with no
>   changes to the item (Note: this is an `item` command, not a `document`
>   command)
> If the root cause of the 404 is because the document item was created
> by someone who is no longer a part of the account, this command will
> â€œfix” the bug, ie. the document get command should no longer
> return 404s
> I look forward to hearing from you. If the above does not address the
> 404 bug, I will file a separate issue for this one, but I was not
> personally able to replicate this on my test account.

Nobody else created these documents, but the `op item edit` trick does

2 weeks agochore(karabiner): update exemptions list
Greg Hurrell [Sun, 5 Jun 2022 13:51:11 +0000 (15:51 +0200)] 
chore(karabiner): update exemptions list

Because SpaceFN layer in particular doesn't play well (jumping with
space causes forward or other movement to stop).

2 weeks agochore(backup): sync with latest versions of scripts
Greg Hurrell [Sat, 4 Jun 2022 19:41:39 +0000 (21:41 +0200)] 
chore(backup): sync with latest versions of scripts

Main two differences:

- Updated `dump-1password` to work with new version of `op` tool; note I
  also renamed the script to just `dump` (to see actual changes, do `git
  show -M20` or similar).
- `sync` script now deletes during mirror to free up space.


- We now log `--debug` output into 1Password items (seeing as I am
  seeing some troubling 404s, wanting to know what's up, although I
  expect that I'll get nothing in those cases).
- We log `parallel` job details so I can retry the 404s manually or at
  least confirm that the corresponding documents are still accessible
  inside 1Password itself.

3 weeks agofix(fig): tolerate missing crontab for user
Greg Hurrell [Fri, 3 Jun 2022 14:30:27 +0000 (16:30 +0200)] 
fix(fig): tolerate missing crontab for user

I wish I could do this without a fragile substring check, but I can't
think of any alternative (I could look on the filesystem at a specific
location, but that seems like it would be even more fragile, as it would
be potentially even more platform dependent).

3 weeks agorefactor: add `when` and `is`
Greg Hurrell [Fri, 3 Jun 2022 14:25:44 +0000 (16:25 +0200)] 
refactor: add `when` and `is`

To make conditional access more ergonomic. Basically riffing on the
ideas mentioned in 14cd8e6293ace839e9655810a90859ba0ccd084e.

3 weeks agostyle: run `yarn format`
Greg Hurrell [Fri, 3 Jun 2022 11:38:38 +0000 (13:38 +0200)] 
style: run `yarn format`

3 weeks agorefactor(aur): switch from "obs-studio-git" to "obs-studio"
Greg Hurrell [Fri, 3 Jun 2022 10:58:16 +0000 (12:58 +0200)] 
refactor(aur): switch from "obs-studio-git" to "obs-studio"

Because apparently, that is what I'm currently running without having

    :: Checking for inner conflicts...
     -> Package conflicts found:
     -> Installing obs-studio-git will remove: obs-studio
     -> package conflicts can not be resolved with noconfirm, aborting

3 weeks agorefactor(pacman): move "gnome-icon-theme" into "aur" aspect
Greg Hurrell [Fri, 3 Jun 2022 10:54:20 +0000 (12:54 +0200)] 
refactor(pacman): move "gnome-icon-theme" into "aur" aspect

Because it is in the AUR now:

    error: target not found: gnome-icon-theme


3 weeks agofeat(pacman): turn on color for `pacman` (and `yay`)
Greg Hurrell [Fri, 3 Jun 2022 10:53:44 +0000 (12:53 +0200)] 
feat(pacman): turn on color for `pacman` (and `yay`)

3 weeks agorefactor(bitcoin): extract Bitcoin stuff into separate aspect
Greg Hurrell [Fri, 3 Jun 2022 10:43:11 +0000 (12:43 +0200)] 
refactor(bitcoin): extract Bitcoin stuff into separate aspect

Given that some people use this stuff for money-related things, move it
all into a separate aspect where I can more easily cordon it off. This
stuff will only install on Arch, and only if `$USER` is "wincent". Note
the use of the default user + password, because I only want to use this
to inspect and learn about the blockchain; I have no intention of ever
using a wallet on a toy system like this one.

3 weeks agorefactor: add local `wincent` helper and use it
Greg Hurrell [Fri, 3 Jun 2022 09:35:51 +0000 (11:35 +0200)] 
refactor: add local `wincent` helper and use it

This is to handle the common case of running stuff only when it's "me"
(that is, when `$USER` is "wincent"). There is an obvious combinatorial
problem with the existing helpers because they aren't composable; ie. I
can do "if arch" or "if wincent" but not "if arch and wincent" or "if
arch or wincent". So far, that's not a problem, but it might be in the
future; the main challenge is figuring out what such an API should/would
look like, as we don't want to come up with something convoluted when
simply writing some JS would suffice:

    if (
      variable('identity') === 'wincent' &&
      attributes.platform === 'arch'

and so on... I may be other thinking things but I'm imagining something
like the following with implicit AND semantics:

    when('arch', 'wincent', () => {
      // do stuff...

and if you wanted OR semantics, you'd represent that with an array:

    when(['arch', 'debian'], 'wincent', () => {
      // do stuff...

The basic idea of the `when` helper would be to abstract over the
different kinds of checks (variable look-ups, attribute tests etc) and
just have string labels for every check that we'd care to make. So, the
above examples could effectively stand in for `if` blocks, or could be
wrangled to actually use `if` blocks like this:

    // `test` probably isn't the right word here, but something like...
    if(test(['arch', 'debian'], 'wincent')) {
      // do stuff

And we'd plug either of the above into the existing `task` API like so:

    test(['arch', 'debian'], 'wincent').task('...', () => {});
    when(['arch', 'debian'], 'wincent').task('...', () => {});

Anyway, something to think about...

3 weeks agofeat(aur): install bitcoin-core and btc-rpc-explorer
Greg Hurrell [Fri, 3 Jun 2022 09:13:27 +0000 (11:13 +0200)] 
feat(aur): install bitcoin-core and btc-rpc-explorer

For pulling down a local copy of the blockchain and playing around with
it. This is just a temporary thing, which I will move into a dedicated
aspect in a follow-up commit.

3 weeks agochore(node): don't install some global packages
Greg Hurrell [Mon, 30 May 2022 16:02:14 +0000 (18:02 +0200)] 
chore(node): don't install some global packages

Haven't used any of these for a while, but something I do do all the
time is create new codespaces, so any useless activity I can trim off of
the bootstrap process â€” like, installing stuff I don't actually use â€” is
going to be a win.

3 weeks agofeat(nvim): gracefully skip over invalid JSON
Greg Hurrell [Sun, 29 May 2022 16:23:53 +0000 (18:23 +0200)] 
feat(nvim): gracefully skip over invalid JSON

Rather than throwing an error.

3 weeks agorefactor(nvim): use more descriptive variable names
Greg Hurrell [Sun, 29 May 2022 16:18:24 +0000 (18:18 +0200)] 
refactor(nvim): use more descriptive variable names

3 weeks agofix(nvim): add "." to nvim-cmp keyword characters for handle source
Greg Hurrell [Sun, 29 May 2022 16:02:11 +0000 (18:02 +0200)] 
fix(nvim): add "." to nvim-cmp keyword characters for handle source

So I can type a "." in something like "" without interrupting

For some reason, this function is _super_ fussy about the exact format
it wants things in. I tried expressing this in a bunch of ways that I
think should be equivalent, but only this one worked (and it was about
the tenth that I tried).

Breaking it down:

    [[          Lua: opening string delimiter (ignores escapes).
    \%(         Vim: start non-capturing group.
    \k          Vim: keyword character.
    \|          Vim: alternate operator.
    \.          Vim: literal dot.
    \)          Vim: end non-capturing group.
    \+          Vim: one-or-more quantifier.
    ]]          Lua: closing string delimiter.

Note that in the `gitcommit` filetype `'iskeyword'` has the default
value of:


(48-57 correspond to 0-9; not sure what 192-255 correspond to.)

3 weeks agofix(nvim): include handle text in handle completion autocomplete
Greg Hurrell [Sun, 29 May 2022 14:15:10 +0000 (16:15 +0200)] 
fix(nvim): include handle text in handle completion autocomplete

Hadn't spotted this bug because at GitHub your handle always matches
your email address:

    @wincent     Greg Hurrell <>
    ^^^^^^^^     ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^
    Handle       Name          Email address

As such, I could type "@wincent" and it would always match the suggested
`newText`, because "wincent" is in the email address part.

However, when the handles don't match, it would not work; ie. in the
following scenario "@wincent" wouldn't work:

    @wincent     Greg Hurrell <>
    ^^^^^^^^     ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^
    Handle       Name          Email address

This is slightly weird because I can type something like
"@winHurrgreghurr" and it will match, but it generally yields the
expected result. (Note that including a dot in the input breaks the
autocompletion because it is not considered a keyword character; I may
have to override the keyword detection to fix that.)

3 weeks agofix(nvim): turn "cob" snippet into "cab"
Greg Hurrell [Sun, 29 May 2022 13:50:54 +0000 (15:50 +0200)] 
fix(nvim): turn "cob" snippet into "cab"

Because it is "Co-Authored-By", not "Co-Outhored-By"... le sigh.

3 weeks agoperf(nvim): defer gitcommit-specific setup until actually needed
Greg Hurrell [Sun, 29 May 2022 13:27:25 +0000 (15:27 +0200)] 
perf(nvim): defer gitcommit-specific setup until actually needed

3 weeks agofix(dotfiles): skip over encrypted files in codespaces
Greg Hurrell [Sun, 29 May 2022 13:03:53 +0000 (15:03 +0200)] 
fix(dotfiles): skip over encrypted files in codespaces

My intention was to have encrypted files on local machines, and simple
symlinks from my private codespaces-dotfiles repo for codespaces, but
what was actually happening was the codespaces bootstrap would run my
dotfiles install, creating a symlink pointing at nothing, and the
private repo contents would not get linked.

With this change, we won't create the useless symlink, and the
codespaces automation can create an actually useful one (ie. pointing at
the private repo) for us.

3 weeks agochore(dotfiles): store some encrypted handles
Greg Hurrell [Sun, 29 May 2022 12:33:59 +0000 (14:33 +0200)] 
chore(dotfiles): store some encrypted handles

3 weeks agofeat(nvim): hack together handle-based completion for commit messages
Greg Hurrell [Sat, 28 May 2022 22:48:00 +0000 (00:48 +0200)] 
feat(nvim): hack together handle-based completion for commit messages

I'll doubtless end up tweaking this, but for now, only in commit
messages, you can type "@" to autocomplete a GitHub handle. The idea is
you do:


and it will expand to (with `@handle` selected):

Co-Authored-By: @handle

You can type "@" or "@wincent" or "@hurrell" and it will offer
completions like:

Co-Authored-By: Greg Hurrell <>
This isn't perfect (ie. you can't type "@greg hurr" and tab complete
from there; as soon as you hit space you lose the autocompletion menu)
but is is smart enough to not pop up the menu if you are typing a @ in
the middle of an email address (eg. "" will not trigger
the pop-up). It will only trigger if "@" is preceded by space, or at the
start of a line (and to be honest, we probably don't even need the
latter although it doesn't hurt).

Depends on "~/.github-handles.json" existing on disk. Not committing
that to the repo because I don't want to leak folks' handles and names.
Format is like this:

      "wincent": "Greg Hurrell <>",

In the absence of that file, autocomplete after "cob" instead looks like

Co-Authored-By: Name <>
                    ^^^^  ^^^^ ^^^^^^^^^^
                     1     2       3

And you can tab through the "1", "2", and "3" placeholders.

3 weeks agofix(nvim): make sure blend value is propagated to `FloatBorder`
Greg Hurrell [Sat, 28 May 2022 18:03:04 +0000 (20:03 +0200)] 
fix(nvim): make sure blend value is propagated to `FloatBorder`

In the last commit I said I was going to be too lazy to investigate
this, but I couldn't resist doing a `git log --grep transparen` to
remind myself where the transparency came from, and lo and behold, there
is is...

3 weeks agofeat(nvim): improve appearance of floating windows
Greg Hurrell [Sat, 28 May 2022 17:46:46 +0000 (19:46 +0200)] 
feat(nvim): improve appearance of floating windows

Requires changes I just added to the Pinnacle submodule.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/pinnacle 20a0ecd...23c7d8d (1):
  > feat: add functions for darkening/lightening highlight groups

3 weeks agochore(nvim): update Command-T submodule
Greg Hurrell [Sat, 28 May 2022 12:23:41 +0000 (14:23 +0200)] 
chore(nvim): update Command-T submodule

Tracking 5.0.4 release plus a couple of insignificant commits on top of

* aspects/nvim/files/.config/nvim/pack/bundle/opt/command-t c797e8b...d554468 (5):
  > chore: use more specific license identifier in gemspec
  > chore: deal with gemspec deprecation warning
  > docs: update history for 5.0.4 release
  > refactor: rewrite for compatibility with Ruby versions prior to 2.3.0
  > fix: don't error if watchman dies with SIGABRT

4 weeks agofeat(nvim): add primitive first version of "Co-Authored-By:" snippet
Greg Hurrell [Thu, 26 May 2022 18:35:53 +0000 (20:35 +0200)] 
feat(nvim): add primitive first version of "Co-Authored-By:" snippet

Need to think about how to make it easy to reference frequent
collaborators here... perhaps with choice nodes, perhaps with something
altogether more crude, or more manual... The main thing is I don't want
to leak individual people's names and email addresses, if I can help it,
although it's not that hard to figure out when somebody works for
GitHub, what their GitHub handle is, and what their name is, and what
their GitHub email address is going to be... Could encrypt it, but that
presents problems when I am working on a codespace; I'll have to look
into how to conveniently get secrets over there... ðŸ¤”

5 weeks agostyle: run `yarn format`
Greg Hurrell [Thu, 19 May 2022 15:59:38 +0000 (17:59 +0200)] 
style: run `yarn format`

5 weeks agostyle: use consistent cast style
Greg Hurrell [Thu, 19 May 2022 15:18:42 +0000 (17:18 +0200)] 
style: use consistent cast style

I hate this cast, still, but I can at least make it consistent with
what's in the file elsewhere.

5 weeks agochore: update `typescript` and `@types/node`
Greg Hurrell [Thu, 19 May 2022 14:49:34 +0000 (16:49 +0200)] 
chore: update `typescript` and `@types/node`

- `typescript`: 4.6.3 â†’ 4.6.4
- `@types/node`: 17.0.25 â†’ 17.0.35

6 weeks agofeat(nvim): make "imp" snippet smarter
Greg Hurrell [Fri, 13 May 2022 11:43:20 +0000 (13:43 +0200)] 
feat(nvim): make "imp" snippet smarter

As I've been thinking about how to make "import" vs "import type"
statements easier to work with, I've had three main options in mind:

1. Use LuaSnip choice nodes to select between type and non-type modes.
   This is hard to make feel right, as I am not sure what to bind it to:
   a new key, or should I overload the already heavily-overloaded Tab

2. Make two snippets, "imp" and "impt" to embody the two variants. This
   is definitely the simplest way.

3. Do what I'm doing in this commit: make the snippet "smarter", such
   that it looks at what you type and decides what to expand to:

    | Typing...              | expands to...                      |
    | ---------------------- | ---------------------------------- |
    | import type {foo}      | import type {foo} from 'foo';      |
    | import type {foo       | import type {foo from 'foo';       |
    | import type {foo,      | import type {foo, from 'foo';      |
    | import type {foo, bar} | import type {foo, bar} from 'foo'; |
    | import foo             | import foo from 'foo';             |
    | import {foo}           | import {foo} from 'foo';           |
    | import {foo            | import {foo from 'foo';            |
    | import {foo, bar}      | import {foo, bar} from 'foo';      |

Note those incomplete entries in there are intentional, as in as you
successively type characters you see the completion build up:

    import t          â†’ import t from 't';
    import ty         â†’ import ty from 'ty';
    import typ        â†’ import typ from 'typ';
    import type       â†’ import type from 'type';
    import type {     â†’ import type { from 'type';
    import type {a    â†’ import type {a from 'a';
    import type {a,   â†’ import type {a, from 'a';

Will take this for a test drive and see if I like it.

6 weeks agofeat(nvim): make LuaSnip live update dependent nodes
Greg Hurrell [Fri, 13 May 2022 11:16:07 +0000 (13:16 +0200)] 
feat(nvim): make LuaSnip live update dependent nodes

Normally `update_events` is set to "InsertLeave", which means that
dependent snippets don't update until you, er, leave Insert mode. We can
provide instant visual feedback though by adding "TextChangedI" to this
list as well.

6 weeks agofix(codespaces): adapt to new hostname format
Greg Hurrell [Thu, 12 May 2022 12:01:19 +0000 (14:01 +0200)] 
fix(codespaces): adapt to new hostname format

I've noticed my commits getting created with the wrong email address
because the hostnames used to be of the form:


and now they are of the form:


Now, I could make this even laxer, and perhaps I should, but at least
to start with I am doing the minimal thing.

Without this change, my `hostHandle` ended up being
`codespaces-${HEX_STUFF}` instead of the desired `codespaces`. As such,
my `~/.gitconfig` would up with this in it:

            path = .gitconfig.local
            path = .gitconfig.d/codespaces-${HEX_STUFF}

instead of the desired:

            path = .gitconfig.local
            path = .gitconfig.d/codespaces

As such, the necessary include file wasn't being loaded.

6 weeks agorefactor(nvim): use LuaSnip `fmt` helper
Greg Hurrell [Thu, 12 May 2022 10:32:01 +0000 (12:32 +0200)] 
refactor(nvim): use LuaSnip `fmt` helper

To make the result of snippet expansion a bit more obvious at a glance.

Which is easier to make sense of â€” this?

    {t('context "'), i(1, 'description'), t({'" do', '  '}), i(2, '# body'), t({'', 'end'})}

or this?

      context "{}" do
    ]], {
      i(1, 'description'),
      i(2, '# body'),

6 weeks agorefactor(nvim): revert undesired bits of snippet config
Greg Hurrell [Wed, 11 May 2022 18:05:49 +0000 (20:05 +0200)] 
refactor(nvim): revert undesired bits of snippet config

As noted in the parent commit, I wanted this stuff in the repo history
just as a demo.

6 weeks agofeat(nvim): [demo] use choice nodes in "imp" snippet
Greg Hurrell [Wed, 11 May 2022 18:02:20 +0000 (20:02 +0200)] 
feat(nvim): [demo] use choice nodes in "imp" snippet

I don't actually like the ergonomics of this, so I'm going to back it
out in the next commit, but I wanted to at least show how it is done.

`<C-u>` to select from choices and thus produce "import" or "import
type". In practice, I think it feels better to just have an "impt"
snippet to expand to "import type". Failing that, I can put some smarts
in here so that if you type "type {Something}" in the `ModuleName`
position, it will do the right thing and strip off the "type {...}" over
on the RHS.

6 weeks agorefactor(nvim): use more explicit names for imported values
Greg Hurrell [Wed, 11 May 2022 18:01:33 +0000 (20:01 +0200)] 
refactor(nvim): use more explicit names for imported values

6 weeks agochore(nvim): update LuaSnip submodule
Greg Hurrell [Wed, 11 May 2022 17:56:43 +0000 (19:56 +0200)] 
chore(nvim): update LuaSnip submodule

So that I can use goodies such as `select_choice()` if I want
(admittedly, I don't think I do ðŸ¤£).

* aspects/nvim/files/.config/nvim/pack/bundle/opt/LuaSnip 89f8712...cc00863 (255):
  > fix(cleanup): don't clean the filetypes that are already lazy_loaded.
  > fix(cleanup): remove all data stored by the loaders.
  > Auto generate docs
  > fix: Set nomodeline for User-autocommand (close #417)
  > Auto generate docs
  > refactor: move functions to set/get current choices into init.lua
  > Auto generate docs
  > lua-loader: make reload work with snippet-directories (close #413).
  > Auto generate docs
  > Add doc for `autosnippet`, short misc docstring.
  > loaders: add tests.
  > loaders: Insert copy of table in extend_ft_paths.
  > Extend snipmate-syntax: `autosnippet` adds an autotriggered snippet.
  > fix: allow multiple lazy_load with snipmate loader.
  > Auto generate docs
  > Prevent overwriting register with default-text from insertNode (close #403).
  > Format with stylua
  > Auto generate docs
  > Merge pull request #399 from Weypare/ui-select-hint
  > Auto generate docs
  > Merge pull request #387 from ayoub-fork/add_declaration
  > Format with stylua
  > Auto generate docs
  > parser: don't use escaped chars for escaping others (closes #385).
  > Auto generate docs
  > Merge pull request #380 from 9999years/from-lua-docs
  > Auto generate docs
  > Merge pull request #373 from yangxing844/master
  > Format with stylua
  > Merge pull request #371 from Mike325/cleanup
  > set dummy MYVIMRC for tests.
  > Auto generate docs
  > Merge pull request #370 from Mike325/reload
  > Merge pull request #368 from TornaxO7/additional_doc_text
  > Merge pull request #366 from TornaxO7/readme_example_link_fix
  > Format with stylua
  > Auto generate docs
  > explicitly pass optional param `offset` to fs_read (close #365).
  > restore clean_invalidated to init.lua (closes #359).
  > Auto generate docs
  > Merge branch 'master' of
  > doc: reword, fix some lists.
  > tests: fix broken ones + add some for priority.
  > Prio: higher prio should be looked at first, not lower prio.
  > Don't export snippet-tables from snippet_collection.
  > Merge branch 'snip_prio'
  > Auto generate docs
  > Merge pull request #354 from itepechi/fix_resolve_symlink
  > Auto generate docs
  > Merge pull request #353 from mathjiajia/patch-1
  > remove branch-reference from workflow.
  > Format with stylua
  > Auto generate docs
  > Merge pull request #355 from xiaket/fix-bash-example
  > Auto generate docs
  > Create unique ids for all snippets, allow getting them by it.
  > add_snippets: use local `session`.
  > Auto generate docs
  > Merge pull request #352 from Xiretza/gitignore-doc-tags
  > Auto generate docs
  > lua_loader: load files in nested directory (<ft>/*.lua) (closes #349).
  > Remove vim.validate-calls for now (closes #350).
  > Auto generate docs
  > ci: fix syntax.
  > ci: run on pull_request instead of pull_request_target.
  > ci: run workflow only on push to master.
  > Auto generate docs
  > Also recommend disabling certain diagnostics for snip_env.
  > Provide `update_events` as an alias for `updateevents`.
  > Mention snip_env in readme.
  > Auto generate docs
  > Add example for lua-loader.
  > Auto generate docs
  > Breaking Change (Deprecation, actually): direct access to `ls.snippets`.
  > Show usage of `key` in `add_snippets` in Examples.
  > fix ft=nil-case of add_snippets.
  > Add tests for add_snippets.
  > Mention new lua-loader in Readme.
  > Only show actually loaded files in edit_snippet_files.
  > Auto generate docs
  > Add easy way to reload snippets added via `add_snippets`.
  > Don't show invalidated snippets in LuaSnipListAvailable.
  > Add definition for `ls`.
  > Auto generate docs
  > Prevent unnecessary refresh_notify.
  > Auto generate docs
  > Maybe _don't_ reuse vscode-lazy_loader augroup-name.
  > Add function to actually remove invalidated snippets.
  > Auto generate docs
  > Accept table like `{ft1={...}, ft2={...}}` in add_snippets.
  > Add short example for lua-loader.
  > Auto generate docs
  > Add tests for lua-loader.
  > Add doc for lua-loader.
  > open with proper permissions.
  > Change expected return of luasnippet-files.
  > Auto generate docs
  > Properly import (configurable) globals into luasnippet-files.
  > Move config effective for a session from config to session.
  > Add autocommand for reloading each loaded file.
  > Implement reloading snippets from some file+editing snippet-files.
  > Add loader for lua-snippets.
  > Correctly recognize empty ("") filetype.
  > Refactor: move functions from from_snipmate to util.
  > update section on adding snippets in readme.
  > Auto generate docs
  > Add function for removing snippets.
  > Auto generate docs
  > Make tests and examples+doc use new functions.
  > Make available use get_snippets.
  > Use add_snippets in loaders.
  > Add function add_snippets and get_snippets.
  > Merge pull request #348 from kunzaatko/patch-2
  > Merge pull request #347 from L3MON4D3/ci_try
  > Merge pull request #346 from leiserfg/update-action
  > Auto generate docs
  > doc: use - instead of * for lists.
  > Auto generate docs
  > Merge pull request #333 from leiserfg/panvimdoc
  > Auto generate docs
  > Merge pull request #331 from kunzaatko/patch-1
  > ci: run actions in PR too: two.
  > ci: run actions in PR too.
  > Auto generate docs
  > Merge pull request #332 from kunzaatko/patch-2
  > Readme: recommend `lazy_load` instead of `load`
  > Auto generate docs
  > Fix examples+partial.
  > Document changes to user_args/opts as last param.
  > Auto generate docs
  > Document updated ext_opts.
  > copy ext_opts passed to (snippet)nodes, they might be reused.
  > Remove some dead code.
  > textNode: add active highlight on enter.
  > fix: correctly pass opts to snippet.
  > Breaking Change: split ext_opts into node_ext_opts and child_ext_opts.
  > make increase_prio work multiple times.
  > Allow overriding global ext_opts in snippet(Node).
  > Add priority only to nodes that define hl_group.
  > refactor ext_opts+fix small bugs in complete+extend/make_opts_valid.
  > Also leave nested snippets when exiting.
  > Auto generate docs
  > Mention peculiarities of choiceNode in doc.
  > fix snipmate_loader.
  > Merge remote-tracking branch 'uga_rosa/extends'
  > Merge remote-tracking branch 'uga_rosa/extends'
  > Merge branch 'deterministic_load'
  > Mention luasnip-snippet-repo in README (closes #326).
  > Auto generate docs
  > Merge pull request #324 from hqurve/patch-1
  > Auto generate docs
  > Add short doc for select_choice.
  > Allow using for selecting a choice (closes #308).
  > Move no_region_check_wrap into util/util.lua.
  > refactor(cNode): implement change_choice using set_choice.
  > Merge pull request #323 from L3MON4D3/snippetProxy
  > Merge pull request #322 from davidatbu/feature/follow-symbolic-links-for-scandir
  > Fix(parser): exclude exit-point of snippet ($0) from sorting.
  > perf: make fix_node_indices perform acceptably.
  > doc: reword vscode-section slightly.
  > docs( make docs easier for newbs wanting to load vscode snippets
  > Actually _use_ inputEnter from tNode in fNode.
  > Check buffer-local instead of global values when possible (close #319).
  > Don't assume snippet is expanded at cursor when indenting.
  > fix: use neovim-api for setting the cursor. (closes #302)
  > Format with stylua
  > Merge pull request #313 from columbarius/fix-langmap-move-cursor
  > Auto generate docs
  > doc: Add short example at beginning.
  > Merge pull request #306 from leiserfg/on-the-fly
  > Merge pull request #285 from leiserfg/on-the-fly
  > Merge pull request #304 from leiserfg/fix-doc-enumerations
  > Doc: fix file extension (closes #299)
  > Merge pull request #292 from AckslD/in-snippet
  > Use different caches for loaders.
  > Run stylua+doc-generation on push.
  > Re-enable stylua for PRs only.
  > Auto generate docs
  > docs: misc improvements.
  > Improve matchNode.
  > Auto generate docs
  > Improve documentation some more.
  > Add .styluaignore.
  > Auto generate docs
  > Improve doc for dynamic- and functionNode.
  > Merge pull request #277 from uga-rosa/master
  > Merge pull request #276 from uga-rosa/master
  > Don't format statement that breaks stylua.
  > Respect different newline conventions.
  > Format with stylua
  > Add test for region_check_events.
  > fix(choiceNode): don't move the cursor two times when restoring it.
  > feat: don't chage mode unnecessarily.
  > fix: open folds by changing feed-parameters.
  > Slight readme/doc-improvements.
  > readme: Recommend setting `delete_check_events` if history is enabled.
  > typo
  > fix: move jump_active from `init.lua`-local to `session`.
  > Merge pull request #259 from Zorig/patch-1
  > Auto generate docs
  > Format with stylua
  > Doc: add section for basics.
  > Readme: add example for adding snippets via vscode/snipmate loader.
  > Merge remote-tracking branch 'rayz0rr/master'
  > Format with stylua
  > feat: Enable repeating snippets via vim-repeat (closes #225).
  > Merge branch 'better_argnodes' (PR #249)
  > Format with stylua
  > Restructure examples, add links to interesting sections to readme.
  > Format with stylua
  > tests: add tests for parser.
  > tests: add tests for dynamicNode.
  > Format with stylua
  > tests: add tests for indentation.
  > Format with stylua
  > tests: include quick check for get_static_text in most tests.
  > Format with stylua
  > tests: add for functionNode, more for restoreNode.
  > Format with stylua
  > tests: Add more for restoreNode.
  > Format with stylua
  > test: Add tests for restoreNode.
  > test: Add tests for choiceNode.
  > Format with stylua
  > fix(expansion): handle error on `input_leave`ing current_node (closes #253).
  > Format with stylua
  > fix: take `selection` into account when selecting text (closes #252).
  > test: Add tests for jumping.
  > test: Add simple integration test for expansion.
  > tests: divide up based on test-type.
  > test: properly handle out-of-date git.
  > Format with stylua
  > tests: adapt tests to use nvims' testing-framework.
  > Merge pull request #250 from uga-rosa/master
  > Format with stylua
  > fix(dynamicLambda): properly pass parent.
  > fix: remove foldexpr for .snippet-files (closes #246).
  > fix: Good comment, bad code???
  > Auto generate docs
  > Format with stylua
  > feat: function to notify other plugins that snippets were added.
  > Format with stylua
  > Merge pull request #244 from uga-rosa/fix-path
  > Auto generate docs
  > doc: touch up docs for snipmate loader, show fmt much earlier.
  > Auto generate docs
  > Format with stylua
  > Merge pull request #242 from uga-rosa/add-snipmate-loader
  > feat(filetypelist_to_set): make sure a list was passed.
  > Format with stylua
  > feat(loader): Make include and exclude ft_redirect-aware.
  > fix(filetypes): add `all` before the filetypes are redirected.
  > Format with stylua
  > fix: snippetNodes' set_mark_rgrav(), misc fixes.
  > doc: show load() and filetype_extend() earlier.

6 weeks agofix(nvim): correct type in nvim-cmp configuration
Greg Hurrell [Wed, 11 May 2022 17:55:58 +0000 (19:55 +0200)] 
fix(nvim): correct type in nvim-cmp configuration

This one went undetected because I currently don't have any choice nodes
in my snippet configuration.

7 weeks agofeat(dotfiles): add `gg tags` (ripper-tags wrapper)
Greg Hurrell [Thu, 5 May 2022 16:39:57 +0000 (18:39 +0200)] 
feat(dotfiles): add `gg tags` (ripper-tags wrapper)

7 weeks agochore: install ripper-tags
Greg Hurrell [Thu, 5 May 2022 16:34:23 +0000 (18:34 +0200)] 
chore: install ripper-tags

8 weeks agorefactor(nvim): switch to new keymap API provided by Neovim v0.7.0
Greg Hurrell [Fri, 29 Apr 2022 13:15:00 +0000 (15:15 +0200)] 
refactor(nvim): switch to new keymap API provided by Neovim v0.7.0

Was added in:

The API is extremely similar to what I had, so the changes are very

- Instead of mode-specific functions that correspond to `nmap`,
  `nnoremap` etc, the new API takes an explicit `mode` (really, `modes`)
  argument as the first parameter. So:

      wincent.vim.nmap(lhs, rhs, opts)


      vim.keymap.set('n', lhs, rhs, opts)

- Additionally, everything is `noremap` by default, unless its a
  `<Plug>` mapping, so we can basically forget about the distinction
  between `nmap` and `nnoremap` (etc) because it will do the right thing
  for us.

Finally, note that there are a couple of places where I wrapped a
function reference:


with an anonymous forwarding function:

    function() wincent.mappings.leader.cycle_numbering() end

to stop us from eagerly loading the corresponding file before the
mapping is actually used.

Lots of changes here, but all fairly simple, so hopefully I didn't break
anything inadvertently along the way.

8 weeks agorefactor(nvim): cut over to base16-nvim submodule
Greg Hurrell [Fri, 29 Apr 2022 11:54:41 +0000 (13:54 +0200)] 
refactor(nvim): cut over to base16-nvim submodule

Completes the work that I started in 63ae5ac88edac5ab8 but then forgot
about. The contents of the submodule exactly matches what was on the
filesystem prior to this commit.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/base16-nvim 0000000...b9c6f65 (2):
  > fix: adjust template to match what was actually used to generate outputs

8 weeks agorefactor(nvim): remove commented-out LSP config
Greg Hurrell [Fri, 29 Apr 2022 10:42:03 +0000 (12:42 +0200)] 
refactor(nvim): remove commented-out LSP config

I had this in there so I wouldn't forget how to emit debug output to a
log file, but I haven't needed to do that in recent memory, so now I
consider this to be just clutter.

The default config:

(obviously) already works without this config, already using both
`typescript-language-server` and `--stdio`, so let's just get rid of it.

8 weeks agochore(nvim): remove unused plugins
Greg Hurrell [Thu, 28 Apr 2022 17:03:57 +0000 (19:03 +0200)] 
chore(nvim): remove unused plugins

* aspects/nvim/files/.config/nvim/pack/bundle/opt/float-preview.nvim f9ed1c7...0000000:

* aspects/nvim/files/.config/nvim/pack/bundle/opt/ultisnips aec91ca...0000000:

8 weeks agofeat(dotfiles): teach `gg cs create` to default
Greg Hurrell [Wed, 27 Apr 2022 11:34:20 +0000 (13:34 +0200)] 
feat(dotfiles): teach `gg cs create` to default

In the absence of other arguments, get it to do what I mostly get it to

8 weeks agorefactor(dotfiles): set exports in zshenv rather than zshrc
Greg Hurrell [Wed, 27 Apr 2022 11:21:24 +0000 (13:21 +0200)] 
refactor(dotfiles): set exports in zshenv rather than zshrc

As per:

`.zshenv` is better than `.zshrc` for this kind of thing, because its
sourced for all shells, not just interactive ones.

8 weeks agochore(dotfiles): set GIT_CEILING_DIRECTORIES
Greg Hurrell [Wed, 27 Apr 2022 11:15:46 +0000 (13:15 +0200)] 
chore(dotfiles): set GIT_CEILING_DIRECTORIES

"/Users" on Darwin, "/home" everywhere else.

As recommended in:

> CVE-2022-24765
> This vulnerability affects users working on multi-user machines where
> a malicious actor could create a .git directory in a shared location
> above a victim's current working directory. On Windows, for example,
> an attacker could create C:\.git\config, which would cause all git
> invocations that occur outside of a repository to read its configured
> values.
> Since some configuration variables (such as core.fsmonitor) cause Git
> to execute arbitrary commands, this can lead to arbitrary command
> execution when working on a shared machine.
> The most effective way to protect against this vulnerability is to
> upgrade to Git v2.35.2. This version changes Git's behavior when
> looking for a top-level .git directory to stop when its directory
> traversal changes ownership from the current user. (If you wish to
> make an exception to this behavior, you can use the new multi-valued
> configuration).
> If you can't upgrade immediately, the most effective ways to reduce
> your risk are the following:
> Define the GIT_CEILING_DIRECTORIES environment variable to contain the
> parent directory of your user profile (i.e., /Users on macOS, /home on
> Linux, and C:\Users on Windows).

I'm not actually working on any multi-user machines of late, but it
doesn't hurt to be conservative about this kind of thing.

8 weeks agofix(nvim): fix broken setting
Greg Hurrell [Mon, 25 Apr 2022 11:44:41 +0000 (13:44 +0200)] 
fix(nvim): fix broken setting

The deprecation message I saw when preparing cafb03c2153ba72e4c was
wrong. Specifically, I had this config:

    documentation = { border = 'single' }

and the message generated here:


    [nvim-cmp] documentation is deprecated.
    [nvim-cmp] Please use window.documentation = "native" instead.

But that doesn't work, and causes this kind of error:

    Error executing vim.schedule lua callback: ...nvim/pack/bundle/opt/nvim-cmp/lua/cmp/view/docs_view.lua:38: bad argument
     #1 to 'min' (number expected, got nil)
    stack traceback:
            [C]: in function 'min'
            ...nvim/pack/bundle/opt/nvim-cmp/lua/cmp/view/docs_view.lua:38: in function 'open'
            ...t/.config/nvim/pack/bundle/opt/nvim-cmp/lua/cmp/view.lua:229: in function 'callback'
            ...ig/nvim/pack/bundle/opt/nvim-cmp/lua/cmp/utils/async.lua:95: in function ''
            vim/_editor.lua: in function <vim/_editor.lua:0>

This commit replaces that with the config suggested in the docs instead.

8 weeks agorefactor(nvim): remove use of private API
Greg Hurrell [Mon, 25 Apr 2022 11:35:54 +0000 (13:35 +0200)] 
refactor(nvim): remove use of private API

Doesn't seem needed any more, as of:

8 weeks agochore(nvim): update nvim-cmp submodule
Greg Hurrell [Mon, 25 Apr 2022 11:20:14 +0000 (13:20 +0200)] 
chore(nvim): update nvim-cmp submodule

Requires some tweaking to account for breaking changes:

* aspects/nvim/files/.config/nvim/pack/bundle/opt/nvim-cmp 4efecf7...433af3d (120):
  > Add docs
  > fix: Fix stylua errors and install_stylua script (#923)
  > Fix scopes comparator
  > fix: use vim.treesitter.query instead of deprecated nvim-treesitter.ts_utils (#919)
  > Improve
  > docs!: improve the instructions to follow breaking changes (#231) (#904)
  > Remove print
  > Revert #873 fixes for Fix #899
  > Revert #886 and refactor (#900)
  > Fix #893
  > Fix #894
  > Fix mapping normalization order
  > Improve cmdline preset
  > Remove all default mappings
  > Add deprecation notice
  > dev (#813)
  > make completion popup windows have bufhidden=wipe (#886)
  > Fix #875
  > Bottom up mode for custom menu (#848)
  > Change URL of FAQ in bug_report (#867)
  > Update bug_report.yml
  > Update bug_report.yml
  > Update issue template
  > Improve macro handling
  > Update bug_report.yml
  > Fix snr notation
  > Fix recursive mapping problem. Thank you tpope! Fix #858 Fix #871
  > Avoid misleading suggested configuration
  > Prefer above identifier for locality sort
  > Improve scopes sorter
  > Use `get_word` instead to sort.
  > Use cache for locality sort
  > Add locality sort (easy version)
  > Rename locals to scopes
  > Add  sort (required nvim-treesitter)
  > Improve timing
  > use only the first filetype when formatting (#857)
  > fix(misc): kill redundant redraw during incsearch (#485) (#859)
  > Update readme: add a link to a list of cmp sources (#853)
  > Try to fix col adjustment (#843)
  > Make sure config is not nil (#836)
  > Add `cmp.get_entries`. Fixes #831
  > Add doc
  > Redundent kind of lsp.MarkupKind (#819)
  > Fix entry:get_word()'s cache condition
  > Fix #801 Fix #615 Fix #798
  > Improve common string mapping instruction
  > Add docs for integarting copilot.vim
  > fmt
  > Refactor wildmenu_entries_view
  > Improve complete_common_string
  > Implement matching config. Fix #796
  > test&lint&fmt
  > Implement shell like common string completion. Fix #785
  > Support multiple filetypes Fix #786
  > Fix #789
  > Add filetype config Use view.entries == 'native' instead of experimental.native_menu
  > Refactor context module, return false (not {}) in context.in_treesitter_capture (#777)
  > Added `event_chars` property to `confirm_done event` (#782)
  > Fix: close the view if cmp.enabled = false and the user types some text (#781)
  > Decrease THROTTLE_TIME
  > Fix menu position for horizontal splitting
  > Statusline view in search mode or command line mode (#729)
  > improve
  > Improve sync API
  > Fix #757
  > Improve keymap (#768)
  > Wait for filtering completion
  > Re fix #754
  > Fix Ci
  > Fix #756
  > Fix #754
  > Fix docs to avoid "E20: Mark not set" error (#753)
  > fmt&lint
  > Improve recently used
  > Support import completion
  > evacuate -> fallback
  > Fix cmdline mapping again
  > fix cmdline mapping
  > Fix #746
  > Add comments
  > Fix #741
  > Fix keymap.t timing
  > Improve keymapping handling
  > Fix expression resolving timing
  > Solve expression manually
  > Revert expr mapping handling
  > Fix cmdline completion redraw
  > Add comments
  > Avoid expr mapping message (#738)
  > Fix #734
  > Fix expr keymap handling
  > Use utf-16 at this time
  > Fix offset encoding enum
  > Speficy offset encoding
  > Improve word creation
  > Fix #721
  > Improve tests
  > Improve keymap handling (#720)
  > Improve redraw in search mode
  > fmt/test
  > Fix #716
  > Re-fix flickering
  > Fix hlsearch Fix
  > Improve wording on keyword_length documentation (#719)
  > Default CmpItemKind%name% to CmpItemKind (#712)
  > Add `complete_done` event and improved the recently_used sorter. Fix #708
  > Fix #589
  > Fix #699 Fix #705 Fix #698
  > Fix #703
  > Correct the description of functions (#697)
  > handle `nil` value accessing `CompletionItemKind` (#690)
  > Fix #615
  > Fix #683
  > add function to check if in comment (#676)
  > Add the snippet indicator for items with Snippet kind (#677)
  > Change cmp#ready to CmpReady and document autocmds better (#669)
  > Use a default zindex of 50 for documentation (#661)
  > Fix vim.fn.complete being constantly called (#654)
  > Improve

8 weeks agochore(nvim): update to v0.7.0
Greg Hurrell [Mon, 25 Apr 2022 10:29:56 +0000 (12:29 +0200)] 
chore(nvim): update to v0.7.0

Release notes:

2 months agofeat: add "node" aspect to codespaces
Greg Hurrell [Wed, 20 Apr 2022 11:06:55 +0000 (13:06 +0200)] 
feat: add "node" aspect to codespaces

Previously I have only flirted with `typescript-language-server` on
codespaces, not wanted to conflict with the already-installed node on
there. My main concern is that some webpack build process (or similar)
might end up picking up on the newer (v18.0.0) version installed at:


and run into some divergent breaking behavior relative to the older
version at:


But there's really only one way to be sure and that's to try it, so here
we go.

2 months agorefactor: don't run "node" aspect twice on Linux... 🤦
Greg Hurrell [Wed, 20 Apr 2022 11:06:21 +0000 (13:06 +0200)] 
refactor: don't run "node" aspect twice on Linux... ðŸ¤¦

2 months agostyle: run `yarn format`
Greg Hurrell [Wed, 20 Apr 2022 10:42:19 +0000 (12:42 +0200)] 
style: run `yarn format`

2 months agofeat(fig): add support for SUDO_ASKPASS
Greg Hurrell [Wed, 20 Apr 2022 10:27:00 +0000 (12:27 +0200)] 
feat(fig): add support for SUDO_ASKPASS

We need to be able to do passwordless sudo on codespaces now, so I
figure this is the best way to provide a means for doing so (we'll just
set `SUDO_ASKPASS` to a program that emits an empty string).

Without this, we'll fail the first time we need to do sudo during the
installation, because we'll call `prompt()` (to get the password), but
`NON_INTERACTIVE` will be set. In my test run, this manifested in the
logs as a failure to `apt-get install` something:

    [error]   Failed: command `apt-get install -y bfs` failed

Alternatives considered:

- Ability to pass in password via environment variable or command line
  option (rejected because it encourages insecure practices, even if
  _we're_ only using it for the benign case of passing an empty string).

- Ability to indicate via an environment variable or command line switch
  that we don't want to provide a password (rejected because it seems
  very one-off and hackish, lacking in flexibility compared to the
  chosen solution).

In my local testing I checked to see this working with absolute paths
like `/bin/ls` and names only (ie. `ls`). Not sure whether `spawn` is
using the `PATH` under the hood (I'd hope so) or a hard-coded list, but
we'll see when we try this out for real on a codespace, I guess.

2 months agofix(shell): make shell assignment work under new codespaces config
Greg Hurrell [Wed, 20 Apr 2022 10:09:21 +0000 (12:09 +0200)] 
fix(shell): make shell assignment work under new codespaces config

Install was hanging trying to change the shell for the `vscode` user;
pass `sudo` unconditionally to make it work.

2 months agorefactor(ssh): adjust ssh config to account for codespace changes
Greg Hurrell [Wed, 20 Apr 2022 09:58:15 +0000 (11:58 +0200)] 
refactor(ssh): adjust ssh config to account for codespace changes

Basically changing from:

    RemoteForward /root/.clipper.sock /Users/wincent/.clipper.sock
    User root


    RemoteForward /home/vscode/.clipper.sock /Users/wincent/.clipper.sock
    User vscode

(Paths here aren't sensitive, so I am including the plaintext contents
of the change here for ease of access.)

2 months agofix(dotfiles): teach `gg tail` about new logfile location
Greg Hurrell [Wed, 20 Apr 2022 09:53:17 +0000 (11:53 +0200)] 
fix(dotfiles): teach `gg tail` about new logfile location


    tail: cannot open '/root/codespaces-post-start.log' for reading: Permission denied
    tail: no files remaining

now that codespace user is `vscode` instead of `root`.

2 months agostyle: run `yarn format`
Greg Hurrell [Wed, 20 Apr 2022 09:44:21 +0000 (11:44 +0200)] 
style: run `yarn format`

2 months agorefactor(codespaces): adapt to running as "vscode" instead of "root"
Greg Hurrell [Wed, 20 Apr 2022 09:42:53 +0000 (11:42 +0200)] 
refactor(codespaces): adapt to running as "vscode" instead of "root"

I am flying a bit blind here as I am preparing this on my Mac and will
then try creating a codespace with it... doubtless, there will probably
be some other follow-up changes that need to happen when I try it "for

2 months agofix(nvim): stop Vim from interpreting code as a modeline
Greg Hurrell [Wed, 20 Apr 2022 09:28:11 +0000 (11:28 +0200)] 
fix(nvim): stop Vim from interpreting code as a modeline

As noted in the comment, we can't have "vim:" in a string in code near
the beginning or end of a file like this one, otherwise when we open it
we end up seeing an error like this:

    Error detected while processing modelines:
    E518: Unknown option: //'

I seldom have reason to edit this file, but in doing a global
find-and-replace right now I saw the error, so may as well fix it.

2 months agochore: update packages
Greg Hurrell [Tue, 19 Apr 2022 21:14:32 +0000 (23:14 +0200)] 
chore: update packages

2 months agochore(nvim): update Ferret submodule
Greg Hurrell [Tue, 19 Apr 2022 21:11:48 +0000 (23:11 +0200)] 
chore(nvim): update Ferret submodule

* aspects/nvim/files/.config/nvim/pack/bundle/opt/ferret 73c3390...35757c7 (4):
  > docs: update HISTORY section
  > fix: don't E684 if quickfix listing is empty
  > fix: avoid Vimscript footgun
  > fix: avoid E42 error when deleting last quickfix entry

2 months agochore: update to NodeJS v18.0.0
Greg Hurrell [Tue, 19 Apr 2022 21:10:43 +0000 (23:10 +0200)] 
chore: update to NodeJS v18.0.0

2 months agorefactor: add `arch`/`darwin`/`debian` helpers
Greg Hurrell [Tue, 29 Mar 2022 13:50:39 +0000 (15:50 +0200)] 
refactor: add `arch`/`darwin`/`debian` helpers

As explained in the related issue, I don't know if these things belong
in the Fig core itself, so I'm adding a mechanism here for adding
arbitrary helper functions to a top-level "helpers.ts" file.

The three helpers I'm adding here allow me to DRY up the common pattern
of running specific tasks only on a specific platform. It works well for
this limited case; if we ever want an expressive way of saying "run only
on personal Darwin machines but not work Darwin machines", then we'll
need to look for something else, but at the moment there is no pressing

2 months agochore(brew): (re)move some packages
Greg Hurrell [Tue, 29 Mar 2022 13:17:04 +0000 (15:17 +0200)] 
chore(brew): (re)move some packages

- Haven't used Transmission for years: remove it.
- Have used KeyCastr at work: move it from "Personal-only" to "General".
- Don't need Scroll Reverser any more, as I went back to using a track

2 months agorefactor(nvim): install Nvim from appimage on Codespaces
Greg Hurrell [Mon, 28 Mar 2022 10:53:34 +0000 (12:53 +0200)] 
refactor(nvim): install Nvim from appimage on Codespaces

Because it is way faster than building from source.

Note that this required me to teach `fetch()` how to follow redirects.

I also made a little `debian.task` helper so that I can write:

    debian.task('do something', async () => {
      await command(...);

instead of:

    task('do something', async () => {
      if (attributes.distribution === 'debian') {
        await command(...);
      } else {
        skip('not on Debian');

I have similar patterns in a few places now, so at some point will need
to consolidate on something uniform.

3 months agochore(nvim): clean up spell file
Greg Hurrell [Fri, 25 Mar 2022 11:57:24 +0000 (12:57 +0100)] 
chore(nvim): clean up spell file

Some of these had capitalized and non-capitalized variants; we only need
the latter, because it covers both.

There was also one misspelled word in here ("reservior"), which I

3 months agochore(nvim): add "microservices" to custom dictionary
Greg Hurrell [Fri, 25 Mar 2022 11:53:11 +0000 (12:53 +0100)] 
chore(nvim): add "microservices" to custom dictionary

3 months agofix(dotfiles): work around shell initialization race condition
Greg Hurrell [Tue, 15 Mar 2022 10:11:25 +0000 (11:11 +0100)] 
fix(dotfiles): work around shell initialization race condition

This has been driving me crazy for a while now, that I would see
sometimes, but not always, this when I opened a shell:

    ln: colors.conf: File exists

despite the `-f` in `ln -sf`.

I believe the cause is that `ln -sf` first unlinks and then links in the
case of an existing entry (ie. it cannot do an atomic "overwrite"
operation). So, when you launch two shells at a time, something which
can happen pretty easily when a `.tmux` script runs and sets up multiple
splits, there is a chance that two shells will race to perform the
following steps (one possible ordering arbitrarily selected out of many
and shown here):

1. Shell "A" checks to see if "colors.conf" exists; it does.
2. Shell "B" checks to see if "colors.conf" exists; it does.
3. Shell "B" unlinks "colors.conf" and succeeds.
4. Shell "A" unlinks "colors.conf" and fails (silently).
5. Shell "A" creates new "colors.conf".
6. Shell "B" tries to create new "colors.conf" and fails (noisily).

3 months agochore(nvim): tweak tcomment mappings
Greg Hurrell [Mon, 14 Mar 2022 11:02:15 +0000 (12:02 +0100)] 
chore(nvim): tweak tcomment mappings

I have to give a session on Vim in which I want to show some useful
built-in mappings, like `gu{motion}`. So, get rid of my custom `gu` for
TComment, in favor of `gC`, to avoid the clash.

ie. with this, we now have `gc` to toggle comments, and `gC` to
explicitly turn them off.

While I'm at it, removed `tcomment_textobject_inlinecomment` setting
which is no longer mentioned in the docs, so I suspect that it does

3 months agorefactor(dotfiles): make `serve` alias work with Python 3
Greg Hurrell [Sat, 12 Mar 2022 15:36:25 +0000 (16:36 +0100)] 
refactor(dotfiles): make `serve` alias work with Python 3

Annoyingly, on Arch Linux we have `python` (Python 3) and `python3`,
while on macOS we have `python` (Python 2) and `python3`.

I think this will work on both, although I've only tested in on Arch for

3 months agochore(homebrew): add "stylua"
Greg Hurrell [Wed, 9 Mar 2022 13:17:50 +0000 (14:17 +0100)] 
chore(homebrew): add "stylua"

Code formatter for Lua:

Because I needed to use this on a PR I submitted to another project;
seems like something handy to have around though. Maybe I'll even run it
over my own dotfiles one day!

3 months agochore(nvim): add "gitcommit" filetype to indent-blankline exclusions
Greg Hurrell [Wed, 9 Mar 2022 12:03:13 +0000 (13:03 +0100)] 
chore(nvim): add "gitcommit" filetype to indent-blankline exclusions

Because these are Markdown-like, I don't want the indent markers for the
same reason as I don't want them in Markdown (ie. looking for an
uncluttered, prose-like editing experience).

3 months agochore(nvim): update indent-blankline.nvim submodule
Greg Hurrell [Wed, 9 Mar 2022 11:58:00 +0000 (12:58 +0100)] 
chore(nvim): update indent-blankline.nvim submodule

So we can get:

Which in turn allows me to get rid of some config.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/indent-blankline.nvim 2e35f7d...9915d46 (1):
  > Merge pull request #371 from lukas-reineke/develop

3 months agochore(nvim): add "markdown.corpus" filetype to indent_blankline_filetype_exclude
Greg Hurrell [Mon, 7 Mar 2022 10:56:44 +0000 (11:56 +0100)] 
chore(nvim): add "markdown.corpus" filetype to indent_blankline_filetype_exclude

Because it seems that the plug-in doesn't grok compound filetypes.
Looking at the code (in "utils.lua"), support for that should be pretty
easy to add, so I've opened a PR for it here:

3 months agoperf(nvim): avoid delays caused by use of <Nop> on LHS of mappings
Greg Hurrell [Sun, 6 Mar 2022 21:35:53 +0000 (22:35 +0100)] 
perf(nvim): avoid delays caused by use of <Nop> on LHS of mappings

It's only legit on RHS, where you can use it to map something to do
nothing. But if you want to stop something being mapped, you can't use
it on the LHS; it ends up being parsed as "<" + "n" + "o" + "p" + ">",
and interfering with other mappings that have a "<" prefix.

"Solution": Bind to another key that I can't don't type instead.

3 months agoperf(nvim): mostly fix laggy screen updates when indenting/dedenting
Greg Hurrell [Sun, 6 Mar 2022 21:19:22 +0000 (22:19 +0100)] 
perf(nvim): mostly fix laggy screen updates when indenting/dedenting

For some reason, dedenting is slow even without indent-blankline
running. The remapping of "<" in normal mode makes it snappy though.
VISUAL mode remains a dog (but like I said, it's a dog even without
indent-blankline). It seems to be a clash with a mapping with an
ambiguous prefix (<Nop>), so I'll reconfigure that in the next commit.

3 months agofix(nvim): make indent-blankline.nvim play nicely with fold markers
Greg Hurrell [Fri, 4 Mar 2022 11:31:45 +0000 (12:31 +0100)] 
fix(nvim): make indent-blankline.nvim play nicely with fold markers

Otherwise, it ends up overwriting the left side of the marker. I did
think about indenting the markers (from my `foldtext` function), but I
think this is going to look better.

3 months agofeat(nvim): add indent-blankline.nvim plugin
Greg Hurrell [Fri, 4 Mar 2022 10:18:50 +0000 (11:18 +0100)] 
feat(nvim): add indent-blankline.nvim plugin

This gives us back what we used to have with the old indentLine plugin:

I removed that plugin in a90b52b0cbfe6c296aa2e18e72bc743742ff0359
because I didn't like the conceal-related visual artifacts that you'd
see when using `TextYankPost`.

This new pluin:

is written in Lua, and uses virtual text instead of conceal-based hacks,
so it looks just fine when using `TextYankPost`.

Adding an exclusion for Markdown files, as I like those to look "clean";
it's really only program source code that I care about having this kind
of visual aid.

3 months agostyle: run Prettier
Greg Hurrell [Wed, 2 Mar 2022 12:19:17 +0000 (13:19 +0100)] 
style: run Prettier

With `yarn format`.

3 months agofeat(systemd): set up Pulseaudio null sink automatically via systemd
Greg Hurrell [Wed, 2 Mar 2022 12:05:27 +0000 (13:05 +0100)] 
feat(systemd): set up Pulseaudio null sink automatically via systemd

According to the internet, there are a million ways to do this, but
because I am currently using Pulseaudio compatibility mode in PipeWire,
this looks like the easiest (the alternatives all require explicit
PipeWire configuration, which would mean that I would have to stop
pretending that PipeWire doesn't exist).

Note that I tweaked the way handlers get run because I wanted to notify
multiple handlers as a result of a single task running. So, you can now
notify an array of handlers. Additionally, I want handlers to run in
notification order, not registration order. Added "tests" (ie. code in
the "meta" aspect) to show this working:

- We register three handlers in this order: "first", "second", "common".
- We then run two tasks that notify ["common", "first"] and ["common",
  "second"] respectively.
- Under the old system, we would run "first", "second", "common",
  because that is the registration order.
- Under the new system, we run "common", "first", "second", because that
  is the notification order.

The old implementation was the way it was because that seemed like the
simplest thing to build, but as soon as I added the ability to notify an
multiple handlers using array syntax, it became clear that it is too
easy to wind up with counter-intuitive results (you'd definitely expect
`notify: ['a', 'b']` to run `'a'` then `'b'`), hence this refactor.

Here's an excerpt from the "meta" run showing this working:

    [notice]  Task: meta | don't notify a handler
    [info]    Skipped: command `mkdir /etc`
    [notice]  Task: meta | notify a handler
    [notice]  Changed: command `true`
    [notice]  Task: meta | notify multiple handlers...
    [notice]  Changed: command `true`
    [notice]  Task: meta | ...across multiple tasks
    [notice]  Changed: command `true`
    [notice]  Task: meta | set repo permissions
    [info]    Ok: file /home/wincent/code/wincent
    [notice]  Handler: meta | handle command
    [notice]  Changed: command `true`
    [notice]  Handler: meta | handle common
    [notice]  Changed: command `true`
    [notice]  Handler: meta | handle first
    [notice]  Changed: command `true`
    [notice]  Handler: meta | handle second
    [notice]  Changed: command `true`
    [notice]  Handler: meta | should not to be called
    [info]    Skipped: handler meta | should not to be called

3 months agofix(dotfiles): remove stray `echo` from `gg`
Greg Hurrell [Tue, 1 Mar 2022 13:46:33 +0000 (14:46 +0100)] 
fix(dotfiles): remove stray `echo` from `gg`

3 months agorefactor(dotfiles): improve organization of "gg" files
Greg Hurrell [Mon, 28 Feb 2022 17:59:43 +0000 (18:59 +0100)] 
refactor(dotfiles): improve organization of "gg" files

Instead of hiding everything inside a "bin/" directory, move it into a
"lib/gg/" directory.

3 months agorefactor(dotfiles): reorder functions
Greg Hurrell [Mon, 28 Feb 2022 17:50:40 +0000 (18:50 +0100)] 
refactor(dotfiles): reorder functions

This isn't an ES module, but the pattern I've been following in those
for a while is:

1. Default export.
2. Supporting functions, ordered alphabetically.

By analogy, this commit imposes this ordering:

1. `main()` function.
2. Supporting functions, ordered alphabetically.

Because this file includes something derived from third-party code under
the MIT, and it needs a license header of its own, I put that down the
bottom (I guess I could have put it in a separate file too, and probably
will; the only reason I haven't done it previously is I didn't want to
clutter a `bin` directory with other stuff, but I think I move some
stuff around after this):

3. Third-party code.

Not mentioned:

1(b). Code that calls `main()`.

3 months agofeat(dotfiles): teach `gg` to sniff test paths more zealously
Greg Hurrell [Mon, 28 Feb 2022 10:52:47 +0000 (11:52 +0100)] 
feat(dotfiles): teach `gg` to sniff test paths more zealously

Because under Packwerk[^1], test files can live in places other than
"test/*", like, "some/path/to/package/test/*".


3 months agochore(nvim): update Command-T submodule
Greg Hurrell [Fri, 25 Feb 2022 17:20:35 +0000 (18:20 +0100)] 
chore(nvim): update Command-T submodule

No behavioral change on this side, but I wanted to unbreak CI.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/command-t 3464447...c797e8b (1):
  > test: attempt to unbreak CI

3 months agofix(nvim): update Command-T submodule
Greg Hurrell [Fri, 25 Feb 2022 17:07:42 +0000 (18:07 +0100)] 
fix(nvim): update Command-T submodule

For this fix:

* aspects/nvim/files/.config/nvim/pack/bundle/opt/command-t 6a00a2c...3464447 (1):
  > fix: teach file scanner to skip over badly encoded strings

3 months agofeat(dotfiles): add `html5tidy` command to pry
Greg Hurrell [Fri, 25 Feb 2022 10:04:39 +0000 (11:04 +0100)] 
feat(dotfiles): add `html5tidy` command to pry

Idea stolen from @mathias:

More context here:

I didn't bring across the CSS selector argument as I don't see myself
using it.

(Note that it's been a long while since I had a pryrc file, I never
committed it to my dotfiles repo, and when I did have one, I had it at
`~/.pryrc` instead of `~/.config/pry/pryrc`. As such, I also updated my
"ftdetect" patterns to look for the new filename.)

3 months agochore(dotfiles): add "github" hashed directory
Greg Hurrell [Thu, 24 Feb 2022 11:53:36 +0000 (12:53 +0100)] 
chore(dotfiles): add "github" hashed directory

This probably doesn't need to be private as it doesn't seem to be super
sensitive â€” but I'd rather err on the side of caution.