]> git.wincent.com - wincent.git/log
8 months agochore(node): install latest, on Arch Linux too
Greg Hurrell [Sat, 15 Jan 2022 14:13:47 +0000 (15:13 +0100)] 
chore(node): install latest, on Arch Linux too

8 months agochore(pacman): install graphviz
Greg Hurrell [Sat, 15 Jan 2022 13:37:15 +0000 (14:37 +0100)] 
chore(pacman): install graphviz

Because I am using it in a side-project now.

8 months agochore(aur): add Edge browser
Greg Hurrell [Sat, 15 Jan 2022 09:52:41 +0000 (10:52 +0100)] 
chore(aur): add Edge browser

Although it is already flagged as out of date... But I want to be able
to use those sweet vertical tabs.

8 months agochore(apt): add `bfs` to the installation list
Greg Hurrell [Fri, 14 Jan 2022 15:09:41 +0000 (16:09 +0100)] 
chore(apt): add `bfs` to the installation list

8 months agochore(codespaces): install `sk` (skim)
Greg Hurrell [Fri, 14 Jan 2022 13:55:59 +0000 (14:55 +0100)] 
chore(codespaces): install `sk` (skim)

Would be nice if we could just `apt-get` this, but we can't.


8 months agochore(homebrew): add "graphviz"
Greg Hurrell [Fri, 14 Jan 2022 00:15:00 +0000 (01:15 +0100)] 
chore(homebrew): add "graphviz"

So I can use the `dot` executable to render pretty state machines like:

    digraph finite_state_machine {
      rankdir = LR;

      // Invisible node from which to draw start transitions to start states.
      node [style = invis]; -3;

      // Accept states.
      node [style = "", shape = doublecircle]; 0;

      // Other states.
      node [style = "", shape = circle];

      -3 -> 3;
      1 -> 0 [label = "a"];
      1 -> 1 [label = "b"];
      2 -> 0 [label = "b"];
      2 -> 2 [label = "a"];
      3 -> 1 [label = "ε"];
      3 -> 2 [label = "ε"];

As produced by:


To actually render, any of the following:

    dot -Tpng input.dot -o output.png
    dot -Tsvg input.dot -o output.svg

    cat input.dot | dot -Tpng -o output.png
    cat input.dot | dot -Tsvg -o output.svg

As per:


8 months agofeat(dotfiles): add `git find` for finding files by name
Greg Hurrell [Thu, 13 Jan 2022 12:58:08 +0000 (13:58 +0100)] 
feat(dotfiles): add `git find` for finding files by name

Basically saves me from the common task of doing:

    git ls-files | grep something

I already have a `G` suffix alias for `| grep`, which means I do:

    git ls-files G something

But this is going to be easier:

    git find something

8 months agochore(nvim): update from v0.6.0 to v0.6.1
Greg Hurrell [Wed, 12 Jan 2022 23:32:08 +0000 (00:32 +0100)] 
chore(nvim): update from v0.6.0 to v0.6.1

Release notes: https://github.com/neovim/neovim/releases/tag/v0.6.1

8 months agochore(nvim): update nvim-lspconfig
Greg Hurrell [Wed, 12 Jan 2022 23:29:18 +0000 (00:29 +0100)] 
chore(nvim): update nvim-lspconfig

Updating this because I just updated to Neovim v0.6.1, and I noticed
the headline feature of the recent nvim-lspconfig v0.1.1 release was
"Compatible with nvim 0.6.1":


* aspects/nvim/files/.config/nvim/pack/bundle/opt/nvim-lspconfig a286302...2c70b7b (140):
  > docs: update server_configurations.md skip-checks: true
  > fix(ccls): set offset_encoding to utf-32 (#1649)
  > docs: update server_configurations.md skip-checks: true
  > chore: remove sourcekit package.json (#1655)
  > feat: add asm_lsp (#1652)
  > feat: add opencl_ls (#1654)
  > docs: update server_configurations.md skip-checks: true
  > Merge pull request #1651 from teto/single-file-support-hls
  > fix: try_add_wrapper errors if passed nil for bufnr (#1648)
  > docs: update server_configurations.md skip-checks: true
  > feat: add OpenFOAM language server (#1643)
  > docs: update server_configurations.md skip-checks: true
  > docs(taplo): update installation instructions (#1640)
  > docs: update server_configurations.md skip-checks: true
  > fix(denols): simplify/update location handler (#1638)
  > docs: update server_configurations.md skip-checks: true
  > feat(ltexls): add gitcommit to filetypes (#1637)
  > docs: update server_configurations.md skip-checks: true
  > chore: remove healthcheck (#1636)
  > fix(ltex): use .bat extension on Windows (#1628)
  > docs: update server_configurations.md skip-checks: true
  > feat(leanls): add root dir as command-line arg (#1634)
  > docs: update server_configurations.md skip-checks: true
  > refactor(clangd): remove obsolete --background-index flag (#1630)
  > refactor(tests): simpler temp_dir detection (#1626)
  > ci: remove outdated brew workaround (#1625)
  > docs: update server_configurations.md skip-checks: true
  > fix(nimls): remove erroneous package_json entry (#1624)
  > docs: update server_configurations.md skip-checks: true
  > feat: add solc (#1623)
  > docs: update CONTRIBUTING.md
  > docs: update server_configurations.md skip-checks: true
  > feat: add gotmpl to gopls filetypes (#1619)
  > docs: update server_configurations.md skip-checks: true
  > fix(denols): add package_json (#1611)
  > fix: use forward delineated paths in leanlsps (#1610)
  > fix: properly handle sanitizing bufname in .launch() (#1608)
  > docs: update server_configurations.md skip-checks: true
  > feat: add verible configuration (#1605)
  > docs: update server_configurations.md skip-checks: true
  > feat(remark): add remark-language-server (#1606)
  > docs: fix URLS to example configurations (#1604)
  > fix: attach to buffer when manually launching in single file mode (#1599)
  > fix: only attempt to attach to valid bufnames (#1598)
  > fix: do not attach server to buffers with nil or missing name (#1597)
  > docs: update server_configurations.md skip-checks: true
  > fix: internally use forward delineated paths cross-platform (#1593)
  > docs: update server_configurations.md skip-checks: true
  > chore: fix blanklines in efm.lua (#1592)
  > fix: only stop/restart managed clients on :LspStop/:LspRestart (#1591)
  > docs: update server_configurations.md skip-checks: true
  > feat(efm): re-enable single file support
  > docs: update server_configurations.md skip-checks: true
  > feat: add grammarly support (#1562)
  > docs: update server_configurations.md skip-checks: true
  > Merge pull request #1583 from nathanielc/rename-flux-lsp
  > fix: remove dependency on deprecated close_preview_autocommand (#1575)
  > docs: update server_configurations.md skip-checks: true
  > fix(codeqlls): remove single_file_support (#1577)
  > docs: update server_configurations.md skip-checks: true
  > feat(emmet_ls): enable single_file_support (#1573)
  > docs: update server_configurations.md skip-checks: true
  > feat: add cssmodules_ls (#1568)
  > docs: update server_configurations.md skip-checks: true
  > fix(erlang_ls): use correct cmd on non-windows systems
  > docs: update server_configurations.md skip-checks: true
  > fix: update erlangls cmd for win32 (#1566)
  > docs: update server_configurations.md skip-checks: true
  > fix(ccls): delete invalid root directory pattern (#1565)
  > docs: update server_configurations.md skip-checks: true
  > fix(solargraph):  restore correct cmd (#1560)
  > chore: format with stylua (#1557)
  > docs: update server_configurations.md skip-checks: true
  > feat(ltex): enable single_file_support (#1556)
  > docs: update server_configurations.md skip-checks: true
  > fix(lean3ls): use utf-32 offset encoding (#1465)
  > docs: update server_configurations.md skip-checks: true
  > feat: add solidity_ls solidity language server (#1552)
  > docs: update server_configurations.md skip-checks: true
  > Merge pull request #1522 from kylo252/win-compat
  > docs: update server_configurations.md skip-checks: true
  > fix: add missing cmds for lemminx and sqls (#1551)
  > fix(spectral): add more root_dirs (#1550)
  > chore: fix missing [lspconfig] prefix for vim.notify (#1546)
  > docs: update server_configurations.md skip-checks: true
  > fix(graphql): add typescriptreact, javascriptreact filetypes (#1544)
  > docs: update server_configurations.md skip-checks: true
  > feat(quick-lint-js): enable single-file-support (#1541)
  > docs: update server_configurations.md skip-checks: true
  > docs(lua): simplify cmd documentation (#1539)
  > docs: update server_configurations.md skip-checks: true
  > docs(lua): clarify sumneko `cmd` setting
  > docs: update server_configurations.md skip-checks: true
  > feat: add quick-lint-js (#1533)
  > docs: update server_configurations.md skip-checks: true
  > docs: update lua-language-server instructions (#1537)
  > docs: add selene to the list of required linters (#1536)
  > docs: replace mention of deprecated APIs (#1532)
  > docs: update server_configurations.md skip-checks: true
  > chore!: remove compat shims for pre-0.5.1 handlers (#1530)
  > fix(eslint): openDoc function on Linux (#1529)
  > docs: update server_configurations.md skip-checks: true
  > docs(jsonls): remove formatting workaround
  > docs: update server_configurations.md skip-checks: true
  > fix(jsonls): add windows executable support (#1521)
  > docs: update minimum requirements to nvim-0.6
  > docs: update server_configurations.md skip-checks: true
  > fix(fsautocomplete): changed cmd to executable of newest version (#1518)
  > docs: update server_configurations.md skip-checks: true
  > fix(help): workaround plugin/users overwritting tags (#1512)
  > chore: use client.request instead of buf_request (#1503)
  > docs: update server_configurations.md skip-checks: true
  > feat: add golangci-lint-languageserver support (#1511)
  > docs: update server_configurations.md skip-checks: true
  > fix(eslint): default to location mode for workingDirectory (#1506)
  > docs: update server_configurations.md skip-checks: true
  > fix(tailwindcss): add default classAttributes (#1505)
  > docs: update server_configurations.md skip-checks: true
  > fix(yamlls): add yaml.docker-compose to filetypes (#1501)
  > chore: prefix all vim.notify message with [lspconfig] (#1496)
  > docs: update adding a new server example (#1499)
  > docs: update server_configurations.md skip-checks: true
  > docs: make |lspconfig-server-configurations| jump to the markdown file (#1497)
  > docs: update server_configurations.md skip-checks: true
  > docs(bicep): document required filetype autocommand (#1493)
  > fix(eslint): match opts to sync request (#1492)
  > docs: update server_configurations.md skip-checks: true
  > fix: single_file_mode should be single_file_support (#1489)
  > docs: update server_configurations.md skip-checks: true
  > docs: fix docgen (#1486)
  > docs: update server_configurations.md skip-checks: true
  > Merge pull request #1479 from mjlbach/accessible-configs
  > fix: only set cmd_cwd if filepath exists (#1485)
  > docs: update server_configurations.md skip-checks: true
  > fix: set correct cwd config key when unset (#1483)
  > docs: update server_configurations.md skip-checks: true
  > chore: remove executable check (#1477)
  > docs: update server_configurations.md skip-checks: true
  > fix(leanls): make opening nonexisting directories work (#1474)
  > docs: fix typo in installation command for ocamlls (#1475)

8 months agochore(nvim): add "filesystems" to custom dictionary
Greg Hurrell [Fri, 7 Jan 2022 16:11:01 +0000 (17:11 +0100)] 
chore(nvim): add "filesystems" to custom dictionary

8 months agofeat(nvim): make some snippets less annoying
Greg Hurrell [Fri, 7 Jan 2022 16:06:44 +0000 (17:06 +0100)] 
feat(nvim): make some snippets less annoying

Make "req" and "imp" snippets keep you in insert mode so that when you
land here:

    import Something from "Something";

you can just type "./" without having to hit Escape/Ctrl-[ first. In
practice, I use local imports far more often than named (npm package)
imports, so this makes the common case a bit more pleasant. I could
potentially add some "smarts" in here one day to try and insert "./"
automatically only when appropriate, but I can't be bothered right now.

The other annoying thing I am tweaking here is making some snippet
shortcuts longer. As we have fuzzy autocompletion, I can still get
"describe" from "desc" (or less), but this just lets me go on typing if
I want and still complete whenever I want. In tandem with the parent
commit, this makes completing common snippets much more comfortable.

8 months agochore(nvim): tweak ordering of nvim-cmp sources
Greg Hurrell [Fri, 7 Jan 2022 16:05:14 +0000 (17:05 +0100)] 
chore(nvim): tweak ordering of nvim-cmp sources

In use, I've been finding it annoying that snippets don't rank highly
enough, so I want to see how things feel with them at the top. At the
same time, I want to boost the ranking of LSP-powered completions,
because they should in theory be better than "dumb" completions based on

8 months agochore(nvim): update terminus submodule
Greg Hurrell [Tue, 28 Dec 2021 12:29:42 +0000 (13:29 +0100)] 
chore(nvim): update terminus submodule

* aspects/nvim/files/.config/nvim/pack/bundle/opt/terminus e8bc19c...12b07e3 (2):
  > refactor: reorder expressions
  > Merge branch 'pull/50'

9 months agofeat(homebrew): install Frum (Ruby version manager)
Greg Hurrell [Sat, 25 Dec 2021 20:43:21 +0000 (21:43 +0100)] 
feat(homebrew): install Frum (Ruby version manager)

Because I need to update the wikitext gem.




    eval "$(frum init)"
    frum install 3.1.0
    frum local 3.1.0

or something like that.

9 months agochore(nvim): remove nvim-cmp's cmp-cmdline module
Greg Hurrell [Thu, 23 Dec 2021 13:00:03 +0000 (14:00 +0100)] 
chore(nvim): remove nvim-cmp's cmp-cmdline module

Because this issue:


(inability to tab-expand `:e %<tab>`) is driving me up the wall.

9 months agofeat(nvim): add `import` snippet
Greg Hurrell [Wed, 22 Dec 2021 16:41:53 +0000 (17:41 +0100)] 
feat(nvim): add `import` snippet

Somewhat similar to what I used to have under UltiSnips (not dealing
with type-only imports yet though):

    snippet "imp(o|or|ort)?" "import" !br
    import ${1:Module} from '${2}$1${3}';

    snippet "type" "import type" !br
    import type {${1:Type}} from '${2}$1${3}';

9 months agofix(nvim): remove errant quote from `desc` snippet
Greg Hurrell [Sat, 18 Dec 2021 12:00:13 +0000 (13:00 +0100)] 
fix(nvim): remove errant quote from `desc` snippet

9 months agofix(nvim): use correct syntax in `it` snippet
Greg Hurrell [Sat, 18 Dec 2021 11:59:12 +0000 (12:59 +0100)] 
fix(nvim): use correct syntax in `it` snippet

9 months agofeat(nvim): add `desc` and `it` snippets for the "jest" filetype
Greg Hurrell [Sat, 18 Dec 2021 11:57:01 +0000 (12:57 +0100)] 
feat(nvim): add `desc` and `it` snippets for the "jest" filetype

I never ported all of my UltiSnips snippets to Luasnip, so I just bring
things across one by one when I get annoyed about not having them.

9 months agofix(nvim): fix floating window borders
Greg Hurrell [Fri, 17 Dec 2021 15:41:07 +0000 (16:41 +0100)] 
fix(nvim): fix floating window borders

On this machine, due to font differences (I presume), my terminal wasn't
rendering the corners correctly, so steal the characters used here


9 months agochore(nvim): remove stale lua-language-server instructions
Greg Hurrell [Wed, 15 Dec 2021 21:57:49 +0000 (22:57 +0100)] 
chore(nvim): remove stale lua-language-server instructions

Seeing as lua-language-server regularly pegs the CPU for me, and it's
been a while since I built it, going to see whether a new version fixes
it. This change from November 2020:


looks promising, and I think my build predates that... Fingers crossed.

Built using:

    cd $path_to_clone_of_lua_language_server_repo
    git pull
    git submodule update --recursive
    cd 3rd/luamake
    cd ../..
    ./3rd/luamake/luamake rebuild

Then back out unsolicited changes to `~/.zshrc` 🤦 and update path in my
config to the built executable (the binary in the `macOS/` subdirectory
is there, but won't boot, failing to load "bee.so" which is right next
to it).

9 months agofix(nvim): patch up LSP diagnostics
Greg Hurrell [Wed, 15 Dec 2021 21:46:16 +0000 (22:46 +0100)] 
fix(nvim): patch up LSP diagnostics

Catching up with breaking name changes.

9 months agorefactor(nvim): replace broken lspsaga
Greg Hurrell [Wed, 15 Dec 2021 21:27:07 +0000 (22:27 +0100)] 
refactor(nvim): replace broken lspsaga

Broken since Neovim 0.6.0, more or less, and unmaintained:


This is a pretty active fork that isn't broken:


but you can easily achieve most of what I want with some customization
from the wiki:


so, I'm just going to use that instead. For now, starting with borders,
which I can't live without. Later will do some more tweaks to get me
back to parity with what I had formerly.

9 months agofix(nvim): avoid annoying unwanted jumps in LuaSnip
Greg Hurrell [Wed, 15 Dec 2021 12:28:03 +0000 (13:28 +0100)] 
fix(nvim): avoid annoying unwanted jumps in LuaSnip

This one has been driving me up the wall. If you type something like


that expands to:


and if later on you type tab somewhere else, like here, where you want
an indent:

    function foo() {

then LuaSnip will jump back inside the `console.log()`.

I thought that setting `history = false` in the config would stop this,
because the docs say:

> - `history`: If true, Snippets that were exited can still be jumped back into.

and it seems I wasn't alone in thinking this:


That issue lead to this PR:


which adds an `expand_or_locally_jumpable()` function.

So, this commit pulls that in. Two things to note:

(1) The LuaSnip update changes the API in a way that produced these errors
    trying to complete a snippet:

        E5108: Error executing lua ...vim/pack/bundle/opt/LuaSnip/lua/luasnip/util/environ.lua:16:
        attempt to index local 'pos' (a nil value)

    I updated nvim-cmp to see if that would fix it (it didn't), before
    finding the actual remedy, which was updating cmp_luasnip.

(2) `expand_or_locally_jumpable()` only works for forward jumps, not
    backwards ones like `jumpable(-1)`, so I grabbed the `in_snippet()`
    function (private to LuaSnip) and adapted it so I could use it
    for the backwards case as well. I am not actually sure if this is
    required, strictly speaking, but it doesn't seem to do any harm
    either, so I'm keeping it.

Submodule updates listed below:

* aspects/nvim/files/.config/nvim/pack/bundle/opt/LuaSnip b7d520e...89f8712 (59):
  > fix: Prevent error when snip is deleted and updated from same event.
  > Format with stylua
  > perf: Optimize out unnecessary calls to pos_begin_end_raw.
  > perf: use pos_begin_raw for comparing positions.
  > perf: improve primitive algorithm for adjusting marks inside snippet.
  > Auto generate docs
  > Format with stylua
  > fix(docstrings): only wrap env-value in table if it is usually in one.
  > doc: mention `snippet.trigger`.
  > doc: specify that the immediate parent is passed to the d/fNode-function.
  > BREAKING CHANGE: don't pass env to snippetNodes.
  > fix: handle end-mark being one line below after full delete.
  > fix: Perform snip-delete-check before updating.
  > Format with stylua
  > fix: Unlink snippet on out-of-range-errors.
  > fix: make check for node vs table a bit better.
  > Auto generate docs
  > Format with stylua
  > Merge pull request #226 from ner0-m/feat/fs-for-language-injection
  > Auto generate docs
  > doc: use simple ordered list instead of indexing an unordered one.
  > doc: clarify expected position-format.
  > Auto generate docs
  > docs: update lsp_expand-doc.
  > Auto generate docs
  > Format with stylua
  > fix: default captures to empty table.
  > feat: allow expanding at any position.
  > Merge pull request #236 from L3MON4D3/refactor_expand
  > docs: also update link to snippets-table in readme.
  > docs: recommend skipping auxiliary functions.
  > fix: fix+improve update-behaviour of restore/dynamic/snippetNode.
  > Auto generate docs
  > perf: don't copy restoreNode-snippet in put_initial. Closes #234.
  > Auto generate docs
  > feat(choice): Allow passing a table of nodes as choice.
  > Auto generate docs
  > docs: misc fixes, rewords, corrections.
  > Merge pull request #233 from L3MON4D3/restore_position
  > fix(dyn): prevent querying cleared extmarks.
  > Auto generate docs
  > docs: whoops.
  > Merge pull request #228 from L3MON4D3/restoreNode
  > Auto generate docs
  > Merge pull request #229 from tiagovla/fix_typo
  > fix(dynamicNode): Correctly init subsnips for static text/docstring.
  > Auto generate docs
  > doc: recommend `lambda` in text on `functionNode`.
  > Auto generate docs
  > doc(luasnip.extras): add it.
  > Format with stylua
  > fix(fmt): prevent the same node being reused (close #221).
  > Merge pull request #216 from rhcher/master
  > Auto generate docs
  > Merge pull request #215 from dvdsk/master
  > Format with stylua
  > Format with stylua
  > fix(select): if select ends on a multibyte-char, it's cut off (close #214).
  > fix(insertNode): node ending with \n leads to wrong selection.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/cmp_luasnip 16832bb...7bd2612 (2):
  > fix(cmp_luasnip): remove unused parameters
  > Merge pull request #29 from L3MON4D3/master

* aspects/nvim/files/.config/nvim/pack/bundle/opt/nvim-cmp 669803b...4efecf7 (103):
  > Correct vim doc reference for getcmdtype() (#650)
  > Fix #648
  > Fix #582
  > Fix #603
  > Fix #640
  > Fix #646 Resolve all properties by default
  > Fix #637
  > Update issue template
  > Update issue template
  > Update issue template
  > Fix rendering of wide characters in the custom completion window (#641)
  > docs: clarify behavior of `select` in confirm mapping (#621)
  >  Readme: improve readability of lua code block in setup section (#622)
  > Fix #610
  > feat: add issue template (#604)
  > Fix docs
  > fmt
  > Implement #349
  > Fix #595
  > fmt
  > Use vim.lsp.util.apply_text_edits instead of vim-vital-vs
  > fix: default highlights overriding existing highlights (#591)
  > Fix duplicate doc tags (#586)
  > Implement kind highlights (#584)
  > Fix multibyte chars
  > Fire change events when selecting different items with native menu completion (#514)
  > Add documents (#460)
  > Fix README.md
  > Improve incomplete handling
  > Remove misc.readonly Fix #571
  > Fix #321
  > Allow to take the full SourceConfig from source API (#561)
  > Normalize keymapping configuration Fix #475 Fix #570 Fix #533
  > Fix #567
  > Fix #563
  > Fix #559
  > Improve first display
  > Fix possible nil argument to string.byte (#550)
  > Add some wiki info in README (#549)
  > Rename type as cmdtype
  > Improve completion reset handling
  > Fix document about scrolling docs backwards (#538)
  > Refactor get_active_entry and core.filter (#535)
  > Add reason to complete function (#529)
  > Fix cmdline screen cursor
  > Don't feed <C-f> manually but check auto-indentation
  > Fix #526
  > Fix #520
  > cosmetic changes
  > fmt
  > Add cmdline expansion test
  > Add tests
  > Fix #516 (#517)
  > Fix #513
  > Fixed typo in README.md (#515)
  > Link to menu appearance page in wiki (#493)
  > Fix cmdline confirmation bug
  > Fix #504
  > Handle block visual/select modes, refactor mode handling (#498)
  > Remove unused methods
  > Improve regex handling
  > Handle InsertEnter and CmdlineEnter seperately
  > Remove triggering insert enter event
  > Improve avoiding InsertEnter's invalid mode detection
  > Fixes the bug that the `cmp.close` does not close the menu when using native_menu.
  > Use key sequence to avoid the invalid mode detection
  > Add textwidth tests
  > Re-fix autoindent with tests
  > Fix #494
  > Fix #473
  > strict mapping handling
  > Fix tests
  > Fix #480
  > Fix #481
  > Add linebreak option to cmp documentation window (#486)
  > Fix cmdline confirmation
  > Improve async.step
  > Save undopoint
  > Use apply_text_edits to avoid making the unexpected indentation by '<CR>'
  > fix(ghost_text): generate it using chars instead of bytes (#471)
  > Escape <Bar> when setting indentkeys (#474)
  > Fix expansion bug
  > Allow the callback invoking multiple times if it's the recent one
  > Support session
  > Fix native menu bug
  > tmp fix for serveral bugs
  > Fix #421
  > Fix #463
  > Fix and improve README.md (#462)
  > Fix
  > Support isIncomplete only response
  > Fix #458
  > Fix #449
  > Fix #456
  > Organize keymap implementation (#454)
  > Fix keymap bug
  > Fix #443
  > Rewrite keymap.lua (#452)
  > Fix #436
  > Fix native menu not respecting cmp.PreselectMode.None sometimes (#447)
  > misc.merge: ensure that `misc.none` is never returned (#441)
  > README: clarify that a snippet plugin is required (#439)
  > Add mappings for visual mode (#438)

9 months agochore(node): update Yarn version
Greg Hurrell [Fri, 10 Dec 2021 23:54:18 +0000 (00:54 +0100)] 
chore(node): update Yarn version


    success Saved lockfile.
    warning Your current version of Yarn is out of date. The latest version is "1.22.15", while you're on "1.22.4".
    info To upgrade, run the following command:
    $ curl --compressed -o- -L https://yarnpkg.com/install.sh | bash

when running `yarn`. Evidently, I'm not following those update

9 months agofeat(dotfiles): add a Raycast script for searching the org chart
Greg Hurrell [Fri, 10 Dec 2021 08:55:08 +0000 (09:55 +0100)] 
feat(dotfiles): add a Raycast script for searching the org chart

9 months agochore(homebrew): add pngcrush
Greg Hurrell [Wed, 8 Dec 2021 18:42:58 +0000 (19:42 +0100)] 
chore(homebrew): add pngcrush

For stuff like this:


After installing this, I came here to add it to the Brewfile and saw
that I used optipng in the past. Not sure which is better. Seems they
are equivalent, but pngcrush is slower...


9 months agochore(nvim): add "whorling" to custom dictionary
Greg Hurrell [Sat, 4 Dec 2021 00:30:56 +0000 (01:30 +0100)] 
chore(nvim): add "whorling" to custom dictionary

9 months agochore(dotfiles): export HOMEBREW_NO_AUTO_UPDATE=1
Greg Hurrell [Sat, 4 Dec 2021 00:29:07 +0000 (01:29 +0100)] 
chore(dotfiles): export HOMEBREW_NO_AUTO_UPDATE=1

Because apparently, it will cure my ails:


9 months agochore(nvim): update to Neovim v0.6.0 on Codespaces
Greg Hurrell [Fri, 3 Dec 2021 11:07:33 +0000 (12:07 +0100)] 
chore(nvim): update to Neovim v0.6.0 on Codespaces

9 months agofix(nvim): update vim-fugitive submodule
Greg Hurrell [Fri, 3 Dec 2021 11:03:16 +0000 (12:03 +0100)] 
fix(nvim): update vim-fugitive submodule

Because under Neovim v0.6.0 this was causing a spew of errors of the

    E1208: -complete used without -nargs

during start-up. Updating the plug-in makes the errors go away.

It's been a long time since I updated this plug-in, so here are the
noteworthy changes (seeing as there is no explicit changelog, nor
releases on GitHub, linking to the tags):

- https://github.com/tpope/vim-fugitive/releases/tag/v3.4
- https://github.com/tpope/vim-fugitive/releases/tag/v3.5
- https://github.com/tpope/vim-fugitive/releases/tag/v3.6

* aspects/nvim/files/.config/nvim/pack/bundle/opt/vim-fugitive b498607...2064312 (260):
  > Don't reject invalid Git dir when detecting common dir
  > Fix blame from stage buffer
  > Disable diff.suppressBlankEmpty for summary window diff
  > Fix gf error in commit message outside of repository
  > fugitive.vim 3.6
  > Try to avoid trailing newline blame issues
  > Remove dead code
  > Support copies with :Gclog --follow
  > Remove q map stubs
  > Use dummy events to prevent "No matching autocommands" message
  > Fix command execution on Vim 7
  > Fix readfile() usage
  > Fix typo
  > fugitive.vim 3.5
  > Provide FugitiveRemote()
  > Don't scroll :Git! window for paginated commands
  > Fix race condition on nvim 0.4
  > Revert "Use :redrawstatus rather than &ro = &ro"
  > Use :redrawstatus rather than &ro = &ro
  > Support blame maps without filetype plugin on
  > Provide for retrieving parsed remote URL
  > Move to beginning of line in "(" map
  > Guard against parallel status reload
  > Further decouple #BufReadStatus() from v:cmdbang
  > Ignore v:cmdbang when not in autocommand
  > Remove leading slash when parsing scpremote:/~user
  > Help file formatting fix
  > Don't show diff on root commits
  > Adjust encapsulation of escaped completion handling
  > Allow escaped characters in tab complete
  > Improve parallelism of status buffer with earlier diff
  > Ensure jobstart on_exit runs when waiting
  > Make status buffer diff retrieval asynchronous
  > Collapse all status buffer diffs on :edit!
  > Support reload on custom chmod and unlink events
  > Restore laziness of status reload after write
  > Minor performance improvement to global map definition
  > Show overflow sections as 255+ not 256
  > Fix default remote in fugitive#RemoteUrl
  > Add experimental behavior for X on commit line
  > Fix :GBrowse - destination
  > Fix wrong variable name in fugitive#RemoteUrl()
  > Extract helper to parse fugitive#RemoteUrl() arguments
  > Fix resolution of scp style URLs
  > Normalize path when parsing remote URL
  > Avoid repeat config retrieval in :GBrowse
  > Separate remote resolution from URL reassembly
  > Invert flag for lazy initialization
  > Try to avoid interference by $GIT_DIR and $GIT_WORK_TREE
  > Respect 'splitright' instead of 'splitbelow' for :vertical
  > Support jump to diff from :Git log --name-status
  > Fix typo
  > Make RemoteUrl() option parsing a bit less convoluted
  > Fix check for wrong executable
  > Fix FugitiveRemoteUrl('origin', FugitiveConfig())
  > Override GPG_TTY to prevent terminal garbling
  > Extract helper to determine PTY availability
  > Use --filters in cat-file whenever possible
  > Force current buffer number for FugitiveStatusline()
  > Tab complete :Git ++options and --options
  > Support lazy initialization in statusline indicator
  > Eliminate internal use of FugitiveCommonDir()
  > Fix inconsistency when scrolling :Git! preview window
  > Standardize <mods> handling for quickfix commands
  > Fix typo in error message
  > Use new tab for --patch maps
  > Drop unused args parameter from :Gcommand implementations
  > Make initialization lazy
  > Provide User FugitiveEditor event
  > Avoid error when mapcheck() and <unique> semantics differ
  > Fix pedit map in :Git -p grep
  > Add >/ and >:/ as work-tree version expansions
  > fugitive.vim 3.4
  > Provide FugitiveDidChange()
  > Enforce 'autowrite' in all subcommands
  > Remove :Gcgrep
  > Fix :Git difftool on Vim 7
  > Fix :Ggrep on Vim 7
  > Change :Gstatus to error stub
  > Document ++curwin
  > Support :Git ++curwin blame %
  > Change :0,1Git blame to split by default
  > Expand ~~ as cwd
  > Tab complete !bufnr
  > Improve fallback go-to-file in temp buffers
  > Update :Gpush FAQ entry to mention :Git!
  > Pre-expand argument when completing Git objects
  > Return full ref name on FugitiveHead(-1)
  > Fix check for maps disabled by dictionary
  > Fix check for -addr=other on nvim
  > Expand :GMove and :GRename arguments
  > Document :Ggrep -q
  > Expand :(literal)./ arguments to use cwd
  > Clean up job dictionary entry after nvim job completes
  > Add stdin support to FugitiveExecute()
  > Further tweak to direct :Git blame count handling
  > Replace #ReloadStatus() with #DidChange()
  > Fix direct blame maps in short files
  > Make "q" error maps consistent
  > Try :Git for default dispatch in status buffer
  > Accept a dictionary in fugitive#RemoteHttpHeaders()
  > Better HTTP redirect detection
  > Fix error on :GBrowse remote/branch@remote
  > Extend :Gdiffsplit zero argument positioning to ">" arguments
  > Don't append another filename when expanding ">commit:file"
  > Favor ssh:// URL over scp style when possible
  > Limit size based :Gdiffsplit orientation to no argument variant
  > Force :leftabove for :Gdiffsplit! with argument
  > Respect 'splitbelow' on :Gdiffsplit with argument
  > Provide :Gdiffsplit ++novertical
  > Fix edge case in s:Map() short circuiting
  > Provide User FugitivePager autocommand event
  > Use <cfile> not <cword> for temp file "." map
  > Support jump to commit in :Git log --graph
  > Provide slightly less bad "." map in temp buffers
  > Map "(" and ")" in blame buffers
  > Provide utility function to expire cached config
  > Tweak Vim 7 more prompt behavior
  > Disable -- More -- prompt on push/fetch
  > Directly echo :Git output for a few trivial commands on Vim 7
  > Work around hostile ftplugin/man.vim
  > Trigger FugitiveChanged after writing stage buffer
  > Don't show "Bare" status for worktrees attached to bare repos
  > Add deprecation warning to FugitivePrepare()
  > Change deprecated Git wrappers to error stubs
  > Provide FugitiveGitVersion()
  > Provide FugitiveExecute()
  > Make FugitiveConfig(callback) asynchronous
  > Fix :Git merge
  > Adjust User events for fugitive:// buffers
  > Support :Git ++curwin
  > Move config --list parsing into Execute callback
  > Focus quickfix list after :Ggrep! -q
  > Don't match git grep "BUG:" lines as filename
  > Default :Git grep to pager, not quickfix
  > Support :Ggrep --no-index/--no-cached
  > Better :Ggrep quickfix patterns
  > Expand ~ and $VAR in :Git arguments
  > Fix line number inclusion in :Ggrep
  > Handle jump to file in :Git -p grep without line number
  > Fix command preparation bug
  > Better support for --no-literal-pathspecs
  > Drop Vim requirement to 7.3
  > Improve public API argument order flexibility
  > Do what I mean for :Git -c alias.foo=blame foo
  > Distinguish between uses of Git dir
  > Allow FugitiveRemoteUrl(name, ':noresolve')
  > Fix config functions with config dictionary as first argument
  > Fix false positive "unknown Git error"
  > Fix FugitiveRemoteUrl()
  > Remove unused keys from :GBrowse options
  > Include remote_name in :GBrowse options
  > Rearrange fugitive#ResolveRemote()
  > Add alternatives to :GBrowse ++remote=
  > Don't accept 0 to refer to alternate buffer
  > Fix duplicate help tag
  > Fix U in status window
  > Update documentation for :Git
  > Use :Git --no-pager in Vim 7 to directly echo output
  > Move FugitivePath() away from documented functions
  > Add unofficial raw argument list support to fugitive#Execute()
  > Improve tab completion for :Git push
  > Introduce FugitiveShellCommand() to replace FugitivePrepare()
  > Fix :Ggrep argument parsing off-by-one error
  > Eliminate speck of repetition around :Git --no-pager
  > Disable 'more' on :Git --no-pager
  > Don't set $COLUMNS on legacy :! implementation
  > Fix pseudo-job execution on Vim 7
  > Add -z to :Ggrep quickfix opening flags
  > Use :Ggrep -q to eschew output in favor of quickfix window
  > Avoid more possibilities for :Ggrep more prompt
  > Avoid line echo during jump to file in :Git -p grep
  > Avoid :Ggrep interrupt leaving behind result without file
  > Avoid -- More -- prompt during :Ggrep
  > Stream to preview window on `:Git! command`
  > Fix constructing Git shell commands
  > Use jobs for :Git --paginate
  > Tweak check for Git in PATH
  > Add special case error for failure to find Git in PATH
  > Add optional callback to FugitiveConfig()
  > Accept Git dir as first argument to FugitiveRemoteUrl()
  > Use jobs for :Ggrep
  > Use jobs for quickfix commands
  > Standardize on 'git_dir' as dictionary key
  > Fix :Gedit .git with nonstandard .git dir
  > Pass --git-dir= alongside -C for nontrivial cases
  > Avoid unnecessary -C when querying Git config
  > Include cwd in fugitive#Execute() result
  > Include --no-literal-pathspecs in FugitiveResult().flags
  > Respect environment variable overrides when opening terminal
  > Improve check for job environment variable support
  > Accept buffer numbers and dictionaries in FugitiveDetect()
  > Support jump to file under cursor in :Git -p grep
  > Improve git grep argument handling
  > Don't match :0: as line number in :Ggrep
  > Deprecate CTRL-N and CTRL-P
  > Don't override user maps with removal notices
  > Use jobs for all Git execution helpers
  > Avoid shell with nvim terminal
  > Override GIT_INDEX_FILE when belonging to wrong repository
  > Use jobs for FileReadCmd
  > Silently ignore trees in s:BlobTemp()
  > Use jobs for calls to git update-index
  > Use jobs to capture stdout to file
  > Fix command preparation when no arguments, only flags
  > Make prepare functions idempotent
  > Tweak documentation for FugitiveResult()
  > Convert exec path to Vim path before accessing via filesystem
  > Rename #Prepare to #ShellCommand
  > Separate out flags when parsing Git arguments
  > Fix fugitive#writefile() when staging new file
  > Use Git paths when passing temp files to hash-object
  > Fix FugitiveIsGitDir()
  > Fix FugitiveHead() for certain arities
  > Improve flexibility of public API argument order
  > Generalize FugitiveIsGitDir() to check for buffer Git dir
  > Fix usage of index()
  > Apply insteadOf to raw remote URLs in addition to remote names
  > Homogenize calls to private exec helpers
  > Fix direct usage of fnameescape()
  > Rename and relocate s:TempCmd()
  > Fix read command output into buffer with guioptions=!
  > Accept git_dir dict key in FugitivePrepare()
  > Fix error message generation in s:ReplaceCmd()
  > Minimize use of combined stdout and stderr
  > Don't trust git --version with nonzero exit status
  > Fix error message for system() failure with argument list
  > Tighten check for PowerShell to match Vim's behavior
  > Add Vim version constraint to new PowerShell support
  > Encourage FugitiveFind() over FugitiveGitDir()
  > Eliminate use of ":write !"
  > Fix determining Git version with custom Git command
  > Fix incorrect readfile() arguments
  > Use absolute path to /usr/bin/env
  > Fix omitted Git dir argument
  > Get remote URL with config rather than shelling out
  > Add methods to config object
  > Decouple s:SystemError() from Git
  > Document autocommands
  > Reference plugin file as canonical API documentation
  > Remove "soft" qualifier from deprecated commands
  > Document FugitiveRemoteUrl()
  > Document FugitiveGitDir()
  > Tweak phrasing of FugitiveConfig() family documentation
  > Move FugitiveHead() documentation to plugin file
  > Improve PowerShell support with recent Vim
  > Don't execute autocmds during :GBrowse with range
  > Better support for ssh config
  > Support expanding ## as argument list
  > Use :echomsg for deprecation warnings
  > Avoid stepping on status window in :Gclog/:Gllog
  > Generalize :GBrowse - to all temp buffers
  > Tighten loose regexp
  > Fix error parsing worktree out of config
  > Remove unnecessary -complete on command with no arguments
  > Don't assume unrecognized status headers are refs
  > Don't abbreviate :vertical
  > Error when core.worktree expected but missing
  > Avoid spurious window resizing in :Gdiffsplit
  > Fix ternary expression in s:NullError

9 months agochore(nvim): update Loupe submodule
Greg Hurrell [Fri, 3 Dec 2021 10:43:56 +0000 (11:43 +0100)] 
chore(nvim): update Loupe submodule

* aspects/nvim/files/.config/nvim/pack/bundle/opt/loupe f543319...af1eb73 (5):
  > chore: add .mailmap
  > fix: also work with long forms of `:v` (`:vg` ... `:vglobal`)
  > fix: make `:g!` work as a command
  > refactor: edit some code comments in the name of precision
  > fix: make `g:LoupeVeryMagic` work with `:su`, `:sub`, `:subs` etc

9 months agochore(homebrew): add "powershell" cask
Greg Hurrell [Thu, 2 Dec 2021 11:08:21 +0000 (12:08 +0100)] 
chore(homebrew): add "powershell" cask

Because I need it to do "MS stuff".

9 months agochore: update npm dependencies
Greg Hurrell [Fri, 26 Nov 2021 12:50:42 +0000 (13:50 +0100)] 
chore: update npm dependencies

- `typescript`: 4.4.2 → 4.5.2
- `@types/node`: 16.7.10 → 16.11.10

9 months agochore: bump NodeJS version 16.8.0 → 16.13.0
Greg Hurrell [Fri, 26 Nov 2021 12:49:17 +0000 (13:49 +0100)] 
chore: bump NodeJS version 16.8.0 → 16.13.0

10 months agostyle: run `yarn format`
Greg Hurrell [Tue, 23 Nov 2021 20:41:59 +0000 (21:41 +0100)] 
style: run `yarn format`

10 months agofeat(fig): make most operations return an `OperationResult`
Greg Hurrell [Tue, 23 Nov 2021 20:37:39 +0000 (21:37 +0100)] 
feat(fig): make most operations return an `OperationResult`

We can make this a richer return type in the future if it proves
useful, but for now we return a simple string like "ok", "changed",
or "skipped". The only operation that don't do this, for now, is
`command()` because that already returns something more "interesting"
for its return value.

Closes: https://github.com/wincent/wincent/issues/105
10 months agofeat(fig): allow `fetch()` to handle binary encodings
Greg Hurrell [Tue, 23 Nov 2021 17:50:41 +0000 (18:50 +0100)] 
feat(fig): allow `fetch()` to handle binary encodings

Well, technically, not just binary encodings. Basically, we teach
`fetch()` and all the places it calls through to to accept an arbitrary
encoding value, which will usually be `utf8` (or implicitly, `undefined`
to mean the same), but which you can force to be "none" (ie.
untampered-with binary) by passing `null`.

For context, see commit c07a1ed8ffa6f2e29a42bb0132e53a6e7453be99, where
I document how I had to stop using `fetch()` and switch to just invoking
`curl` for these files because the former was re-encoding everything as

Test plan: Back up old files (renaming with ".bak" extension) and then
run `./install nvim --start='download spell files' --step`; then check
that the downloaded files are the same:

    $ cd ~/.config/nvim/spell
    $ shasum es*
    39ae12c465cb3f73280c891b951b343d4d44e6e2  es.utf-8.spl
    39ae12c465cb3f73280c891b951b343d4d44e6e2  es.utf-8.spl.bak
    613e9929a988b02878778fe8a9a79dbd0d252721  es.utf-8.sug
    613e9929a988b02878778fe8a9a79dbd0d252721  es.utf-8.sug.bak

Also ran `./install dotfiles` as a kind of a spot check to be sure[^1]
that I hadn't broken anything.

Closes: https://github.com/wincent/wincent/issues/104
[^1]: As sure as anyone can ever be about these things without doing
exhaustive testing.

10 months agofeat(nvim): add config for Solargraph and Sorbet
Greg Hurrell [Tue, 23 Nov 2021 15:55:31 +0000 (16:55 +0100)] 
feat(nvim): add config for Solargraph and Sorbet

Neither of these work particularly well on my very large repo test case,
but I want to have them handy for experimentation purposes.

10 months agochore(neovim): update nvim-lspconfig submodule
Greg Hurrell [Mon, 22 Nov 2021 17:42:30 +0000 (18:42 +0100)] 
chore(neovim): update nvim-lspconfig submodule

Because I am about to do some experimentation with these two:

- https://github.com/neovim/nvim-lspconfig/blob/a2863027c809127aca44e7519ec63a23ec0f1655/lua/lspconfig/solargraph.lua
- https://github.com/neovim/nvim-lspconfig/blob/a2863027c809127aca44e7519ec63a23ec0f1655/lua/lspconfig/sorbet.lua

Want to make sure I am up-to-date (looking at the history, I can't see
any relevant changes, but it doesn't hurt to be safe).

10 months agochore(homebrew): add "graphiql" cask to work profile
Greg Hurrell [Mon, 22 Nov 2021 12:13:31 +0000 (13:13 +0100)] 
chore(homebrew): add "graphiql" cask to work profile

10 months agofix(nvim): make file-wise jumping use getjumplist()
Greg Hurrell [Wed, 17 Nov 2021 14:41:52 +0000 (15:41 +0100)] 
fix(nvim): make file-wise jumping use getjumplist()

Addresses the problems noted in the previous commit. Namely, the "BUG:"
comment that points out that invalid line numbers can break all the
things. This is nicer anyway, as we're doing all the jumps via a single
mapping, and we should even be able to jump through multiple distinct
unnamed buffers now (not that those come up particularly frequently, but

10 months agofix(nvim): make jump list step function to overcome feedkeys latency
Greg Hurrell [Wed, 17 Nov 2021 13:59:04 +0000 (14:59 +0100)] 
fix(nvim): make jump list step function to overcome feedkeys latency

As mentioned in the parent commit, we have to wait a bit to actually see
the effects of the feedkeys call.

But as noted in the "BUG:" comment, this is still edge-casey enough that
I probably have to resort to parsing the `:jumps` output in order to
reliably detect forwards progress (and if I am going to do that, maybe I
can dispense with reading the buffer name entirely and just enqueue a
number of feedkeys calls directly; maybe even a single call containing
repeated presses).

10 months agofeat(nvim): add binding for doing file-wise movement through jump list
Greg Hurrell [Wed, 17 Nov 2021 13:44:27 +0000 (14:44 +0100)] 
feat(nvim): add binding for doing file-wise movement through jump list

This is really just a draft which I am committing in order to document
it; it seems that the feedkeys call works, but it's side-effects
don't seem to take effect immediately. That means that when we call
`nvim_win_get_cursor` and `nvim_buf_get_name` we get the old results

In the next commit I am going to experiment with adding a small delay
(via `defer_fn`) to see if that allows the code to "see" the

10 months agorefactor(nvim): port color.vim to color.lua
Greg Hurrell [Sun, 14 Nov 2021 21:26:58 +0000 (22:26 +0100)] 
refactor(nvim): port color.vim to color.lua

There's a chance that there are bugs in here because I did it quickly
just now while listening to a podcast — 😀 — but at least in a brief
test it doesn't seem to be throwing any errors.

10 months agofeat(nvim): actually restore autocmds when leaving zen-mode
Greg Hurrell [Sat, 13 Nov 2021 17:37:21 +0000 (18:37 +0100)] 
feat(nvim): actually restore autocmds when leaving zen-mode

I am not blowing away and restoring the "WincentAutocolor" group

1. It doesn't seem to be necessary.
2. The set-up is not yet in Lua, and I'd need to port it before using
   this mechanism.

The mechanism is a global-abusing hack, BTW.

10 months agorefactor(nvim): remove unused local assigns
Greg Hurrell [Fri, 12 Nov 2021 15:19:53 +0000 (16:19 +0100)] 
refactor(nvim): remove unused local assigns

Not used, and never used.

10 months agodocs: update CHANGELOG.md
Greg Hurrell [Fri, 12 Nov 2021 15:19:25 +0000 (16:19 +0100)] 
docs: update CHANGELOG.md

Probably a bunch of things that I could have or should have mentioned in
here, but... oh well...

10 months agofix(nvim): enable tmux plugin in zen-mode.nvim
Greg Hurrell [Fri, 12 Nov 2021 15:00:08 +0000 (16:00 +0100)] 
fix(nvim): enable tmux plugin in zen-mode.nvim

I had this back to front because I misread the README:


which says:

    tmux = { enabled = false }, -- disables the tmux statusline

ie. I thought `enabled = false` meant "make it look like tmux isn't

But it doesn't work. Inspection of the source code:


reveals that you need `enabled = true` to turn on the tmux plugin inside
zen-mode, and then it will do its thing:


and turn off the status line and zoom the current pane:

    vim.fn.system([[tmux set status off]])
    vim.fn.system([[tmux list-panes -F '\#F' | grep -q Z || tmux resize-pane -Z]])

which is exactly what I wanted it to do.

10 months agorefactor(nvim): switch to zen-mode.nvim from Goyo
Greg Hurrell [Thu, 11 Nov 2021 20:56:20 +0000 (21:56 +0100)] 
refactor(nvim): switch to zen-mode.nvim from Goyo

Not because Goyo is broken, but my suspicion was that zen-mode would be
easier to set up (less hacks) because it uses floating windows. In
practice, set-up isn't any simpler, but at least it is all in Lua.

Closes: https://github.com/wincent/wincent/issues/107
10 months agorefactor(nvim): move "table" snippet into `all` filetypes category
Greg Hurrell [Wed, 10 Nov 2021 10:55:37 +0000 (11:55 +0100)] 
refactor(nvim): move "table" snippet into `all` filetypes category

Seeing as I write Markdown-ish commit messages and sometimes what to put
tables in them, move the `table` snippet up into `all` from `markdown`.
In general it's a useful rendering of tables for any plain-text-ish kind
of situation, so seems a reasonable place for it.


    | First Header  | Second Header |
    | ------------- | ------------- |
    | Content Cell  | Content Cell  |
    | Content Cell  | Content Cell  |

10 months agofix(nvim): return value of `map()` function from helper functions
Greg Hurrell [Tue, 9 Nov 2021 18:06:56 +0000 (19:06 +0100)] 
fix(nvim): return value of `map()` function from helper functions

Realized while testing the parent commit that I wasn't actually
propagating the return value of `map()` through the helpers. For some
reason, I evidently thought that Lua implicitly returned the value of
the last expression in a function body, but it doesn't; you need an
explicit `return`.

10 months agofix(nvim): avoid accessing uninitialized `key` variable
Greg Hurrell [Tue, 9 Nov 2021 17:50:56 +0000 (18:50 +0100)] 
fix(nvim): avoid accessing uninitialized `key` variable

Closes: https://github.com/wincent/wincent/issues/119
10 months agofeat(dotfiles): add `gg tail`
Greg Hurrell [Tue, 9 Nov 2021 14:12:09 +0000 (15:12 +0100)] 
feat(dotfiles): add `gg tail`

I run this absurd little command often enough that I want to have an
shortcut like this for it, as opposed to pulling it out of my command

10 months agorefactor(nvim): remove now-unused highlight override
Greg Hurrell [Tue, 2 Nov 2021 08:24:38 +0000 (09:24 +0100)] 
refactor(nvim): remove now-unused highlight override

As noted in the previous commit, I'm not messing with LSP doc window
highlights right now, so that makes this override unused (and the name
of the group still reflects the name of the old plugin anyway).

10 months agochore(nvim): restore borders to nvim-cmp documentation windows
Greg Hurrell [Tue, 2 Nov 2021 08:19:37 +0000 (09:19 +0100)] 
chore(nvim): restore borders to nvim-cmp documentation windows

The other settings that I used to have (back when this was "nvim-compe")
may or may not be relevant, so I am noting them here as a reminder:

    border = 'single', -- see `:h nvim_open_win`
    winhighlight = "NormalFloat:CompeDocumentation,FloatBorder:CompeDocumentationBorder",
    max_width = 120,
    min_width = 60,
    max_height = math.floor(vim.o.lines * 0.3),
    min_height = 1,

10 months agofix(nvim): rework autocomplete mappings to work properly again
Greg Hurrell [Sat, 30 Oct 2021 20:20:18 +0000 (22:20 +0200)] 
fix(nvim): rework autocomplete mappings to work properly again

Because things were semi-broken in the recent move from nvim-compe to
nvim-cmp. I think this is mostly right at this point.

10 months agorefactor(nvim): remove a redundant `require`
Greg Hurrell [Sat, 30 Oct 2021 10:54:02 +0000 (12:54 +0200)] 
refactor(nvim): remove a redundant `require`

10 months agochore: sort .gitmodules
Greg Hurrell [Sat, 30 Oct 2021 10:45:17 +0000 (12:45 +0200)] 
chore: sort .gitmodules

Using old trick:




I actually have a function for this
but I keep forgetting to use it.

10 months agochore(nvim): migrate from nvim-compe to nvim-cmp next
Greg Hurrell [Fri, 29 Oct 2021 17:16:22 +0000 (19:16 +0200)] 
chore(nvim): migrate from nvim-compe to nvim-cmp

The former is abandoned in favor of a modular rewrite that requires me
to install a bunch of additional plugins. Some pointers into why this
happened can be found in the replies to the thread here:


This isn't totally working yet because the architecture and
implementation are so dramatically different; the main problems I have
is that my mappings aren't working that great (at least, I haven't been
able to accept a snippet expansion yet), but it looks like it is going
to be a fair bit of effort to get them unbusted, so I am committing what
I have so far as a kind of checkpoint.

The most notable change from a usage perspective is that the plugin no
longer uses Vim's own popup menu. This makes it feel laggy in my initial
testing of it 😢 but on the bright side it gives much more control over
the styling and appearance of the menu, so it does look better than

Also needed to update LuaSnip otherwise errors were being thrown
whenever I tried to expand or even see a snippet. Such is the reality of
stacking plugins from three different authors on top of each other in
order to get snippets working 😭.

* aspects/nvim/files/.config/nvim/pack/bundle/opt/LuaSnip 9a8cf5f...b7d520e (91):
  > BREAKING(conditions): move expand-conditions due to ambiguity.
  > Format with stylua
  > fix(snippet): don't generate multiple default-functions.
  > Auto generate docs
  > Merge pull request #211 from jedrzejboczar/show-condition
  > Format with stylua
  > fix(function/dynamicNode): second try at d5f86cb (closes #205).
  > Revert "fix(function/dynamicNode): unlink snippet if text was deleted (closes #205)."
  > Format with stylua
  > fix(function/dynamicNode): unlink snippet if text was deleted (closes #205).
  > Merge pull request #200 from oncomouse/master
  > Auto generate docs
  > feat(snippet): snippets may be marked as hidden.
  > Merge pull request #196 from L3MON4D3/lazy_load_event
  > Merge pull request #194 from jonathf/master
  > Merge pull request #193 from jonathf/master
  > fix(parser): update to "new"(cb4fe49) function-signature (closes #192).
  > Auto generate docs
  > docs(api): last fixup, for sure (thx @bew :D).
  > Auto generate docs
  > docs(api): fix formatting.
  > Auto generate docs
  > docs(luasnip): Add api-reference (closes #191).
  > Merge pull request #190 from leiserfg/use-new-json
  > Format with stylua
  > Merge pull request #189 from captainko/snippet-event
  > Auto generate docs
  > docs: mention event.
  > feat(loader): trigger event upon loading new snippets.
  > Format with stylua
  > refactor(config): set global var back to nil instead of false.
  > refactor(session): move previously global vars to session.
  > feat(tests): use makefile and local copy of plenary.
  > fix(choice_restore): stupid (closes #187).
  > doc: add example for `parser_nested_assembler`.
  > Format with stylua
  > Merge branch 'choice_restore'
  > fix: partial was broken due to change in signature(cb4fe49).
  > Auto generate docs
  > Format with stylua
  > BREAKING(feat): Add snippet_passive-key to ext_opts (closes #180).
  > Auto generate docs
  > Format with stylua
  > doc: update to new signature.
  > fix: adjust internal uses of functions to new signature.
  > BREAKING: Change header for function/dynamicNodes' function.
  > refactor: one implementation for get_args and get_static_args.
  > refactor: get_args should be defined in Node.
  > Auto generate docs
  > Enhance docs for functionNode.
  > Format with stylua
  > fix: don't indent blank lines. (closes #177)
  > Format with stylua
  > Merge pull request #169 from jedrzejboczar/fmt
  > Format with stylua
  > fix(parser): match ^%s+$, not %s$ (closes #176).
  > fix: better error when calling change_choice outside choiceNode.
  > Merge pull request #173 from leiserfg/auto-json-snips
  > Format with stylua
  > feat: add some (one, for now) built-in conditions.
  > Auto generate docs
  > Format with stylua
  > feat: pass useful data to condition-function.
  > Format with stylua
  > fix: also list available autosnippets.
  > Format with stylua
  > fix(parser): don't error on unescaped $, just insert literally.
  > Merge pull request #167 from nghialm269/master
  > Merge pull request #166 from ChristianChiarulli/fix-filter-function
  > Merge pull request #165 from leiserfg/reload
  > Format with stylua
  > doc: correct comment, add example to Examples/snippets.lua.
  > fix: return and set same value in __index.
  > Format with stylua
  > feat: add commands to control filetype-redirect.
  > feat: get fts for snippet-search from table, not directly from 'ft'.
  > Format with stylua
  > fix: use correct (byte vs col) indexing (+remove util.ext_pos-functions).
  > Format with stylua
  > Add example for env and captures in lambda.
  > README: accomodate users unfamiliar with lua.
  > Merge pull request #153 from L3MON4D3/lambda_named_vars
  > Merge pull request #152 from hituzi-no-sippo/fix-keymap-mode
  > Format with stylua
  > pattern-tokenizer: skip ^ at beginning of pattern.
  > Merge pull request #149 from kmarius/tm-filename
  > Merge pull request #148 from bronzehedwick/patch-1
  > Mention search-order for snippets in examples.
  > Readme: use subheadings for setup-details
  > fix(parser): get_static_text caches results.
  > fix: if update inserts text at end, grav will not shift snippet-mark.

10 months agofeat(dotfiles): add Raycast commits Script Command
Greg Hurrell [Fri, 29 Oct 2021 14:56:53 +0000 (16:56 +0200)] 
feat(dotfiles): add Raycast commits Script Command

10 months agofeat(dotfiles): add issues navigation Script Command to Raycast
Greg Hurrell [Fri, 29 Oct 2021 14:54:50 +0000 (16:54 +0200)] 
feat(dotfiles): add issues navigation Script Command to Raycast

10 months agorefactor(dotfiles): remove useless branch
Greg Hurrell [Fri, 29 Oct 2021 14:54:39 +0000 (16:54 +0200)] 
refactor(dotfiles): remove useless branch

10 months agofeat(dotfiles): port org search/nav to Raycast
Greg Hurrell [Fri, 29 Oct 2021 14:51:03 +0000 (16:51 +0200)] 
feat(dotfiles): port org search/nav to Raycast

10 months agofeat(dotfiles): add Raycast script command for jumping to pulls
Greg Hurrell [Fri, 29 Oct 2021 14:47:24 +0000 (16:47 +0200)] 
feat(dotfiles): add Raycast script command for jumping to pulls

10 months agofeat(dotfiles): port repo search from Alfred to Raycast
Greg Hurrell [Fri, 29 Oct 2021 14:36:09 +0000 (16:36 +0200)] 
feat(dotfiles): port repo search from Alfred to Raycast

This is the nastiest workflow, and probably has a bunch of unhandled
edge-cases in it, but it works for basic inputs.

10 months agofeat(dotfiles): add generic GitHub search Script Command
Greg Hurrell [Fri, 29 Oct 2021 14:12:48 +0000 (16:12 +0200)] 
feat(dotfiles): add generic GitHub search Script Command

10 months agorefactor(dotfiles): pull out common utilities for use in Script Commands
Greg Hurrell [Fri, 29 Oct 2021 13:49:28 +0000 (15:49 +0200)] 
refactor(dotfiles): pull out common utilities for use in Script Commands

10 months agofeat(dotfiles): port "GitHub user" workflow from Alfred to Raycast
Greg Hurrell [Fri, 29 Oct 2021 13:32:17 +0000 (15:32 +0200)] 
feat(dotfiles): port "GitHub user" workflow from Alfred to Raycast

10 months agorefactor(dotfiles): port Raycast npm.js to npm.sh (Zsh)
Greg Hurrell [Fri, 29 Oct 2021 13:21:02 +0000 (15:21 +0200)] 
refactor(dotfiles): port Raycast npm.js to npm.sh (Zsh)

So that we only rely on what comes with the system.

I included Stack Overflow links to the two arcane things I had to do:

- Trimming leading and trailing whitespace.
- Trimming the final character.

Neither of those things sound like they should be arcane, but they

10 months agofeat(dotfiles): add some Raycast script commands
Greg Hurrell [Fri, 29 Oct 2021 12:58:36 +0000 (14:58 +0200)] 
feat(dotfiles): add some Raycast script commands

Just to show:

- Where I am planning to put these.
- What I will do with commands containing sensitive info (encrypt them).
- Lament that Node isn't bundled with Raycast, which means I have a
  fragile dependency on my local install — in another commit I'll
  rewrite this using a scripting language that comes with macOS (at
  least, for now... Ruby would be the obvious choice, but Apple has
  threatened with removing it from the base install "soon"... so I guess
  that leaves Zsh, which isn't my favorite language for scripting, but
  oh well...)

10 months agofeat(nvim): use breakindent/breakindentopt to improve soft wrapping
Greg Hurrell [Thu, 28 Oct 2021 13:56:52 +0000 (15:56 +0200)] 
feat(nvim): use breakindent/breakindentopt to improve soft wrapping

Should make bulleted lists look a bit better in Markdown files. The
interplay between these settings and others (such as `'showbreak'`) is
subtle, but I _think_ this is generally an improvement.

Example of what the Fig README from this repo looks like in a narrow

    Overall structure remains similar to Ansible, but I made some changes to better
    ↳ reflect the use case here;

    - Configuration is divided into ["aspects"](../aspects) that contain:
      - A TypeScript `index.ts` that defines tasks to be executed.
      - An `aspect.json` or `aspect.ts` file that contains metadata, such as a
    ↳   `description` and (optional) `variables`.
      - An (optional) `files` directory containing resources to be copied or otherwise
    ↳   manipulated.
      - An (optional) `templates` directory containing templates to be dynamically
    ↳   generated (and then copied, installed etc).
      - An (optional) `support` directory to contain any other useful resources (eg.
    ↳   helper scripts etc).
    - A [top-level `project.json`](https://github.com/wincent/wincent/blob/main/project.
    ↳ json) declares:
      - Supported platforms (eg. "darwin", "linux") plus their related aspects and
    ↳   variables.
      - Profiles (eg. "personal" and "work") along with their associated variables, and
    ↳   patterns for determining which profile should apply on a given machine.
      - Default variables that apply in the absence of more specific settings (see
    ↳   ["Variables"](#variables) for more details).
    - The Fig source itself lives in [the `fig` directory](https://github.com/wincent/
    ↳ wincent/tree/main/fig).
    - All interaction occurs via [the top-level `install` script](https://github.com/
    ↳ wincent/wincent/blob/main/install), which invokes Fig via a set of helper scripts
    ↳ [in the `bin` directory](https://github.com/wincent/wincent/tree/main/bin).

Compare that with how it used to render:

    Overall structure remains similar to Ansible, but I made some changes to better reflect
    ↳ the use case here;

    - Configuration is divided into ["aspects"](../aspects) that contain:
      - A TypeScript `index.ts` that defines tasks to be executed.
      - An `aspect.json` or `aspect.ts` file that contains metadata, such as a `description`
    ↳ and (optional) `variables`.
      - An (optional) `files` directory containing resources to be copied or otherwise
    ↳ manipulated.
      - An (optional) `templates` directory containing templates to be dynamically generated
    ↳ (and then copied, installed etc).
      - An (optional) `support` directory to contain any other useful resources (eg. helper
    ↳ scripts etc).
    - A [top-level `project.json`](https://github.com/wincent/wincent/blob/main/project.
    ↳ json) declares:
      - Supported platforms (eg. "darwin", "linux") plus their related aspects and variables.
      - Profiles (eg. "personal" and "work") along with their associated variables, and
    ↳ patterns for determining which profile should apply on a given machine.
      - Default variables that apply in the absence of more specific settings (see
    ↳ ["Variables"](#variables) for more details).
    - The Fig source itself lives in [the `fig` directory](https://github.com/wincent/
    ↳ wincent/tree/main/fig).
    - All interaction occurs via [the top-level `install` script](https://github.com/wincent/
    ↳ wincent/blob/main/install), which invokes Fig via a set of helper scripts [in the
    ↳ `bin` directory](https://github.com/wincent/wincent/tree/main/bin).

Things to note:

- Both top-level and nested bulleted lists now show "correct" (matching)
  indent on soft-wrapped lines. Previously, display was only correct for
  top-level bulleted lists.
- `'showbreak'` behavior is unaffected for normal paragraphs (this is
  visible in the paragraph at the top of each excerpt).
- In general, we are maintaining `'showbreak'` so that we _do_ have a
  visible indication of where soft-wrapping is occurring, which would
  otherwise be indistinguishable from actual hard-wrapping.

Not shown: the common case of a single level of quoting (with ">") works
just like top-level bulleted lists.

10 months agochore(homebrew): add Raycast to work machine
Greg Hurrell [Thu, 28 Oct 2021 13:49:52 +0000 (15:49 +0200)] 
chore(homebrew): add Raycast to work machine

Going to take this for a spin:


11 months agofeat(dotfiles): add `gg cs tail`
Greg Hurrell [Fri, 22 Oct 2021 12:05:08 +0000 (14:05 +0200)] 
feat(dotfiles): add `gg cs tail`

Shorthand for:

    gh cs ssh -- tail -f /root/codespaces-post-start.log

11 months agorefactor(dotfiles): get rid of unused associative array
Greg Hurrell [Fri, 15 Oct 2021 16:54:54 +0000 (18:54 +0200)] 
refactor(dotfiles): get rid of unused associative array

As explained in the parent commit, I just had this in here to record the
fact that I had thought I was going to need it, and that in turn
justified writing the script for Zsh instead of Bash...

11 months agorefactor(dotfiles): fold "git zap" and "git zip" into one script, "git sync"
Greg Hurrell [Fri, 15 Oct 2021 16:52:18 +0000 (18:52 +0200)] 
refactor(dotfiles): fold "git zap" and "git zip" into one script, "git sync"

As noted previously, I always run these two together, so it makes sense
for them to be melded into one script.

Fun fact: before I started this, I thought I was going to need an
associative array, so I switched over to Zsh. In the end, I didn't need
it, but I left it in here to: (a) show my work, and (b) have an example
of how to do some useful things in Zsh, like find out the path of the
currently script (like you can in Bash with `$BASH_SOURCE`).

In the next commit, I'll delete the unneeded/unused associative array,
but I'm keeping the script in Zsh for now.

11 months agofeat(dotfiles): teach `gg cs` to forward arguments
Greg Hurrell [Fri, 15 Oct 2021 10:01:17 +0000 (12:01 +0200)] 
feat(dotfiles): teach `gg cs` to forward arguments

Right now, I have a mental model where I have to think about whether I
want to jump into a Codespace (`gg cs`) or do some management operation
(eg. `gh cs list`, `gh cs delete` etc).

Let's just use `gg cs` for everything. With no args, it connects as
before, and with args it just forwards them to `gh cs`. So, I can do:

- `gg cs`: connect to a Codespace.
- `gg cs list` : list Codespaces.
- etc

11 months agochore(nvim): update custom dictionary
Greg Hurrell [Wed, 13 Oct 2021 12:55:35 +0000 (14:55 +0200)] 
chore(nvim): update custom dictionary

11 months agofix(nvim): make ":OpenOnGitHub" work in Codespaces again
Greg Hurrell [Wed, 13 Oct 2021 12:51:22 +0000 (14:51 +0200)] 
fix(nvim): make ":OpenOnGitHub" work in Codespaces again

The image I'm working on very recently added a "/usr/bin/open" symlink,
pointing to "/etc/alternatives/open", which in turn points at
"/usr/bin/xdg-open". So that means that when `ssh`-ed into a Codespace,
`executable('open')` would evaluate to `1`, and we'd futilely try to
open the link.

Now, in the long run, I probably want to do something cleverer here, so
that I can use `open` on both macOS and my Linux box, but skip it in a
Codespaces context, but for now I am just unbreaking this as
straightforwardly as possible: instead of checking for the existence of
an executable, we get its path, resolve symlinks, and grab the final
path component; if it's "open" then we use it, but if it is anything
else (eg. "xdg-open"), we don't. Note that if the executable is missing,
`exepath` will return an empty string, `resolve` will return an empty
string too, and `fnamemodify` will return -- you guessed it -- an empty
string as well.

11 months agodocs: use actual Markdown footnotes instead of fake ones
Greg Hurrell [Thu, 30 Sep 2021 14:14:01 +0000 (16:14 +0200)] 
docs: use actual Markdown footnotes instead of fake ones

These display correctly on GitHub, GitLab, and BitBucket, unlike the
old technique, which failed on BitBucket, where it would render a
pair of visible `<sup>`/`</sup>` tags.

11 months agofix(nvim): unbreak <Leader>r mapping
Greg Hurrell [Tue, 28 Sep 2021 12:34:57 +0000 (14:34 +0200)] 
fix(nvim): unbreak <Leader>r mapping

I must have broken this months ago without noticing. The gotcha here is
that we need to support both `<expr>` and non-`<expr>` mappings.
Examples of the former category include some autocompletion-related
ones. For those, we evaluate the (VimScript) expressions, which happen
to be calls into Lua (eg. `v:lua.blah()`) and the return value ends up
being the RHS of the mapping.

The second category are ones like the `<Leader>r` mapping. For those we
have to get into a command context and call a Lua function (ie. `:lua

11 months agofeat(dotfiles): add `gg go` shortcut
Greg Hurrell [Mon, 27 Sep 2021 16:49:40 +0000 (18:49 +0200)] 
feat(dotfiles): add `gg go` shortcut

Based on the same idea as the old `portool go`:


This one is in some sense simpler because I don't have as many things I
want to run, but it does have to deal with Darwin and non-Darwin (ie.
Codespaces) environments, which have repos checked out in different
places, and different capabilities/roles.

12 months agochore(nvim): updated submodule URL
Greg Hurrell [Wed, 22 Sep 2021 10:10:30 +0000 (12:10 +0200)] 
chore(nvim): updated submodule URL

Strictly speaking, not necessary, because GitHub redirects when you
clone from the old URL, but seeing as they changed it a long time ago
(Jan 2015):


we should probably update it.

Note that I did with with:

    git submodule set-url vim-easydir https://github.com/duggiefresh/vim-easydir.git

and not:

    git submodule set-url -- aspects/nvim/files/.config/nvim/pack/bundle/opt/vim-easydir https://github.com/duggiefresh/vim-easydir.git

because the later ends up adding a new, unwanted submodule entry to the
`.gitmodules` file instead of updating the existing one:

    [submodule "aspects/nvim/files/.config/nvim/pack/bundle/opt/vim-easydir"]
            url = https://github.com/duggiefresh/vim-easydir.git

I think this is a slight inaccuracy in the `git-submodule` man page,
because it states that this subcommand takes a path when it really takes
a name:

    git submodule [--quiet] set-url [--] <path> <newurl>

12 months agochore(dotfiles): update `gh cs ports` invocation for v0.12.0 compatibility
Greg Hurrell [Mon, 13 Sep 2021 14:41:07 +0000 (16:41 +0200)] 
chore(dotfiles): update `gh cs ports` invocation for v0.12.0 compatibility

Technically, I think it will still work, at least for this version,
although I haven't tried it yet. In practice, I expect to basically
always invoke this one without an argument.

12 months agofeat(dotfiles): teach gg completion to complete files for `gg test`
Greg Hurrell [Tue, 7 Sep 2021 13:51:06 +0000 (15:51 +0200)] 
feat(dotfiles): teach gg completion to complete files for `gg test`

Unfortunately I don't know how to get it to complete filenames if I skip
the `test` subcommand (because `gg test/thing` is equivalent to `gg test
test/thing`) but this is still probably useful and I can expand it more
as time goes on.

12 months agochore(dotfiles, homebrew): set up git-lfs
Greg Hurrell [Mon, 6 Sep 2021 16:45:55 +0000 (18:45 +0200)] 
chore(dotfiles, homebrew): set up git-lfs

Basically just did:

    brew install git-lfs
    git lfs install

and moved the changes it made into the source template (moving them into
alphabetical order along the way, seeing as it had obviously just
appended them at the end).

Docs here:


Doing this because according to this, I need to:


12 months agofix: fix false-positive in glob code
Greg Hurrell [Mon, 6 Sep 2021 16:31:05 +0000 (18:31 +0200)] 
fix: fix false-positive in glob code

If we match a file but it is up too high in the directory hierarchy,
it shouldn't be considered a match.

eg. if we're looking for "a/*/*", we shouldn't return the file "a/b",
but we should return "a/c/d".

12 months agofix: update error handling for TypeScript 4.4
Greg Hurrell [Mon, 6 Sep 2021 16:08:42 +0000 (18:08 +0200)] 
fix: update error handling for TypeScript 4.4

As explained here:


caught errors now have type `unknown` instead of `any`. Now, it's true
that sometimes I can be pretty sure that I'm going to get an `Error`
instance in these `catch` clauses, but I would rather just mindlessly
obey the type checker and adapt the code to handle any value. This
"future-proofs" the code by making it ready to handle any changes that
invalidate my initial assumptions here.

Fixes these post-upgrade errors:

    fig/readAspect.ts:32:24 - error TS2571: Object is of type 'unknown'.

    32     throw new Error(`${error.message} in ${directory}`);

    fig/readProject.ts:15:24 - error TS2571: Object is of type 'unknown'.

    15     throw new Error(`${error.message} in ${path}`);

    fig/test.ts:16:19 - error TS2345: Argument of type 'unknown' is not assignable to parameter of type 'string'.

    16         log.error(error);

    fig/test/harness.ts:66:25 - error TS2571: Object is of type 'unknown'.

    66         const message = caught.toString();

    fig/test/harness.ts:153:16 - error TS2571: Object is of type 'unknown'.

    153       log(`\n${error.message}\n`);

12 months agochore: update TypeScript from 4.3.2 to 4.4.2
Greg Hurrell [Mon, 6 Sep 2021 15:58:59 +0000 (17:58 +0200)] 
chore: update TypeScript from 4.3.2 to 4.4.2

Just some proactive maintenance so as not to fall behind.

12 months agochore: bump node version from 14.17.0 to 16.8.0
Greg Hurrell [Mon, 6 Sep 2021 15:55:22 +0000 (17:55 +0200)] 
chore: bump node version from 14.17.0 to 16.8.0

Via the releases page:


v14 is the "Active LTS" release, and came out on 2020-04-21. It will hit
end-of-life on 2023-04-30, so no hurry to get off it.

v16 is the "Current" release, and came out on 2021-04-20. It will hit
end-of-life on 2024-04-30.

So yeah, no hurry to move, but I may as well update about once a year
and stay on whatever is "Current". (This partly prompted because I just
opened a PR to a project that wants me to use Node v16, and if I can
just have that version hanging around on my system already it makes life
easier for me).

Test plan: `./install` and see that things still seem to be working.

12 months agofeat(dotfiles): teach `gg` to run `gg test` if first arg starts with `test/`
Greg Hurrell [Mon, 6 Sep 2021 09:00:00 +0000 (11:00 +0200)] 
feat(dotfiles): teach `gg` to run `gg test` if first arg starts with `test/`

Just a convenience to save some typing, and because on a few occasions I
have typed this unthinkingly anyway, expecting it to work.

12 months agofeat(apt): install par on Debian
Greg Hurrell [Tue, 31 Aug 2021 16:51:15 +0000 (18:51 +0200)] 
feat(apt): install par on Debian

Because I need to wrap in Vim. (I could also make my wrapping keybinding
degrade gracefully in the absence of `par`, but I find it so darn useful
I just prefer to install it everywhere I use Vim.)

Luckily, it is only an `apt-get install par` away:


12 months agorefactor(nvim): apply post-update tweaks for LuaSnip
Greg Hurrell [Tue, 31 Aug 2021 15:53:12 +0000 (17:53 +0200)] 
refactor(nvim): apply post-update tweaks for LuaSnip

I _think_ the docblock snippet works close to how the old UltiSnips one
did now, and the rest seem to still be working.

12 months agochore(nvim): update LuaSnip
Greg Hurrell [Tue, 31 Aug 2021 15:24:07 +0000 (17:24 +0200)] 
chore(nvim): update LuaSnip

Motivation; get this fix:


But it turns out that there have been a _lot_ of changes since I last
updated; if anything breaks, I will follow up:

* aspects/nvim/files/.config/nvim/pack/bundle/opt/LuaSnip 72323c1...9a8cf5f (261):
  > Merge pull request #143 from leiserfg/multi-ft
  > Format with stylua
  > fix: account for compound filetypes (closes #142).
  > Update README.md
  > Format with stylua
  > Fix parser, for real now.
  > Format with stylua
  > Fix slight regression with variables in lsp-parsed snippets.
  > Fixup(d2aa43c): BREAKING, parsing has become more strict.
  > Format with stylua
  > Provide option to set better `assemble`-function for nested snippets.
  > Format with stylua
  > Merge branch 'master' of github.com:L3MON4D3/LuaSnip
  > lsp: correctly parse brackets (closes #141) and split iNode-text.
  > fix(parser): remove escape-chars everywhere.
  > Merge pull request #140 from carlitux/patch-2
  > Set pos to nil for better docstring if queried manually.
  > Format with stylua
  > Improve get_docstring().
  > Typo.
  > Format with stylua
  > Account for selecting empty lines (only) (closes #139).
  > Use `rawget` to get position.
  > Merge pull request #138 from leiserfg/handle_emtpy_snippets
  > Parser: ${n:sometext} can also be repetitions of previous insertNodes.
  > Try expanding autosnippets if pum is visible, too.
  > Format with stylua
  > Use tokenizer to create helper-snippet for regex-triggers.
  > Implement tokenizer for patterns.
  > Format with stylua
  > pcall `get_text`, {""} on error. Don't error on `str_utfindex`.
  > Try to prevent jump_from from erroring due to deleted snippets.
  > Auto generate docs
  > Format with stylua
  > Merge branch 'insert_node_event_callbacks'
  > Add <Plug>-mapping for previous choice (Closes #131).
  > Format with stylua
  > Provide setting for delete-check autocommands.
  > Recommend `InsertEnter` for `region_check_events`
  > Make bytecol_to_utfcol behave correctly (used to return three values).
  > Auto generate docs
  > Format with stylua
  > Small changes+improvements for the enter/leave events:
  > Auto generate docs
  > Auto generate docs
  > Format with stylua
  > No need to input_leave the generated snippet in dynamicNode.
  > Trigger autocommands on entering/leaving nodes.
  > Add function to check if the current snippet was deleted+<Plug>-mapping.
  > Merge pull request #126 from leiserfg/generic-package-name
  > Auto generate docs
  > Format with stylua
  > Document indent_snippet_node and some usages for it.
  > Remove prefix_snippet_node, it's really just a specification of ISN.
  > Re-implement changing choice backwards.
  > Prevent region check for autotriggered snippets too.
  > Each choice gets a pointer to the next.
  > Rename choiceNode.inner to choiceNode.active_choice, more expressive.
  > Clear snippets' own marks on exit.
  > Rename vars that store choiceNodes to reflect that.
  > Format with stylua
  > Disable region check while jumping.
  > Make sure node isn't nil before indexing.
  > Check for specific node+also check following snippets.
  > Leave exit node when next snippet is expanded, only compare lines for region.
  > Mention setting in README.
  > Add config for specifying when to do region check, defaults to never.
  > Fix minor bugs with exit_out_of_region_snippet.
  > Fix small issues with exitNode.
  > Fix bug caused by new jump_from/into-behaviour.
  > Add function to leave active snippet if its' region is left.
  > Make no_move actually funcitional.
  > Add snippet.snippet, contains 'outer' (ie. the user-triggered) snippet.
  > Have jump_into/jump_leave return the new active node.
  > Merge pull request #124 from leiserfg/clean_lazy
  > Auto generate docs
  > Fix lazy-loading.
  > Add more details for loading vscode-packaged snippets.
  > Format with stylua
  > Fix/improve update_dependents-behaviour.
  > Clean up a bit.
  > Reset active upon exit()ing, only pop active choice if this was active.
  > Simplify choiceNodes' init-process.
  > Merge pull request #121 from L3MON4D3/static_text_for_snippets
  > Ignore and correctly format lines on which stylua fails.
  > Format with stylua
  > Fix regression: *move_on_mark_*-functions were removed, typo(?) in util.mark.
  > Format with stylua
  > Remove print's.
  > Changes nothing functionally, but clearer.
  > After parsing, the positions of insertNodes are not 'dense', fix it.
  > Inserting a missing `i(0)` is handled by snippet-constructor.
  > Auto generate docs
  > Format with stylua
  > Document expected layout of directories loaded via vscode-loader.
  > Format with stylua
  > Separate expanding tabs in text and indenting; make both more generic.
  > Fix expand_tab-implementation.
  > Always initialize static_text for insert and textNode.
  > Format with stylua
  > Fix unlink_current, correctly set active node.
  > Set Luasnip_active_choice correctly after exit()ing choiceNode.
  > Format with stylua
  > Merge pull request #114 from leiserfg/extra-vars
  > Format with stylua
  > Differentiate between insert and exitNodes(`i(0)`).
  > Call insertNodes' input_leave function for i(0).
  > Auto generate docs
  > Format with stylua
  > Document new behaviour of i(0).
  > Format with stylua
  > Do insertNodes' input_enter for i(0).
  > Fix TM_LINE_INDEX/NUMBER, it should be a string.
  > Format with stylua
  > Explicitly open folds after moving, doesn't seem to happen automatically.
  > Auto generate docs
  > Format with stylua
  > Mention passive extending active and highlight groups in doc.
  > Fix overriding-behaviour.
  > Fix clear_invalid, don't have it override active with passive.
  > Use user-defined Luasnip*Node{Active,Passive} as highlight when defined.
  > Merge default into user-defined table.
  > Format with stylua
  > Replace link to matrix room with icon.
  > Format with stylua
  > Clarify arguments to util.put.
  > Use byte-position of mark to nvim_buf_set_text().
  > Expose function to get byte-position of mark.
  > Format with stylua
  > Default ext_opts-table to {}.
  > Auto generate docs
  > Format with stylua
  > Add example for ext_opts, fix jdoc-snippet.
  > Rename prio_increase to ext_prio_increase.
  > Add documentation for ext_opts.
  > Correctly pass ext_opts with higher prios for inner snippets.
  > Config: include priority+functions to modify.
  > Add appropriate exit()-functions to dynamic and choice.
  > Use copy of passed table.
  > Fix dynNode:set_rgrav, after changing textNode, grav is default-false.
  > Fill missing values in ext_opts.
  > Don't unnecessarily update extmark.
  > Change ext_opts on entering/leaving.
  > Correctly set type and opts for snippet.
  > Rename change_rgravs to update_rgravs.
  > DO change gravities for textNodes, prevents some bug+more uniform.
  > Enter node in both paths.
  > Delete marks on exit.
  > Use two functions to set gravs or other opts.
  > Set snippets' mark from outside also.
  > Format with stylua
  > Mention nvim-cmp and cmp_luasnip in README.
  > Format with stylua
  > Merge pull request #106 from amenonsen/patch-3
  > Format with stylua
  > Merge pull request #105 from amenonsen/patch2
  > Format with stylua
  > Yeeeeeaaaaah no, not really anymore
  > Format with stylua
  > Mention autosnippets in README.
  > Format with stylua
  > Merge branch 'autotrigger'
  > Format with stylua
  > Fix: Adding a i(0) if none was specified.
  > Don't set correctly and then overwrite with old values :/
  > As the mark-id isn't copied anymore, it can be set later in put_initial()
  > Implement clear-function, fix bug with raw_pos.
  > Print gravities in snippet:dump().
  > Store ext_opts in snippet, pass to children; Change marks for dyn/choice
  > Add ext_opts to config.
  > Use raw, not utf-adjusted position for initializing extmarks.
  > Don't set positions in opts.
  > Default-init marks with nil.
  > Fix set_mark_rgrav-function, use default-version everywhere.
  > Actually use new marks in snippets.
  > Most likely, there won't be any updates to pos, and if, then to both.
  > Marks are objects; Simplify extmark_rgrav-setting.
  > Add table for node-names, shift indices to match name.
  > Refactor types to use enum.
  > Auto generate docs
  > Mention mappings in DOC, refer to README.
  > Auto generate docs
  > Merge pull request #104 from amenonsen/patch-1
  > Mention new config-option in README.
  > Auto generate docs
  > Document SELECT-behaviour and lsp-parsing.
  > Provide example mappings for lua and vimscript.
  > Link to lsp-snippet spec.
  > Format with stylua
  > Only remove indent for TM_SELECTED_TEXT.
  > Enable new vars in env.
  > Correctly populate selection.
  > Create all types of indent in store_selection().
  > Modify store_selection to get all lines at once.
  > Allow node.pos to be nil, mimic vscodes' behaviour for $TM_SELECTED_TEXT.
  > Should be an insertNode.
  > Add new snippetNodes prefixSnippetNode and indentSnippetNode
  > Refactor population of args for function/dynamicNodes.
  > Improve autowrapping for snippets, fix it for snippetNodes.
  > Merge pull request #102 from leiserfg/find_vimrc
  > Auto generate docs
  > Specify what the text looks like when executing condition-function.
  > Auto generate docs
  > Maybe also document condition-function.
  > Format with stylua
  > Change snippet:match(...) for regex-triggers, parentheses can mess up patterns.
  > Reuse mark-id if possible.
  > Refactor snippet:indent() slightly.
  > Clean up unneeded args.
  > Indent + populate snippetNodes' env in put_initial().
  > Auto generate docs
  > Format with stylua
  > Explicitly mention text-passing behaviour in docs.
  > BREAKING CHANGE: Pass dedented text to function/dynamicNodes, indent returned text for functionNodes.
  > Merge pull request #94 from leiserfg/fix-of-by-one
  > Merge pull request #93 from leiserfg/use-named-register
  > Format with stylua
  > Reset Visual after use.
  > Return {} instead of "" on empty visual.
  > Prepare for storing prio,hl_group,... in node.mark.
  > Format with stylua
  > Correctly check for empty table ({} != {} in lua);
  > Rewrite extmarks to work more consistently.
  > Update parsed nodes.
  > Fix node-gravities for exitNodes'.
  > Remove prints', fix enter_node.
  > Use only one node to mark beginning and end of node.
  > Merge pull request #92 from leiserfg/select
  > If lambda returns nil, use default of "" to prevent errors.
  > Format with stylua
  > Add dynamic lambdas+examples.
  > Format with stylua
  > Add nonempty-node. Inserts text if arg-node is not empty.
  > Add some examples for `match()`.
  > Adjust default-value for `match()`
  > Merge pull request #86 from leiserfg/match_with_lambda
  > BREAKING CHANGE: Move pseudo-nodes from ls.util.functions to ls.extras.
  > Quickly shuffle around signature of `match()`.
  > Merge pull request #84 from leiserfg/match_with_lambda
  > Auto generate docs
  > Merge pull request #83 from praveendhawan/patch-1
  > Auto generate docs
  > Format with stylua
  > BREAKING CHANGE: Default `wordTrig` to true, not false.
  > Add expand and expandable function+vim-versions (close #79).
  > Luasnip_current_nodes may (somehow) be nil, check before indexing.
  > Format with stylua
  > Add partial function+example (closes #72).
  > Auto generate docs
  > Replace table with list, md2vim doesn't like tables.
  > Auto generate docs
  > Fix table in Doc.
  > Merge pull request #69 from leiserfg/md-doc
  > Alias set_config to setup.
  > Merge pull request #29 from tjdevries/update_config_correctly
  > Initialize function+dynamicNodes when cildren of choiceNode.
  > Format with stylua
  > Add Examples for recently added nodes.
  > Repeat doesn't need lambdas.
  > Merge pull request #67 from leiserfg/lambda-util

12 months agorefactor(nvim): use vim-rails
Greg Hurrell [Tue, 31 Aug 2021 11:31:50 +0000 (13:31 +0200)] 
refactor(nvim): use vim-rails

As mentioned in the previous commit, not sure if I want to go the
heavy-weight plug-in route or not, but am at least going to give it a
try. I did used to use vim-rails waaaaay back; it was vendored in the
very first commit of this repo (61a7e2a830ed, ".vim/.vimrc: initial
import", May 2009), until it finally got removed in in e9a1d032a9f68
("vim: remove vim-{haml,rails}", October 2015).

* aspects/nvim/files/.config/nvim/pack/bundle/opt/vim-rails 0000000...03a5c3e (1612):
  > Ensure we're back in magic mode after embedding `define_pattern()`

12 months agofeat(nvim): set up some projections for Rails-like projects
Greg Hurrell [Tue, 31 Aug 2021 11:28:26 +0000 (13:28 +0200)] 
feat(nvim): set up some projections for Rails-like projects

Not sure whether I want to go with something very minimal like this, or
drag in all of the vim-rails plug-in, which is quite large. I _think_
I'm going to do the latter, but I want at least a simple example in the
Git history to go back to in case I end up changing my mind later on.

12 months agochore(nvim): remove unused vim-soy plugin
Greg Hurrell [Tue, 31 Aug 2021 11:19:04 +0000 (13:19 +0200)] 
chore(nvim): remove unused vim-soy plugin

* aspects/nvim/files/.config/nvim/pack/bundle/opt/vim-soy d103c7c...0000000:

12 months agofeat(nvim): add "cont" and "test" Ruby snippets
Greg Hurrell [Tue, 31 Aug 2021 11:06:02 +0000 (13:06 +0200)] 
feat(nvim): add "cont" and "test" Ruby snippets

Bring back some snippets like the ones I used to have with Ultisnips
(and technically still do over in my .vim files):


AFAICT there is no obvious way to conditionally enable this in files
with compound filetypes, so just adding this for all Ruby files for now.

I asked upstream about whether this is possible:


12 months agorefactor(codespaces): switch to more precise `pkill` mechanism
Greg Hurrell [Mon, 30 Aug 2021 13:10:51 +0000 (15:10 +0200)] 
refactor(codespaces): switch to more precise `pkill` mechanism

Of course, this, too, isn't 100% future-proof, because the file may be
renamed or moved in the future, but it seems better than what I had
before (see parent commit).

12 months agofix(codespaces): tweak `pkill sshd` invocation
Greg Hurrell [Mon, 30 Aug 2021 13:01:24 +0000 (15:01 +0200)] 
fix(codespaces): tweak `pkill sshd` invocation

Something has changed which causes the old command to no longer work.

`pgrep sshd -a` shows these commands running:

    1147 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
    30372 sshd: root@pts/0

The first (PID 1147) is the main process and the second (PID 30372) is
the subprocess forked to handle my connection. We need to restart the
main process. The old kill command (`pkill -HUP -xf /usr/sbin/sshd`)
would do that (`-f` tells `pkill` to match the entire invocation,
including arguments, and `-x` requires an exact match), because
presumably the old instances were starting `/usr/sbin/sshd` without any
arguments. But now, for some reasons, there is a suffix there that
causes `-fx` to no longer match.

By dropping `-x`, we match against the full string, but less precisely.
This is enough to make the command work again, without killing the
existing connection (the subprocess).

Although as I write this, it still feels too fragile; I think I might
switch to reading `/var/run/sshd.pid` instead.