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

19 hours 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.

20 hours 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 days 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 days 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.

7 days 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.

8 days 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'),

8 days 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.

8 days 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.

8 days 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

8 days 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.

8 days 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.

2 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)

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

2 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.

2 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

3 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.

3 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:

3 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

3 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.

3 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.

3 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.

3 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:

3 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

3 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:

4 weeks 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.

4 weeks 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... 🤦

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

4 weeks 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.

4 weeks 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.

4 weeks 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.)

4 weeks 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`.

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

4 weeks 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

4 weeks 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.

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

4 weeks 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

4 weeks 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

7 weeks 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

7 weeks 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

7 weeks 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.

7 weeks 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

7 weeks 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

2 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).

2 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

2 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

2 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!

2 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).

2 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

2 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:

2 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.

2 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.

2 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.

2 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.

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

With `yarn format`.

2 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

2 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`

2 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.

2 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()`.

2 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/*".


2 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

2 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

2 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.)

2 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.

2 months agofix(dotfiles): stop leaking HOSTNAME variable
Greg Hurrell [Thu, 24 Feb 2022 11:50:10 +0000 (12:50 +0100)] 
fix(dotfiles): stop leaking HOSTNAME variable

This variable could be useful, but I don't want to accidentally set it
globally in a file like this one.

It was added in 9d3e4a539363d548e ("chore: make some work-specific
config available on personal machine", Sep 17, 2019) and was already
leaking globally then. The last reference to it was removed in
6465fa42bf6e5728b ("chore: remove Liferay-specific config and tools",
May 6, 2021).

So, remove it, and use an anonymous local function so that any variables
I add here in the future don't wind up leaking, provided I just follow
the pattern.

2 months agofeat(dotfiles): teach "the-hub" Raycast script to take a search param
Greg Hurrell [Thu, 24 Feb 2022 09:49:58 +0000 (10:49 +0100)] 
feat(dotfiles): teach "the-hub" Raycast script to take a search param

Because "?q=foo+bar" (or "?q=foo%20bar") works now.

2 months agofeat(pacman): install `mtr`
Greg Hurrell [Tue, 22 Feb 2022 09:53:35 +0000 (10:53 +0100)] 
feat(pacman): install `mtr`

Because as I said here:

this is cool/useful.

2 months agofix(karabiner): enable overwriting of symlink
Greg Hurrell [Mon, 21 Feb 2022 07:45:36 +0000 (08:45 +0100)] 
fix(karabiner): enable overwriting of symlink

Just like I did in 14922be1, needed to be able to replace these symlinks
when I changed my login username.

2 months agochore: tell Prettier to ignore screenkey.json
Greg Hurrell [Mon, 21 Feb 2022 00:17:34 +0000 (01:17 +0100)] 
chore: tell Prettier to ignore screenkey.json

Seeing as it is a generated file, written by the tool, and every time I
touch any setting in the UI it is going to get rewritten like this.

2 months agorefactor(dotfiles): tweak i3-gaps to fit screenkey
Greg Hurrell [Sun, 20 Feb 2022 23:46:16 +0000 (00:46 +0100)] 
refactor(dotfiles): tweak i3-gaps to fit screenkey

Turning off `inverse_outer` because it messes with my plan to make
screenkey not overlap with other windows.

    i3-msg gaps bottom all set 70

makes sure that the windows don't overlap, but when `smart_gaps
inverse_outer` is in effect, it only works on workspaces with exactly
one window on them. As I had gaps set to 0 anyway, there is no point in
having this setting, so I am just commenting it out.

Added a `gaps` function so that I don't have to remember that `i3-msg`

2 months agofix(systemd): enable overwriting of symlink
Greg Hurrell [Sun, 20 Feb 2022 23:27:12 +0000 (00:27 +0100)] 
fix(systemd): enable overwriting of symlink

Needed to be able to re-run this role after renaming my user login from
"glh" to "wincent" in 1a206b8f.

2 months agofeat(dotfiles): add screenkey config
Greg Hurrell [Sun, 20 Feb 2022 23:26:47 +0000 (00:26 +0100)] 
feat(dotfiles): add screenkey config

2 months agochore: rename user account from "glh" to "wincent"
Greg Hurrell [Sat, 19 Feb 2022 23:55:47 +0000 (00:55 +0100)] 
chore: rename user account from "glh" to "wincent"

Parent commit made me think about this and I figure, why not? "wincent"
is the username I used historically from the first days of Mac OS X
(including prior to the first public beta in 2000) on all of my personal
machines. From 2011 to 2013 I worked for `$startup` and had my first
employer-provided machines, and IIRC the username I used on those was

Then at `$megaCorp`, "glh" was my username from 2014 to 2018, and I
ended up using that on my personal laptop, which I acquired in 2017, for
consistency. When I got a Linux desktop in 2020 I again opted for "glh"
for consistency.

But there was a fly in the ointment: at `$nextJob` they had given
me "greghurrell" as a username (from 2019 to 2020), and finally at
`$currentJob` (2021 to current) it's again "wincent".

All of which is to say, it seems I can and may as well just go back to
using "wincent" everywhere again: personal laptop, Linux desktop, and
work laptop.

2 months agochore(homebrew): install Raycast on personal machine too
Greg Hurrell [Sat, 19 Feb 2022 22:40:53 +0000 (23:40 +0100)] 
chore(homebrew): install Raycast on personal machine too

Having used it on my work machine since October 2021, I am pretty happy
with it from a UX perspective, and I find it distracting to have two
very similar tools on different machines; every time I pull up Alfred I
feel somehow surprised by it.

I _do_ have some misgivings about Raycast, though:

- They notoriously boasted about not using code review (or at least, not
  blocking on code review) in their development process.
- The story for syncing between machines is very weak indeed. I have
  some helper scripts already committed to my dotfiles, but to get
  everything else brought across I had to:

  1. Export settings from work machine.
  2. Sync `.rayconfig` file (which is, fortunately, just gzipped JSON)
     over from work machine to personal machine.
  3. "Gunzip" the config file by renaming it to "Raycast.rayconfig.Z"
     and doing `zcat Raycast.rayconfig > Raycast.rayconfig`.
  4. Edit paths in the file because I have different usernames on these
     machines; eg. everywhere it said:


     I had to change it to:


  5. Redo gzip compression with `gzip Raycast.rayconfig`.
  6. Rename the file from "Raycast.rayconfig.gz" to "Raycast.rayconfig".
  7. Finally, import the settings.

After all that, things mostly worked. Needed to do some other one-off

- In "Security" preference pane, under "Accessibility", grant access so
  that in order for text expansion to work.
- Set Command-Space to open Raycast.
- Set Raycast to launch at login
- Tell Alfred not to use Command-Space anymore (but still run at login,
  because we need it for dynamic placeholders in snippets — specifically
  for my `;date` snippet — which Raycast can't do yet).
- Turn off stuff that I don't need Alfred to do any more, like record
  clipboard history.

I'm not going to rename my user account from "glh" to "wincent" just to
make this easier, although part of me is tempted to do so... I always
used to use "wincent" on my machines, until I started working for FB,
where my username was "glh", and that got me in the habit of using that,
so I switched to it on my personal laptop and my Linux desktop too. Then
I started working for GitHub, and on that machine my username is my
GitHub handle ("wincent"). 🤦

2 months agodocs: update Big Sur references → Monterey
Greg Hurrell [Sat, 19 Feb 2022 21:48:22 +0000 (22:48 +0100)] 
docs: update Big Sur references → Monterey

2 months agorefactor(dotfiles): switch to more secure mode for xsecurelock
Greg Hurrell [Fri, 18 Feb 2022 19:10:08 +0000 (20:10 +0100)] 
refactor(dotfiles): switch to more secure mode for xsecurelock

Because I don't care about the seeing the length of the password, only
that the program is actually receiving key presses.

3 months agofeat(apt): install iotop
Greg Hurrell [Wed, 16 Feb 2022 14:34:45 +0000 (15:34 +0100)] 
feat(apt): install iotop

Specifically because I want to figure out why installs are so slow on
Codespaces. (Spoiler alert: looking at `htop` and `iotop` shows nothing
much to be happening during long slow `git fetch` or Neovim build or
Skim build... You can see `rustc` going at it pretty hard during the
Skim build, but I think the instance may be lying about the actually
accessible CPU capacity; either that, or the entire FS is just
excruciatingly slow until warmed up...).

3 months agofix(nvim): teach `:OpenOnGitHub` to open URLs with spaces in them
Greg Hurrell [Wed, 9 Feb 2022 12:09:05 +0000 (13:09 +0100)] 
fix(nvim): teach `:OpenOnGitHub` to open URLs with spaces in them

Because even with shell escaping, the macOS open tool will complain if
you give it a command like:

    open ''


    The file $PWD/https:/ does not exist.

3 months agofeat(nvim): try to use current branch in `:OpenOnGitHub`
Greg Hurrell [Wed, 9 Feb 2022 12:00:17 +0000 (13:00 +0100)] 
feat(nvim): try to use current branch in `:OpenOnGitHub`

Will see if this is annoying or not. Because if you're on "main" or
"master" it is going to be nice, but if you are on
"topic-branch-that-maybe-i-have-not-pushed-yet", it could become
irritating. If it does, I'll look at making this even smarter, like
trying to detect the base branch if the remote doesn't seem to have a
branch matching the topic.

3 months agorefactor(dotfiles): override Git's merge.conflictStyle differently
Greg Hurrell [Wed, 9 Feb 2022 11:32:04 +0000 (12:32 +0100)] 
refactor(dotfiles): override Git's merge.conflictStyle differently

Because the way I was trying to do it in 5de84b453699c976f7e2a91e262116
doesn't work. Reported the problem on the Git mailing list here:

But even if it does get fixed, the fix will only apply in new releases,
so we have to work around it here.

The problem is that, when running an old version of Git, `git
checkout` dies immediately on seeing an unrecognized value for
`merge.conflictStyle` in `~/.gitconfig`, even though we later override
it with a backwards-compatible value in `~/.gitconfig.d/codespaces`, and
even though `git config merge.conflictStyle` reports the overridden

3 months agochore(dotfiles): update zsh autocompletion for "gg owners"
Greg Hurrell [Thu, 3 Feb 2022 13:27:47 +0000 (14:27 +0100)] 
chore(dotfiles): update zsh autocompletion for "gg owners"

3 months agorefactor(dotfiles): rename `gg serviceowners` to `gg owners`
Greg Hurrell [Thu, 3 Feb 2022 13:23:41 +0000 (14:23 +0100)] 
refactor(dotfiles): rename `gg serviceowners` to `gg owners`

Because it is easier to type the latter, and because I am sick of seeing
zsh helpfully offer:

    zsh: correct 'serviceowners' to 'SERVICEOWNERS' [yes, no, edit, abort]? n

The old subcommand name will continue to work as an alias, thanks to the

3 months agofix(dotfiles): cope with older Git on Codespaces
Greg Hurrell [Wed, 2 Feb 2022 14:21:15 +0000 (15:21 +0100)] 
fix(dotfiles): cope with older Git on Codespaces

This hacky fix seems better than the alternatives of:

- Templating out `~/.gitconfig` differently based on an install-time
  version check.
- Building a newer version of Git from source when setting up a

3 months agofix(dotfiles): make "emp something something" not blow up
Greg Hurrell [Mon, 31 Jan 2022 09:47:09 +0000 (10:47 +0100)] 
fix(dotfiles): make "emp something something" not blow up

The search facility here isn't very good (we can only search by login,
not name), but the least we can do is not blow up if somebody does try
to search for "foo bar".

So, convert spaces to pluses before trying to open the URL. This
prevents the `open` tool from complaining with:

    The file $absolute-path-to-current-directory/$some-url?login=foo bar does not exist.

ie. note how the space in the "foo bar" causes the tool to treat the
argument as a non-URL, and it ties to open that bizarre mongrel
formed by mashing the absolute path to the current directory with the
URL that we're trying to open.

3 months agofix(vim): update Ferret submodule to work around rg v13.0.0 edgecase
Greg Hurrell [Sat, 29 Jan 2022 23:20:30 +0000 (00:20 +0100)] 
fix(vim): update Ferret submodule to work around rg v13.0.0 edgecase

Just testing out current `HEAD` of the `next` branch before I move this
over to `main`:

* aspects/nvim/files/.config/nvim/pack/bundle/opt/ferret a513036...73c3390 (1):
  > fix: rg v13.0.0 hang when passing additional options that take arguments

3 months agochore(dotfiles): set Git merge.conflictStyle to zdiff3
Greg Hurrell [Tue, 25 Jan 2022 12:04:50 +0000 (13:04 +0100)] 
chore(dotfiles): set Git merge.conflictStyle to zdiff3

As described here:

I'd like to have this fall back to "diff3" in versions of Git prior to
v2.35.0, but I don't think I can do that without templating out a
different version of the config file based on different machines. 😢

3 months agofix(node): update installation check
Greg Hurrell [Tue, 18 Jan 2022 10:55:41 +0000 (11:55 +0100)] 
fix(node): update installation check

On a Codespace (running npm v7.5.2) and locally (running npm v7.21.0),
`--parseable` always exits with a 0 exit code. `--json` correctly exits
with 1 if no package is installed, and 0 otherwise.

3 months agochore(homebrew): add 1password-cli
Greg Hurrell [Sat, 22 Jan 2022 13:52:09 +0000 (14:52 +0100)] 
chore(homebrew): add 1password-cli

3 months agorefactor(nvim): update deprecated function call
Greg Hurrell [Wed, 19 Jan 2022 22:47:21 +0000 (23:47 +0100)] 
refactor(nvim): update deprecated function call

Make it use the new name. This changed around the Neovim v0.6.1
timeframe, as far as I can tell.

4 months agofeat(dotfiles): teach Hammerspoon about Edge
Greg Hurrell [Mon, 17 Jan 2022 17:25:02 +0000 (18:25 +0100)] 
feat(dotfiles): teach Hammerspoon about Edge

Specifically, get it to do the same thing we do for Chrome (that is,
take up the full screen when opening new windows).

4 months agochore(homebrew): install microsoft-edge cask
Greg Hurrell [Mon, 17 Jan 2022 17:14:04 +0000 (18:14 +0100)] 
chore(homebrew): install microsoft-edge cask

4 months agochore(homebrew): add "utm" cask
Greg Hurrell [Mon, 17 Jan 2022 12:10:54 +0000 (13:10 +0100)] 
chore(homebrew): add "utm" cask

Using this so I can run untrusted code in a VM (eg. evaluating

4 months agochore: stop Prettier from looking at CMake build artifacts
Greg Hurrell [Sat, 15 Jan 2022 14:28:30 +0000 (15:28 +0100)] 
chore: stop Prettier from looking at CMake build artifacts

Without this, `yarn format` will say:

    [error] aspects/interception/support/CMakeFiles/mac2linux.dir/compiler_depend.ts: SyntaxError: Invalid character. (1:1)
    [error] > 1 | # CMAKE generated file: DO NOT EDIT!
    [error]     | ^
    [error]   2 | # Timestamp file for compiler generated dependencies management for mac2linux.
    [error]   3 |

because it thinks this "ts" (timestamp) file is TS (TypeScript), which
is not the case.

4 months agochore(aur): set Microsoft Edge as default browser
Greg Hurrell [Sat, 15 Jan 2022 14:26:36 +0000 (15:26 +0100)] 
chore(aur): set Microsoft Edge as default browser

So that Ctrl+Shift+Click in Kitty will open in Edge instead of Chrome.

4 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

4 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.

4 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.

4 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

4 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.

4 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 -o output.png
    dot -Tsvg -o output.svg

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

As per: