]> git.wincent.com - wincent.git/commitdiff
style: reformat with 2-space indent
authorGreg Hurrell <greg@hurrell.net>
Thu, 6 May 2021 21:35:50 +0000 (23:35 +0200)
committerGreg Hurrell <greg@hurrell.net>
Thu, 6 May 2021 21:35:50 +0000 (23:35 +0200)
I'd only changed it to 4-space in order to be consistent with what I use
every day at work. Now we can go back to the comfort of The Old Ways
(tm).

168 files changed:
.editorconfig
.github/ISSUE_TEMPLATE.md
.github/PULL_REQUEST_TEMPLATE.md
.prettierrc
CHANGELOG.md
README.md
aspects/aur/aspect.ts
aspects/aur/index.ts
aspects/automator/aspect.json
aspects/automator/index.ts
aspects/automator/support/Open in Terminal Vim.js
aspects/automount/aspect.json
aspects/automount/index.ts
aspects/avahi/aspect.json
aspects/avahi/index.ts
aspects/backup/aspect.json
aspects/backup/index.ts
aspects/cron/aspect.json
aspects/cron/index.ts
aspects/defaults/aspect.json
aspects/defaults/index.ts
aspects/dotfiles/aspect.json
aspects/dotfiles/files/.clipper.json
aspects/dotfiles/files/.config/clipper/clipper.json
aspects/dotfiles/index.ts
aspects/fonts/aspect.json
aspects/fonts/index.ts
aspects/homebrew/aspect.json
aspects/homebrew/index.ts
aspects/interception/README.md
aspects/interception/aspect.json
aspects/interception/index.ts
aspects/iterm/README.md
aspects/iterm/aspect.json
aspects/iterm/files/DynamicProfiles/00-Base.json
aspects/iterm/files/DynamicProfiles/30-Mutt-Base.json
aspects/iterm/files/DynamicProfiles/60-Vim-Base.json
aspects/iterm/files/Sources/10-4K.json
aspects/iterm/files/Sources/10-Retina.json
aspects/iterm/files/Sources/40-Mutt-4K.json
aspects/iterm/files/Sources/40-Mutt-Retina.json
aspects/iterm/files/Sources/70-Vim-4K.json
aspects/iterm/files/Sources/70-Vim-Retina.json
aspects/iterm/index.ts
aspects/karabiner/aspect.json
aspects/karabiner/index.ts
aspects/karabiner/support/karabiner-test.js
aspects/karabiner/support/karabiner.js
aspects/launchd/README.md
aspects/launchd/aspect.json
aspects/launchd/index.ts
aspects/locale/aspect.json
aspects/locale/index.ts
aspects/meta/aspect.json
aspects/meta/index.ts
aspects/node/aspect.json
aspects/node/index.ts
aspects/pacman/aspect.ts
aspects/pacman/index.ts
aspects/ruby/aspect.json
aspects/ruby/index.ts
aspects/shell/aspect.json
aspects/shell/index.ts
aspects/ssh/aspect.json
aspects/ssh/index.ts
aspects/sshd/aspect.json
aspects/sshd/index.ts
aspects/systemd/aspect.json
aspects/systemd/index.ts
aspects/tampermonkey/aspect.json
aspects/tampermonkey/index.ts
aspects/tampermonkey/templates/UserScripts/github/enhanceReviewComments.user.js
aspects/tampermonkey/templates/UserScripts/github/makeTextAreasBigger.user.js
aspects/tampermonkey/templates/UserScripts/github/useFixedWidthFont.user.js
aspects/tampermonkey/templates/UserScripts/gmail/removeHighlighting.user.js
aspects/tampermonkey/templates/UserScripts/twitter/bypassClickTracking.user.js
aspects/tampermonkey/templates/UserScripts/twitter/hideLikeButtons.user.js
aspects/terminfo/aspect.json
aspects/terminfo/index.ts
aspects/vim/aspect.json
aspects/vim/index.ts
fig/Attributes.ts
fig/Compiler.ts
fig/Context.ts
fig/ErrorWithMetadata.ts
fig/HandlerRegistry.ts
fig/README.md
fig/Scanner.ts
fig/TaskRegistry.ts
fig/VariableRegistry.ts
fig/__tests__/Scanner-test.ts
fig/__tests__/compare-test.ts
fig/__tests__/merge-test.ts
fig/__tests__/regExpFromString-test.ts
fig/__tests__/resource-test.ts
fig/__tests__/stringify-test.ts
fig/__tests__/template-test.ts
fig/assert.ts
fig/child_process.ts
fig/compare.ts
fig/console.ts
fig/console/COLORS.ts
fig/dedent.ts
fig/dsl/fail.ts
fig/dsl/handler.ts
fig/dsl/operations/__tests__/cron-test.ts
fig/dsl/operations/__tests__/defaults-test.ts
fig/dsl/operations/backup.ts
fig/dsl/operations/command.ts
fig/dsl/operations/cron.ts
fig/dsl/operations/defaults.ts
fig/dsl/operations/fetch.ts
fig/dsl/operations/file.ts
fig/dsl/operations/line.ts
fig/dsl/operations/template.ts
fig/dsl/options.ts
fig/dsl/resource.ts
fig/dsl/root.ts
fig/dsl/skip.ts
fig/dsl/task.ts
fig/dsl/variable.ts
fig/dsl/variables.ts
fig/escapeRegExpPattern.ts
fig/fs.ts
fig/fs/assertMode.ts
fig/fs/stat.ts
fig/fs/tempdir.ts
fig/fs/tempfile.ts
fig/fs/tempname.ts
fig/getAspectFromCaller.ts
fig/getCaller.ts
fig/getOptions.ts
fig/globToRegExp.ts
fig/main.ts
fig/merge.ts
fig/path.ts
fig/posix/__tests__/chmod-test.ts
fig/posix/__tests__/ln-test.ts
fig/posix/__tests__/rm-test.ts
fig/posix/__tests__/touch-test.ts
fig/posix/chmod.ts
fig/posix/chown.ts
fig/posix/cp.ts
fig/posix/id.ts
fig/posix/ln.ts
fig/posix/mkdir.ts
fig/posix/mv.ts
fig/posix/rm.ts
fig/posix/touch.ts
fig/prompt.ts
fig/readAspect.ts
fig/readProject.ts
fig/regExpFromString.ts
fig/run.ts
fig/spawn.ts
fig/status.ts
fig/stringify.ts
fig/template.ts
fig/test.ts
fig/test/harness.ts
fig/types.d.ts
package.json
project.json
support/typegen/Builder.js
support/typegen/SCHEMAS.js
support/typegen/index.js
tsconfig.json
variables.ts

index 37f6464952de1eb22ed354e94bd700c8838462b0..343778c2def1bec77b36c42cdde8fdb3f4b20443 100644 (file)
@@ -3,4 +3,4 @@ root = true
 
 [*.{js,json,md,ts}]
 indent_style = space
-indent_size = 4
+indent_size = 2
index 7df03988e3fa3a1418d74fbe3d8c8387ef87b98a..c1669e931f9b74a98ffcdd82aa780f08d90c19d4 100644 (file)
@@ -10,6 +10,6 @@
 
 ## Specifications
 
--   Version:
--   Platform:
--   Subsystem:
+- Version:
+- Platform:
+- Subsystem:
index 51e1e7e8fc86215508488b9df66716c29dfac84d..e941bd0a823512066e854b6d1ddb90fcfa2f264f 100644 (file)
@@ -2,5 +2,5 @@ Fixes #
 
 ## Proposed Changes
 
--   ...
--   ...
+- ...
+- ...
index 0aad73f1b69638019397066a7ddd83a096df4494..a265b388b876d083e91d02e0120cc9af226e1b49 100644 (file)
@@ -1,3 +1,3 @@
 bracketSpacing: false
 singleQuote: true
-tabWidth: 4
+tabWidth: 2
index cc59dd66cf425c4a82e2a82385167c0005cf0afa..3399c1f68ede0cd23d5b8dfddf0d35080ae40a8a 100644 (file)
 
 ## 2020-12-21
 
--   [Zsh]: Added `rand` subcommand to `color` function (pull request [#95](https://github.com/wincent/wincent/pull/95) from Michael Lohmann).
+- [Zsh]: Added `rand` subcommand to `color` function (pull request [#95](https://github.com/wincent/wincent/pull/95) from Michael Lohmann).
 
 ## 2020-10-22
 
--   [Zsh]: Dropped `groot` alias in favor of `git root` function.
+- [Zsh]: Dropped `groot` alias in favor of `git root` function.
 
 ## 2020-10-10
 
--   [Vim]: Started ported many configuration files to Lua, optimizing for Neovim, while letting Vim degrade gracefully.
+- [Vim]: Started ported many configuration files to Lua, optimizing for Neovim, while letting Vim degrade gracefully.
 
 ## 2020-05-02
 
--   [Meta]: Dropped Ansible dependency.
+- [Meta]: Dropped Ansible dependency.
 
 ## 2020-05-01
 
--   [Mutt]: Remove Mutt config because I haven't used it for over a year.
+- [Mutt]: Remove Mutt config because I haven't used it for over a year.
 
 ## 2020-04-27
 
--   [Git]: Preseed pager with search pattern so that "n" can be used to jump to next commit or diff file.
+- [Git]: Preseed pager with search pattern so that "n" can be used to jump to next commit or diff file.
 
 ## 2019-10-13
 
--   [Vim]: Switched from [tpope/vim-markdown](https://github.com/tpope/vim-markdown) to [plasticboy/vim-markdown](https://github.com/plasticboy/vim-markdown); note that because this is replacing one submodule with another of the same name you may need to remove the old submodule directory with `rm` as well as removing the corresponding config in your local `.git/config` in order for the next `git submodule update --init` to succeed.
+- [Vim]: Switched from [tpope/vim-markdown](https://github.com/tpope/vim-markdown) to [plasticboy/vim-markdown](https://github.com/plasticboy/vim-markdown); note that because this is replacing one submodule with another of the same name you may need to remove the old submodule directory with `rm` as well as removing the corresponding config in your local `.git/config` in order for the next `git submodule update --init` to succeed.
 
 ## 2019-10-02
 
--   [Vim]: Add `:OpenOnGitHub` command.
+- [Vim]: Add `:OpenOnGitHub` command.
 
 ## 2019-09-27
 
--   [Vim]: Add `:Typecheck` command.
+- [Vim]: Add `:Typecheck` command.
 
 ## 2019-09-24
 
--   [Vim]: Add `:Lint` command.
+- [Vim]: Add `:Lint` command.
 
 ## 2019-09-19
 
--   [Zsh]: Make tabs visible in `git-diff` output.
+- [Zsh]: Make tabs visible in `git-diff` output.
 
 ## 2019-09-14
 
--   [Vim]: Implement "smart tab" functionality (ie. in projects that use tabs, use tabs for indentation and spacing for alignment).
+- [Vim]: Implement "smart tab" functionality (ie. in projects that use tabs, use tabs for indentation and spacing for alignment).
 
 ## 2019-09-14
 
--   [Zsh]: Add `git cp` alias for `git cherry-pick`.
+- [Zsh]: Add `git cp` alias for `git cherry-pick`.
 
 ## 2019-08-23
 
--   [Zsh]: Add `git wd` alias for `git diff --dirstat` (mnemonic: "[w]hat(changed) [d]irectory").
+- [Zsh]: Add `git wd` alias for `git diff --dirstat` (mnemonic: "[w]hat(changed) [d]irectory").
 
 ## 2019-08-22
 
--   [Vim]: Use floating preview window for LSP "hover" functionality.
+- [Vim]: Use floating preview window for LSP "hover" functionality.
 
 ## 2019-07-21
 
--   [Vim]: Switch from javascript-typescript-langserver to typescript-language-server.
+- [Vim]: Switch from javascript-typescript-langserver to typescript-language-server.
 
 ## 2019-06-26
 
--   [Zsh]: Add `git get` alias equivalent to a `git fresh` (see below) followed by a `git merge`.
+- [Zsh]: Add `git get` alias equivalent to a `git fresh` (see below) followed by a `git merge`.
 
 ## 2019-06-17
 
--   [Zsh]: Add `subtree` function (eg. `subtree '*.js'`, or `subtree '*.js|*.ts' src`).
+- [Zsh]: Add `subtree` function (eg. `subtree '*.js'`, or `subtree '*.js|*.ts' src`).
 
 ## 2019-06-07
 
--   [Vim]: Add `table` snippet for use in Markdown files.
+- [Vim]: Add `table` snippet for use in Markdown files.
 
 ## 2019-05-23
 
--   [Vim]: Moved plug-in submodules into "[~/.vim/pack/bundle/opt](https://github.com/wincent/wincent/tree/master/roles/dotfiles/files/.vim/pack/bundle/opt)"
+- [Vim]: Moved plug-in submodules into "[~/.vim/pack/bundle/opt](https://github.com/wincent/wincent/tree/master/roles/dotfiles/files/.vim/pack/bundle/opt)"
 
 ## 2019-04-26
 
--   [Zsh]: Add `git fresh` alias for `git remote update --prune`.
+- [Zsh]: Add `git fresh` alias for `git remote update --prune`.
 
 ## 2019-03-29
 
--   [Zsh]: Make Shift-Tab go to previous completion.
--   [Vim]: Force use of NERDTree instead of netrw when opening Vim with a directory argument.
+- [Zsh]: Make Shift-Tab go to previous completion.
+- [Vim]: Force use of NERDTree instead of netrw when opening Vim with a directory argument.
 
 ## 2019-03-27
 
--   [Vim]: Improve set-up for doing merge conflict resolution.
+- [Vim]: Improve set-up for doing merge conflict resolution.
 
 ## 2019-03-08
 
--   [Zsh]: Add `git wc` alias for `git whatchanged`.
+- [Zsh]: Add `git wc` alias for `git whatchanged`.
 
 ## 2019-02-27
 
--   [Zsh]: Add `git message` (shortcut: `git msg`) alias.
+- [Zsh]: Add `git message` (shortcut: `git msg`) alias.
 
 ## 2019-02-15
 
--   [Vim]: Make deoplete rank file-path matches above others.
+- [Vim]: Make deoplete rank file-path matches above others.
 
 ## 2019-02-14
 
--   [Vim]: `<S-Up>`, `<S-Down>` etc can be used to navigate with location list results.
+- [Vim]: `<S-Up>`, `<S-Down>` etc can be used to navigate with location list results.
 
 ## 2019-02-07
 
--   [Vim]: Apply tweaks for working in repos that use tabs instead of spaces.
+- [Vim]: Apply tweaks for working in repos that use tabs instead of spaces.
 
 ## 2019-01-25
 
--   [Vim]: Make improvements for working with TypeScript.
+- [Vim]: Make improvements for working with TypeScript.
 
 ## 2019-01-23
 
--   [Zsh]: Add `git ff` alias for doing fast-forward merges.
+- [Zsh]: Add `git ff` alias for doing fast-forward merges.
 
 ## 2019-01-10
 
--   [Vim]: Bind `<C-minus>` to `:NERDTreeFind`, to complement the existing `-` binding that does in-place directory navigation (vim-vinegar style).
+- [Vim]: Bind `<C-minus>` to `:NERDTreeFind`, to complement the existing `-` binding that does in-place directory navigation (vim-vinegar style).
 
 ## 2019-01-03
 
--   [Vim]: `J` and `K` visual mode mappings now take a count.
+- [Vim]: `J` and `K` visual mode mappings now take a count.
 
 ## 2018-12-24
 
--   [Zsh]: Running `color` without arguments refreshes the color scheme in the current window.
+- [Zsh]: Running `color` without arguments refreshes the color scheme in the current window.
 
 ## 2018-12-18
 
--   [Vim,Zsh]: Switched default color scheme to "default-dark".
+- [Vim,Zsh]: Switched default color scheme to "default-dark".
 
 ## 2018-11-25
 
--   [Zsh]: Overhaul prompt.
+- [Zsh]: Overhaul prompt.
 
 ## 2018-10-20
 
--   [Vim]: Set up [Goyo](https://github.com/junegunn/goyo.vim).
+- [Vim]: Set up [Goyo](https://github.com/junegunn/goyo.vim).
 
 ## 2018-03-21
 
--   Set up "fn" and "power" key equivalents on external keyboard.
+- Set up "fn" and "power" key equivalents on external keyboard.
 
 ## 2018-03-08
 
--   [Zsh]: Add `tw` and `tick` shell utilities.
+- [Zsh]: Add `tw` and `tick` shell utilities.
 
 ## 2018-03-06
 
--   [Vim]: Prevent `'spelllang'` setting from getting blown away in Markdown files.
+- [Vim]: Prevent `'spelllang'` setting from getting blown away in Markdown files.
 
 ## 2017-12-28
 
--   Make Caps Lock and Return repeat when held down.
--   Add back SpaceFN layer.
--   [Vim]: Add `<LocalLeader>p` mapping to print the highlight groups that apply at the current cursor position.
+- Make Caps Lock and Return repeat when held down.
+- Add back SpaceFN layer.
+- [Vim]: Add `<LocalLeader>p` mapping to print the highlight groups that apply at the current cursor position.
 
 ## 2017-12-22
 
--   [Vim]: Add "J"/"K" bindings to move visual selection up and down.
--   [Vim]: Add convenience `wincent#debug#log()` function for debugging purposes.
+- [Vim]: Add "J"/"K" bindings to move visual selection up and down.
+- [Vim]: Add convenience `wincent#debug#log()` function for debugging purposes.
 
 ## 2017-12-15
 
--   [Mutt]: Add "O" macro to save original message (mnemonic: "[O]riginal").
--   [Mutt]: Add "S" macro to save all attachments (mnemonic: "[S]ave").
+- [Mutt]: Add "O" macro to save original message (mnemonic: "[O]riginal").
+- [Mutt]: Add "S" macro to save all attachments (mnemonic: "[S]ave").
 
 ## 2017-12-06
 
--   Use iTerm dynamic profiles to change the font size when an external monitor is present.
+- Use iTerm dynamic profiles to change the font size when an external monitor is present.
 
 ## 2017-11-08
 
--   [Vim]: Dump YouCompleteMe.
+- [Vim]: Dump YouCompleteMe.
 
 ## 2017-11-01
 
--   [Mutt]: Mutt now uses different configs for work and personal machines.
+- [Mutt]: Mutt now uses different configs for work and personal machines.
 
 ## 2017-10-20
 
--   [Zsh]: Add `fzf`-powered functions for finding directories and history entries.
+- [Zsh]: Add `fzf`-powered functions for finding directories and history entries.
 
 ## 2017-06-16
 
--   Switch to Karabiner-Elements.
+- Switch to Karabiner-Elements.
 
 ## 2017-06-14
 
--   [Zsh]: Start using zsh-autosuggestions plug-in.
+- [Zsh]: Start using zsh-autosuggestions plug-in.
 
 ## 2017-06-06
 
--   [Vim]: Neovim is now the default `$EDITOR`.
+- [Vim]: Neovim is now the default `$EDITOR`.
 
 ## 2017-05-03
 
--   [Zsh]: Prompt now shows `$SHLVL` by repeating the `$` or `#` symbol.
--   [Zsh]: Prompt now indicates the presence of background jobs with a `*`.
--   [Vim]: Now turns off syntax highlighting in inactive splits.
+- [Zsh]: Prompt now shows `$SHLVL` by repeating the `$` or `#` symbol.
+- [Zsh]: Prompt now indicates the presence of background jobs with a `*`.
+- [Vim]: Now turns off syntax highlighting in inactive splits.
 
 ## 2017-02-09
 
--   [Vim]: Use `par` to re-wrap text.
+- [Vim]: Use `par` to re-wrap text.
 
 ## 2017-01-19
 
--   Get emoji working in the pager.
+- Get emoji working in the pager.
 
 ## 2016-12-24
 
--   [Mutt]: Use Markdown to send HTML email.
+- [Mutt]: Use Markdown to send HTML email.
 
 ## 2016-12-16
 
--   [Mutt]: Add retry with exponential backoff to mail sync script.
+- [Mutt]: Add retry with exponential backoff to mail sync script.
 
 ## 2016-12-14
 
--   Colorize man pages.
+- Colorize man pages.
 
 ## 2016-12-13
 
--   [Mutt]: Switched from `offlineimap` to `mbsync` (in the `isync` package) for mail synchronization.
+- [Mutt]: Switched from `offlineimap` to `mbsync` (in the `isync` package) for mail synchronization.
 
 ## 2016-12-12
 
--   [Mutt]: Added address autocompletion (via custom YouCompleteMe completer) inside Vim buffers of with filetype "mail".
+- [Mutt]: Added address autocompletion (via custom YouCompleteMe completer) inside Vim buffers of with filetype "mail".
 
 ## 2016-12-11
 
--   [Mutt]: Switched from `contacts` to `lbdb` for searching contacts.
+- [Mutt]: Switched from `contacts` to `lbdb` for searching contacts.
 
 ## 2016-12-07
 
--   [Mutt]: Switched from `w3m` to `elinks` for viewing links within emails.
+- [Mutt]: Switched from `w3m` to `elinks` for viewing links within emails.
 
 ## 2016-12-02
 
--   [Mutt]: Added `mutt` config.
+- [Mutt]: Added `mutt` config.
 
 ## 2016-11-30
 
--   [Vim]: Fine-tuned startup performance from 500ms down to 150ms.
+- [Vim]: Fine-tuned startup performance from 500ms down to 150ms.
 
 ## 2016-11-29
 
--   [Vim,Zsh]: Updated base16 dependencies, which means that the existing `dark`/`light` scheme names no longer apply. Instead of `dark tomorrow` (`color dark tomorrow`) or `light tomorrow` (`color light tomorrow`), run `color tomorrow-night` and `color tomorrow`. Note that some schemes [no longer have light variants](https://github.com/chriskempson/base16/issues/42) at all. `color` continues to show currently configured scheme information and `color help` shows a list of all available colors.
+- [Vim,Zsh]: Updated base16 dependencies, which means that the existing `dark`/`light` scheme names no longer apply. Instead of `dark tomorrow` (`color dark tomorrow`) or `light tomorrow` (`color light tomorrow`), run `color tomorrow-night` and `color tomorrow`. Note that some schemes [no longer have light variants](https://github.com/chriskempson/base16/issues/42) at all. `color` continues to show currently configured scheme information and `color help` shows a list of all available colors.
 
 ## 2016-11-28
 
--   Removed BSD license and replaced with public domain dedication.
+- Removed BSD license and replaced with public domain dedication.
 
 ## 2016-11-22
 
--   Replaced Karabiner configuration with custom Hammerspoon configuration, because Karabiner does not work on macOS Sierra.
-    -   Features that survived translation:
-        -   `<Capslock>` and `<Return>` retain their dual-purpose functionalities.
-        -   `<Tab>` and `<C-i>` can still be mapped independently in the terminal.
-    -   Features that have not yet been ported:
-        -   "SpaceFN" layer.
-    -   Features unlikely to be ported due to technical constraints:
-        -   `<Shift>` control over Caps Lock state.
-    -   Features that will not be ported because they can be solved by other means:
-        -   Remapping of YubiKey to work with Colemak.
+- Replaced Karabiner configuration with custom Hammerspoon configuration, because Karabiner does not work on macOS Sierra.
+  - Features that survived translation:
+    - `<Capslock>` and `<Return>` retain their dual-purpose functionalities.
+    - `<Tab>` and `<C-i>` can still be mapped independently in the terminal.
+  - Features that have not yet been ported:
+    - "SpaceFN" layer.
+  - Features unlikely to be ported due to technical constraints:
+    - `<Shift>` control over Caps Lock state.
+  - Features that will not be ported because they can be solved by other means:
+    - Remapping of YubiKey to work with Colemak.
 
 ## 2016-11-14
 
--   [Vim]: Add "breakpoints" to statusline that reduce the amount of information displayed as window width decreases.
--   [Vim]: Extracted macro replay functionality into a separate plug-in, [Replay](https://github.com/wincent/replay).
+- [Vim]: Add "breakpoints" to statusline that reduce the amount of information displayed as window width decreases.
+- [Vim]: Extracted macro replay functionality into a separate plug-in, [Replay](https://github.com/wincent/replay).
 
 ## 2016-11-10
 
--   [tmux]: Adding `<Prefix>-b` binding to jump back to previous shell prompt.
+- [tmux]: Adding `<Prefix>-b` binding to jump back to previous shell prompt.
 
 ## 2016-10-12
 
--   [tmux]: Change color of active/inactive panes to make currently active pane more obvious.
+- [tmux]: Change color of active/inactive panes to make currently active pane more obvious.
 
 ## 2016-10-11
 
--   Manage most of the macOS preferences via the Ansible `osx_defaults` module, instead of custom Ansible `command` tasks.
+- Manage most of the macOS preferences via the Ansible `osx_defaults` module, instead of custom Ansible `command` tasks.
 
 ## 2016-10-07
 
--   [Zsh]: Make `C-z` run `fg` at the shell prompt.
+- [Zsh]: Make `C-z` run `fg` at the shell prompt.
 
 ## 2016-07-05
 
--   [Zsh]: Bounce Dock icon when a shell command finishes running and the terminal is in the background.
+- [Zsh]: Bounce Dock icon when a shell command finishes running and the terminal is in the background.
 
 ## 2016-06-03
 
--   Set up [Clipper](https://github.com/wincent/clipper) to work via UNIX domain sockets rather than TCP ports for better security.
+- Set up [Clipper](https://github.com/wincent/clipper) to work via UNIX domain sockets rather than TCP ports for better security.
 
 ## 2016-05-11
 
--   [Vim,Zsh]: Switched default color scheme to "tomorrow-dark" (later renamed to "tomorrow-night").
+- [Vim,Zsh]: Switched default color scheme to "tomorrow-dark" (later renamed to "tomorrow-night").
 
 ## 2016-05-09
 
--   [Vim]: Use `<Tab>` to toggle folds.
+- [Vim]: Use `<Tab>` to toggle folds.
 
 ## 2016-05-02
 
--   Work around lengthy hangs running Ansible on macOS.
+- Work around lengthy hangs running Ansible on macOS.
 
 ## 2016-04-29
 
--   [Vim]: Extracted within-file find-and-replace enhancements into a separate plug-in, [Scalpel](https://github.com/wincent/scalpel).
+- [Vim]: Extracted within-file find-and-replace enhancements into a separate plug-in, [Scalpel](https://github.com/wincent/scalpel).
 
 ## 2016-04-10
 
--   [Vim]: Use "Powerline" glyphs to make statusline a little prettier.
--   Switch to Adobe Source Code Pro font.
+- [Vim]: Use "Powerline" glyphs to make statusline a little prettier.
+- Switch to Adobe Source Code Pro font.
 
 ## Older changes
 
--   Please see `git log --until=2016-04-10`, which should show around 1,500 commits dating as far back as May 2009.
+- Please see `git log --until=2016-04-10`, which should show around 1,500 commits dating as far back as May 2009.
index 09b3de682b7f097fe132993827e12b44db00bd30..d1e66d747b06e9fb134f2ee2189f64bfa1e259c7 100644 (file)
--- a/README.md
+++ b/README.md
@@ -4,12 +4,12 @@
 
 ![](https://raw.githubusercontent.com/wincent/wincent/media/screenshot.png)
 
--   Target platforms: macOS and Linux (see [Platform status](#platform-status) below).
--   Set-up method: ~~Beautiful and intricate snowflake~~ an incredibly over-engineered custom configuration framework called [Fig](./fig/README.md).
--   Visible in the screenshot:
-    -   [default-dark Base16](http://chriskempson.com/projects/base16/) color scheme (see [screenshots of other colorschemes](https://github.com/wincent/wincent/blob/media/colorschemes/README.md)).
-    -   [Adobe Source Code Pro](https://github.com/adobe-fonts/source-code-pro) (Light) font.
-    -   [Neovim](https://neovim.io), running inside [tmux](https://github.com/tmux/tmux), inside [iTerm2](http://www.iterm2.com/), on macOS "High Sierra".
+- Target platforms: macOS and Linux (see [Platform status](#platform-status) below).
+- Set-up method: ~~Beautiful and intricate snowflake~~ an incredibly over-engineered custom configuration framework called [Fig](./fig/README.md).
+- Visible in the screenshot:
+  - [default-dark Base16](http://chriskempson.com/projects/base16/) color scheme (see [screenshots of other colorschemes](https://github.com/wincent/wincent/blob/media/colorschemes/README.md)).
+  - [Adobe Source Code Pro](https://github.com/adobe-fonts/source-code-pro) (Light) font.
+  - [Neovim](https://neovim.io), running inside [tmux](https://github.com/tmux/tmux), inside [iTerm2](http://www.iterm2.com/), on macOS "High Sierra".
 
 ## Features
 
 
 [A set of dotfiles](https://github.com/wincent/wincent/tree/master/aspects/dotfiles/files) that I've been tweaking and twiddling since the early 2000s ([under version control](https://github.com/wincent/wincent/commit/61a7e2a830edb7) since 2009). Characteristics include:
 
--   Sane Vim pasting via bracketed paste mode.
--   Write access to local clipboard from local and remote hosts, inside and outside of tmux (via [Clipper](https://github.com/wincent/clipper)).
--   Full mouse support (pane/split resizing, scrolling, text selection) in Vim and tmux.
--   Focus/lost events for Vim inside tmux.
--   Cursor shape toggles on entering Vim.
--   Italics in the terminal.
--   Bundles a (not-excessive) number of [useful Vim plug-ins](https://github.com/wincent/wincent/tree/master/aspects/vim/files/.vim/pack).
--   Conservative Vim configuration (very few overrides of core functionality; most changes are unobtrusive enhancements; some additional functionality exposed via `<Leader>` and `<LocalLeader>` mappings.
--   Relatively restrained Zsh config, Bash-like but with a few Zsh perks, such as right-side prompt, auto-cd hooks, command elapsed time printing and such.
--   Unified color-handling (across iTerm2 and Vim) via [Base16 Shell](https://github.com/chriskempson/base16-shell).
--   Encrypted versioning of files with sensitive content (via [git-cipher](https://github.com/wincent/git-cipher)).
--   Comprehensive [Hammerspoon](http://www.hammerspoon.org/) [config](https://github.com/wincent/wincent/tree/master/aspects/dotfiles/files/.hammerspoon).
+- Sane Vim pasting via bracketed paste mode.
+- Write access to local clipboard from local and remote hosts, inside and outside of tmux (via [Clipper](https://github.com/wincent/clipper)).
+- Full mouse support (pane/split resizing, scrolling, text selection) in Vim and tmux.
+- Focus/lost events for Vim inside tmux.
+- Cursor shape toggles on entering Vim.
+- Italics in the terminal.
+- Bundles a (not-excessive) number of [useful Vim plug-ins](https://github.com/wincent/wincent/tree/master/aspects/vim/files/.vim/pack).
+- Conservative Vim configuration (very few overrides of core functionality; most changes are unobtrusive enhancements; some additional functionality exposed via `<Leader>` and `<LocalLeader>` mappings.
+- Relatively restrained Zsh config, Bash-like but with a few Zsh perks, such as right-side prompt, auto-cd hooks, command elapsed time printing and such.
+- Unified color-handling (across iTerm2 and Vim) via [Base16 Shell](https://github.com/chriskempson/base16-shell).
+- Encrypted versioning of files with sensitive content (via [git-cipher](https://github.com/wincent/git-cipher)).
+- Comprehensive [Hammerspoon](http://www.hammerspoon.org/) [config](https://github.com/wincent/wincent/tree/master/aspects/dotfiles/files/.hammerspoon).
 
 ### Homebrew
 
@@ -38,35 +38,35 @@ On macOS, [the "homebrew" aspect](https://github.com/wincent/wincent/tree/master
 
 On macOS, we use [Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements/), and on Linux, we use [Interception Tools](https://gitlab.com/interception/linux/tools) and a few other pieces to make the following changes:
 
--   Make Caps Lock serve as Backspace (when tapped) and Left Control (when chorded with another key). When held down alone, Caps Lock fires repeated Backspace events.
--   Make Return serve as Return (when tapped) and Right Control (when chorded with another key). When held down alone, Return fires repeated Return events.
--   Maps Control-I to F6 (only in MacVim and the terminal) so that it can be mapped independently from Tab in Vim.
--   Toggle Caps Lock on by tapping both Shift keys simultaneously.
--   Makes the function keys on my external Realforce keyboard behave like the "media" keys on Apple's keyboards.
+- Make Caps Lock serve as Backspace (when tapped) and Left Control (when chorded with another key). When held down alone, Caps Lock fires repeated Backspace events.
+- Make Return serve as Return (when tapped) and Right Control (when chorded with another key). When held down alone, Return fires repeated Return events.
+- Maps Control-I to F6 (only in MacVim and the terminal) so that it can be mapped independently from Tab in Vim.
+- Toggle Caps Lock on by tapping both Shift keys simultaneously.
+- Makes the function keys on my external Realforce keyboard behave like the "media" keys on Apple's keyboards.
 
 And these only on macOS:
 
--   Swap Option and Command keys on my external Realforce keyboard.
--   Make the "application" key (extra modifier key on right-hand side) behave as "fn" on Realforce keyboard.
--   Make "pause" (at far-right of function key row) behave as "power" (effectively, sleep) on Realforce keyboard.
--   Adds a "SpaceFN" layer that can be activated by holding down Space while hitting other keys; I use this to make the cursor keys available on or near the home row in any app.
+- Swap Option and Command keys on my external Realforce keyboard.
+- Make the "application" key (extra modifier key on right-hand side) behave as "fn" on Realforce keyboard.
+- Make "pause" (at far-right of function key row) behave as "power" (effectively, sleep) on Realforce keyboard.
+- Adds a "SpaceFN" layer that can be activated by holding down Space while hitting other keys; I use this to make the cursor keys available on or near the home row in any app.
 
 ### Zsh
 
 #### Functions
 
--   `ag`: Transparently wraps the `ag` executable so as to provide a centralized place to set defaults for that command (seeing as it has no "rc" file).
--   `bounce`: bounce the macOS Dock icon if the terminal is not in the foreground.
--   `color`: change terminal and Vim color scheme.
--   `fd`: "find directory" using fast `bfs` and `sk`; automatically `cd`s into the selected directory.
--   `fh`: "find [in] history"; selecting a history item inserts it into the command line but does not execute it.
--   `history`: overrides the (tiny) default history count.
--   `jump` (aliased to `j`): to jump to hashed directories.
--   `regmv`: bulk-rename files (eg. `regmv '/\.tif$/.tiff/' *`).
--   `scratch`: create a random temporary scratch directory and `cd` into it.
--   `tick`: moves an existing time warp (eg. `tick +1h`); see `tw` below for a description of time warp.
--   `tmux`: wrapper that reattches to pre-existing sessions, or creates new ones based on the current directory name; additionally, looks for a `.tmux` file to set up windows and panes (note that the first time a given `.tmux` file is encountered the wrapper asks the user whether to trust or skip it).
--   `tw` ("time warp"): overrides `GIT_AUTHOR_DATE` and `GIT_COMMITTER_DATE` (eg. `tw -1d`).
+- `ag`: Transparently wraps the `ag` executable so as to provide a centralized place to set defaults for that command (seeing as it has no "rc" file).
+- `bounce`: bounce the macOS Dock icon if the terminal is not in the foreground.
+- `color`: change terminal and Vim color scheme.
+- `fd`: "find directory" using fast `bfs` and `sk`; automatically `cd`s into the selected directory.
+- `fh`: "find [in] history"; selecting a history item inserts it into the command line but does not execute it.
+- `history`: overrides the (tiny) default history count.
+- `jump` (aliased to `j`): to jump to hashed directories.
+- `regmv`: bulk-rename files (eg. `regmv '/\.tif$/.tiff/' *`).
+- `scratch`: create a random temporary scratch directory and `cd` into it.
+- `tick`: moves an existing time warp (eg. `tick +1h`); see `tw` below for a description of time warp.
+- `tmux`: wrapper that reattches to pre-existing sessions, or creates new ones based on the current directory name; additionally, looks for a `.tmux` file to set up windows and panes (note that the first time a given `.tmux` file is encountered the wrapper asks the user whether to trust or skip it).
+- `tw` ("time warp"): overrides `GIT_AUTHOR_DATE` and `GIT_COMMITTER_DATE` (eg. `tw -1d`).
 
 #### Prompt
 
@@ -76,17 +76,17 @@ Zsh is configured with the following prompt:
 
 Visible here are:
 
--   Concise left-hand prompt consisting of:
-    -   Last component of current directory (abbreviates `$HOME` to `~` if possible).
-    -   Prompt marker, `❯`, the "[HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT](https://codepoints.net/U+276F)" (that's `\u276f`, or `e2 9d af` in UTF-8).
--   Extended right-hand size prompt which auto-hides when necessary to make room for long commands and contains:
-    -   Duration of previous command in adaptive units (seconds, minutes, hours, days, depending on duration).
-    -   Current version control branch name.
-    -   Current version control worktree status using colors that match those used in `git status`:
-        -   Green dot indicates staged changes.
-        -   Red dot indicates unstaged changes.
-        -   Blue dot indicates untracked files.
-    -   Full version of current working directory (again, abbreviating `$HOME` to `~`).
+- Concise left-hand prompt consisting of:
+  - Last component of current directory (abbreviates `$HOME` to `~` if possible).
+  - Prompt marker, `❯`, the "[HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT](https://codepoints.net/U+276F)" (that's `\u276f`, or `e2 9d af` in UTF-8).
+- Extended right-hand size prompt which auto-hides when necessary to make room for long commands and contains:
+  - Duration of previous command in adaptive units (seconds, minutes, hours, days, depending on duration).
+  - Current version control branch name.
+  - Current version control worktree status using colors that match those used in `git status`:
+    - Green dot indicates staged changes.
+    - Red dot indicates unstaged changes.
+    - Blue dot indicates untracked files.
+  - Full version of current working directory (again, abbreviating `$HOME` to `~`).
 
 Nested shells are indicated with additional prompt characters. For example, one nested shell:
 
@@ -118,14 +118,14 @@ If there are background processes, a yellow asterisk is shown:
 
 ## Dependencies
 
--   [tmux](https://github.com/tmux/tmux) 3.2 or later.
--   [Neovim](https://neovim.io) or [Vim](http://www.vim.org/) 8.0 or later with Ruby and Python support (although there's a reasonable amount of feature detection in order to degrade gracefully).
--   Relatively recent [Zsh](http://www.zsh.org/).
--   Relatively recent [Git](http://git-scm.com/).
--   [Clipper](https://wincent.com/products/clipper) for transparent access to the local system clipboard.
--   On macOS, [iTerm2](http://www.iterm2.com/). Additionally, only the latest version of macOS (although at the time of writing, I'm still on High Sierra) gets actively tested.
--   [Ruby](https://www.ruby-lang.org/).
--   [Adobe Source Code Pro](https://github.com/adobe-fonts/source-code-pro) or any other fixed-width font that includes the [Powerline glyphs](http://powerline.readthedocs.io/en/master/installation.html#fonts-installation).
+- [tmux](https://github.com/tmux/tmux) 3.2 or later.
+- [Neovim](https://neovim.io) or [Vim](http://www.vim.org/) 8.0 or later with Ruby and Python support (although there's a reasonable amount of feature detection in order to degrade gracefully).
+- Relatively recent [Zsh](http://www.zsh.org/).
+- Relatively recent [Git](http://git-scm.com/).
+- [Clipper](https://wincent.com/products/clipper) for transparent access to the local system clipboard.
+- On macOS, [iTerm2](http://www.iterm2.com/). Additionally, only the latest version of macOS (although at the time of writing, I'm still on High Sierra) gets actively tested.
+- [Ruby](https://www.ruby-lang.org/).
+- [Adobe Source Code Pro](https://github.com/adobe-fonts/source-code-pro) or any other fixed-width font that includes the [Powerline glyphs](http://powerline.readthedocs.io/en/master/installation.html#fonts-installation).
 
 ## Platform status
 
@@ -153,10 +153,10 @@ sudo pacman -S git ruby tmux vim
 git clone --recursive https://github.com/wincent/wincent.git
 ```
 
--   `git`: In order to clone the repo.
--   `ruby`: So that git-cipher can run (also used to build Command-T).
--   `tmux`: Just for comfort (eg. so you can see scrollback).
--   `vim`: Because the Vim aspect needs Vim (it runs `vim` to do a `:helptags` update).
+- `git`: In order to clone the repo.
+- `ruby`: So that git-cipher can run (also used to build Command-T).
+- `tmux`: Just for comfort (eg. so you can see scrollback).
+- `vim`: Because the Vim aspect needs Vim (it runs `vim` to do a `:helptags` update).
 
 ### Install
 
@@ -164,33 +164,33 @@ git clone --recursive https://github.com/wincent/wincent.git
 
 At the time of writing, these are the aspects, which you can expect to change over time:
 
--   On macOS only:
-    -   **automator**: Scripts for use with Automator
-    -   **automount**: Sets up macOS's automount facility
-    -   **backup**: Backup scripts
-    -   **cron**: Sets up cron files
-    -   **defaults**: Sets up defaults (ie. preferences) on macOS
-    -   **fonts**: Installs Source Code Pro font files
-    -   **homebrew**: Installs and updates Homebrew
-    -   **iterm**: Dynamic profiles for iTerm
-    -   **karabiner**: Configures Karabiner-Elements (keyboard customization).
-    -   **launchd**: Configures launchd
-    -   **node**: Installs Node.js
-    -   **ruby**: Installs Ruby gems
-    -   **ssh**: Manages local SSH config
-    -   **tampermonkey**: Sets up UserScripts
--   On Linux only:
-    -   **aur**: Installs packages from the Arch User Repository.
-    -   **interception**: Sets up Interceptions Tools (keyboard customization).
-    -   **locale**: Sets up /etc/locale.conf
-    -   **pacman**: Installs packages via the Pacman package manager
-    -   **systemd**: Set up services that run from systemd
--   On both macOS and Linux:
-    -   **dotfiles**: Creates symlinks in \$HOME to the dotfiles in this repo
-    -   **meta**: Tests the configuration framework
-    -   **shell**: Sets the use shell to zsh
-    -   **terminfo**: Sets up terminfo database entries for italics and 256-color support
-    -   **vim**: Configures Vim
+- On macOS only:
+  - **automator**: Scripts for use with Automator
+  - **automount**: Sets up macOS's automount facility
+  - **backup**: Backup scripts
+  - **cron**: Sets up cron files
+  - **defaults**: Sets up defaults (ie. preferences) on macOS
+  - **fonts**: Installs Source Code Pro font files
+  - **homebrew**: Installs and updates Homebrew
+  - **iterm**: Dynamic profiles for iTerm
+  - **karabiner**: Configures Karabiner-Elements (keyboard customization).
+  - **launchd**: Configures launchd
+  - **node**: Installs Node.js
+  - **ruby**: Installs Ruby gems
+  - **ssh**: Manages local SSH config
+  - **tampermonkey**: Sets up UserScripts
+- On Linux only:
+  - **aur**: Installs packages from the Arch User Repository.
+  - **interception**: Sets up Interceptions Tools (keyboard customization).
+  - **locale**: Sets up /etc/locale.conf
+  - **pacman**: Installs packages via the Pacman package manager
+  - **systemd**: Set up services that run from systemd
+- On both macOS and Linux:
+  - **dotfiles**: Creates symlinks in \$HOME to the dotfiles in this repo
+  - **meta**: Tests the configuration framework
+  - **shell**: Sets the use shell to zsh
+  - **terminfo**: Sets up terminfo database entries for italics and 256-color support
+  - **vim**: Configures Vim
 
 #### Examples
 
@@ -239,16 +239,16 @@ Unless otherwise noted, the contents of this repo are in the public domain. See
 
 The repo is written and maintained by Greg Hurrell &lt;[greg@hurrell.net](mailto:greg@hurrell.net)&gt;. Other contributors that have submitted patches include, in alphabetical order:
 
--   Anton Kastritskiy
--   Joe Lencioni
--   Jonathan Wilkins
--   Keng Kiat Lim
--   Mark Stenglein
--   Matthew Byrne
--   Michael Lohmann
--   Stone C. Lasley
--   Victor Igor
--   Zac Collier
+- Anton Kastritskiy
+- Joe Lencioni
+- Jonathan Wilkins
+- Keng Kiat Lim
+- Mark Stenglein
+- Matthew Byrne
+- Michael Lohmann
+- Stone C. Lasley
+- Victor Igor
+- Zac Collier
 
 This list produced with:
 
index b48b724011ef29b1e03c59991f17a11954234c34..75adfec0c2652c89c89750769c50d87a1ddb30cb 100644 (file)
@@ -1,16 +1,16 @@
 export default {
-    description: 'Installs and updates packages from the Arch User Repository',
-    variables: {
-        packages: [
-            'bfs', // Breadth-first `find` replacement.
-            'clipper-git', // Clipboard daemon.
-            'google-chrome', // Web browser.
-            'it87-dkms-git', // Allows `sensors` to pick up on it8688 chipset.
-            'lf', // Command-line file explorer.
-            'neovim-git', // Neovim with latest LSP goodness.
-            'obs-studio-git', // Open Broadcaster Software (OBS) for streaming/screen-casting.
-            'ttf-symbola', // Font with lots of Unicode glyphs (eg. u276f, for prompt).
-            'watchman', // Fast filesystem index (speeds up Command-T).
-        ],
-    },
+  description: 'Installs and updates packages from the Arch User Repository',
+  variables: {
+    packages: [
+      'bfs', // Breadth-first `find` replacement.
+      'clipper-git', // Clipboard daemon.
+      'google-chrome', // Web browser.
+      'it87-dkms-git', // Allows `sensors` to pick up on it8688 chipset.
+      'lf', // Command-line file explorer.
+      'neovim-git', // Neovim with latest LSP goodness.
+      'obs-studio-git', // Open Broadcaster Software (OBS) for streaming/screen-casting.
+      'ttf-symbola', // Font with lots of Unicode glyphs (eg. u276f, for prompt).
+      'watchman', // Fast filesystem index (speeds up Command-T).
+    ],
+  },
 };
index 8ee595d76dd146cc20b3ab54686037666fdaada0..5a1d66bc0168d1c8670ab1cb4ea2ba052161a0e3 100644 (file)
@@ -1,94 +1,85 @@
 import {
-    attributes,
-    command,
-    file,
-    handler,
-    resource,
-    skip,
-    task as defineTask,
-    variable,
+  attributes,
+  command,
+  file,
+  handler,
+  resource,
+  skip,
+  task as defineTask,
+  variable,
 } from 'fig';
 import {join} from 'path';
 
 // TODO: DRY this up; it is in three files now
 function task(name: string, callback: () => Promise<void>) {
-    defineTask(name, async () => {
-        if (attributes.distribution === 'arch') {
-            await callback();
-        } else {
-            skip('not on Arch Linux');
-        }
-    });
+  defineTask(name, async () => {
+    if (attributes.distribution === 'arch') {
+      await callback();
+    } else {
+      skip('not on Arch Linux');
+    }
+  });
 }
 
 task('fetch yay', async () => {
-    // TODO: make a `git` operation? (if I need to do this in more than one
-    // place)
-    await command('git', ['clone', 'https://aur.archlinux.org/yay.git/'], {
-        chdir: 'vendor',
-        creates: 'vendor/yay',
-        raw: true,
-    });
+  // TODO: make a `git` operation? (if I need to do this in more than one
+  // place)
+  await command('git', ['clone', 'https://aur.archlinux.org/yay.git/'], {
+    chdir: 'vendor',
+    creates: 'vendor/yay',
+    raw: true,
+  });
 });
 
 task('install yay', async () => {
-    await command('makepkg', ['-si', '--noconfirm'], {
-        chdir: 'vendor/yay',
-        creates: '/usr/bin/yay',
-    });
+  await command('makepkg', ['-si', '--noconfirm'], {
+    chdir: 'vendor/yay',
+    creates: '/usr/bin/yay',
+  });
 });
 
 task('install packages', async () => {
-    await command('yay', [
-        '-S',
-        '--noconfirm',
-        ...variable.strings('packages'),
-    ]);
+  await command('yay', ['-S', '--noconfirm', ...variable.strings('packages')]);
 });
 
 task('create ~/.config/systemd/user', async () => {
-    for (const directory of [
-        '~/.config',
-        '~/.config/systemd',
-        '~/.config/systemd/user',
-    ]) {
-        await file({
-            path: directory,
-            state: 'directory',
-        });
-    }
+  for (const directory of [
+    '~/.config',
+    '~/.config/systemd',
+    '~/.config/systemd/user',
+  ]) {
+    await file({
+      path: directory,
+      state: 'directory',
+    });
+  }
 });
 
 task('install ~/.config/systemd/user/clipper.service', async () => {
-    await file({
-        notify: 'enable clipper.service',
-        path: '~/.config/systemd/user/clipper.service',
-        src: '/usr/share/clipper/clipper.service',
-        state: 'file',
-    });
+  await file({
+    notify: 'enable clipper.service',
+    path: '~/.config/systemd/user/clipper.service',
+    src: '/usr/share/clipper/clipper.service',
+    state: 'file',
+  });
 });
 
 task('set up sensors', async () => {
-    for (const conf of [
-        'etc/modprobe.d/it87.conf',
-        'etc/modules-load.d/it87.conf',
-        'etc/sensors.d/gigabyte-x570.conf',
-    ]) {
-        await file({
-            path: join('/', conf),
-            src: resource.file(conf),
-            state: 'file',
-            sudo: true,
-        });
-    }
+  for (const conf of [
+    'etc/modprobe.d/it87.conf',
+    'etc/modules-load.d/it87.conf',
+    'etc/sensors.d/gigabyte-x570.conf',
+  ]) {
+    await file({
+      path: join('/', conf),
+      src: resource.file(conf),
+      state: 'file',
+      sudo: true,
+    });
+  }
 });
 
 handler('enable clipper.service', async () => {
-    await command('systemctl', ['--user', 'daemon-reload']);
-    await command('systemctl', [
-        '--user',
-        'enable',
-        'clipper.service',
-        '--now',
-    ]);
+  await command('systemctl', ['--user', 'daemon-reload']);
+  await command('systemctl', ['--user', 'enable', 'clipper.service', '--now']);
 });
index ee96423e923e033f0e3dbee9336ce250784f10d3..83ca0bf784c50797ab5710e1006fda3e46ff4208 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Scripts for use with Automator"
+  "description": "Scripts for use with Automator"
 }
index 77b61fe2e3044abfbca79da27767ce555b3005ab..da231989d27f6a33c25e755647a6f25847502dd1 100644 (file)
@@ -1,10 +1,10 @@
 import {command, path, resource, task} from 'fig';
 
 task('create "Open in Terminal Vim.app"', async () => {
-    const script = resource.support('Open in Terminal Vim.applescript');
-    const contents = resource.support('Open in Terminal Vim.js');
+  const script = resource.support('Open in Terminal Vim.applescript');
+  const contents = resource.support('Open in Terminal Vim.js');
 
-    await command('osascript', [script, contents], {
-        creates: path.home.join('bin/Open in Terminal Vim.app'),
-    });
+  await command('osascript', [script, contents], {
+    creates: path.home.join('bin/Open in Terminal Vim.app'),
+  });
 });
index d53b1b5125f514c86d101a6d14f4211cbf4d7231..beecc64a39306f5f16547d3a1f4ce3def67ab4fe 100644 (file)
@@ -1,44 +1,44 @@
 function run(input, _parameters) {
-    var iTerm = Application('iTerm2');
+  var iTerm = Application('iTerm2');
 
-    iTerm.activate();
+  iTerm.activate();
 
-    var windows = iTerm.windows();
+  var windows = iTerm.windows();
 
-    var window;
+  var window;
 
-    var tab;
+  var tab;
 
-    if (windows.length) {
-        window = iTerm.currentWindow();
+  if (windows.length) {
+    window = iTerm.currentWindow();
 
-        tab = window.createTabWithDefaultProfile();
-    } else {
-        window = iTerm.createWindowWithDefaultProfile();
+    tab = window.createTabWithDefaultProfile();
+  } else {
+    window = iTerm.createWindowWithDefaultProfile();
 
-        tab = window.currentTab();
-    }
+    tab = window.currentTab();
+  }
 
-    var session = tab.currentSession();
+  var session = tab.currentSession();
 
-    var files = [];
+  var files = [];
 
-    for (var i = 0; i < input.length; i++) {
-        files.push(quotedForm(input[i]));
-    }
+  for (var i = 0; i < input.length; i++) {
+    files.push(quotedForm(input[i]));
+  }
 
-    session.write({text: 'vim ' + files.join(' ')});
+  session.write({text: 'vim ' + files.join(' ')});
 }
 
 // Based on: https://ruby-doc.org/stdlib-2.3.0/libdoc/shellwords/rdoc/Shellwords.html#method-c-shellescape
 function quotedForm(path) {
-    var string = path.toString();
+  var string = path.toString();
 
-    if (string === '' || string === null) {
-        return "''";
-    }
+  if (string === '' || string === null) {
+    return "''";
+  }
 
-    return string
-        .replace(/([^a-z0-9_\-.,:\/@\n])/gi, '\\$1')
-        .replace(/\n/g, "'\n'");
+  return string
+    .replace(/([^a-z0-9_\-.,:\/@\n])/gi, '\\$1')
+    .replace(/\n/g, "'\n'");
 }
index 051cfa3bff26d4f4fe9d4874ca45666f72905c62..a752a0fa634263985bd5417f1b78713115a25668 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Fixes an annoying default behavior in the macOS automount system"
+  "description": "Fixes an annoying default behavior in the macOS automount system"
 }
index a82c382fe4a14419a73660129d751d49a4448b54..1629abad2692fde38179bc9e6d1fbd3152400075 100644 (file)
@@ -1,19 +1,19 @@
 import {command, handler, line, skip, task, variable} from 'fig';
 
 task('configure /etc/auto_master', async () => {
-    if (variable('identity') === 'wincent') {
-        await line({
-            notify: 'flush cache',
-            path: '/etc/auto_master',
-            regexp: /^\s*#?\s*\/net\s+/,
-            sudo: true,
-            line: '#/net\t\t\t-hosts\t\t-nobrowse,hidefromfinder,nosuid',
-        });
-    } else {
-        skip();
-    }
+  if (variable('identity') === 'wincent') {
+    await line({
+      notify: 'flush cache',
+      path: '/etc/auto_master',
+      regexp: /^\s*#?\s*\/net\s+/,
+      sudo: true,
+      line: '#/net\t\t\t-hosts\t\t-nobrowse,hidefromfinder,nosuid',
+    });
+  } else {
+    skip();
+  }
 });
 
 handler('flush cache', async () => {
-    await command('automount', ['-vc'], {sudo: true});
+  await command('automount', ['-vc'], {sudo: true});
 });
index cf45361a6babdaef47f786ca613e103a5fde297f..25ce1e250b5d954055e78915b63d557efa8782e7 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Sets up zeroconf (\"Bonjour\") networking via Avahi"
+  "description": "Sets up zeroconf (\"Bonjour\") networking via Avahi"
 }
index 20cf33d0eb59da971f6ca7afdcbd285322255988..7185ff8f6d00c33b64c5dfbf40b0e5112d1dd4bc 100644 (file)
@@ -1,44 +1,44 @@
 import {command, fail, file, task} from 'fig';
 
 task('activate avahi-daemon', async () => {
-    // TODO: refactor this because I have almost identical code in sshd aspect
-    const result = await command('systemctl', ['is-active', 'avahi-daemon'], {
-        failedWhen: () => false,
-    });
+  // TODO: refactor this because I have almost identical code in sshd aspect
+  const result = await command('systemctl', ['is-active', 'avahi-daemon'], {
+    failedWhen: () => false,
+  });
 
-    if (result && typeof result.status === 'number') {
-        if (result.status !== 0) {
-            await command('systemctl', ['start', 'avahi-daemon.service'], {
-                sudo: true,
-            });
-        }
-    } else {
-        fail('could not determine avahi-daemon status');
+  if (result && typeof result.status === 'number') {
+    if (result.status !== 0) {
+      await command('systemctl', ['start', 'avahi-daemon.service'], {
+        sudo: true,
+      });
     }
+  } else {
+    fail('could not determine avahi-daemon status');
+  }
 });
 
 task('enable avahi-daemon', async () => {
-    // TODO: refactor this because I have almost identical code in sshd aspect
-    const result = await command('systemctl', ['is-enabled', 'avahi-daemon'], {
-        failedWhen: () => false,
-    });
+  // TODO: refactor this because I have almost identical code in sshd aspect
+  const result = await command('systemctl', ['is-enabled', 'avahi-daemon'], {
+    failedWhen: () => false,
+  });
 
-    if (result && typeof result.status === 'number') {
-        if (result.status !== 0) {
-            await command('systemctl', ['enable', 'avahi-daemon.service'], {
-                sudo: true,
-            });
-        }
-    } else {
-        fail('could not determine avahi-daemon status');
+  if (result && typeof result.status === 'number') {
+    if (result.status !== 0) {
+      await command('systemctl', ['enable', 'avahi-daemon.service'], {
+        sudo: true,
+      });
     }
+  } else {
+    fail('could not determine avahi-daemon status');
+  }
 });
 
 task('enable /etc/services/avahi/ssh.service', async () => {
-    await file({
-        path: '/etc/avahi/services/ssh.service',
-        src: '/usr/share/doc/avahi/ssh.service',
-        state: 'file',
-        sudo: true,
-    });
+  await file({
+    path: '/etc/avahi/services/ssh.service',
+    src: '/usr/share/doc/avahi/ssh.service',
+    state: 'file',
+    sudo: true,
+  });
 });
index 55b1cddb8a455bb055f1c8776467547d3d1e62de..f4df5ae1fb3f6f5601e94e6b191ac1d81522394a 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Backup scripts"
+  "description": "Backup scripts"
 }
index cfba41056181dfda100078d870c62b43b7c4fc1f..82882a4099e4a2b55aa1bf6d5da9276a0330cbff 100644 (file)
@@ -1,9 +1,9 @@
 import {file, skip, task, variable} from 'fig';
 
 task('create ~/Backups', async () => {
-    if (variable('identity') === 'wincent') {
-        await file({path: '~/Backups', state: 'directory'});
-    } else {
-        skip();
-    }
+  if (variable('identity') === 'wincent') {
+    await file({path: '~/Backups', state: 'directory'});
+  } else {
+    skip();
+  }
 });
index 87f9e537995241c96c6dab4009251b26d453b2b9..171b31de6a97563a56cbf5e562d064a3ef56fa31 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Sets up cron files"
+  "description": "Sets up cron files"
 }
index b8b489b4dead039bb47ee09f28f6825a6b07a2de..d28c37d1016582b3aa81e96c7a90683d3e1ae1fc 100644 (file)
@@ -1,62 +1,62 @@
 import {
-    command,
-    cron,
-    file,
-    path,
-    resource,
-    skip,
-    template,
-    task,
-    variable,
+  command,
+  cron,
+  file,
+  path,
+  resource,
+  skip,
+  template,
+  task,
+  variable,
 } from 'fig';
 
 task('create ~/Library/Cron', async () => {
-    await file({
-        path: '~/Library/Cron',
-        state: 'directory',
-    });
+  await file({
+    path: '~/Library/Cron',
+    state: 'directory',
+  });
 });
 
 task('fill templates', async () => {
-    if (variable('identity') === 'wincent') {
-        for (const src of resource.templates('*.erb')) {
-            await template({
-                mode: '0755',
-                path: path('~/Library/Cron').join(src.basename.strip('.erb')),
-                src,
-            });
-        }
-    } else {
-        skip();
+  if (variable('identity') === 'wincent') {
+    for (const src of resource.templates('*.erb')) {
+      await template({
+        mode: '0755',
+        path: path('~/Library/Cron').join(src.basename.strip('.erb')),
+        src,
+      });
     }
+  } else {
+    skip();
+  }
 });
 
 task('schedule check-git cron job', async () => {
-    if (variable('identity') === 'wincent') {
-        await cron({
-            id: 'check-git',
-            hour: '8,12,16,20',
-            job: '$HOME/Library/Cron/check-git.sh',
-            minute: '0',
-        });
-    } else {
-        skip();
-    }
+  if (variable('identity') === 'wincent') {
+    await cron({
+      id: 'check-git',
+      hour: '8,12,16,20',
+      job: '$HOME/Library/Cron/check-git.sh',
+      minute: '0',
+    });
+  } else {
+    skip();
+  }
 });
 
 task('touch ~/mbox', async () => {
-    if (variable('identity') === 'wincent') {
-        // Because cron jobs can produce mail.
-        await file({path: '~/mbox', state: 'touch'});
-    } else {
-        skip();
-    }
+  if (variable('identity') === 'wincent') {
+    // Because cron jobs can produce mail.
+    await file({path: '~/mbox', state: 'touch'});
+  } else {
+    skip();
+  }
 });
 
 task('hide ~/mbox', async () => {
-    if (variable('identity') === 'wincent') {
-        await command('chflags', ['hidden', '~/mbox']);
-    } else {
-        skip();
-    }
+  if (variable('identity') === 'wincent') {
+    await command('chflags', ['hidden', '~/mbox']);
+  } else {
+    skip();
+  }
 });
index d7a8489505b3abf8ccf5f554e78786dfb165f261..64b5ba0d43b9a5e4629fc97a7e05aa966888d308 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Sets up defaults (ie. preferences) on macOS"
+  "description": "Sets up defaults (ie. preferences) on macOS"
 }
index 59811928cc24f71751ef386be05455b7e4f30975..999b8ef8d1f87cd68d3fc19337036a6bc873f180 100644 (file)
@@ -7,765 +7,765 @@ import {defaults, task} from 'fig';
  */
 
 task('Activity Monitor -> View -> Dock Icon -> Show CPU History', async () => {
-    await defaults({
-        domain: 'com.apple.ActivityMonitor',
-        key: 'IconType',
-        type: 'int',
-        value: 6,
-    });
+  await defaults({
+    domain: 'com.apple.ActivityMonitor',
+    key: 'IconType',
+    type: 'int',
+    value: 6,
+  });
 });
 
 task('Siri -> Enable Siri', async () => {
-    await defaults({
-        domain: 'com.apple.assistant.support',
-        key: 'Assistant Enabled',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    domain: 'com.apple.assistant.support',
+    key: 'Assistant Enabled',
+    type: 'bool',
+    value: false,
+  });
 });
 
 task("Don't create .DS_Store files on network volumes.", async () => {
-    await defaults({
-        domain: 'com.apple.desktopservices',
-        key: 'DSDontWriteNetworkStores',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'com.apple.desktopservices',
+    key: 'DSDontWriteNetworkStores',
+    type: 'bool',
+    value: true,
+  });
 });
 
 task("Don't create .DS_Store files on external USB drives.", async () => {
-    await defaults({
-        domain: 'com.apple.desktopservices',
-        key: 'DSDontWriteUSBStores',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'com.apple.desktopservices',
+    key: 'DSDontWriteUSBStores',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: 10.9
 task(
-    'Automatically quit printer app once the print jobs complete',
-    async () => {
-        await defaults({
-            domain: 'com.apple.print.PrintingPrefs',
-            key: 'Quit When Finished',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'Automatically quit printer app once the print jobs complete',
+  async () => {
+    await defaults({
+      domain: 'com.apple.print.PrintingPrefs',
+      key: 'Quit When Finished',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task('Disable auto-correct', async () => {
-    await defaults({
-        key: 'NSAutomaticSpellingCorrectionEnabled',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    key: 'NSAutomaticSpellingCorrectionEnabled',
+    type: 'bool',
+    value: false,
+  });
 });
 
 // Last tested: [10.9]
 task(
-    'Disable press-and-hold for keys in favor of key repeat Requires logout.',
-    async () => {
-        await defaults({
-            key: 'ApplePressAndHoldEnabled',
-            type: 'bool',
-            value: false,
-        });
-    }
+  'Disable press-and-hold for keys in favor of key repeat Requires logout.',
+  async () => {
+    await defaults({
+      key: 'ApplePressAndHoldEnabled',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task('Disable smart quotes, dashes, ellipses', async () => {
-    await defaults({
-        key: 'NSAutomaticDashSubstitutionEnabled',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    key: 'NSAutomaticDashSubstitutionEnabled',
+    type: 'bool',
+    value: false,
+  });
 });
 
 // Last tested: [10.9]
 task('Disable smart quotes, dashes, ellipses', async () => {
-    await defaults({
-        key: 'NSAutomaticQuoteSubstitutionEnabled',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    key: 'NSAutomaticQuoteSubstitutionEnabled',
+    type: 'bool',
+    value: false,
+  });
 });
 
 // Last tested: [10.9]
 task('Disable the warning when changing a file extension', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'FXEnableExtensionChangeWarning',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'FXEnableExtensionChangeWarning',
+    type: 'bool',
+    value: false,
+  });
 });
 
 // Last tested: [10.9]
 task("Don't display full POSIX path as Finder window title", async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: '_FXShowPosixPathInTitle',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: '_FXShowPosixPathInTitle',
+    type: 'bool',
+    value: false,
+  });
 });
 
 // Last tested: [10.12.6]
 task('New Finder windows show $HOME', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'NewWindowTarget',
-        type: 'string',
-        value: 'PfHm',
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'NewWindowTarget',
+    type: 'string',
+    value: 'PfHm',
+  });
 });
 
 // Last tested: [10.9]
 task('Expand print panel by default', async () => {
-    await defaults({
-        key: 'PMPrintingExpandedStateForPrint',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    key: 'PMPrintingExpandedStateForPrint',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.9]
 task('Expand print panel by default', async () => {
-    await defaults({
-        key: 'PMPrintingExpandedStateForPrint2',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    key: 'PMPrintingExpandedStateForPrint2',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.9]
 task('Expand save panel by default', async () => {
-    await defaults({
-        key: 'NSNavPanelExpandedStateForSaveMode',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    key: 'NSNavPanelExpandedStateForSaveMode',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.9]
 task('Expand save panel by default', async () => {
-    await defaults({
-        key: 'NSNavPanelExpandedStateForSaveMode2',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    key: 'NSNavPanelExpandedStateForSaveMode2',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.10.2]
 task(
-    'Finder -> Preferences -> General -> Spring-loaded folders and windows -> Delay (short)',
-    async () => {
-        await defaults({
-            key: 'com.apple.springing.delay',
-            type: 'float',
-            value: 0,
-        });
-    }
+  'Finder -> Preferences -> General -> Spring-loaded folders and windows -> Delay (short)',
+  async () => {
+    await defaults({
+      key: 'com.apple.springing.delay',
+      type: 'float',
+      value: 0,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'Finder -> Preferences -> General -> Spring-loaded folders and windows',
-    async () => {
-        await defaults({
-            key: 'com.apple.springing.enabled',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'Finder -> Preferences -> General -> Spring-loaded folders and windows',
+  async () => {
+    await defaults({
+      key: 'com.apple.springing.enabled',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task(
-    'Finder -> allow quitting via Command-Q; doing so will also hide desktop icons',
-    async () => {
-        await defaults({
-            domain: 'com.apple.finder',
-            key: 'QuitMenuItem',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'Finder -> allow quitting via Command-Q; doing so will also hide desktop icons',
+  async () => {
+    await defaults({
+      domain: 'com.apple.finder',
+      key: 'QuitMenuItem',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task('Finder -> allow text selection in Quick Look', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'QLEnableTextSelection',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'QLEnableTextSelection',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.9]
 task(
-    'Finder -> disable window animations and Get Info animations',
-    async () => {
-        await defaults({
-            domain: 'com.apple.finder',
-            key: 'DisableAllAnimations',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'Finder -> disable window animations and Get Info animations',
+  async () => {
+    await defaults({
+      domain: 'com.apple.finder',
+      key: 'DisableAllAnimations',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task('Finder -> show all filename extensions', async () => {
-    await defaults({
-        key: 'AppleShowAllExtensions',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    key: 'AppleShowAllExtensions',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.9]
 task('Finder -> show path bar', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'ShowPathbar',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'ShowPathbar',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: [10.9]
 task('Finder -> show status bar', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'ShowStatusBar',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'ShowStatusBar',
+    type: 'bool',
+    value: true,
+  });
 });
 
 task('Finder Preferences -> New Finder windows show', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'NewWindowTargetPath',
-        value: 'file:///Users/glh/',
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'NewWindowTargetPath',
+    value: 'file:///Users/glh/',
+  });
 });
 
 task(
-    'Finder Preferences -> Open folders in tabs instead of new windows',
-    async () => {
-        await defaults({
-            domain: 'com.apple.finder',
-            key: 'FinderSpawnTab',
-            type: 'bool',
-            value: false,
-        });
-    }
+  'Finder Preferences -> Open folders in tabs instead of new windows',
+  async () => {
+    await defaults({
+      domain: 'com.apple.finder',
+      key: 'FinderSpawnTab',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
 
 task('Finder Preferences -> Sidebar -> Tags -> Recent Tags', async () => {
-    await defaults({
-        domain: 'com.apple.finder',
-        key: 'ShowRecentTags',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    domain: 'com.apple.finder',
+    key: 'ShowRecentTags',
+    type: 'bool',
+    value: false,
+  });
 });
 
 task('Hammerspoon preferences -> Keep Console window on top', async () => {
-    await defaults({
-        domain: 'org.hammerspoon.Hammerspoon',
-        key: 'MJKeepConsoleOnTopKey',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'org.hammerspoon.Hammerspoon',
+    key: 'MJKeepConsoleOnTopKey',
+    type: 'bool',
+    value: true,
+  });
 });
 
 task('Hammerspoon preferences -> Show dock icon', async () => {
-    await defaults({
-        domain: 'org.hammerspoon.Hammerspoon',
-        key: 'MJShowDockIconKey',
-        type: 'bool',
-        value: false,
-    });
+  await defaults({
+    domain: 'org.hammerspoon.Hammerspoon',
+    key: 'MJShowDockIconKey',
+    type: 'bool',
+    value: false,
+  });
 });
 
 // Last tested: [10.10.2]
 task('Make sheets drop down (almost) instantly', async () => {
-    await defaults({
-        key: 'NSWindowResizeTime',
-        type: 'float',
-        value: 0.001,
-    });
+  await defaults({
+    key: 'NSWindowResizeTime',
+    type: 'float',
+    value: 0.001,
+  });
 });
 
 // Last tested: [10.9]
 task(
-    'Require password immediately after sleep or screen saver begins',
-    async () => {
-        await defaults({
-            domain: 'com.apple.screensaver',
-            key: 'askForPassword',
-            type: 'int',
-            value: 1,
-        });
-    }
+  'Require password immediately after sleep or screen saver begins',
+  async () => {
+    await defaults({
+      domain: 'com.apple.screensaver',
+      key: 'askForPassword',
+      type: 'int',
+      value: 1,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task(
-    'Require password immediately after sleep or screen saver begins',
-    async () => {
-        await defaults({
-            domain: 'com.apple.screensaver',
-            key: 'askForPasswordDelay',
-            type: 'float',
-            value: 0,
-        });
-    }
+  'Require password immediately after sleep or screen saver begins',
+  async () => {
+    await defaults({
+      domain: 'com.apple.screensaver',
+      key: 'askForPasswordDelay',
+      type: 'float',
+      value: 0,
+    });
+  }
 );
 
 // Last tested: 10.10
 task(
-    'System Preferences -> Accessibility -> Display -> Reduce transparency',
-    async () => {
-        await defaults({
-            domain: 'com.apple.universalaccess',
-            key: 'reduceTransparency',
-            type: 'bool',
-            value: false,
-        });
-    }
-);
-
-task(
-    'System Preferences -> Accessibility -> Zoom -> Smooth images',
-    async () => {
-        await defaults({
-            domain: 'com.apple.universalaccess',
-            key: 'closeViewSmoothImages',
-            type: 'bool',
-            value: false,
-        });
-    }
-);
-
-task(
-    'System Preferences -> Accessibility -> Zoom -> Use scroll gesture with modifier keys to zoom (Control)',
-    async () => {
-        await defaults({
-            domain: 'com.apple.universalaccess',
-            key: 'closeViewScrollWheelToggle',
-            type: 'bool',
-            value: true,
-        });
-
-        await defaults({
-            domain: 'com.apple.driver.AppleBluetoothMultitouch.trackpad',
-            key: 'HIDScrollZoomModifierMask',
-            type: 'int',
-            value: 262144,
-        });
-
-        await defaults({
-            domain: 'com.apple.AppleMultitouchTrackpad',
-            key: 'HIDScrollZoomModifierMask',
-            type: 'int',
-            value: 262144,
-        });
-    }
+  'System Preferences -> Accessibility -> Display -> Reduce transparency',
+  async () => {
+    await defaults({
+      domain: 'com.apple.universalaccess',
+      key: 'reduceTransparency',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
 
-// Last tested: [10.10.2]
 task(
-    'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Hot Corners -> [Bottom Left] Start Screen Saver',
-    async () => {
-        await defaults({
-            domain: 'com.apple.dock',
-            key: 'wvous-bl-corner',
-            type: 'int',
-            value: 5,
-        });
-    }
+  'System Preferences -> Accessibility -> Zoom -> Smooth images',
+  async () => {
+    await defaults({
+      domain: 'com.apple.universalaccess',
+      key: 'closeViewSmoothImages',
+      type: 'bool',
+      value: false,
+    });
+  }
+);
+
+task(
+  'System Preferences -> Accessibility -> Zoom -> Use scroll gesture with modifier keys to zoom (Control)',
+  async () => {
+    await defaults({
+      domain: 'com.apple.universalaccess',
+      key: 'closeViewScrollWheelToggle',
+      type: 'bool',
+      value: true,
+    });
+
+    await defaults({
+      domain: 'com.apple.driver.AppleBluetoothMultitouch.trackpad',
+      key: 'HIDScrollZoomModifierMask',
+      type: 'int',
+      value: 262144,
+    });
+
+    await defaults({
+      domain: 'com.apple.AppleMultitouchTrackpad',
+      key: 'HIDScrollZoomModifierMask',
+      type: 'int',
+      value: 262144,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Hot Corners -> [Top Right] Disable Screen Saver',
-    async () => {
-        await defaults({
-            domain: 'com.apple.dock',
-            key: 'wvous-tr-corner',
-            type: 'int',
-            value: 6,
-        });
-    }
+  'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Hot Corners -> [Bottom Left] Start Screen Saver',
+  async () => {
+    await defaults({
+      domain: 'com.apple.dock',
+      key: 'wvous-bl-corner',
+      type: 'int',
+      value: 5,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> General -> Recent items (Applications)',
-    async () => {
-        await defaults({
-            domain: 'com.apple.recentitems',
-            key: 'RecentApplications',
-            type: 'dict-add',
-            value: {MaxAmount: 50},
-        });
-    }
+  'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Hot Corners -> [Top Right] Disable Screen Saver',
+  async () => {
+    await defaults({
+      domain: 'com.apple.dock',
+      key: 'wvous-tr-corner',
+      type: 'int',
+      value: 6,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
-task('System Preferences -> General -> Recent items (Documents)', async () => {
+task(
+  'System Preferences -> General -> Recent items (Applications)',
+  async () => {
     await defaults({
-        domain: 'com.apple.recentitems',
-        key: 'RecentDocuments',
-        type: 'dict-add',
-        value: {MaxAmount: 50},
+      domain: 'com.apple.recentitems',
+      key: 'RecentApplications',
+      type: 'dict-add',
+      value: {MaxAmount: 50},
     });
+  }
+);
+
+// Last tested: [10.10.2]
+task('System Preferences -> General -> Recent items (Documents)', async () => {
+  await defaults({
+    domain: 'com.apple.recentitems',
+    key: 'RecentDocuments',
+    type: 'dict-add',
+    value: {MaxAmount: 50},
+  });
 });
 
 // Last tested: [10.10.2]
 task('System Preferences -> General -> Recent items (Servers)', async () => {
-    await defaults({
-        domain: 'com.apple.recentitems',
-        key: 'RecentServers',
-        type: 'dict-add',
-        value: {MaxAmount: 50},
-    });
+  await defaults({
+    domain: 'com.apple.recentitems',
+    key: 'RecentServers',
+    type: 'dict-add',
+    value: {MaxAmount: 50},
+  });
 });
 
 // Last tested: [10.12.1]
 task(
-    'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Show with clock',
-    async () => {
-        await defaults({
-            domain: 'com.apple.screensaver',
-            host: 'currentHost',
-            key: 'showClock',
-            type: 'bool',
-            value: false,
-        });
-    }
+  'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Show with clock',
+  async () => {
+    await defaults({
+      domain: 'com.apple.screensaver',
+      host: 'currentHost',
+      key: 'showClock',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Start after -> 5 Minutes',
-    async () => {
-        await defaults({
-            domain: 'com.apple.screensaver',
-            host: 'currentHost',
-            key: 'idleTime',
-            type: 'int',
-            value: 300,
-        });
-    }
+  'System Preferences -> Desktop & Screen Saver -> Screen Saver -> Start after -> 5 Minutes',
+  async () => {
+    await defaults({
+      domain: 'com.apple.screensaver',
+      host: 'currentHost',
+      key: 'idleTime',
+      type: 'int',
+      value: 300,
+    });
+  }
 );
 
 task(
-    'System Preferences -> Dock -> Automatically hide and show Dock',
-    async () => {
-        await defaults({
-            domain: 'com.apple.dock',
-            key: 'autohide',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'System Preferences -> Dock -> Automatically hide and show Dock',
+  async () => {
+    await defaults({
+      domain: 'com.apple.dock',
+      key: 'autohide',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: 10.11
 task(
-    'System Preferences -> General -> Appearance -> Automatically hide and show the menu bar',
-    async () => {
-        await defaults({
-            key: '_HIHideMenuBar',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'System Preferences -> General -> Appearance -> Automatically hide and show the menu bar',
+  async () => {
+    await defaults({
+      key: '_HIHideMenuBar',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: 10.10
 task('System Preferences -> General -> Appearance -> Graphite', async () => {
-    await defaults({
-        key: 'AppleAquaColorVariant',
-        type: 'int',
-        value: 6,
-    });
+  await defaults({
+    key: 'AppleAquaColorVariant',
+    type: 'int',
+    value: 6,
+  });
 });
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> General -> Click in scroll bar to -> Jump to the next page',
-    async () => {
-        await defaults({
-            key: 'AppleScrollerPagingBehavior',
-            type: 'int',
-            value: 0,
-        });
-    }
+  'System Preferences -> General -> Click in scroll bar to -> Jump to the next page',
+  async () => {
+    await defaults({
+      key: 'AppleScrollerPagingBehavior',
+      type: 'int',
+      value: 0,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> General -> Show scroll bars -> Automatically based on mouse or trackpad',
-    async () => {
-        await defaults({
-            key: 'AppleShowScrollBars',
-            type: 'string',
-            value: 'Automatic',
-        });
-    }
+  'System Preferences -> General -> Show scroll bars -> Automatically based on mouse or trackpad',
+  async () => {
+    await defaults({
+      key: 'AppleShowScrollBars',
+      type: 'string',
+      value: 'Automatic',
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> General -> Sidebar icon size -> Small',
-    async () => {
-        await defaults({
-            key: 'NSTableViewDefaultSizeMode',
-            type: 'int',
-            value: 1,
-        });
-    }
+  'System Preferences -> General -> Sidebar icon size -> Small',
+  async () => {
+    await defaults({
+      key: 'NSTableViewDefaultSizeMode',
+      type: 'int',
+      value: 1,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    "System Preferences -> General -> [Don't] Ask to keep changes when closing documents",
-    async () => {
-        await defaults({
-            key: 'NSCloseAlwaysConfirmsChanges',
-            type: 'int',
-            value: 0,
-        });
-    }
+  "System Preferences -> General -> [Don't] Ask to keep changes when closing documents",
+  async () => {
+    await defaults({
+      key: 'NSCloseAlwaysConfirmsChanges',
+      type: 'int',
+      value: 0,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    "System Preferences -> General -> [Don't] Close windows when quitting an app",
-    async () => {
-        await defaults({
-            key: 'NSQuitAlwaysKeepsWindows',
-            type: 'int',
-            value: 0,
-        });
-    }
+  "System Preferences -> General -> [Don't] Close windows when quitting an app",
+  async () => {
+    await defaults({
+      key: 'NSQuitAlwaysKeepsWindows',
+      type: 'int',
+      value: 0,
+    });
+  }
 );
 
 // Last tested: [10.11.5]
 task(
-    'System Preferences -> Mission Control -> Displays have separate Spaces',
-    async () => {
-        await defaults({
-            domain: 'com.apple.spaces',
-            key: 'spans-displays',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'System Preferences -> Mission Control -> Displays have separate Spaces',
+  async () => {
+    await defaults({
+      domain: 'com.apple.spaces',
+      key: 'spans-displays',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: [10.10.2]
 task(
-    'System Preferences -> Sound -> Sound Effects -> Play feedback when volume is changed',
-    async () => {
-        await defaults({
-            key: 'com.apple.sound.beep.feedback',
-            type: 'bool',
-            value: false,
-        });
-    }
+  'System Preferences -> Sound -> Sound Effects -> Play feedback when volume is changed',
+  async () => {
+    await defaults({
+      key: 'com.apple.sound.beep.feedback',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
 
 // Last tested: [10.13.3]
 task(
-    'System Preferences -> Sound -> Sound Effects -> Play user interface sound effects',
-    async () => {
-        await defaults({
-            key: 'com.apple.sound.uiaudio.enabled',
-            type: 'int',
-            value: 0,
-        });
-    }
+  'System Preferences -> Sound -> Sound Effects -> Play user interface sound effects',
+  async () => {
+    await defaults({
+      key: 'com.apple.sound.uiaudio.enabled',
+      type: 'int',
+      value: 0,
+    });
+  }
 );
 
 task(
-    'System Preferences -> Users & Groups -> Login Options -> Show fast user switching menu as "Icon"',
-    async () => {
-        await defaults({
-            key: 'userMenuExtraStyle',
-            type: 'int',
-            value: 2,
-        });
-    }
+  'System Preferences -> Users & Groups -> Login Options -> Show fast user switching menu as "Icon"',
+  async () => {
+    await defaults({
+      key: 'userMenuExtraStyle',
+      type: 'int',
+      value: 2,
+    });
+  }
 );
 
 // Last tested: 10.9
 task(
-    'Tweak subpixel font rendering (https://wincent.com/wiki/AppleFontSmoothing)',
-    async () => {
-        await defaults({
-            host: 'currentHost',
-            key: 'AppleFontSmoothing',
-            type: 'int',
-            value: 1,
-        });
-    }
+  'Tweak subpixel font rendering (https://wincent.com/wiki/AppleFontSmoothing)',
+  async () => {
+    await defaults({
+      host: 'currentHost',
+      key: 'AppleFontSmoothing',
+      type: 'int',
+      value: 1,
+    });
+  }
 );
 
 // Last tested: [10.9]
 task('Use plain text mode for new TextEdit documents', async () => {
-    await defaults({
-        domain: 'com.apple.TextEdit',
-        key: 'RichText',
-        type: 'int',
-        value: 0,
-    });
+  await defaults({
+    domain: 'com.apple.TextEdit',
+    key: 'RichText',
+    type: 'int',
+    value: 0,
+  });
 });
 
 // Last tested: 3.1.3
 task(
-    'iTerm2 -> Preferences -> Advanced -> Windows -> Terminal windows resize smoothly',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'DisableWindowSizeSnap',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'iTerm2 -> Preferences -> Advanced -> Windows -> Terminal windows resize smoothly',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'DisableWindowSizeSnap',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: 2.9.20150224-nightly
 task(
-    'iTerm2 -> Preferences -> Advanced -> Tabs -> Preferred tab width',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'OptimumTabWidth',
-            type: 'int',
-            value: 275,
-        });
-    }
+  'iTerm2 -> Preferences -> Advanced -> Tabs -> Preferred tab width',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'OptimumTabWidth',
+      type: 'int',
+      value: 275,
+    });
+  }
 );
 
 // Last tested: 2.9.20150224-nightly
 task('iTerm2 -> Preferences -> Appearance -> Hide scrollbars', async () => {
-    await defaults({
-        domain: 'com.googlecode.iterm2',
-        key: 'HideScrollbar',
-        type: 'bool',
-        value: true,
-    });
+  await defaults({
+    domain: 'com.googlecode.iterm2',
+    key: 'HideScrollbar',
+    type: 'bool',
+    value: true,
+  });
 });
 
 // Last tested: 2.9.20150224-nightly
 task(
-    'iTerm2 -> Preferences -> Appearance -> Hide tab activity indicator',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'HideActivityIndicator',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'iTerm2 -> Preferences -> Appearance -> Hide tab activity indicator',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'HideActivityIndicator',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: 3.1.3 (they still show on mouseover)
 task(
-    'iTerm2 -> Preferences -> Appearance -> Show tab close buttons',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'HideTabCloseButton',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'iTerm2 -> Preferences -> Appearance -> Show tab close buttons',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'HideTabCloseButton',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: 2.9.20150224-nightly
 task(
-    'iTerm2 -> Preferences -> General -> Adjust window when changing font size',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'AdjustWindowForFontSizeChange',
-            type: 'bool',
-            value: false,
-        });
-    }
+  'iTerm2 -> Preferences -> General -> Adjust window when changing font size',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'AdjustWindowForFontSizeChange',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
 
 // Last tested: 3.1.3
 task(
-    'iTerm2 -> Preferences -> Appearance -> Stretch tabs to fill bar',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'StretchTabsToFillBar',
-            type: 'bool',
-            value: true,
-        });
-    }
+  'iTerm2 -> Preferences -> Appearance -> Stretch tabs to fill bar',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'StretchTabsToFillBar',
+      type: 'bool',
+      value: true,
+    });
+  }
 );
 
 // Last tested: 3.3.20190114-nightly (default: 1)
 task('iTerm2 -> Preferences -> Appearance -> Theme -> Dark', async () => {
-    await defaults({
-        domain: 'com.googlecode.iterm2',
-        key: 'TabStyleWithAutomaticOption',
-        type: 'int',
-        value: 1,
-    });
+  await defaults({
+    domain: 'com.googlecode.iterm2',
+    key: 'TabStyleWithAutomaticOption',
+    type: 'int',
+    value: 1,
+  });
 });
 
 // Last tested: 3.1.3 (default: 5)
 task(
-    'iTerm2 -> Preferences -> Advanced -> General -> Width of left and right margins in terminal panes',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'TerminalMargin',
-            type: 'int',
-            value: 1,
-        });
-    }
+  'iTerm2 -> Preferences -> Advanced -> General -> Width of left and right margins in terminal panes',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'TerminalMargin',
+      type: 'int',
+      value: 1,
+    });
+  }
 );
 
 // Last tested: 3.2.20180604-nightly (default: ?)
 task(
-    'iTerm2 -> Preferences -> Advanced -> General -> Width of left and right margins in terminal panes',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'TerminalVMargin',
-            type: 'int',
-            value: 2,
-        });
-    }
+  'iTerm2 -> Preferences -> Advanced -> General -> Width of left and right margins in terminal panes',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'TerminalVMargin',
+      type: 'int',
+      value: 2,
+    });
+  }
 );
 
 // Last tested: 2.9.20150224-nightly
 task(
-    'iTerm2 -> Preferences -> General -> Native full screen windows',
-    async () => {
-        await defaults({
-            domain: 'com.googlecode.iterm2',
-            key: 'UseLionStyleFullscreen',
-            type: 'bool',
-            value: false,
-        });
-    }
+  'iTerm2 -> Preferences -> General -> Native full screen windows',
+  async () => {
+    await defaults({
+      domain: 'com.googlecode.iterm2',
+      key: 'UseLionStyleFullscreen',
+      type: 'bool',
+      value: false,
+    });
+  }
 );
index b1c380b34bf4a199da8afaafebb6d379669017b9..1db9479145ad95c6afc28cab66a0a0d1ae517a5f 100644 (file)
@@ -1,52 +1,52 @@
 {
-    "description": "Creates symlinks in $HOME to the dotfiles in this repo",
-    "variables": {
-        "files": [
-            ".Xresources",
-            ".ackrc",
-            ".agignore",
-            ".clipper.json",
-            ".config/alacritty",
-            ".config/big-sur.jpg",
-            ".config/chrome-flags.conf",
-            ".config/chromium-flags.conf",
-            ".config/clipper",
-            ".config/dunst",
-            ".config/herbstluftwm",
-            ".config/i3",
-            ".config/i3blocks",
-            ".config/kitty",
-            ".config/lf",
-            ".config/picom.conf",
-            ".config/ranger",
-            ".config/sxhkd",
-            ".config/xkeysnail.py",
-            ".ghci",
-            ".gitattributes",
-            ".gitignore",
-            ".gitk",
-            ".hammerspoon",
-            ".hgrc",
-            ".inputrc",
-            ".lbdbrc",
-            ".npmrc",
-            ".pypirc",
-            ".rdebugrc",
-            ".rgrc",
-            ".rspec",
-            ".screenrc",
-            ".tmux.conf",
-            ".urlview",
-            ".xinitrc",
-            ".zsh",
-            ".zshenv",
-            ".zshrc"
-        ],
-        "templates": [
-            ".corpusrc.erb",
-            ".fehbg",
-            ".gitconfig.erb",
-            ".hammerspoon/iterm.lua.erb"
-        ]
-    }
+  "description": "Creates symlinks in $HOME to the dotfiles in this repo",
+  "variables": {
+    "files": [
+      ".Xresources",
+      ".ackrc",
+      ".agignore",
+      ".clipper.json",
+      ".config/alacritty",
+      ".config/big-sur.jpg",
+      ".config/chrome-flags.conf",
+      ".config/chromium-flags.conf",
+      ".config/clipper",
+      ".config/dunst",
+      ".config/herbstluftwm",
+      ".config/i3",
+      ".config/i3blocks",
+      ".config/kitty",
+      ".config/lf",
+      ".config/picom.conf",
+      ".config/ranger",
+      ".config/sxhkd",
+      ".config/xkeysnail.py",
+      ".ghci",
+      ".gitattributes",
+      ".gitignore",
+      ".gitk",
+      ".hammerspoon",
+      ".hgrc",
+      ".inputrc",
+      ".lbdbrc",
+      ".npmrc",
+      ".pypirc",
+      ".rdebugrc",
+      ".rgrc",
+      ".rspec",
+      ".screenrc",
+      ".tmux.conf",
+      ".urlview",
+      ".xinitrc",
+      ".zsh",
+      ".zshenv",
+      ".zshrc"
+    ],
+    "templates": [
+      ".corpusrc.erb",
+      ".fehbg",
+      ".gitconfig.erb",
+      ".hammerspoon/iterm.lua.erb"
+    ]
+  }
 }
index bf827d573bb861c997b20890008c7ecd72c2d3f2..cc1ff5844da4ee27bad5e1ebf4fcfb5f86a60dc3 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "address": "~/.clipper.sock"
+  "address": "~/.clipper.sock"
 }
index bf827d573bb861c997b20890008c7ecd72c2d3f2..cc1ff5844da4ee27bad5e1ebf4fcfb5f86a60dc3 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "address": "~/.clipper.sock"
+  "address": "~/.clipper.sock"
 }
index 1956d8d7cf8bb32071f1df9f72af4f43638b5e81..e4fe8e0d338fd49cee12f15ad85b616bd066199d 100644 (file)
 import {
-    backup,
-    command,
-    fail,
-    file,
-    log,
-    path,
-    prompt,
-    resource,
-    skip,
-    template,
-    task,
-    variable,
-    variables,
+  backup,
+  command,
+  fail,
+  file,
+  log,
+  path,
+  prompt,
+  resource,
+  skip,
+  template,
+  task,
+  variable,
+  variables,
 } from 'fig';
 
 variables(({identity}) => ({
-    gitUserEmail: identity === 'wincent' ? 'greg@hurrell.net' : '',
-    gitUserName: identity === 'wincent' ? 'Greg Hurrell' : '',
-    gitHubUsername: identity === 'wincent' ? 'wincent' : '',
+  gitUserEmail: identity === 'wincent' ? 'greg@hurrell.net' : '',
+  gitUserName: identity === 'wincent' ? 'Greg Hurrell' : '',
+  gitHubUsername: identity === 'wincent' ? 'wincent' : '',
 }));
 
 task('check for decrypted files', async () => {
-    if (variable('identity') === 'wincent') {
-        const result = await command(
-            'vendor/git-cipher/bin/git-cipher',
-            ['status'],
-            {
-                failedWhen: () => false,
-            }
-        );
+  if (variable('identity') === 'wincent') {
+    const result = await command(
+      'vendor/git-cipher/bin/git-cipher',
+      ['status'],
+      {
+        failedWhen: () => false,
+      }
+    );
 
-        if (result !== null) {
-            if (result.status !== 0) {
-                log.warn(`git-cipher status:\n\n${result.stdout}\n`);
+    if (result !== null) {
+      if (result.status !== 0) {
+        log.warn(`git-cipher status:\n\n${result.stdout}\n`);
 
-                if (!(await prompt.confirm('Continue anyway'))) {
-                    fail(`decrypted file check failed`);
-                }
-            }
+        if (!(await prompt.confirm('Continue anyway'))) {
+          fail(`decrypted file check failed`);
         }
-    } else {
-        skip();
+      }
     }
+  } else {
+    skip();
+  }
 });
 
 task('make directories', async () => {
-    await file({path: '~/.backups', state: 'directory'});
-    await file({path: '~/.config', state: 'directory'});
-    await file({path: '~/.mail', state: 'directory'});
-    await file({path: '~/.zshenv.d', state: 'directory'});
+  await file({path: '~/.backups', state: 'directory'});
+  await file({path: '~/.config', state: 'directory'});
+  await file({path: '~/.mail', state: 'directory'});
+  await file({path: '~/.zshenv.d', state: 'directory'});
 
-    if (variable('identity') === 'wincent') {
-        await file({path: '~/code', state: 'directory'});
-    }
+  if (variable('identity') === 'wincent') {
+    await file({path: '~/code', state: 'directory'});
+  }
 });
 
 task('move originals to ~/.backups', async () => {
-    const files = [...variable.paths('files'), ...variable.paths('templates')];
+  const files = [...variable.paths('files'), ...variable.paths('templates')];
 
-    for (const file of files) {
-        const src = file.strip('.erb');
+  for (const file of files) {
+    const src = file.strip('.erb');
 
-        await backup({src});
-    }
+    await backup({src});
+  }
 });
 
 task('create symlinks', async () => {
-    const files = variable.paths('files');
+  const files = variable.paths('files');
 
-    for (const src of files) {
-        await file({
-            force: true,
-            path: path.home.join(src),
-            src: path.aspect.join('files', src),
-            state: 'link',
-        });
-    }
+  for (const src of files) {
+    await file({
+      force: true,
+      path: path.home.join(src),
+      src: path.aspect.join('files', src),
+      state: 'link',
+    });
+  }
 });
 
 task('fill templates', async () => {
-    const templates = variable.paths('templates');
+  const templates = variable.paths('templates');
 
-    for (const src of templates) {
-        await template({
-            mode: src.endsWith('.sh.erb') ? '0755' : '0644',
-            path: path.home.join(src.strip('.erb')),
-            src: path.aspect.join('templates', src),
-        });
-    }
+  for (const src of templates) {
+    await template({
+      mode: src.endsWith('.sh.erb') ? '0755' : '0644',
+      path: path.home.join(src.strip('.erb')),
+      src: path.aspect.join('templates', src),
+    });
+  }
 });
 
 task('create ~/code/.editorconfig', async () => {
-    if (variable('identity') === 'wincent') {
-        await template({
-            path: '~/code/.editorconfig',
-            src: resource.template('code/.editorconfig'),
-        });
-    } else {
-        skip();
-    }
+  if (variable('identity') === 'wincent') {
+    await template({
+      path: '~/code/.editorconfig',
+      src: resource.template('code/.editorconfig'),
+    });
+  } else {
+    skip();
+  }
 });
index e0f2edeabab8197de29c04a5cb9f51596ceaf8f1..c1f15eb90b41f0e1a825869f295b26906d1ee5e4 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Installs Source Code Pro font files"
+  "description": "Installs Source Code Pro font files"
 }
index ec279c00d6035921d60c669b3fadff6c52c8cf08..878caba478e5530a6075a613dea5436923f8548c 100644 (file)
@@ -2,33 +2,33 @@ import {command, file, log, path, resource, skip, task} from 'fig';
 import stat from 'fig/fs/stat.js';
 
 task('create ~/Library/Fonts', async () => {
-    await file({
-        path: path.home.join('Library/Fonts'),
-        state: 'directory',
-    });
+  await file({
+    path: path.home.join('Library/Fonts'),
+    state: 'directory',
+  });
 });
 
 task('install Source Code Pro', async () => {
-    // Check to see whether submodule is present.
-    const contents = 'vendor/fonts/source-code-pro/TTF';
+  // Check to see whether submodule is present.
+  const contents = 'vendor/fonts/source-code-pro/TTF';
 
-    const stats = await stat(contents);
+  const stats = await stat(contents);
 
-    if (stats === null) {
-        log.warn(`Submodule contents missing at "${contents}"`);
+  if (stats === null) {
+    log.warn(`Submodule contents missing at "${contents}"`);
 
-        return skip();
-    } else if (stats instanceof Error) {
-        throw stats;
-    }
+    return skip();
+  } else if (stats instanceof Error) {
+    throw stats;
+  }
 
-    const files = resource.files('source-code-pro/*.ttf');
+  const files = resource.files('source-code-pro/*.ttf');
 
-    const target = path.home.join('Library/Fonts');
+  const target = path.home.join('Library/Fonts');
 
-    for (const ttf of files) {
-        await command('cp', [ttf, target], {
-            creates: target.join(ttf.basename),
-        });
-    }
+  for (const ttf of files) {
+    await command('cp', [ttf, target], {
+      creates: target.join(ttf.basename),
+    });
+  }
 });
index 121aa0870e009dda667985d213a6bf6f53bc148f..ccdfdfe09e4d37c4e1f1c0e64a68238612e132f0 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Installs and updates Homebrew"
+  "description": "Installs and updates Homebrew"
 }
index 238b4a0a1227273af2ad1fde43d83b182a931e0c..e12d1b655aa7db7c45d04d732819ecf9bd6e2aaf 100644 (file)
@@ -1,47 +1,46 @@
 import {command, fetch, resource, skip, task, template} from 'fig';
 
 task('download installation script', async () => {
-    await fetch({
-        dest: 'vendor/homebrew/install.sh',
-        mode: '0755',
-        url:
-            'https://raw.githubusercontent.com/Homebrew/install/master/install.sh',
-    });
+  await fetch({
+    dest: 'vendor/homebrew/install.sh',
+    mode: '0755',
+    url: 'https://raw.githubusercontent.com/Homebrew/install/master/install.sh',
+  });
 });
 
 task('install Homebrew', async () => {
-    await command('vendor/homebrew/install.sh', [], {
-        creates: '/usr/local/bin/brew',
-    });
+  await command('vendor/homebrew/install.sh', [], {
+    creates: '/usr/local/bin/brew',
+  });
 });
 
 task('update Homebrew', async () => {
-    await command('brew', ['update']);
+  await command('brew', ['update']);
 });
 
 task('tap "homebrew/bundle"', async () => {
-    const result = await command('brew', ['tap']);
+  const result = await command('brew', ['tap']);
 
-    if (/^homebrew\/bundle$/m.test(result!.stdout)) {
-        return skip('already tapped');
-    }
+  if (/^homebrew\/bundle$/m.test(result!.stdout)) {
+    return skip('already tapped');
+  }
 
-    await command('brew', ['tap', 'homebrew/bundle']);
+  await command('brew', ['tap', 'homebrew/bundle']);
 });
 
 task('prepare Brewfile', async () => {
-    await template({
-        path: '~/Library/Preferences/Brewfile',
-        src: resource.template('Brewfile.erb'),
-    });
+  await template({
+    path: '~/Library/Preferences/Brewfile',
+    src: resource.template('Brewfile.erb'),
+  });
 });
 
 task('run "brew bundle"', async () => {
-    await command('brew', ['bundle'], {
-        chdir: '~/Library/Preferences',
-    });
+  await command('brew', ['bundle'], {
+    chdir: '~/Library/Preferences',
+  });
 });
 
 task('clean up old versions', async () => {
-    await command('brew', ['cleanup']);
+  await command('brew', ['cleanup']);
 });
index 349d34d490b4fad37abde11c857213299f33d6a7..293e2d58f21aa91974b5e1db21cba96843b2fd93 100644 (file)
@@ -2,5 +2,5 @@
 
 > Configures the [Interception Tools](https://gitlab.com/interception/linux/tools) on Linux (analogous to Karabiner-Elements on macOS).
 
--   Uses the [Dual Function Keys](https://gitlab.com/interception/linux/plugins/dual-function-keys) plug-in to map Enter to Control (when chorded with another key) or Enter (when tapped).
--   Uses [the custom `mac2linux` plug-in](support/mac2linux.c) to perform a number of Colemak-specific overrides that enable the use of many macOS-style keyboard shortcuts on Linux.
+- Uses the [Dual Function Keys](https://gitlab.com/interception/linux/plugins/dual-function-keys) plug-in to map Enter to Control (when chorded with another key) or Enter (when tapped).
+- Uses [the custom `mac2linux` plug-in](support/mac2linux.c) to perform a number of Colemak-specific overrides that enable the use of many macOS-style keyboard shortcuts on Linux.
index 6822b177aae995031a7426d41b6eb47862296bc7..a8c0b7253b6ba45f9146ef18c7f4f17f18af181c 100644 (file)
@@ -1,6 +1,6 @@
 {
-    "description": "Configure Interception Tools",
-    "variables": {
-        "deviceName": "Topre Corporation Realforce 87"
-    }
+  "description": "Configure Interception Tools",
+  "variables": {
+    "deviceName": "Topre Corporation Realforce 87"
+  }
 }
index 49a1fbfdf38e89654e7f25cdb38a135c97f387f7..35191224c1e433dcc3d221ecc2bbde9ab90840ea 100644 (file)
@@ -1,70 +1,70 @@
 import {
-    attributes,
-    command,
-    file,
-    handler,
-    resource,
-    skip,
-    task as defineTask,
-    template,
+  attributes,
+  command,
+  file,
+  handler,
+  resource,
+  skip,
+  task as defineTask,
+  template,
 } from 'fig';
 
 function task(name: string, callback: () => Promise<void>) {
-    defineTask(name, async () => {
-        if (attributes.distribution === 'arch') {
-            await callback();
-        } else {
-            skip('not on Arch Linux');
-        }
-    });
+  defineTask(name, async () => {
+    if (attributes.distribution === 'arch') {
+      await callback();
+    } else {
+      skip('not on Arch Linux');
+    }
+  });
 }
 
 task('build mac2linux', async () => {
-    const chdir = resource.support();
+  const chdir = resource.support();
 
-    await command('cmake', ['--configure', '.'], {chdir});
-    await command('cmake', ['--build', '.'], {chdir});
-    await command('make', [], {chdir});
+  await command('cmake', ['--configure', '.'], {chdir});
+  await command('cmake', ['--build', '.'], {chdir});
+  await command('make', [], {chdir});
 });
 
 task('install mac2linux', async () => {
-    const chdir = resource.support();
+  const chdir = resource.support();
 
-    await command('cmake', ['--install', '.', '--prefix', '/usr'], {
-        chdir,
-        notify: 'enable udevmon',
-        sudo: true,
-    });
+  await command('cmake', ['--install', '.', '--prefix', '/usr'], {
+    chdir,
+    notify: 'enable udevmon',
+    sudo: true,
+  });
 });
 
 task('create /etc/interception', async () => {
-    await file({
-        path: '/etc/interception',
-        state: 'directory',
-        sudo: true,
-    });
+  await file({
+    path: '/etc/interception',
+    state: 'directory',
+    sudo: true,
+  });
 });
 
 task('create /etc/interception/dual-function-keys.yaml', async () => {
-    await template({
-        notify: 'enable udevmon',
-        path: '/etc/interception/dual-function-keys.yaml',
-        src: resource.template('dual-function-keys.yaml.erb'),
-        sudo: true,
-    });
+  await template({
+    notify: 'enable udevmon',
+    path: '/etc/interception/dual-function-keys.yaml',
+    src: resource.template('dual-function-keys.yaml.erb'),
+    sudo: true,
+  });
 });
 
 task('create /etc/interception/udevmon.yaml', async () => {
-    await template({
-        notify: 'enable udevmon',
-        path: '/etc/interception/udevmon.yaml',
-        src: resource.template('udevmon.yaml.erb'),
-        sudo: true,
-    });
+  await template({
+    notify: 'enable udevmon',
+    path: '/etc/interception/udevmon.yaml',
+    src: resource.template('udevmon.yaml.erb'),
+    sudo: true,
+  });
 });
 
 handler('enable udevmon', async () => {
-    await command('systemctl', ['enable', 'udevmon', '--now'], {
-        sudo: true,
-    });
+  await command('systemctl', ['enable', 'udevmon', '--now'], {
+    sudo: true,
+  });
 });
index 78103eb0fa4dd6ec8277181321ce4e6bca17dabb..bd000504a5db3a3e72352380291ed8653e1bb489 100644 (file)
@@ -2,40 +2,40 @@ iTerm2 has a "[Dynamic Profiles feature](https://www.iterm2.com/documentation-dy
 
 This is nice for version control purposes, but our principal motivation here is to have the ability to apply different configs depending on whether an external monitor is plugged in (because an external 4K display and the internal Retina display on the laptop require different font sizes in order to produce the same physical size on the screen). We [use Hammerspoon](https://github.com/wincent/wincent/tree/master/roles/dotfiles/files/.hammerspoon) to watch for screen layout changes and when they occur, overwrite the symlinks at:
 
--   `$HOME/Library/Application Support/iTerm2/DynamicProfiles/Mutt.json` (this is the profile used for mutt windows).
--   `$HOME/Library/Application Support/iTerm2/DynamicProfiles/Vim.json` (this is the profile used for `vim://` windows).
--   `$HOME/Library/Application Support/iTerm2/DynamicProfiles/Wincent.json` (this is the profile used for other windows).
+- `$HOME/Library/Application Support/iTerm2/DynamicProfiles/Mutt.json` (this is the profile used for mutt windows).
+- `$HOME/Library/Application Support/iTerm2/DynamicProfiles/Vim.json` (this is the profile used for `vim://` windows).
+- `$HOME/Library/Application Support/iTerm2/DynamicProfiles/Wincent.json` (this is the profile used for other windows).
 
 Overwriting the targets that the symlinks point to causes iTerm to read them and pick up the changes. The link targets are all stored in the "Sources" directory here:
 
--   `$HOME/Library/Application Support/iTerm2/Sources/70-Vim-Retina.json` (`vim://` settings for Retina).
--   `$HOME/Library/Application Support/iTerm2/Sources/40-Mutt-Retina.json` (mutt settings for Retina).
--   `$HOME/Library/Application Support/iTerm2/Sources/10-Retina.json` (settings for other Retina windows).
--   `$HOME/Library/Application Support/iTerm2/Sources/70-Vim-4K.json` (`vim://` settings for the 4K display).
--   `$HOME/Library/Application Support/iTerm2/Sources/40-Mutt-4K.json` (mutt settings for the 4K display).
--   `$HOME/Library/Application Support/iTerm2/Sources/10-4K.json` (settings for other windows on the 4K display).
+- `$HOME/Library/Application Support/iTerm2/Sources/70-Vim-Retina.json` (`vim://` settings for Retina).
+- `$HOME/Library/Application Support/iTerm2/Sources/40-Mutt-Retina.json` (mutt settings for Retina).
+- `$HOME/Library/Application Support/iTerm2/Sources/10-Retina.json` (settings for other Retina windows).
+- `$HOME/Library/Application Support/iTerm2/Sources/70-Vim-4K.json` (`vim://` settings for the 4K display).
+- `$HOME/Library/Application Support/iTerm2/Sources/40-Mutt-4K.json` (mutt settings for the 4K display).
+- `$HOME/Library/Application Support/iTerm2/Sources/10-4K.json` (settings for other windows on the 4K display).
 
 But I confess now that the above is a lie. Each of those profiles also has a "parent" profile so that they can inherit common settings and only specify overrides.
 
--   `10-4K.json` and `10-Retina.json`, for example, inherit from a file called `00-Base.json`.
--   `70-Vim-4K.json` and `70-Vim-Retina.json`, inherit from `60-Vim-Base.json`.
--   `40-Mutt-4K.json` and `40-Mutt-Retina.json`, inherit from `30-Mutt-Base.json`.
--   `30-Mutt-Base.json` itself inherits from `00-Base.json`.
+- `10-4K.json` and `10-Retina.json`, for example, inherit from a file called `00-Base.json`.
+- `70-Vim-4K.json` and `70-Vim-Retina.json`, inherit from `60-Vim-Base.json`.
+- `40-Mutt-4K.json` and `40-Mutt-Retina.json`, inherit from `30-Mutt-Base.json`.
+- `30-Mutt-Base.json` itself inherits from `00-Base.json`.
 
 The number prefixes are there because dynamic profiles are loaded in alphabetical order. We must make sure that parent profiles are loaded before their children, so the global ordering is thus:
 
--   `00-Base.json`
--   `10-4K.json`
--   `10-Retina.json`
--   `30-Mutt-Base.json`
--   `40-Mutt-4K.json`
--   `40-Mutt-Retina.json`
--   `60-Vim-Base.json`
--   `70-Vim-4K.json`
--   `70-Vim-Retina.json`
--   `Mutt.json`
--   `Vim.json`
--   `Wincent.json`
+- `00-Base.json`
+- `10-4K.json`
+- `10-Retina.json`
+- `30-Mutt-Base.json`
+- `40-Mutt-4K.json`
+- `40-Mutt-Retina.json`
+- `60-Vim-Base.json`
+- `70-Vim-4K.json`
+- `70-Vim-Retina.json`
+- `Mutt.json`
+- `Vim.json`
+- `Wincent.json`
 
 The "base" parent profiles never (or rarely) actually change, and we never need to swap one of them for another by changing a symlink target, so those ones live in this dotfiles repo and we have symlinks from `$HOME/Library/Application Support/iTerm2/DynamicProfiles` directly to them in `roles/iterm/files/DynamicProfiles`.
 
@@ -43,26 +43,26 @@ The "Mutt.json" and "Wincent.json" profiles are just symlinks to the "real" prof
 
 ## Summary
 
--   Just symlinks; changing what these points at causes iTerm2 to switch to a different profile:
-    -   `Mutt.json`
-    -   `Vim.json`
-    -   `Wincent.json`
--   Actual profiles; originals live in this repo and get symlinked to from the "Sources" directory in "Application Support":
-    -   `10-4K.json`
-    -   `10-Retina.json`
-    -   `40-Mutt-4K.json`
-    -   `40-Mutt-Retina.json`
-    -   `70-Vim-4K.json`
-    -   `70-Vim-Retina.json`
--   Parent profiles with common settings; originals live in this repo and get symlinked to from the "Dynamic Profiles" directory in "Application Support":
-    -   `00-Base.json`
-    -   `30-Mutt-Base.json`
-    -   `60-Vim-Base.json`
+- Just symlinks; changing what these points at causes iTerm2 to switch to a different profile:
+  - `Mutt.json`
+  - `Vim.json`
+  - `Wincent.json`
+- Actual profiles; originals live in this repo and get symlinked to from the "Sources" directory in "Application Support":
+  - `10-4K.json`
+  - `10-Retina.json`
+  - `40-Mutt-4K.json`
+  - `40-Mutt-Retina.json`
+  - `70-Vim-4K.json`
+  - `70-Vim-Retina.json`
+- Parent profiles with common settings; originals live in this repo and get symlinked to from the "Dynamic Profiles" directory in "Application Support":
+  - `00-Base.json`
+  - `30-Mutt-Base.json`
+  - `60-Vim-Base.json`
 
 ## What this all means
 
--   Because these are symlinks, editing the files in this repo will have no effect until the next iTerm restart (it will notice changes made by Hammerspoon to the symlink targets, but not changes to the files themselves, because the files live in a directly that it is not monitoring).
--   Any edits you make to a dynamic profile from the iTerm UI are not written back to the filesystem: to update the JSON files, you must explicitly export the settings using the drop-down in the UI, and them manually merge them in here.
+- Because these are symlinks, editing the files in this repo will have no effect until the next iTerm restart (it will notice changes made by Hammerspoon to the symlink targets, but not changes to the files themselves, because the files live in a directly that it is not monitoring).
+- Any edits you make to a dynamic profile from the iTerm UI are not written back to the filesystem: to update the JSON files, you must explicitly export the settings using the drop-down in the UI, and them manually merge them in here.
 
 ## A note about the `vim://` URL scheme
 
index 8813061c898c8934e6a932cb9e2eff3a24282b9e..41c8a949c6eedda24120766ac3238b29adfdc380 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Dynamic profiles for iTerm"
+  "description": "Dynamic profiles for iTerm"
 }
index 82b2c844a8d652d090728c9f2bb72b38b17b6dcb..f9093f19f0bbd9f658271e18019a4d41e282beca 100644 (file)
 {
-    "Profiles": [
+  "Profiles": [
+    {
+      "Name": "Base",
+      "Guid": "D70AD504-EFA6-41E2-AF8C-7EC47B16C6B8",
+      "Custom Directory": "No",
+      "Set Local Environment Vars": true,
+      "Working Directory": "/Users/glh",
+      "Prompt Before Closing 2": 0,
+      "Rows": 25,
+      "Use Italic Font": true,
+      "Use Custom Window Title": false,
+      "Right Option Key Sends": 0,
+      "Character Encoding": 4,
+      "Triggers": [],
+      "Blend": 0.300000011920929,
+      "Mouse Reporting": true,
+      "Cursor Boost": 0,
+      "Non-ASCII Anti Aliased": true,
+      "Sync Title": false,
+      "Disable Window Resizing": true,
+      "Close Sessions On End": true,
+      "Jobs to Ignore": ["rlogin", "ssh", "slogin", "telnet"],
+      "Scrollback With Status Bar": false,
+      "Scrollback Lines": 0,
+      "Scrollback in Alternate Screen": false,
+      "Hide After Opening": false,
+      "Flashing Bell": false,
+      "BM Growl": false,
+      "AWDS Window Directory": "",
+      "Use Non-ASCII Font": false,
+      "Shortcut": "",
+      "Background Image Location": "",
+      "Unlimited Scrollback": false,
+      "Custom Command": "No",
+      "AWDS Tab Option": "No",
+      "Smart Selection Rules": [
         {
-            "Name": "Base",
-            "Guid": "D70AD504-EFA6-41E2-AF8C-7EC47B16C6B8",
-            "Custom Directory": "No",
-            "Set Local Environment Vars": true,
-            "Working Directory": "/Users/glh",
-            "Prompt Before Closing 2": 0,
-            "Rows": 25,
-            "Use Italic Font": true,
-            "Use Custom Window Title": false,
-            "Right Option Key Sends": 0,
-            "Character Encoding": 4,
-            "Triggers": [],
-            "Blend": 0.300000011920929,
-            "Mouse Reporting": true,
-            "Cursor Boost": 0,
-            "Non-ASCII Anti Aliased": true,
-            "Sync Title": false,
-            "Disable Window Resizing": true,
-            "Close Sessions On End": true,
-            "Jobs to Ignore": ["rlogin", "ssh", "slogin", "telnet"],
-            "Scrollback With Status Bar": false,
-            "Scrollback Lines": 0,
-            "Scrollback in Alternate Screen": false,
-            "Hide After Opening": false,
-            "Flashing Bell": false,
-            "BM Growl": false,
-            "AWDS Window Directory": "",
-            "Use Non-ASCII Font": false,
-            "Shortcut": "",
-            "Background Image Location": "",
-            "Unlimited Scrollback": false,
-            "Custom Command": "No",
-            "AWDS Tab Option": "No",
-            "Smart Selection Rules": [
-                {
-                    "notes": "Word bounded by whitespace",
-                    "regex": "\\S+",
-                    "precision": "low"
-                },
-                {
-                    "notes": "C++ namespace::identifier",
-                    "regex": "([a-zA-Z0-9_]+::)+[a-zA-Z0-9_]+",
-                    "precision": "normal"
-                },
-                {
-                    "notes": "Paths",
-                    "regex": "\\~?/?([[:letter:][:number:]._-]+/+)+[[:letter:][:number:]._-]+/?",
-                    "precision": "normal"
-                },
-                {
-                    "notes": "Quoted string",
-                    "regex": "@?\"(?:[^\"\\\\]|\\\\.)*\"",
-                    "precision": "normal"
-                },
-                {
-                    "notes": "Java/Python include paths",
-                    "regex": "([[:letter:][:number:]._]+\\.)+[[:letter:][:number:]._]+",
-                    "precision": "normal"
-                },
-                {
-                    "notes": "mailto URL",
-                    "regex": "\\bmailto:([a-z0-9A-Z_]+@)?([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\b",
-                    "precision": "normal"
-                },
-                {
-                    "notes": "Obj-C selector",
-                    "regex": "@selector\\([^)]+\\)",
-                    "precision": "high"
-                },
-                {
-                    "notes": "email address",
-                    "regex": "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\\b",
-                    "precision": "high"
-                },
-                {
-                    "notes": "HTTP URL",
-                    "regex": "https?://([a-z0-9A-Z]+(:[a-zA-Z0-9]+)?@)?[a-z0-9A-Z]+(\\.[a-z0-9A-Z]+)*((:[0-9]+)?)(/[a-zA-Z0-9;/\\.\\-_+%~?&@=#\\(\\)]*)?",
-                    "precision": "very_high"
-                },
-                {
-                    "notes": "SSH URL",
-                    "regex": "\\bssh:([a-z0-9A-Z_]+@)?([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\b",
-                    "precision": "very_high"
-                },
-                {
-                    "notes": "Telnet URL",
-                    "regex": "\\btelnet:([a-z0-9A-Z_]+@)?([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\b",
-                    "precision": "very_high"
-                }
-            ],
-            "Keyboard Map": {
-                "0x9-0x40000": {
-                    "Text": "9",
-                    "Action": 11
-                },
-                "0xf700-0x260000": {
-                    "Text": "[1;6A",
-                    "Action": 10
-                },
-                "0x37-0x40000": {
-                    "Text": "0x1f",
-                    "Action": 11
-                },
-                "0x32-0x40000": {
-                    "Text": "0x00",
-                    "Action": 11
-                },
-                "0xf709-0x20000": {
-                    "Text": "[17;2~",
-                    "Action": 10
-                },
-                "0xf70c-0x20000": {
-                    "Text": "[20;2~",
-                    "Action": 10
-                },
-                "0xf729-0x20000": {
-                    "Text": "[1;2H",
-                    "Action": 10
-                },
-                "0xf72b-0x40000": {
-                    "Text": "[1;5F",
-                    "Action": 10
-                },
-                "0xf705-0x20000": {
-                    "Text": "[1;2Q",
-                    "Action": 10
-                },
-                "0xf703-0x260000": {
-                    "Text": "[1;6C",
-                    "Action": 10
-                },
-                "0xf700-0x220000": {
-                    "Text": "[1;2A",
-                    "Action": 10
-                },
-                "0xd-0x80000": {
-                    "Action": 11,
-                    "Text": "0x1b 0x0a"
-                },
-                "0xf701-0x280000": {
-                    "Text": "0x1b 0x1b 0x5b 0x42",
-                    "Action": 11
-                },
-                "0x38-0x40000": {
-                    "Text": "0x7f",
-                    "Action": 11
-                },
-                "0x33-0x40000": {
-                    "Text": "0x1b",
-                    "Action": 11
-                },
-                "0xf703-0x220000": {
-                    "Text": "[1;2C",
-                    "Action": 10
-                },
-                "0xf701-0x240000": {
-                    "Text": "[1;5B",
-                    "Action": 10
-                },
-                "0xf70d-0x20000": {
-                    "Text": "[21;2~",
-                    "Action": 10
-                },
-                "0xf702-0x260000": {
-                    "Text": "[1;6D",
-                    "Action": 10
-                },
-                "0xf729-0x40000": {
-                    "Text": "[1;5H",
-                    "Action": 10
-                },
-                "0xf706-0x20000": {
-                    "Text": "[1;2R",
-                    "Action": 10
-                },
-                "0x34-0x40000": {
-                    "Text": "0x1c",
-                    "Action": 11
-                },
-                "0xf700-0x280000": {
-                    "Text": "0x1b 0x1b 0x5b 0x41",
-                    "Action": 11
-                },
-                "0x2d-0x40000": {
-                    "Text": "0x1f",
-                    "Action": 11
-                },
-                "0xf70e-0x20000": {
-                    "Text": "[23;2~",
-                    "Action": 10
-                },
-                "0xf702-0x220000": {
-                    "Text": "[1;2D",
-                    "Action": 10
-                },
-                "0xf703-0x280000": {
-                    "Text": "f",
-                    "Action": 10
-                },
-                "0xf700-0x240000": {
-                    "Text": "[1;5A",
-                    "Action": 10
-                },
-                "0xf707-0x20000": {
-                    "Text": "[1;2S",
-                    "Action": 10
-                },
-                "0xf70a-0x20000": {
-                    "Text": "[18;2~",
-                    "Action": 10
-                },
-                "0x35-0x40000": {
-                    "Text": "0x1d",
-                    "Action": 11
-                },
-                "0xf70f-0x20000": {
-                    "Text": "[24;2~",
-                    "Action": 10
-                },
-                "0xf703-0x240000": {
-                    "Text": "[1;5C",
-                    "Action": 10
-                },
-                "0xf701-0x260000": {
-                    "Text": "[1;6B",
-                    "Action": 10
-                },
-                "0xf702-0x280000": {
-                    "Text": "b",
-                    "Action": 10
-                },
-                "0xf72b-0x20000": {
-                    "Text": "[1;2F",
-                    "Action": 10
-                },
-                "0x36-0x40000": {
-                    "Text": "0x1e",
-                    "Action": 11
-                },
-                "0xf708-0x20000": {
-                    "Text": "[15;2~",
-                    "Action": 10
-                },
-                "0xf701-0x220000": {
-                    "Text": "[1;2B",
-                    "Action": 10
-                },
-                "0xf70b-0x20000": {
-                    "Text": "[19;2~",
-                    "Action": 10
-                },
-                "0xf702-0x240000": {
-                    "Text": "[1;5D",
-                    "Action": 10
-                },
-                "0xf704-0x20000": {
-                    "Text": "[1;2P",
-                    "Action": 10
-                }
-            },
-            "Log Directory": "",
-            "Use Canonical Parser": false,
-            "Background Image Is Tiled": false,
-            "Send Code When Idle": false,
-            "ASCII Anti Aliased": true,
-            "Tags": [],
-            "Use Bold Font": true,
-            "Silence Bell": true,
-            "Window Type": 12,
-            "Allow Title Reporting": false,
-            "Use Bright Bold": true,
-            "Default Bookmark": "No",
-            "Disable Smcup Rmcup": false,
-            "Blinking Cursor": false,
-            "Idle Code": 0,
-            "Automatically Log": false,
-            "Smart Cursor Color": true,
-            "Semantic History": {
-                "text": "vim \\1",
-                "action": "best editor",
-                "editor": "com.sublimetext.3"
-            },
-            "Ambiguous Double Width": false,
-            "Blur Radius": 15.08386418269231,
-            "Cursor Type": 2,
-            "AWDS Pane Directory": "",
-            "Blur": false,
-            "Normal Font": "SourceCodePro-Regular 13",
-            "Vertical Spacing": 1,
-            "Disable Printing": false,
-            "AWDS Tab Directory": "",
-            "AWDS Pane Option": "No",
-            "Command": "",
-            "Terminal Type": "xterm-256color",
-            "Horizontal Spacing": 1,
-            "Option Key Sends": 0,
-            "Only The Default BG Color Uses Transparency": false,
-            "Blink Allowed": false,
-            "Minimum Contrast": 0.0,
-            "Transparency": 0,
-            "Initial Text": "",
-            "Screen": -1,
-            "AWDS Window Option": "No",
-            "Non Ascii Font": "Consolas 13",
-            "Columns": 80,
-            "Visual Bell": true,
-            "ASCII Ligatures": false,
-            "Thin Strokes": 1
+          "notes": "Word bounded by whitespace",
+          "regex": "\\S+",
+          "precision": "low"
+        },
+        {
+          "notes": "C++ namespace::identifier",
+          "regex": "([a-zA-Z0-9_]+::)+[a-zA-Z0-9_]+",
+          "precision": "normal"
+        },
+        {
+          "notes": "Paths",
+          "regex": "\\~?/?([[:letter:][:number:]._-]+/+)+[[:letter:][:number:]._-]+/?",
+          "precision": "normal"
+        },
+        {
+          "notes": "Quoted string",
+          "regex": "@?\"(?:[^\"\\\\]|\\\\.)*\"",
+          "precision": "normal"
+        },
+        {
+          "notes": "Java/Python include paths",
+          "regex": "([[:letter:][:number:]._]+\\.)+[[:letter:][:number:]._]+",
+          "precision": "normal"
+        },
+        {
+          "notes": "mailto URL",
+          "regex": "\\bmailto:([a-z0-9A-Z_]+@)?([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\b",
+          "precision": "normal"
+        },
+        {
+          "notes": "Obj-C selector",
+          "regex": "@selector\\([^)]+\\)",
+          "precision": "high"
+        },
+        {
+          "notes": "email address",
+          "regex": "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}\\b",
+          "precision": "high"
+        },
+        {
+          "notes": "HTTP URL",
+          "regex": "https?://([a-z0-9A-Z]+(:[a-zA-Z0-9]+)?@)?[a-z0-9A-Z]+(\\.[a-z0-9A-Z]+)*((:[0-9]+)?)(/[a-zA-Z0-9;/\\.\\-_+%~?&@=#\\(\\)]*)?",
+          "precision": "very_high"
+        },
+        {
+          "notes": "SSH URL",
+          "regex": "\\bssh:([a-z0-9A-Z_]+@)?([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\b",
+          "precision": "very_high"
+        },
+        {
+          "notes": "Telnet URL",
+          "regex": "\\btelnet:([a-z0-9A-Z_]+@)?([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\b",
+          "precision": "very_high"
+        }
+      ],
+      "Keyboard Map": {
+        "0x9-0x40000": {
+          "Text": "9",
+          "Action": 11
+        },
+        "0xf700-0x260000": {
+          "Text": "[1;6A",
+          "Action": 10
+        },
+        "0x37-0x40000": {
+          "Text": "0x1f",
+          "Action": 11
+        },
+        "0x32-0x40000": {
+          "Text": "0x00",
+          "Action": 11
+        },
+        "0xf709-0x20000": {
+          "Text": "[17;2~",
+          "Action": 10
+        },
+        "0xf70c-0x20000": {
+          "Text": "[20;2~",
+          "Action": 10
+        },
+        "0xf729-0x20000": {
+          "Text": "[1;2H",
+          "Action": 10
+        },
+        "0xf72b-0x40000": {
+          "Text": "[1;5F",
+          "Action": 10
+        },
+        "0xf705-0x20000": {
+          "Text": "[1;2Q",
+          "Action": 10
+        },
+        "0xf703-0x260000": {
+          "Text": "[1;6C",
+          "Action": 10
+        },
+        "0xf700-0x220000": {
+          "Text": "[1;2A",
+          "Action": 10
+        },
+        "0xd-0x80000": {
+          "Action": 11,
+          "Text": "0x1b 0x0a"
+        },
+        "0xf701-0x280000": {
+          "Text": "0x1b 0x1b 0x5b 0x42",
+          "Action": 11
+        },
+        "0x38-0x40000": {
+          "Text": "0x7f",
+          "Action": 11
+        },
+        "0x33-0x40000": {
+          "Text": "0x1b",
+          "Action": 11
+        },
+        "0xf703-0x220000": {
+          "Text": "[1;2C",
+          "Action": 10
+        },
+        "0xf701-0x240000": {
+          "Text": "[1;5B",
+          "Action": 10
+        },
+        "0xf70d-0x20000": {
+          "Text": "[21;2~",
+          "Action": 10
+        },
+        "0xf702-0x260000": {
+          "Text": "[1;6D",
+          "Action": 10
+        },
+        "0xf729-0x40000": {
+          "Text": "[1;5H",
+          "Action": 10
+        },
+        "0xf706-0x20000": {
+          "Text": "[1;2R",
+          "Action": 10
+        },
+        "0x34-0x40000": {
+          "Text": "0x1c",
+          "Action": 11
+        },
+        "0xf700-0x280000": {
+          "Text": "0x1b 0x1b 0x5b 0x41",
+          "Action": 11
+        },
+        "0x2d-0x40000": {
+          "Text": "0x1f",
+          "Action": 11
+        },
+        "0xf70e-0x20000": {
+          "Text": "[23;2~",
+          "Action": 10
+        },
+        "0xf702-0x220000": {
+          "Text": "[1;2D",
+          "Action": 10
+        },
+        "0xf703-0x280000": {
+          "Text": "f",
+          "Action": 10
+        },
+        "0xf700-0x240000": {
+          "Text": "[1;5A",
+          "Action": 10
+        },
+        "0xf707-0x20000": {
+          "Text": "[1;2S",
+          "Action": 10
+        },
+        "0xf70a-0x20000": {
+          "Text": "[18;2~",
+          "Action": 10
+        },
+        "0x35-0x40000": {
+          "Text": "0x1d",
+          "Action": 11
+        },
+        "0xf70f-0x20000": {
+          "Text": "[24;2~",
+          "Action": 10
+        },
+        "0xf703-0x240000": {
+          "Text": "[1;5C",
+          "Action": 10
+        },
+        "0xf701-0x260000": {
+          "Text": "[1;6B",
+          "Action": 10
+        },
+        "0xf702-0x280000": {
+          "Text": "b",
+          "Action": 10
+        },
+        "0xf72b-0x20000": {
+          "Text": "[1;2F",
+          "Action": 10
+        },
+        "0x36-0x40000": {
+          "Text": "0x1e",
+          "Action": 11
+        },
+        "0xf708-0x20000": {
+          "Text": "[15;2~",
+          "Action": 10
+        },
+        "0xf701-0x220000": {
+          "Text": "[1;2B",
+          "Action": 10
+        },
+        "0xf70b-0x20000": {
+          "Text": "[19;2~",
+          "Action": 10
+        },
+        "0xf702-0x240000": {
+          "Text": "[1;5D",
+          "Action": 10
+        },
+        "0xf704-0x20000": {
+          "Text": "[1;2P",
+          "Action": 10
         }
-    ]
+      },
+      "Log Directory": "",
+      "Use Canonical Parser": false,
+      "Background Image Is Tiled": false,
+      "Send Code When Idle": false,
+      "ASCII Anti Aliased": true,
+      "Tags": [],
+      "Use Bold Font": true,
+      "Silence Bell": true,
+      "Window Type": 12,
+      "Allow Title Reporting": false,
+      "Use Bright Bold": true,
+      "Default Bookmark": "No",
+      "Disable Smcup Rmcup": false,
+      "Blinking Cursor": false,
+      "Idle Code": 0,
+      "Automatically Log": false,
+      "Smart Cursor Color": true,
+      "Semantic History": {
+        "text": "vim \\1",
+        "action": "best editor",
+        "editor": "com.sublimetext.3"
+      },
+      "Ambiguous Double Width": false,
+      "Blur Radius": 15.08386418269231,
+      "Cursor Type": 2,
+      "AWDS Pane Directory": "",
+      "Blur": false,
+      "Normal Font": "SourceCodePro-Regular 13",
+      "Vertical Spacing": 1,
+      "Disable Printing": false,
+      "AWDS Tab Directory": "",
+      "AWDS Pane Option": "No",
+      "Command": "",
+      "Terminal Type": "xterm-256color",
+      "Horizontal Spacing": 1,
+      "Option Key Sends": 0,
+      "Only The Default BG Color Uses Transparency": false,
+      "Blink Allowed": false,
+      "Minimum Contrast": 0.0,
+      "Transparency": 0,
+      "Initial Text": "",
+      "Screen": -1,
+      "AWDS Window Option": "No",
+      "Non Ascii Font": "Consolas 13",
+      "Columns": 80,
+      "Visual Bell": true,
+      "ASCII Ligatures": false,
+      "Thin Strokes": 1
+    }
+  ]
 }
index 77cc8a0e9ad4cac4b26e87f9c4e04be31ee5360d..715de36c289cdbf271c3301a264887c8aa7d2496 100644 (file)
@@ -1,11 +1,11 @@
 {
-    "Profiles": [
-        {
-            "Name": "Mutt (Base)",
-            "Guid": "2AAB5F82-9007-41DA-B772-5E776FD41383",
-            "Dynamic Profile Parent Name": "Base",
-            "Custom Command": "Yes",
-            "Command": "/usr/local/bin/zsh -ic \"/usr/local/bin/mutt -- $$URL$$\""
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Mutt (Base)",
+      "Guid": "2AAB5F82-9007-41DA-B772-5E776FD41383",
+      "Dynamic Profile Parent Name": "Base",
+      "Custom Command": "Yes",
+      "Command": "/usr/local/bin/zsh -ic \"/usr/local/bin/mutt -- $$URL$$\""
+    }
+  ]
 }
index bb3fc6f0ec370ad849d8652bd6c803bc5556c184..b8bc7c4b3f7e93949d1ee43edb187c9a54c5ef33 100644 (file)
@@ -1,11 +1,11 @@
 {
-    "Profiles": [
-        {
-            "Name": "Vim (Base)",
-            "Guid": "8C012B27-65E8-470D-83FA-B5485479863D",
-            "Dynamic Profile Parent Name": "Base",
-            "Custom Command": "Yes",
-            "Command": "/usr/local/bin/zsh -ic \"/usr/local/bin/nvim $$RES$$\""
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Vim (Base)",
+      "Guid": "8C012B27-65E8-470D-83FA-B5485479863D",
+      "Dynamic Profile Parent Name": "Base",
+      "Custom Command": "Yes",
+      "Command": "/usr/local/bin/zsh -ic \"/usr/local/bin/nvim $$RES$$\""
+    }
+  ]
 }
index fd22af08f6f10b99d21549038c5c2dcfd8d20807..b144a6a1c5453a8c82b28c8e9a1e4dfb9941a7ea 100644 (file)
@@ -1,10 +1,10 @@
 {
-    "Profiles": [
-        {
-            "Name": "Wincent",
-            "Guid": "C9389479-10A0-4D67-BCDF-80BA2CA3A3D6",
-            "Dynamic Profile Parent Name": "Base",
-            "Normal Font": "SourceCodePro-Regular 16"
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Wincent",
+      "Guid": "C9389479-10A0-4D67-BCDF-80BA2CA3A3D6",
+      "Dynamic Profile Parent Name": "Base",
+      "Normal Font": "SourceCodePro-Regular 16"
+    }
+  ]
 }
index 6c1af278c938a28d1283cbbe5bcf55085958ceee..b153569c7dcd8f95ea940a416731b3e71bff319a 100644 (file)
@@ -1,10 +1,10 @@
 {
-    "Profiles": [
-        {
-            "Name": "Wincent",
-            "Guid": "C9389479-10A0-4D67-BCDF-80BA2CA3A3D6",
-            "Dynamic Profile Parent Name": "Base",
-            "Normal Font": "SourceCodePro-Regular 13"
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Wincent",
+      "Guid": "C9389479-10A0-4D67-BCDF-80BA2CA3A3D6",
+      "Dynamic Profile Parent Name": "Base",
+      "Normal Font": "SourceCodePro-Regular 13"
+    }
+  ]
 }
index 91d2370b512de0459ec20366b0ec536cdb5fb7e6..97cdb0979835dbb000b637a458dc4d1d5aaf69e5 100644 (file)
@@ -1,10 +1,10 @@
 {
-    "Profiles": [
-        {
-            "Name": "Mutt",
-            "Guid": "98A7362E-A930-4331-A7DD-E4FC57EFBEEB",
-            "Dynamic Profile Parent Name": "Mutt (Base)",
-            "Normal Font": "SourceCodePro-Regular 16"
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Mutt",
+      "Guid": "98A7362E-A930-4331-A7DD-E4FC57EFBEEB",
+      "Dynamic Profile Parent Name": "Mutt (Base)",
+      "Normal Font": "SourceCodePro-Regular 16"
+    }
+  ]
 }
index 7cba214fa2aad9600f40a1673726e04c2c7e934a..02a93c2663516400bbd705e3d9560e0b2c98414a 100644 (file)
@@ -1,10 +1,10 @@
 {
-    "Profiles": [
-        {
-            "Name": "Mutt",
-            "Guid": "98A7362E-A930-4331-A7DD-E4FC57EFBEEB",
-            "Dynamic Profile Parent Name": "Mutt (Base)",
-            "Normal Font": "SourceCodePro-Regular 13"
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Mutt",
+      "Guid": "98A7362E-A930-4331-A7DD-E4FC57EFBEEB",
+      "Dynamic Profile Parent Name": "Mutt (Base)",
+      "Normal Font": "SourceCodePro-Regular 13"
+    }
+  ]
 }
index 00e330103b45577e6ca12b004415f621d487d9b4..2770993be2573306f4d10140abaf42ad1fedfeba 100644 (file)
@@ -1,10 +1,10 @@
 {
-    "Profiles": [
-        {
-            "Name": "Vim",
-            "Guid": "1770FCDD-BCA2-403B-BABF-A6B2D994D725",
-            "Dynamic Profile Parent Name": "Vim (Base)",
-            "Normal Font": "SourceCodePro-Regular 16"
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Vim",
+      "Guid": "1770FCDD-BCA2-403B-BABF-A6B2D994D725",
+      "Dynamic Profile Parent Name": "Vim (Base)",
+      "Normal Font": "SourceCodePro-Regular 16"
+    }
+  ]
 }
index 4662283ec9648e03c7b5dd0b951af7a48900f6fc..5fccb65776ae973e9a4a50ba58f24fd3c3fc1b2b 100644 (file)
@@ -1,10 +1,10 @@
 {
-    "Profiles": [
-        {
-            "Name": "Vim",
-            "Guid": "18A475CE-8744-4C20-AFAE-AAEBF4F20F40",
-            "Dynamic Profile Parent Name": "Vim (Base)",
-            "Normal Font": "SourceCodePro-Regular 13"
-        }
-    ]
+  "Profiles": [
+    {
+      "Name": "Vim",
+      "Guid": "18A475CE-8744-4C20-AFAE-AAEBF4F20F40",
+      "Dynamic Profile Parent Name": "Vim (Base)",
+      "Normal Font": "SourceCodePro-Regular 13"
+    }
+  ]
 }
index 05e3f8ef01d70f88f87e3d6d87060862d8de5670..5cc3710b173dba6327a7fe2b67abaca83b2f9d5b 100644 (file)
@@ -8,76 +8,72 @@ import type {Path} from 'fig';
 // iTerm will create some of these on first run, but we specify all here
 // for completeness.
 task('create directories', async () => {
-    for (const directory of [
-        '~/Library/Application Support/iTerm2',
-        '~/Library/Application Support/iTerm2/DynamicProfiles',
-        '~/Library/Application Support/iTerm2/Sources',
-    ]) {
-        await file({path: directory, state: 'directory'});
-    }
+  for (const directory of [
+    '~/Library/Application Support/iTerm2',
+    '~/Library/Application Support/iTerm2/DynamicProfiles',
+    '~/Library/Application Support/iTerm2/Sources',
+  ]) {
+    await file({path: directory, state: 'directory'});
+  }
 });
 
 task('link Dynamic Profiles', async () => {
-    const profiles = path.home.join(
-        'Library/Application Support/iTerm2/DynamicProfiles'
-    );
+  const profiles = path.home.join(
+    'Library/Application Support/iTerm2/DynamicProfiles'
+  );
 
-    for (const src of resource.files('DynamicProfiles/*.json')) {
-        await file({
-            force: true,
-            path: profiles.join(src.basename),
-            src,
-            state: 'link',
-        });
-    }
+  for (const src of resource.files('DynamicProfiles/*.json')) {
+    await file({
+      force: true,
+      path: profiles.join(src.basename),
+      src,
+      state: 'link',
+    });
+  }
 });
 
 task('link sources', async () => {
-    const sources = path.home.join(
-        'Library/Application Support/iTerm2/Sources'
-    );
+  const sources = path.home.join('Library/Application Support/iTerm2/Sources');
 
-    for (const src of resource.files('Sources/*.json')) {
-        await file({
-            force: true,
-            path: sources.join(src.basename),
-            src,
-            state: 'link',
-        });
-    }
+  for (const src of resource.files('Sources/*.json')) {
+    await file({
+      force: true,
+      path: sources.join(src.basename),
+      src,
+      state: 'link',
+    });
+  }
 });
 
 task('set up switchable symbolic links', async () => {
-    const {retina} = variable.object('iTermDynamicProfiles');
+  const {retina} = variable.object('iTermDynamicProfiles');
 
-    assert.JSONArray(retina);
+  assert.JSONArray(retina);
 
-    const sources = path.home.join(
-        'Library/Application Support/iTerm2/Sources'
-    );
-    const profiles = path.home.join(
-        'Library/Application Support/iTerm2/DynamicProfiles'
-    );
+  const sources = path.home.join('Library/Application Support/iTerm2/Sources');
+  const profiles = path.home.join(
+    'Library/Application Support/iTerm2/DynamicProfiles'
+  );
 
-    for (const config of retina) {
-        assert.JSONObject(config);
-        let {src, path: dest} = config;
+  for (const config of retina) {
+    assert.JSONObject(config);
+    let {src, path: dest} = config;
 
-        src = sources.join(String(src));
-        dest = profiles.join(String(dest));
+    src = sources.join(String(src));
+    dest = profiles.join(String(dest));
 
-        // We only link these ones if they don't already exist;
-        // once created, Hammerspoon manages the links.
-        const stats = await stat((dest as Path).expand);
+    // We only link these ones if they don't already exist;
+    // once created, Hammerspoon manages the links.
+    const stats = await stat((dest as Path).expand);
 
-        if (stats === null) {
-            await file({
-                path: dest,
-                src,
-                state: 'link',
-            });
-        } else {
-            skip(`path ${stringify(dest)} exists`);
-        }
+    if (stats === null) {
+      await file({
+        path: dest,
+        src,
+        state: 'link',
+      });
+    } else {
+      skip(`path ${stringify(dest)} exists`);
     }
+  }
 });
index c310866ae1e7047e3e0577ccf0a50b78495fceeb..66463dfae651191844807a68932db6cf40115ad1 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Configures Karabiner-Elements"
+  "description": "Configures Karabiner-Elements"
 }
index 2d552c0b77d751120c55c63c5f02b37ada25fda5..dab04f2701e7fc78abff054ceb00001b20dcdeb9 100644 (file)
@@ -3,78 +3,78 @@ import {command, file, path, resource, skip, template, task} from 'fig';
 const node = path.root.join('bin/node');
 
 task('make directories', async () => {
-    await file({path: '~/.config', state: 'directory'});
-    await file({path: '~/.config/karabiner', state: 'directory'});
-    await file({path: '~/bin', state: 'directory'});
+  await file({path: '~/.config', state: 'directory'});
+  await file({path: '~/.config/karabiner', state: 'directory'});
+  await file({path: '~/bin', state: 'directory'});
 });
 
 task('copy helper scripts', async () => {
-    const scripts = [
-        'bin/karabiner-boot',
-        'bin/karabiner-kill',
-        'bin/karabiner-kill.applescript',
-    ];
+  const scripts = [
+    'bin/karabiner-boot',
+    'bin/karabiner-kill',
+    'bin/karabiner-kill.applescript',
+  ];
 
-    for (const script of scripts) {
-        await file({
-            mode: script.endsWith('.applescript') ? '0644' : '0755',
-            path: path.home.join(script),
-            src: resource.file(script),
-            state: 'link',
-        });
-    }
+  for (const script of scripts) {
+    await file({
+      mode: script.endsWith('.applescript') ? '0644' : '0755',
+      path: path.home.join(script),
+      src: resource.file(script),
+      state: 'link',
+    });
+  }
 });
 
 task('test karabiner.json generator', async () => {
-    const test = resource.support('karabiner-test.js');
+  const test = resource.support('karabiner-test.js');
 
-    await command(node, [test]);
+  await command(node, [test]);
 });
 
 let config: string | undefined;
 
 task('prepare karabiner.json', async () => {
-    const script = resource.support('karabiner.js');
+  const script = resource.support('karabiner.js');
 
-    const result = await command(node, [script, '--emit-karabiner-config']);
+  const result = await command(node, [script, '--emit-karabiner-config']);
 
-    if (result) {
-        config = result.stdout;
-    }
+  if (result) {
+    config = result.stdout;
+  }
 });
 
 task('write karabiner.json', async () => {
-    if (!config) {
-        return skip('no contents prepared for karabiner.json');
-    }
+  if (!config) {
+    return skip('no contents prepared for karabiner.json');
+  }
 
-    await template({
-        path: '~/.config/karabiner/karabiner.json',
-        src: resource.template('.config/karabiner/karabiner.json.erb'),
-        variables: {config},
-    });
+  await template({
+    path: '~/.config/karabiner/karabiner.json',
+    src: resource.template('.config/karabiner/karabiner.json.erb'),
+    variables: {config},
+  });
 });
 
 // This is a bit random having this in here, but it's a dependency of our
 // Hammerspoon set-up; should possibly move the related bit of that in here?
 task('write karabiner-sudoers', async () => {
-    await template({
-        path: '/private/etc/sudoers.d/karabiner-sudoers',
-        src: resource.template('karabiner-sudoers.erb'),
-        sudo: true,
-    });
+  await template({
+    path: '/private/etc/sudoers.d/karabiner-sudoers',
+    src: resource.template('karabiner-sudoers.erb'),
+    sudo: true,
+  });
 });
 
 task('build `dry` executable', async () => {
-    await command('make', [], {
-        chdir: path.aspect.join('support/dry'),
-        creates: resource.support('dry/dry'),
-    });
+  await command('make', [], {
+    chdir: path.aspect.join('support/dry'),
+    creates: resource.support('dry/dry'),
+  });
 });
 
 task('install `dry` executable', async () => {
-    await command('make install', [], {
-        chdir: path.aspect.join('support/dry'),
-        creates: path.home.join('bin/dry'),
-    });
+  await command('make install', [], {
+    chdir: path.aspect.join('support/dry'),
+    creates: path.home.join('bin/dry'),
+  });
 });
index 14727e5109f1d17cc3d0651c1dd733fd9b19cbbb..51923d987cdc097938efe18bc2aaa80a29848de5 100755 (executable)
@@ -10,126 +10,125 @@ import {ok} from 'assert';
 import {bundleIdentifier, deepCopy, isObject, visit} from './karabiner.js';
 
 (function test_bundleIdentifier() {
-    (function $() {
-        ok(
-            bundleIdentifier('com.apple.TextEdit') ===
-                '^com\\.apple\\.TextEdit$',
-            $
-        );
-    })();
+  (function $() {
+    ok(
+      bundleIdentifier('com.apple.TextEdit') === '^com\\.apple\\.TextEdit$',
+      $
+    );
+  })();
 })();
 
 (function test_deepCopy() {
-    const source = {
-        object: {
-            isInner: true,
-        },
-        array: [1, 2, [3, 4]],
-    };
-    const copy = deepCopy(source);
-
-    // Copies look the same.
-    (function $() {
-        ok(
-            JSON.stringify(copy) ===
-                '{"object":{"isInner":true},"array":[1,2,[3,4]]}',
-            $
-        );
-    })();
-
-    // Objects are cloned.
-    (function $() {
-        ok(source !== copy, $);
-    })();
-
-    // Nested objects are cloned.
-    (function $() {
-        ok(source.object !== copy.object, $);
-    })();
-
-    // Arrays are cloned.
-    (function $() {
-        ok(source.array !== copy.array, $);
-    })();
-
-    // Nested arrays are cloned.
-    (function $() {
-        ok(source.array[2] !== copy.array[2], $);
-    })();
-
-    // Primitives are identical.
-    (function $() {
-        ok(source.array[0] === copy.array[0], $);
-    })();
+  const source = {
+    object: {
+      isInner: true,
+    },
+    array: [1, 2, [3, 4]],
+  };
+  const copy = deepCopy(source);
+
+  // Copies look the same.
+  (function $() {
+    ok(
+      JSON.stringify(copy) ===
+        '{"object":{"isInner":true},"array":[1,2,[3,4]]}',
+      $
+    );
+  })();
+
+  // Objects are cloned.
+  (function $() {
+    ok(source !== copy, $);
+  })();
+
+  // Nested objects are cloned.
+  (function $() {
+    ok(source.object !== copy.object, $);
+  })();
+
+  // Arrays are cloned.
+  (function $() {
+    ok(source.array !== copy.array, $);
+  })();
+
+  // Nested arrays are cloned.
+  (function $() {
+    ok(source.array[2] !== copy.array[2], $);
+  })();
+
+  // Primitives are identical.
+  (function $() {
+    ok(source.array[0] === copy.array[0], $);
+  })();
 })();
 
 (function test_isObject() {
-    // Arrays are not objects.
-    (function $() {
-        ok(!isObject([1]), $);
-    })();
-
-    // Booleans are not objects.
-    (function $() {
-        ok(!isObject(true), $);
-    })();
-
-    // `null` is not an object.
-    (function $() {
-        ok(!isObject(null), $);
-    })();
-
-    // Numbers are not objects.
-    (function $() {
-        ok(!isObject(1), $);
-    })();
-
-    // Strings are not objects.
-    (function $() {
-        ok(!isObject('this'), $);
-    })();
-
-    // `undefined` is not an object.
-    (function $() {
-        ok(!isObject(undefined), $);
-    })();
-
-    // Objects are objects.
-    (function $() {
-        ok(isObject({}), $);
-    })();
+  // Arrays are not objects.
+  (function $() {
+    ok(!isObject([1]), $);
+  })();
+
+  // Booleans are not objects.
+  (function $() {
+    ok(!isObject(true), $);
+  })();
+
+  // `null` is not an object.
+  (function $() {
+    ok(!isObject(null), $);
+  })();
+
+  // Numbers are not objects.
+  (function $() {
+    ok(!isObject(1), $);
+  })();
+
+  // Strings are not objects.
+  (function $() {
+    ok(!isObject('this'), $);
+  })();
+
+  // `undefined` is not an object.
+  (function $() {
+    ok(!isObject(undefined), $);
+  })();
+
+  // Objects are objects.
+  (function $() {
+    ok(isObject({}), $);
+  })();
 })();
 
 (function test_visit() {
-    const subject = () => ({
-        foo: 1,
-        bar: [
-            {
-                a: [{}, {deep: {prop: 3}}],
-            },
-            {
-                a: [],
-                b: [{deep: {prop: 10}}],
-            },
-        ],
-    });
-
-    // Helpers for readability.
-    const string = JSON.stringify;
-    const squish = (s) => s.replace(/\s+/g, '');
-
-    // Replacing the entire document.
-    (function $() {
-        const updated = visit(subject(), '$', (root) => 'replacement');
-        ok(updated === 'replacement', $);
-    })();
-
-    // Setting a property on an object.
-    (function $() {
-        const updated = visit(subject(), '$.foo', (value) => value + 5);
-        ok(
-            string(updated) ===
-                squish(`{
+  const subject = () => ({
+    foo: 1,
+    bar: [
+      {
+        a: [{}, {deep: {prop: 3}}],
+      },
+      {
+        a: [],
+        b: [{deep: {prop: 10}}],
+      },
+    ],
+  });
+
+  // Helpers for readability.
+  const string = JSON.stringify;
+  const squish = (s) => s.replace(/\s+/g, '');
+
+  // Replacing the entire document.
+  (function $() {
+    const updated = visit(subject(), '$', (root) => 'replacement');
+    ok(updated === 'replacement', $);
+  })();
+
+  // Setting a property on an object.
+  (function $() {
+    const updated = visit(subject(), '$.foo', (value) => value + 5);
+    ok(
+      string(updated) ===
+        squish(`{
           "foo": 6,
           "bar": [
             {
@@ -141,42 +140,38 @@ import {bundleIdentifier, deepCopy, isObject, visit} from './karabiner.js';
             }
           ]
         }`),
-            $
-        );
-    })();
-
-    // Modifying a list.
-    (function $() {
-        let counter = 10;
-        const updated = visit(subject(), '$.bar[0:]', (_) => counter++);
-        ok(
-            string(updated) ===
-                squish(`{
+      $
+    );
+  })();
+
+  // Modifying a list.
+  (function $() {
+    let counter = 10;
+    const updated = visit(subject(), '$.bar[0:]', (_) => counter++);
+    ok(
+      string(updated) ===
+        squish(`{
           "foo": 1,
           "bar": [10, 11]
         }`),
-            $
-        );
-    })();
-
-    // Re-cycling subtrees.
-    (function $() {
-        const original = subject();
-        const updated = visit(
-            original,
-            '$.bar[0:].a[0:].deep',
-            (value) => 'xxx'
-        );
-
-        ok(
-            updated !== original &&
-                updated.foo === original.foo &&
-                updated.bar !== original.bar &&
-                updated.bar[0] !== original.bar[0] &&
-                updated.bar[0].a !== original.bar[0].a &&
-                updated.bar[0].a[0] !== original.bar[0].a[0] &&
-                updated.bar[1] === original.bar[1],
-            $
-        );
-    })();
+      $
+    );
+  })();
+
+  // Re-cycling subtrees.
+  (function $() {
+    const original = subject();
+    const updated = visit(original, '$.bar[0:].a[0:].deep', (value) => 'xxx');
+
+    ok(
+      updated !== original &&
+        updated.foo === original.foo &&
+        updated.bar !== original.bar &&
+        updated.bar[0] !== original.bar[0] &&
+        updated.bar[0].a !== original.bar[0].a &&
+        updated.bar[0].a[0] !== original.bar[0].a[0] &&
+        updated.bar[1] === original.bar[1],
+      $
+    );
+  })();
 })();
index f3724010d8adc05a5025418dfd5010742a11639e..9dbb33d06eb7447e96669d69fbaf469aad4150a6 100755 (executable)
@@ -1,18 +1,18 @@
 function fromTo(from, to) {
-    return [
-        {
-            from: {
-                key_code: from,
-            },
-            to: {
-                key_code: to,
-            },
-        },
-    ];
+  return [
+    {
+      from: {
+        key_code: from,
+      },
+      to: {
+        key_code: to,
+      },
+    },
+  ];
 }
 
 export function bundleIdentifier(identifier) {
-    return '^' + identifier.replace(/\./g, '\\.') + '$';
+  return '^' + identifier.replace(/\./g, '\\.') + '$';
 }
 
 /**
@@ -21,236 +21,235 @@ export function bundleIdentifier(identifier) {
  * Karabiner-Elements needs to manipulate).
  */
 function colemak(key) {
-    return (
-        {
-            d: 'g',
-            e: 'k',
-            f: 'e',
-            g: 't',
-            i: 'l',
-            j: 'y',
-            k: 'n',
-            l: 'u',
-            n: 'j',
-            o: 'semicolon',
-            p: 'r',
-            r: 's',
-            s: 'd',
-            semicolon: 'p',
-            t: 'f',
-            u: 'i',
-            y: 'o',
-        }[key] || key
-    );
+  return (
+    {
+      d: 'g',
+      e: 'k',
+      f: 'e',
+      g: 't',
+      i: 'l',
+      j: 'y',
+      k: 'n',
+      l: 'u',
+      n: 'j',
+      o: 'semicolon',
+      p: 'r',
+      r: 's',
+      s: 'd',
+      semicolon: 'p',
+      t: 'f',
+      u: 'i',
+      y: 'o',
+    }[key] || key
+  );
 }
 
 function launch(from, ...args) {
-    return [
+  return [
+    {
+      from: {
+        simultaneous: [
+          {
+            key_code: colemak('n'), // mnemonic: "[n]ow", "[n]ew")
+          },
+          {
+            key_code: from,
+          },
+        ],
+        simultaneous_options: {
+          key_down_order: 'strict',
+          key_up_order: 'strict_inverse',
+        },
+      },
+      parameters: {
+        'basic.simultaneous_threshold_milliseconds': 500 /* Default: 1000 */,
+      },
+      to: [
         {
-            from: {
-                simultaneous: [
-                    {
-                        key_code: colemak('n'), // mnemonic: "[n]ow", "[n]ew")
-                    },
-                    {
-                        key_code: from,
-                    },
-                ],
-                simultaneous_options: {
-                    key_down_order: 'strict',
-                    key_up_order: 'strict_inverse',
-                },
-            },
-            parameters: {
-                'basic.simultaneous_threshold_milliseconds': 500 /* Default: 1000 */,
-            },
-            to: [
-                {
-                    shell_command: ['open', ...args].join(' '),
-                },
-            ],
-            type: 'basic',
+          shell_command: ['open', ...args].join(' '),
         },
-    ];
+      ],
+      type: 'basic',
+    },
+  ];
 }
 
 function spaceFN(from, to) {
-    return [
-        {
-            from: {
-                modifiers: {
-                    optional: ['any'],
-                },
-                simultaneous: [
-                    {
-                        key_code: 'spacebar',
-                    },
-                    {
-                        key_code: from,
-                    },
-                ],
-                simultaneous_options: {
-                    key_down_order: 'strict',
-                    key_up_order: 'strict_inverse',
-                    to_after_key_up: [
-                        {
-                            set_variable: {
-                                name: 'SpaceFN',
-                                value: 0,
-                            },
-                        },
-                    ],
-                },
-            },
-            parameters: {
-                'basic.simultaneous_threshold_milliseconds': 500 /* Default: 1000 */,
+  return [
+    {
+      from: {
+        modifiers: {
+          optional: ['any'],
+        },
+        simultaneous: [
+          {
+            key_code: 'spacebar',
+          },
+          {
+            key_code: from,
+          },
+        ],
+        simultaneous_options: {
+          key_down_order: 'strict',
+          key_up_order: 'strict_inverse',
+          to_after_key_up: [
+            {
+              set_variable: {
+                name: 'SpaceFN',
+                value: 0,
+              },
             },
-            to: [
-                {
-                    set_variable: {
-                        name: 'SpaceFN',
-                        value: 1,
-                    },
-                },
-                {
-                    key_code: to,
-                },
-            ],
-            type: 'basic',
+          ],
         },
+      },
+      parameters: {
+        'basic.simultaneous_threshold_milliseconds': 500 /* Default: 1000 */,
+      },
+      to: [
         {
-            conditions: [
-                {
-                    name: 'SpaceFN',
-                    type: 'variable_if',
-                    value: 1,
-                },
-            ],
-            from: {
-                key_code: from,
-                modifiers: {
-                    optional: ['any'],
-                },
-            },
-            to: [
-                {
-                    key_code: to,
-                },
-            ],
-            type: 'basic',
+          set_variable: {
+            name: 'SpaceFN',
+            value: 1,
+          },
+        },
+        {
+          key_code: to,
+        },
+      ],
+      type: 'basic',
+    },
+    {
+      conditions: [
+        {
+          name: 'SpaceFN',
+          type: 'variable_if',
+          value: 1,
+        },
+      ],
+      from: {
+        key_code: from,
+        modifiers: {
+          optional: ['any'],
+        },
+      },
+      to: [
+        {
+          key_code: to,
         },
-    ];
+      ],
+      type: 'basic',
+    },
+  ];
 }
 
 function swap(a, b) {
-    return [...fromTo(a, b), ...fromTo(b, a)];
+  return [...fromTo(a, b), ...fromTo(b, a)];
 }
 
 const DEVICE_DEFAULTS = {
-    disable_built_in_keyboard_if_exists: false,
-    fn_function_keys: [],
-    ignore: false,
-    manipulate_caps_lock_led: true,
-    simple_modifications: [],
+  disable_built_in_keyboard_if_exists: false,
+  fn_function_keys: [],
+  ignore: false,
+  manipulate_caps_lock_led: true,
+  simple_modifications: [],
 };
 
 const IDENTIFIER_DEFAULTS = {
-    is_keyboard: true,
-    is_pointing_device: false,
+  is_keyboard: true,
+  is_pointing_device: false,
 };
 
 const APPLE_INTERNAL_US = {
-    ...DEVICE_DEFAULTS,
-    identifiers: {
-        ...IDENTIFIER_DEFAULTS,
-        product_id: 628,
-        vendor_id: 1452,
-    },
+  ...DEVICE_DEFAULTS,
+  identifiers: {
+    ...IDENTIFIER_DEFAULTS,
+    product_id: 628,
+    vendor_id: 1452,
+  },
 };
 
 const APPLE_INTERNAL_ES = {
-    ...DEVICE_DEFAULTS,
-    identifiers: {
-        ...IDENTIFIER_DEFAULTS,
-        product_id: 636,
-        vendor_id: 1452,
-    },
-    simple_modifications: [
-        ...fromTo('non_us_backslash', 'grave_accent_and_tilde'),
-        ...fromTo('grave_accent_and_tilde', 'left_shift'),
-        ...fromTo('backslash', 'return_or_enter'),
-    ],
+  ...DEVICE_DEFAULTS,
+  identifiers: {
+    ...IDENTIFIER_DEFAULTS,
+    product_id: 636,
+    vendor_id: 1452,
+  },
+  simple_modifications: [
+    ...fromTo('non_us_backslash', 'grave_accent_and_tilde'),
+    ...fromTo('grave_accent_and_tilde', 'left_shift'),
+    ...fromTo('backslash', 'return_or_enter'),
+  ],
 };
 
 const REALFORCE = {
-    ...DEVICE_DEFAULTS,
-    identifiers: {
-        ...IDENTIFIER_DEFAULTS,
-        product_id: 273,
-        vendor_id: 2131,
-    },
-    simple_modifications: [
-        ...swap('left_command', 'left_option'),
-        ...swap('right_command', 'right_option'),
-        ...fromTo('application', 'fn'),
-        ...fromTo('pause', 'power'),
-    ],
+  ...DEVICE_DEFAULTS,
+  identifiers: {
+    ...IDENTIFIER_DEFAULTS,
+    product_id: 273,
+    vendor_id: 2131,
+  },
+  simple_modifications: [
+    ...swap('left_command', 'left_option'),
+    ...swap('right_command', 'right_option'),
+    ...fromTo('application', 'fn'),
+    ...fromTo('pause', 'power'),
+  ],
 };
 
 const PARAMETER_DEFAULTS = {
-    'basic.simultaneous_threshold_milliseconds': 50,
-    'basic.to_delayed_action_delay_milliseconds': 500,
-    'basic.to_if_alone_timeout_milliseconds': 1000,
-    'basic.to_if_held_down_threshold_milliseconds': 500,
+  'basic.simultaneous_threshold_milliseconds': 50,
+  'basic.to_delayed_action_delay_milliseconds': 500,
+  'basic.to_if_alone_timeout_milliseconds': 1000,
+  'basic.to_if_held_down_threshold_milliseconds': 500,
 };
 
 const VANILLA_PROFILE = {
-    complex_modifications: {
-        parameters: PARAMETER_DEFAULTS,
-        rules: [],
-    },
-    devices: [],
-    fn_function_keys: [
-        ...fromTo('f1', 'display_brightness_decrement'),
-        ...fromTo('f2', 'display_brightness_increment'),
-        ...fromTo('f3', 'mission_control'),
-        ...fromTo('f4', 'launchpad'),
-        ...fromTo('f5', 'illumination_decrement'),
-        ...fromTo('f6', 'illumination_increment'),
-        ...fromTo('f7', 'rewind'),
-        ...fromTo('f8', 'play_or_pause'),
-        ...fromTo('f9', 'fastforward'),
-        ...fromTo('f10', 'mute'),
-        ...fromTo('f11', 'volume_decrement'),
-        ...fromTo('f12', 'volume_increment'),
-    ],
-    name: 'Vanilla',
-    selected: false,
-    simple_modifications: [],
-    virtual_hid_keyboard: {
-        caps_lock_delay_milliseconds: 0,
-        keyboard_type: 'ansi',
-    },
+  complex_modifications: {
+    parameters: PARAMETER_DEFAULTS,
+    rules: [],
+  },
+  devices: [],
+  fn_function_keys: [
+    ...fromTo('f1', 'display_brightness_decrement'),
+    ...fromTo('f2', 'display_brightness_increment'),
+    ...fromTo('f3', 'mission_control'),
+    ...fromTo('f4', 'launchpad'),
+    ...fromTo('f5', 'illumination_decrement'),
+    ...fromTo('f6', 'illumination_increment'),
+    ...fromTo('f7', 'rewind'),
+    ...fromTo('f8', 'play_or_pause'),
+    ...fromTo('f9', 'fastforward'),
+    ...fromTo('f10', 'mute'),
+    ...fromTo('f11', 'volume_decrement'),
+    ...fromTo('f12', 'volume_increment'),
+  ],
+  name: 'Vanilla',
+  selected: false,
+  simple_modifications: [],
+  virtual_hid_keyboard: {
+    caps_lock_delay_milliseconds: 0,
+    keyboard_type: 'ansi',
+  },
 };
 
 export function isObject(item) {
-    return (
-        item !== null &&
-        Object.prototype.toString.call(item) === '[object Object]'
-    );
+  return (
+    item !== null && Object.prototype.toString.call(item) === '[object Object]'
+  );
 }
 
 export function deepCopy(item) {
-    if (Array.isArray(item)) {
-        return item.map(deepCopy);
-    } else if (isObject(item)) {
-        const copy = {};
-        Object.entries(item).forEach(([k, v]) => {
-            copy[k] = deepCopy(v);
-        });
-        return copy;
-    }
-    return item;
+  if (Array.isArray(item)) {
+    return item.map(deepCopy);
+  } else if (isObject(item)) {
+    const copy = {};
+    Object.entries(item).forEach(([k, v]) => {
+      copy[k] = deepCopy(v);
+    });
+    return copy;
+  }
+  return item;
 }
 
 /**
@@ -266,365 +265,359 @@ export function deepCopy(item) {
  * - `[start:end]`: selects an array slice; `end` is optional.
  */
 export function visit(item, path, updater) {
-    const match = path.match(
-        /^(?<root>\$)|\.(?<child>\w+)|\[(?<slice>.+?)\]|(?<done>$)/
-    );
+  const match = path.match(
+    /^(?<root>\$)|\.(?<child>\w+)|\[(?<slice>.+?)\]|(?<done>$)/
+  );
+  const {
+    groups: {root, child, slice},
+  } = match;
+  const subpath = path.slice(match[0].length);
+  if (root) {
+    return visit(item, subpath, updater);
+  } else if (child) {
+    const next = visit(item[child], subpath, updater);
+    if (next !== undefined) {
+      return {
+        ...item,
+        [child]: next,
+      };
+    }
+  } else if (slice) {
     const {
-        groups: {root, child, slice},
-    } = match;
-    const subpath = path.slice(match[0].length);
-    if (root) {
-        return visit(item, subpath, updater);
-    } else if (child) {
-        const next = visit(item[child], subpath, updater);
-        if (next !== undefined) {
-            return {
-                ...item,
-                [child]: next,
-            };
-        }
-    } else if (slice) {
-        const {
-            groups: {start, end},
-        } = slice.match(/^(?<start>\d+):(?<end>\d+)?$/);
-        let array;
-        for (
-            let i = start, max = end == null ? item.length : end;
-            i < max;
-            i++
-        ) {
-            const next = visit(item[i], subpath, updater);
-            if (next !== undefined) {
-                if (!array) {
-                    array = item.slice(0, i);
-                }
-                array[i] = next;
-            } else if (array) {
-                array[i] = item[i];
-            }
+      groups: {start, end},
+    } = slice.match(/^(?<start>\d+):(?<end>\d+)?$/);
+    let array;
+    for (let i = start, max = end == null ? item.length : end; i < max; i++) {
+      const next = visit(item[i], subpath, updater);
+      if (next !== undefined) {
+        if (!array) {
+          array = item.slice(0, i);
         }
-        return array;
-    } else {
-        const next = updater(item);
-        return next === item ? undefined : next;
+        array[i] = next;
+      } else if (array) {
+        array[i] = item[i];
+      }
     }
+    return array;
+  } else {
+    const next = updater(item);
+    return next === item ? undefined : next;
+  }
 }
 
 const EXEMPTIONS = [
-    'com.factorio',
-    'com.feralinteractive.dirtrally',
-    'org.ioquake.ioquake3',
+  'com.factorio',
+  'com.feralinteractive.dirtrally',
+  'org.ioquake.ioquake3',
 ];
 
 function applyExemptions(profile) {
-    const exemptions = {
-        type: 'frontmost_application_unless',
-        bundle_identifiers: EXEMPTIONS.map(bundleIdentifier),
-    };
+  const exemptions = {
+    type: 'frontmost_application_unless',
+    bundle_identifiers: EXEMPTIONS.map(bundleIdentifier),
+  };
 
-    return visit(
-        profile,
-        '$.complex_modifications.rules[0:].manipulators[0:].conditions',
-        (conditions) => {
-            if (conditions) {
-                if (
-                    conditions.some(
-                        (condition) =>
-                            condition.type === 'frontmost_application_if'
-                    )
-                ) {
-                    return conditions;
-                }
-                return [...deepCopy(conditions), exemptions];
-            } else {
-                return [exemptions];
-            }
+  return visit(
+    profile,
+    '$.complex_modifications.rules[0:].manipulators[0:].conditions',
+    (conditions) => {
+      if (conditions) {
+        if (
+          conditions.some(
+            (condition) => condition.type === 'frontmost_application_if'
+          )
+        ) {
+          return conditions;
         }
-    );
+        return [...deepCopy(conditions), exemptions];
+      } else {
+        return [exemptions];
+      }
+    }
+  );
 }
 
 const DEFAULT_PROFILE = applyExemptions({
-    ...VANILLA_PROFILE,
-    complex_modifications: {
-        parameters: {
-            ...PARAMETER_DEFAULTS,
-            'basic.to_if_alone_timeout_milliseconds': 500 /* Default: 1000 */,
-        },
-        rules: [
-            // {
-            //     description: 'Launcher',
-            //     manipulators: [
-            //         ...launch(
-            //             colemak('c' /* [C]hrome */),
-            //             '-b',
-            //             'com.google.Chrome'
-            //         ),
-            //         ...launch(
-            //             colemak('d' /* To[d]o */),
-            //             '-b',
-            //             'com.culturedcode.ThingsMac'
-            //         ),
-            //         ...launch(
-            //             colemak('f' /* [F]inder */),
-            //             '-b',
-            //             'com.apple.Finder',
-            //             '~/Downloads'
-            //         ),
-            //         ...launch(
-            //             colemak('p' /* [p]asswords */),
-            //             '-b',
-            //             'com.agilebits.onepassword7'
-            //         ),
-            //         ...launch(
-            //             colemak('s' /* [S]lack */),
-            //             '-b',
-            //             'com.tinyspeck.slackmacgap'
-            //         ),
-            //         ...launch(
-            //             colemak('t' /* [t]erminal */),
-            //             '-b',
-            //             'com.googlecode.iterm2'
-            //         ),
-            //         ...launch(
-            //             colemak('w' /* [w]eek */),
-            //             '-b',
-            //             'com.flexibits.fantastical2.mac'
-            //         ),
-            //     ],
-            // },
-            {
-                description: 'SpaceFN layer',
-                manipulators: [
-                    ...spaceFN('b', 'spacebar'),
-                    ...spaceFN('u', 'right_arrow'),
-                    ...spaceFN('y', 'down_arrow'),
-                    ...spaceFN('h', 'left_arrow'),
-                    ...spaceFN('n', 'up_arrow'),
-                    ...spaceFN('l', 'right_arrow'),
-                    ...spaceFN('k', 'down_arrow'),
-                    ...spaceFN('j', 'left_arrow'),
-                    ...spaceFN('i', 'up_arrow'),
-                ],
-            },
-            {
-                description: 'Tab + Return to Backslash',
-                manipulators: [
-                    {
-                        from: {
-                            modifiers: {
-                                optional: ['any'],
-                            },
-                            simultaneous: [
-                                {
-                                    key_code: 'tab',
-                                },
-                                {
-                                    key_code: 'return_or_enter',
-                                },
-                            ],
-                        },
-                        to: [
-                            {
-                                key_code: 'backslash',
-                            },
-                        ],
-                        conditions: [
-                            {
-                                type: 'device_if',
-                                identifiers: [APPLE_INTERNAL_ES.identifiers],
-                            },
-                        ],
-                        type: 'basic',
-                    },
-                ],
+  ...VANILLA_PROFILE,
+  complex_modifications: {
+    parameters: {
+      ...PARAMETER_DEFAULTS,
+      'basic.to_if_alone_timeout_milliseconds': 500 /* Default: 1000 */,
+    },
+    rules: [
+      // {
+      //     description: 'Launcher',
+      //     manipulators: [
+      //         ...launch(
+      //             colemak('c' /* [C]hrome */),
+      //             '-b',
+      //             'com.google.Chrome'
+      //         ),
+      //         ...launch(
+      //             colemak('d' /* To[d]o */),
+      //             '-b',
+      //             'com.culturedcode.ThingsMac'
+      //         ),
+      //         ...launch(
+      //             colemak('f' /* [F]inder */),
+      //             '-b',
+      //             'com.apple.Finder',
+      //             '~/Downloads'
+      //         ),
+      //         ...launch(
+      //             colemak('p' /* [p]asswords */),
+      //             '-b',
+      //             'com.agilebits.onepassword7'
+      //         ),
+      //         ...launch(
+      //             colemak('s' /* [S]lack */),
+      //             '-b',
+      //             'com.tinyspeck.slackmacgap'
+      //         ),
+      //         ...launch(
+      //             colemak('t' /* [t]erminal */),
+      //             '-b',
+      //             'com.googlecode.iterm2'
+      //         ),
+      //         ...launch(
+      //             colemak('w' /* [w]eek */),
+      //             '-b',
+      //             'com.flexibits.fantastical2.mac'
+      //         ),
+      //     ],
+      // },
+      {
+        description: 'SpaceFN layer',
+        manipulators: [
+          ...spaceFN('b', 'spacebar'),
+          ...spaceFN('u', 'right_arrow'),
+          ...spaceFN('y', 'down_arrow'),
+          ...spaceFN('h', 'left_arrow'),
+          ...spaceFN('n', 'up_arrow'),
+          ...spaceFN('l', 'right_arrow'),
+          ...spaceFN('k', 'down_arrow'),
+          ...spaceFN('j', 'left_arrow'),
+          ...spaceFN('i', 'up_arrow'),
+        ],
+      },
+      {
+        description: 'Tab + Return to Backslash',
+        manipulators: [
+          {
+            from: {
+              modifiers: {
+                optional: ['any'],
+              },
+              simultaneous: [
+                {
+                  key_code: 'tab',
+                },
+                {
+                  key_code: 'return_or_enter',
+                },
+              ],
             },
-            {
-                description:
-                    'Disable Karabiner-Elements with Fn+Control+Option+Command+Z',
-                manipulators: [
-                    {
-                        type: 'basic',
-                        from: {
-                            key_code: 'z',
-                            modifiers: {
-                                mandatory: [
-                                    'fn',
-                                    'left_control',
-                                    'left_command',
-                                    'left_option',
-                                ],
-                            },
-                        },
-                        to: [
-                            {
-                                shell_command:
-                                    'osascript ~/bin/karabiner-kill.applescript',
-                            },
-                        ],
-                    },
+            to: [
+              {
+                key_code: 'backslash',
+              },
+            ],
+            conditions: [
+              {
+                type: 'device_if',
+                identifiers: [APPLE_INTERNAL_ES.identifiers],
+              },
+            ],
+            type: 'basic',
+          },
+        ],
+      },
+      {
+        description:
+          'Disable Karabiner-Elements with Fn+Control+Option+Command+Z',
+        manipulators: [
+          {
+            type: 'basic',
+            from: {
+              key_code: 'z',
+              modifiers: {
+                mandatory: [
+                  'fn',
+                  'left_control',
+                  'left_command',
+                  'left_option',
                 ],
+              },
             },
-            {
-                description:
-                    'Change Caps Lock to Control when used as modifier, Backspace when used alone',
-                manipulators: [
-                    {
-                        from: {
-                            key_code: 'caps_lock',
-                            modifiers: {
-                                optional: ['any'],
-                            },
-                        },
-                        to: [
-                            {
-                                key_code: 'left_control',
-                                lazy: true,
-                            },
-                        ],
-                        to_if_alone: [
-                            {
-                                key_code: 'delete_or_backspace',
-                            },
-                        ],
-                        to_if_held_down: [
-                            {
-                                key_code: 'delete_or_backspace',
-                            },
-                        ],
-                        type: 'basic',
-                    },
-                ],
+            to: [
+              {
+                shell_command: 'osascript ~/bin/karabiner-kill.applescript',
+              },
+            ],
+          },
+        ],
+      },
+      {
+        description:
+          'Change Caps Lock to Control when used as modifier, Backspace when used alone',
+        manipulators: [
+          {
+            from: {
+              key_code: 'caps_lock',
+              modifiers: {
+                optional: ['any'],
+              },
             },
-            {
-                description:
-                    'Change Return to Control when used as modifier, Return when used alone',
-                manipulators: [
-                    {
-                        from: {
-                            key_code: 'return_or_enter',
-                            modifiers: {
-                                optional: ['any'],
-                            },
-                        },
-                        to: [
-                            {
-                                key_code: 'right_control',
-                                lazy: true,
-                            },
-                        ],
-                        to_if_alone: [
-                            {
-                                key_code: 'return_or_enter',
-                            },
-                        ],
-                        to_if_held_down: [
-                            {
-                                key_code: 'return_or_enter',
-                            },
-                        ],
-                        type: 'basic',
-                    },
-                ],
+            to: [
+              {
+                key_code: 'left_control',
+                lazy: true,
+              },
+            ],
+            to_if_alone: [
+              {
+                key_code: 'delete_or_backspace',
+              },
+            ],
+            to_if_held_down: [
+              {
+                key_code: 'delete_or_backspace',
+              },
+            ],
+            type: 'basic',
+          },
+        ],
+      },
+      {
+        description:
+          'Change Return to Control when used as modifier, Return when used alone',
+        manipulators: [
+          {
+            from: {
+              key_code: 'return_or_enter',
+              modifiers: {
+                optional: ['any'],
+              },
             },
-            {
-                description: 'Change Control+I to F6 in Vim',
-                manipulators: [
-                    {
-                        conditions: [
-                            {
-                                bundle_identifiers: [
-                                    bundleIdentifier('com.apple.Terminal'),
-                                    bundleIdentifier('com.googlecode.iterm2'),
-                                    bundleIdentifier('org.vim.MacVim.plist'),
-                                ],
-                                type: 'frontmost_application_if',
-                            },
-                        ],
-                        from: {
-                            key_code: 'l',
-                            modifiers: {
-                                mandatory: ['control'],
-                                optional: ['any'],
-                            },
-                        },
-                        to: [
-                            {
-                                key_code: 'f6',
-                                modifiers: ['fn'],
-                            },
-                        ],
-                        type: 'basic',
-                    },
+            to: [
+              {
+                key_code: 'right_control',
+                lazy: true,
+              },
+            ],
+            to_if_alone: [
+              {
+                key_code: 'return_or_enter',
+              },
+            ],
+            to_if_held_down: [
+              {
+                key_code: 'return_or_enter',
+              },
+            ],
+            type: 'basic',
+          },
+        ],
+      },
+      {
+        description: 'Change Control+I to F6 in Vim',
+        manipulators: [
+          {
+            conditions: [
+              {
+                bundle_identifiers: [
+                  bundleIdentifier('com.apple.Terminal'),
+                  bundleIdentifier('com.googlecode.iterm2'),
+                  bundleIdentifier('org.vim.MacVim.plist'),
                 ],
+                type: 'frontmost_application_if',
+              },
+            ],
+            from: {
+              key_code: 'l',
+              modifiers: {
+                mandatory: ['control'],
+                optional: ['any'],
+              },
             },
-            {
-                description: 'Left and Right Shift together toggle Caps Lock',
-                manipulators: [
-                    {
-                        from: {
-                            modifiers: {
-                                optional: ['any'],
-                            },
-                            simultaneous: [
-                                {
-                                    key_code: 'left_shift',
-                                },
-                                {
-                                    key_code: 'right_shift',
-                                },
-                            ],
-                        },
-                        to: [
-                            {
-                                key_code: 'caps_lock',
-                            },
-                        ],
-                        type: 'basic',
-                    },
-                ],
+            to: [
+              {
+                key_code: 'f6',
+                modifiers: ['fn'],
+              },
+            ],
+            type: 'basic',
+          },
+        ],
+      },
+      {
+        description: 'Left and Right Shift together toggle Caps Lock',
+        manipulators: [
+          {
+            from: {
+              modifiers: {
+                optional: ['any'],
+              },
+              simultaneous: [
+                {
+                  key_code: 'left_shift',
+                },
+                {
+                  key_code: 'right_shift',
+                },
+              ],
             },
-            {
-                description: 'Equals plus delete together to forward delete',
-                manipulators: [
-                    {
-                        from: {
-                            modifiers: {
-                                optional: ['any'],
-                            },
-                            simultaneous: [
-                                {
-                                    key_code: 'equal_sign',
-                                },
-                                {
-                                    key_code: 'delete_or_backspace',
-                                },
-                            ],
-                        },
-                        to: [
-                            {
-                                key_code: 'delete_forward',
-                            },
-                        ],
-                        type: 'basic',
-                    },
-                ],
+            to: [
+              {
+                key_code: 'caps_lock',
+              },
+            ],
+            type: 'basic',
+          },
+        ],
+      },
+      {
+        description: 'Equals plus delete together to forward delete',
+        manipulators: [
+          {
+            from: {
+              modifiers: {
+                optional: ['any'],
+              },
+              simultaneous: [
+                {
+                  key_code: 'equal_sign',
+                },
+                {
+                  key_code: 'delete_or_backspace',
+                },
+              ],
             },
+            to: [
+              {
+                key_code: 'delete_forward',
+              },
+            ],
+            type: 'basic',
+          },
         ],
-    },
-    devices: [REALFORCE, APPLE_INTERNAL_US, APPLE_INTERNAL_ES],
-    name: 'Default',
-    selected: true,
+      },
+    ],
+  },
+  devices: [REALFORCE, APPLE_INTERNAL_US, APPLE_INTERNAL_ES],
+  name: 'Default',
+  selected: true,
 });
 
 const CONFIG = {
-    global: {
-        check_for_updates_on_startup: true,
-        show_in_menu_bar: true,
-        show_profile_name_in_menu_bar: false,
-    },
-    profiles: [DEFAULT_PROFILE, VANILLA_PROFILE],
+  global: {
+    check_for_updates_on_startup: true,
+    show_in_menu_bar: true,
+    show_profile_name_in_menu_bar: false,
+  },
+  profiles: [DEFAULT_PROFILE, VANILLA_PROFILE],
 };
 
 if (process.argv.includes('--emit-karabiner-config')) {
-    process.stdout.write(JSON.stringify(CONFIG, null, 2) + '\n');
+  process.stdout.write(JSON.stringify(CONFIG, null, 2) + '\n');
 }
index 2e4c2f76b791ec384d0bca32204dd955d2b52bbf..dcf0d5c30899834546fffc2016e2ae940a60d6f7 100644 (file)
@@ -1,6 +1,6 @@
 Configures launchd to:
 
--   Persist overrides of ridiculously low ulimit values in macOS.
--   Set locale-related environmental variables for the benefit of GUI apps.
+- Persist overrides of ridiculously low ulimit values in macOS.
+- Set locale-related environmental variables for the benefit of GUI apps.
 
 See: http://unix.stackexchange.com/questions/108174/how-to-persist-ulimit-settings-in-osx-mavericks
index 1e81d51b9fed94804f4dd142e45ed7a1e24c0a47..e47f3803b30fb94aa9f081b43f0de02b9afe2ec3 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Configures launchd"
+  "description": "Configures launchd"
 }
index 3a499b85107596bf61648457417680b94e1550ba..903d0159c3d3252c5cf3024f83e4cdc595decba9 100644 (file)
@@ -1,60 +1,60 @@
 import {resource, template, task} from 'fig';
 
 task('configure (global) LaunchDaemons', async () => {
-    const items = [
-        {
-            path: '/Library/LaunchDaemons/limit.maxfiles.plist',
-            variables: {
-                arguments: ['limit', 'maxfiles', 65536, 65536],
-                label: 'limit.maxfiles',
-            },
-        },
-        {
-            path: '/Library/LaunchDaemons/limit.maxproc.plist',
-            variables: {
-                arguments: ['limit', 'maxproc', 2048, 2048],
-                label: 'limit.maxproc',
-            },
-        },
-    ];
+  const items = [
+    {
+      path: '/Library/LaunchDaemons/limit.maxfiles.plist',
+      variables: {
+        arguments: ['limit', 'maxfiles', 65536, 65536],
+        label: 'limit.maxfiles',
+      },
+    },
+    {
+      path: '/Library/LaunchDaemons/limit.maxproc.plist',
+      variables: {
+        arguments: ['limit', 'maxproc', 2048, 2048],
+        label: 'limit.maxproc',
+      },
+    },
+  ];
 
-    for (const {path, variables} of items) {
-        await template({
-            group: 'wheel',
-            mode: '0644',
-            owner: 'root',
-            path,
-            src: resource.template('run.plist.erb'),
-            sudo: true,
-            variables,
-        });
-    }
+  for (const {path, variables} of items) {
+    await template({
+      group: 'wheel',
+      mode: '0644',
+      owner: 'root',
+      path,
+      src: resource.template('run.plist.erb'),
+      sudo: true,
+      variables,
+    });
+  }
 });
 
 task('configure (local) LaunchAgents', async () => {
-    const items = [
-        {
-            path: '~/Library/LaunchAgents/setenv.lang.plist',
-            variables: {
-                arguments: ['setenv', 'LANG', 'en_US.UTF-8'],
-                label: 'setenv.lang',
-            },
-        },
-        {
-            path: '~/Library/LaunchAgents/setenv.lc_time.plist',
-            variables: {
-                arguments: ['setenv', 'LC_TIME', 'en_AU.UTF-8'],
-                label: 'setenv.lc_time',
-            },
-        },
-    ];
+  const items = [
+    {
+      path: '~/Library/LaunchAgents/setenv.lang.plist',
+      variables: {
+        arguments: ['setenv', 'LANG', 'en_US.UTF-8'],
+        label: 'setenv.lang',
+      },
+    },
+    {
+      path: '~/Library/LaunchAgents/setenv.lc_time.plist',
+      variables: {
+        arguments: ['setenv', 'LC_TIME', 'en_AU.UTF-8'],
+        label: 'setenv.lc_time',
+      },
+    },
+  ];
 
-    for (const {path, variables} of items) {
-        await template({
-            mode: '0644',
-            path,
-            src: resource.template('run.plist.erb'),
-            variables,
-        });
-    }
+  for (const {path, variables} of items) {
+    await template({
+      mode: '0644',
+      path,
+      src: resource.template('run.plist.erb'),
+      variables,
+    });
+  }
 });
index fa76c825a094ef478eb385edec132025ba52edcf..b5a3fb43dd391e1856791e6569f82a4ad05bbf97 100644 (file)
@@ -1,20 +1,20 @@
 {
-    "description": "Sets up /etc/locale.conf",
-    "variables": {
-        "lines": [
-            "LANG=en_US.UTF-8",
-            "LC_ADDRESS=\"en_US.UTF-8\"",
-            "LC_COLLATE=\"en_US.UTF-8\"",
-            "LC_CTYPE=\"en_US.UTF-8\"",
-            "LC_IDENTIFICATION=\"en_US.UTF-8\"",
-            "LC_MEASUREMENT=\"en_US.UTF-8\"",
-            "LC_MESSAGES=\"en_US.UTF-8\"",
-            "LC_MONETARY=\"en_US.UTF-8\"",
-            "LC_NAME=\"en_US.UTF-8\"",
-            "LC_NUMERIC=\"en_US.UTF-8\"",
-            "LC_PAPER=\"en_US.UTF-8\"",
-            "LC_TELEPHONE=\"en_US.UTF-8\"",
-            "LC_TIME=\"en_AU.UTF-8\""
-        ]
-    }
+  "description": "Sets up /etc/locale.conf",
+  "variables": {
+    "lines": [
+      "LANG=en_US.UTF-8",
+      "LC_ADDRESS=\"en_US.UTF-8\"",
+      "LC_COLLATE=\"en_US.UTF-8\"",
+      "LC_CTYPE=\"en_US.UTF-8\"",
+      "LC_IDENTIFICATION=\"en_US.UTF-8\"",
+      "LC_MEASUREMENT=\"en_US.UTF-8\"",
+      "LC_MESSAGES=\"en_US.UTF-8\"",
+      "LC_MONETARY=\"en_US.UTF-8\"",
+      "LC_NAME=\"en_US.UTF-8\"",
+      "LC_NUMERIC=\"en_US.UTF-8\"",
+      "LC_PAPER=\"en_US.UTF-8\"",
+      "LC_TELEPHONE=\"en_US.UTF-8\"",
+      "LC_TIME=\"en_AU.UTF-8\""
+    ]
+  }
 }
index c26a472dd2b27e39c049d490dc83379c1d610d84..275ed09e64c1197a2c81a24043523391c5dd5cd1 100644 (file)
@@ -1,16 +1,16 @@
 import {task, line, variable} from 'fig';
 
 task('set up /etc/locale.conf', async () => {
-    for (const setting of variable.strings('lines')) {
-        const [key] = setting.split('=');
+  for (const setting of variable.strings('lines')) {
+    const [key] = setting.split('=');
 
-        await line({
-            group: 'wheel',
-            line: setting,
-            owner: 'root',
-            path: '/etc/locale.conf',
-            regexp: key,
-            sudo: true,
-        });
-    }
+    await line({
+      group: 'wheel',
+      line: setting,
+      owner: 'root',
+      path: '/etc/locale.conf',
+      regexp: key,
+      sudo: true,
+    });
+  }
 });
index a24ad75cb56585052f77153323e58da1779d70fb..f0eaacecf99e692eb0e6ab79e78764a858ae8bf2 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Tests the configuration framework"
+  "description": "Tests the configuration framework"
 }
index d689a3c003af93c171dd228ea4a482e1daba57f2..f7412a9f25dc83e4fce99712900e3f18647da128 100644 (file)
@@ -2,14 +2,14 @@ import {equal, ok} from 'assert';
 import {join} from 'path';
 
 import {
-    command,
-    fail,
-    file,
-    handler,
-    path as toPath,
-    resource,
-    task,
-    template,
+  command,
+  fail,
+  file,
+  handler,
+  path as toPath,
+  resource,
+  task,
+  template,
 } from 'fig';
 import Context from 'fig/Context.js';
 import assert from 'fig/assert.js';
@@ -18,452 +18,452 @@ import stat from 'fig/fs/stat.js';
 import tempdir from 'fig/fs/tempdir.js';
 
 function live() {
-    return !Context.currentOptions?.check;
+  return !Context.currentOptions?.check;
 }
 
 const expect = {
-    equal(actual: any, expected: any, message?: string | Error | undefined) {
-        if (live()) {
-            equal(actual, expected, message);
-        }
-    },
-
-    ok(value: any, message?: string | Error | undefined) {
-        if (live()) {
-            ok(value, message);
-        }
-    },
+  equal(actual: any, expected: any, message?: string | Error | undefined) {
+    if (live()) {
+      equal(actual, expected, message);
+    }
+  },
+
+  ok(value: any, message?: string | Error | undefined) {
+    if (live()) {
+      ok(value, message);
+    }
+  },
 };
 
 const fs = {
-    async readFile(name: string, encoding: BufferEncoding) {
-        if (live()) {
-            return promises.readFile(name, encoding);
-        } else {
-            return '';
-        }
-    },
-
-    async stat(name: string) {
-        if (live()) {
-            return promises.stat(name);
-        } else {
-            return {
-                mtimeMs: 1000,
-            };
-        }
-    },
-
-    async utimes(path: string, atime: number, mtime: number) {
-        if (live()) {
-            await promises.utimes(path, atime, mtime);
-        }
-    },
+  async readFile(name: string, encoding: BufferEncoding) {
+    if (live()) {
+      return promises.readFile(name, encoding);
+    } else {
+      return '';
+    }
+  },
+
+  async stat(name: string) {
+    if (live()) {
+      return promises.stat(name);
+    } else {
+      return {
+        mtimeMs: 1000,
+      };
+    }
+  },
+
+  async utimes(path: string, atime: number, mtime: number) {
+    if (live()) {
+      await promises.utimes(path, atime, mtime);
+    }
+  },
 };
 
 const DEFAULT_STATS = {
-    mode: '0644',
-    target: undefined,
-    type: 'file',
+  mode: '0644',
+  target: undefined,
+  type: 'file',
 };
 
 task('copy a file', async () => {
-    //
-    // 1. Create a file for the first time.
-    //
-    let path = join(await tempdir('meta'), 'example.txt');
+  //
+  // 1. Create a file for the first time.
+  //
+  let path = join(await tempdir('meta'), 'example.txt');
 
-    let {changed, failed, ok, skipped} = Context.counts;
+  let {changed, failed, ok, skipped} = Context.counts;
 
-    // This time showing use of "src".
-    await file({
-        path,
-        src: resource.file('example.txt'),
-        state: 'file',
-    });
+  // This time showing use of "src".
+  await file({
+    path,
+    src: resource.file('example.txt'),
+    state: 'file',
+  });
 
-    let contents = await fs.readFile(path, 'utf8');
+  let contents = await fs.readFile(path, 'utf8');
 
-    expect.equal(contents, 'Some example content.\n');
+  expect.equal(contents, 'Some example content.\n');
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 
-    //
-    // 2. Overwrite an existing file.
-    //
-    ({changed, failed, ok, skipped} = Context.counts);
+  //
+  // 2. Overwrite an existing file.
+  //
+  ({changed, failed, ok, skipped} = Context.counts);
 
-    // This time showing use of "contents".
-    await file({
-        contents: 'New content!\n',
-        path,
-        state: 'file',
-    });
+  // This time showing use of "contents".
+  await file({
+    contents: 'New content!\n',
+    path,
+    state: 'file',
+  });
 
-    contents = await fs.readFile(path, 'utf8');
+  contents = await fs.readFile(path, 'utf8');
 
-    expect.equal(contents, 'New content!\n');
+  expect.equal(contents, 'New content!\n');
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 
-    //
-    // 3. When no changes needed.
-    //
-    ({changed, failed, ok, skipped} = Context.counts);
+  //
+  // 3. When no changes needed.
+  //
+  ({changed, failed, ok, skipped} = Context.counts);
 
-    await file({
-        contents: 'New content!\n',
-        path,
-        state: 'file',
-    });
+  await file({
+    contents: 'New content!\n',
+    path,
+    state: 'file',
+  });
 
-    contents = await fs.readFile(path, 'utf8');
+  contents = await fs.readFile(path, 'utf8');
 
-    expect.equal(contents, 'New content!\n');
+  expect.equal(contents, 'New content!\n');
 
-    expect.equal(Context.counts.changed, changed);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok + 1);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok + 1);
+  expect.equal(Context.counts.skipped, skipped);
 
-    //
-    // 4. Creating an empty file (no "src", no "content").
-    //
-    path = path.replace(/\.txt$/, '.txt.bak');
+  //
+  // 4. Creating an empty file (no "src", no "content").
+  //
+  path = path.replace(/\.txt$/, '.txt.bak');
 
-    ({changed, failed, ok, skipped} = Context.counts);
+  ({changed, failed, ok, skipped} = Context.counts);
 
-    await file({
-        path,
-        state: 'file',
-    });
+  await file({
+    path,
+    state: 'file',
+  });
 
-    contents = await fs.readFile(path, 'utf8');
+  contents = await fs.readFile(path, 'utf8');
 
-    expect.equal(contents, '');
+  expect.equal(contents, '');
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 });
 
 task('create a directory', async () => {
-    //
-    // 1. Create a directory for the first time.
-    //
-    const path = join(await tempdir('meta'), 'a-directory');
+  //
+  // 1. Create a directory for the first time.
+  //
+  const path = join(await tempdir('meta'), 'a-directory');
 
-    let {changed, failed, ok, skipped} = Context.counts;
+  let {changed, failed, ok, skipped} = Context.counts;
 
-    await file({
-        path,
-        state: 'directory',
-    });
+  await file({
+    path,
+    state: 'directory',
+  });
 
-    let stats = live() ? await stat(path) : DEFAULT_STATS;
+  let stats = live() ? await stat(path) : DEFAULT_STATS;
 
-    assert(stats && !(stats instanceof Error));
+  assert(stats && !(stats instanceof Error));
 
-    expect.equal(stats.type, 'directory');
+  expect.equal(stats.type, 'directory');
 
-    const mode = (0o777 - parseInt(Context.attributes.umask, 8))
-        .toString(8)
-        .padStart(4, '0');
+  const mode = (0o777 - parseInt(Context.attributes.umask, 8))
+    .toString(8)
+    .padStart(4, '0');
 
-    expect.equal(stats.mode, mode);
+  expect.equal(stats.mode, mode);
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 
-    //
-    // 2. Changing mode of an existing directory.
-    //
+  //
+  // 2. Changing mode of an existing directory.
+  //
 
-    ({changed, failed, ok, skipped} = Context.counts);
+  ({changed, failed, ok, skipped} = Context.counts);
 
-    await file({
-        mode: '0700',
-        path,
-        state: 'directory',
-    });
+  await file({
+    mode: '0700',
+    path,
+    state: 'directory',
+  });
 
-    stats = live() ? await stat(path) : DEFAULT_STATS;
+  stats = live() ? await stat(path) : DEFAULT_STATS;
 
-    assert(stats && !(stats instanceof Error));
+  assert(stats && !(stats instanceof Error));
 
-    expect.equal(stats.mode, '0700');
+  expect.equal(stats.mode, '0700');
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 
-    //
-    // 3. A no-op.
-    //
+  //
+  // 3. A no-op.
+  //
 
-    ({changed, failed, ok, skipped} = Context.counts);
+  ({changed, failed, ok, skipped} = Context.counts);
 
-    await file({
-        path,
-        state: 'directory',
-    });
+  await file({
+    path,
+    state: 'directory',
+  });
 
-    stats = live() ? await stat(path) : DEFAULT_STATS;
+  stats = live() ? await stat(path) : DEFAULT_STATS;
 
-    assert(stats && !(stats instanceof Error));
+  assert(stats && !(stats instanceof Error));
 
-    expect.equal(stats.mode, '0700');
+  expect.equal(stats.mode, '0700');
 
-    expect.equal(Context.counts.changed, changed);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok + 1);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok + 1);
+  expect.equal(Context.counts.skipped, skipped);
 });
 
 task('manage a symbolic link', async () => {
-    //
-    // 1. Create a link.
-    //
-    let path = join(await tempdir('meta'), 'example.txt');
+  //
+  // 1. Create a link.
+  //
+  let path = join(await tempdir('meta'), 'example.txt');
 
-    const src = resource.file('example.txt');
+  const src = resource.file('example.txt');
 
-    let {changed, failed, ok, skipped} = Context.counts;
+  let {changed, failed, ok, skipped} = Context.counts;
 
-    await file({
-        path,
-        src,
-        state: 'link',
-    });
+  await file({
+    path,
+    src,
+    state: 'link',
+  });
 
-    let contents = await fs.readFile(path, 'utf8');
+  let contents = await fs.readFile(path, 'utf8');
 
-    expect.equal(contents, 'Some example content.\n');
+  expect.equal(contents, 'Some example content.\n');
 
-    let stats = live() ? await stat(path) : DEFAULT_STATS;
+  let stats = live() ? await stat(path) : DEFAULT_STATS;
 
-    assert(stats && !(stats instanceof Error));
+  assert(stats && !(stats instanceof Error));
 
-    expect.equal(stats.type, 'link');
-    expect.equal(stats.target, toPath(src).resolve);
+  expect.equal(stats.type, 'link');
+  expect.equal(stats.target, toPath(src).resolve);
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 });
 
 task('template a file', async () => {
-    //
-    // 1. Create file from template.
-    //
-    const path = join(await tempdir('meta'), 'sample.txt');
-
-    let {changed, failed, ok, skipped} = Context.counts;
-
-    await template({
-        path,
-        src: resource.template('sample.txt.erb'),
-        variables: {
-            greeting: 'Hello',
-            names: ['Bob', 'Jane'],
-        },
-    });
-
-    let contents = await fs.readFile(path, 'utf8');
-
-    expect.equal(contents, 'Hello Bob, Jane!\n');
-
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
-
-    //
-    // 2. Show that running again is a no-op.
-    //
-    ({changed, failed, ok, skipped} = Context.counts);
-
-    await template({
-        path,
-        src: resource.template('sample.txt.erb'),
-        variables: {
-            greeting: 'Hello',
-            names: ['Bob', 'Jane'],
-        },
-    });
-
-    contents = await fs.readFile(path, 'utf8');
-
-    expect.equal(contents, 'Hello Bob, Jane!\n');
-
-    expect.equal(Context.counts.changed, changed);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok + 1);
-    expect.equal(Context.counts.skipped, skipped);
-
-    //
-    // 3. Show that we can change an existing file if required.
-    //
-    // 3a. Just a content change.
-    //
-    ({changed, failed, ok, skipped} = Context.counts);
-
-    await template({
-        path,
-        src: resource.template('sample.txt.erb'),
-        variables: {
-            greeting: 'Hi',
-            names: ['Jim', 'Mary', 'Carol'],
-        },
-    });
-
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
-
-    contents = await fs.readFile(path, 'utf8');
-
-    expect.equal(contents, 'Hi Jim, Mary, Carol!\n');
-
-    //
-    // 3b. Just a mode change.
-    //
-    ({changed, failed, ok, skipped} = Context.counts);
-
-    await template({
-        mode: '0600',
-        path,
-        src: resource.template('sample.txt.erb'),
-        variables: {
-            greeting: 'Hi',
-            names: ['Jim', 'Mary', 'Carol'],
-        },
-    });
-
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
-
-    contents = await fs.readFile(path, 'utf8');
-
-    expect.equal(contents, 'Hi Jim, Mary, Carol!\n');
-
-    let stats = live() ? await stat(path) : DEFAULT_STATS;
-
-    assert(stats && !(stats instanceof Error));
-
-    expect.equal(stats.mode, '0600');
-
-    //
-    // 3c. A mode and a content change.
-    //
-    ({changed, failed, ok, skipped} = Context.counts);
-
-    await template({
-        mode: '0644',
-        path,
-        src: resource.template('sample.txt.erb'),
-        variables: {
-            greeting: 'Yo',
-            names: ['Derek'],
-        },
-    });
+  //
+  // 1. Create file from template.
+  //
+  const path = join(await tempdir('meta'), 'sample.txt');
+
+  let {changed, failed, ok, skipped} = Context.counts;
+
+  await template({
+    path,
+    src: resource.template('sample.txt.erb'),
+    variables: {
+      greeting: 'Hello',
+      names: ['Bob', 'Jane'],
+    },
+  });
+
+  let contents = await fs.readFile(path, 'utf8');
+
+  expect.equal(contents, 'Hello Bob, Jane!\n');
+
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
+
+  //
+  // 2. Show that running again is a no-op.
+  //
+  ({changed, failed, ok, skipped} = Context.counts);
+
+  await template({
+    path,
+    src: resource.template('sample.txt.erb'),
+    variables: {
+      greeting: 'Hello',
+      names: ['Bob', 'Jane'],
+    },
+  });
+
+  contents = await fs.readFile(path, 'utf8');
+
+  expect.equal(contents, 'Hello Bob, Jane!\n');
+
+  expect.equal(Context.counts.changed, changed);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok + 1);
+  expect.equal(Context.counts.skipped, skipped);
+
+  //
+  // 3. Show that we can change an existing file if required.
+  //
+  // 3a. Just a content change.
+  //
+  ({changed, failed, ok, skipped} = Context.counts);
+
+  await template({
+    path,
+    src: resource.template('sample.txt.erb'),
+    variables: {
+      greeting: 'Hi',
+      names: ['Jim', 'Mary', 'Carol'],
+    },
+  });
+
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
+
+  contents = await fs.readFile(path, 'utf8');
+
+  expect.equal(contents, 'Hi Jim, Mary, Carol!\n');
+
+  //
+  // 3b. Just a mode change.
+  //
+  ({changed, failed, ok, skipped} = Context.counts);
+
+  await template({
+    mode: '0600',
+    path,
+    src: resource.template('sample.txt.erb'),
+    variables: {
+      greeting: 'Hi',
+      names: ['Jim', 'Mary', 'Carol'],
+    },
+  });
+
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
+
+  contents = await fs.readFile(path, 'utf8');
+
+  expect.equal(contents, 'Hi Jim, Mary, Carol!\n');
+
+  let stats = live() ? await stat(path) : DEFAULT_STATS;
+
+  assert(stats && !(stats instanceof Error));
+
+  expect.equal(stats.mode, '0600');
+
+  //
+  // 3c. A mode and a content change.
+  //
+  ({changed, failed, ok, skipped} = Context.counts);
+
+  await template({
+    mode: '0644',
+    path,
+    src: resource.template('sample.txt.erb'),
+    variables: {
+      greeting: 'Yo',
+      names: ['Derek'],
+    },
+  });
+
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
+
+  contents = await fs.readFile(path, 'utf8');
+
+  expect.equal(contents, 'Yo Derek!\n');
+
+  stats = live() ? await stat(path) : DEFAULT_STATS;
+
+  assert(stats && !(stats instanceof Error));
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
-
-    contents = await fs.readFile(path, 'utf8');
-
-    expect.equal(contents, 'Yo Derek!\n');
-
-    stats = live() ? await stat(path) : DEFAULT_STATS;
-
-    assert(stats && !(stats instanceof Error));
-
-    expect.equal(stats.mode, '0644');
+  expect.equal(stats.mode, '0644');
 });
 
 task('touch an item', async () => {
-    //
-    // 1. Create a file for the first time.
-    //
-    let path = join(await tempdir('meta'), 'example.txt');
+  //
+  // 1. Create a file for the first time.
+  //
+  let path = join(await tempdir('meta'), 'example.txt');
 
-    let {changed, failed, ok, skipped} = Context.counts;
+  let {changed, failed, ok, skipped} = Context.counts;
 
-    await file({
-        path,
-        state: 'touch',
-    });
+  await file({
+    path,
+    state: 'touch',
+  });
 
-    let contents = await fs.readFile(path, 'utf8');
+  let contents = await fs.readFile(path, 'utf8');
 
-    expect.equal(contents, '');
+  expect.equal(contents, '');
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 
-    //
-    // 2. Touch an existing entity.
-    //
+  //
+  // 2. Touch an existing entity.
+  //
 
-    const now = Date.now();
-    const recent = now - 3_600_000; // An hour ago.
+  const now = Date.now();
+  const recent = now - 3_600_000; // An hour ago.
 
-    await fs.utimes(path, recent, recent);
+  await fs.utimes(path, recent, recent);
 
-    ({changed, failed, ok, skipped} = Context.counts);
+  ({changed, failed, ok, skipped} = Context.counts);
 
-    await file({
-        path,
-        state: 'touch',
-    });
+  await file({
+    path,
+    state: 'touch',
+  });
 
-    expect.equal(Context.counts.changed, changed + 1);
-    expect.equal(Context.counts.failed, failed);
-    expect.equal(Context.counts.ok, ok);
-    expect.equal(Context.counts.skipped, skipped);
+  expect.equal(Context.counts.changed, changed + 1);
+  expect.equal(Context.counts.failed, failed);
+  expect.equal(Context.counts.ok, ok);
+  expect.equal(Context.counts.skipped, skipped);
 
-    const stats = await fs.stat(path);
+  const stats = await fs.stat(path);
 
-    // Assert that mtime is within 1 second, allowing some imprecision.
-    expect.ok(Math.abs(stats.mtimeMs - now) < 1_000);
+  // Assert that mtime is within 1 second, allowing some imprecision.
+  expect.ok(Math.abs(stats.mtimeMs - now) < 1_000);
 });
 
 task("don't notify a handler", async () => {
-    await command('mkdir', ['/etc'], {
-        creates: '/etc',
-        notify: 'should not to be called',
-    });
+  await command('mkdir', ['/etc'], {
+    creates: '/etc',
+    notify: 'should not to be called',
+  });
 });
 
 task('notify a handler', async () => {
-    await command('true', [], {
-        notify: 'handle command',
-    });
+  await command('true', [], {
+    notify: 'handle command',
+  });
 });
 
 handler('should not to be called', async () => {
-    fail('handler fired');
+  fail('handler fired');
 });
 
 handler('handle command', async () => {
-    await command('true', []);
+  await command('true', []);
 });
index d562fa8e6f9828ca1ee25f2903070d3ecc72a289..dda84261ecf297089cb6145f86c3885573eb74fd 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Installs Node.js"
+  "description": "Installs Node.js"
 }
index e1c2db630dce95ce1a4ac3f8aeb78bb35858cf5b..764146bbf01a250b9ee5018fafb678ec4c67deff 100644 (file)
@@ -7,59 +7,59 @@ const bin = path.home.join(`n/bin`);
 const npm = bin.join('npm');
 
 task('make ~/n', async () => {
-    await file({path: '~/n', state: 'directory'});
+  await file({path: '~/n', state: 'directory'});
 });
 
 task('hide ~/n', async () => {
-    if (attributes.platform === 'darwin') {
-        await command('chflags', ['hidden', '~/n']);
-    }
+  if (attributes.platform === 'darwin') {
+    await command('chflags', ['hidden', '~/n']);
+  }
 });
 
 task(`install Node.js v${NODE_VERSION}`, async () => {
-    const env = {
-        ...process.env,
-        N_PREFIX: path.home.join('n'),
-    };
+  const env = {
+    ...process.env,
+    N_PREFIX: path.home.join('n'),
+  };
 
-    await command(n, [NODE_VERSION], {
-        creates: `~/n/n/versions/node/${NODE_VERSION}/bin/node`,
-        env,
-    });
+  await command(n, [NODE_VERSION], {
+    creates: `~/n/n/versions/node/${NODE_VERSION}/bin/node`,
+    env,
+  });
 });
 
 task('install global packages', async () => {
-    const env = {
-        ...process.env,
-        N_PREFIX: path.home.join('n'),
-        PATH: `${bin}:${process.env.PATH}`,
-    };
+  const env = {
+    ...process.env,
+    N_PREFIX: path.home.join('n'),
+    PATH: `${bin}:${process.env.PATH}`,
+  };
 
-    const packages = [
-        'bs-platform',
-        'flow-bin',
-        'flow-typed',
-        'gatsby-cli',
-        'typescript-language-server',
-        'neovim',
-        'ocaml-language-server',
-        'reason-cli',
-        'source-map-explorer',
-        'typescript',
-        'vim-language-server',
-        'yarn@1.22.4',
-    ];
+  const packages = [
+    'bs-platform',
+    'flow-bin',
+    'flow-typed',
+    'gatsby-cli',
+    'typescript-language-server',
+    'neovim',
+    'ocaml-language-server',
+    'reason-cli',
+    'source-map-explorer',
+    'typescript',
+    'vim-language-server',
+    'yarn@1.22.4',
+  ];
 
-    for (const name of packages) {
-        const result = await command(npm, ['ls', '-g', '--parseable', name], {
-            env,
-            failedWhen: () => false,
-        });
+  for (const name of packages) {
+    const result = await command(npm, ['ls', '-g', '--parseable', name], {
+      env,
+      failedWhen: () => false,
+    });
 
-        if (result && result.status === 0) {
-            skip(`package ${name} (already installed)`);
-        } else {
-            await command(npm, ['install', '-g', name], {env});
-        }
+    if (result && result.status === 0) {
+      skip(`package ${name} (already installed)`);
+    } else {
+      await command(npm, ['install', '-g', name], {env});
     }
+  }
 });
index 69fa9d95fd88041848c2183539bcf106b008fef0..d8f13467457d3014e4bf7474461671e1beb7bd2a 100644 (file)
@@ -1,73 +1,73 @@
 export default {
-    description: 'Installs and updates packages via the pacman package manager',
-    variables: {
-        packages: [
-            'adobe-source-code-pro-fonts', // Monospace programming font.
-            'ant', // Java build tool.
-            'avahi', // zeroconf ("Bonjour") networking.
-            'bluez', // Bluetooth stack.
-            'bluez-utils', // Provides `bluetoothctl` CLI tool for pairing etc (see: https://wiki.archlinux.org/index.php/Bluetooth).
-            'caja', // File manager from MATE desktop.
-            'chafa', // Low-res character-based image previewer.
-            'clang', // Compiler toolchain (eg. used for Neovim LSP).
-            'cmake', // Build tool (eg. used to build Neovim).
-            'dmenu', // Item selection UI.
-            'dnsutils', // For `host`, `nslookup` and friends.
-            'dunst', // Notification daemon (eg. for clock dropdown in status bar).
-            'feh', // Sets desktop background.
-            'git', // Version control system.
-            'gnome-control-center', // For controlling audio (etc).
-            'gnome-icon-theme', // eg. for clock icon in dunst notifications.
-            'happy', // Haskell golden testing library (needed for docvim).
-            'htop', // Fancier process monitor.
-            'hwinfo', // For querying hardware info.
-            'i3', // Window manager.
-            'i3blocks', // Status bar.
-            'iftop', // Network monitor.
-            'interception-dual-function-keys', // Substitute for some key (ha!) Karabiner-Elements functionality.
-            'iotop', // I/O monitor.
-            'irssi', // IRC client.
-            'jdk8-openjdk', // Java.
-            'jq', // JSON parser.
-            'kitty', // Terminal emulator.
-            'mariadb', // Drop-in replacemend for (and default Arch) MySQL package.
-            'mlocate', // Find files by name with `locate`.
-            'netcat', // For piping over network connectison (see also `socat` below).
-            'nodejs', // JavaScript engine.
-            'npm', // Node package manager.
-            'openssh', // SSH tools.
-            'otf-font-awesome', // Icon font (eg. for status bar).
-            'pcmanfm', // File manager from LXDE desktop (lightweight).
-            'picom', // X compositor (eg. window transparency etc).
-            'pulseaudio-bluetooth',
-            'python-neovim', // Support for running Python plugins in Neovim.
-            'python-pip', // So we can install commandt.score and redis (for deoplete plugins).
-            'ripgrep', // Grep replacement.
-            'ruby', // Scripting language.
-            'screenkey', // Shows keyboard interactions for screencasting.
-            'scrot', // Screenshot tool.
-            'skim', // Fuzzy finder.
-            'slop', // For selecting screen regions (eg. with screenkey).
-            'socat', // Netcat replacement with UNIX domain socket (etc) support.
-            'stack', // Haskell environment.
-            'stress', // CPU (etc) stress tester.
-            'sxhkd', // Hotkey daemon for X (eg. open Dmenu with Super+Space).
-            'sxiv', // Simple X image viewer.
-            'tree', // CLI file hierarchy viewer.
-            'unzip', // For extracting and viewing .zip archive contents.
-            'vi', // Original vi text editor.
-            'vim', // Vim (vi improved) text editor.
-            'vlc', // Media player.
-            'wget', // `curl` alternative.
-            'xautolock', // Screen locker with hot-corner support.
-            'xclip', // CLI access to X clipboard.
-            'xdo', // Window utility for X, used to implement "swallow" functionality.
-            'xdotool', // Another X utility, used to send per-application key strokes.
-            'xorg', // Window system.
-            'xorg-xinit', // X initializer.
-            'xsecurelock', // Secure screen lock from Google.
-            'yarn', // JavaScript package manager.
-            'zsh', // Shell.
-        ],
-    },
+  description: 'Installs and updates packages via the pacman package manager',
+  variables: {
+    packages: [
+      'adobe-source-code-pro-fonts', // Monospace programming font.
+      'ant', // Java build tool.
+      'avahi', // zeroconf ("Bonjour") networking.
+      'bluez', // Bluetooth stack.
+      'bluez-utils', // Provides `bluetoothctl` CLI tool for pairing etc (see: https://wiki.archlinux.org/index.php/Bluetooth).
+      'caja', // File manager from MATE desktop.
+      'chafa', // Low-res character-based image previewer.
+      'clang', // Compiler toolchain (eg. used for Neovim LSP).
+      'cmake', // Build tool (eg. used to build Neovim).
+      'dmenu', // Item selection UI.
+      'dnsutils', // For `host`, `nslookup` and friends.
+      'dunst', // Notification daemon (eg. for clock dropdown in status bar).
+      'feh', // Sets desktop background.
+      'git', // Version control system.
+      'gnome-control-center', // For controlling audio (etc).
+      'gnome-icon-theme', // eg. for clock icon in dunst notifications.
+      'happy', // Haskell golden testing library (needed for docvim).
+      'htop', // Fancier process monitor.
+      'hwinfo', // For querying hardware info.
+      'i3', // Window manager.
+      'i3blocks', // Status bar.
+      'iftop', // Network monitor.
+      'interception-dual-function-keys', // Substitute for some key (ha!) Karabiner-Elements functionality.
+      'iotop', // I/O monitor.
+      'irssi', // IRC client.
+      'jdk8-openjdk', // Java.
+      'jq', // JSON parser.
+      'kitty', // Terminal emulator.
+      'mariadb', // Drop-in replacemend for (and default Arch) MySQL package.
+      'mlocate', // Find files by name with `locate`.
+      'netcat', // For piping over network connectison (see also `socat` below).
+      'nodejs', // JavaScript engine.
+      'npm', // Node package manager.
+      'openssh', // SSH tools.
+      'otf-font-awesome', // Icon font (eg. for status bar).
+      'pcmanfm', // File manager from LXDE desktop (lightweight).
+      'picom', // X compositor (eg. window transparency etc).
+      'pulseaudio-bluetooth',
+      'python-neovim', // Support for running Python plugins in Neovim.
+      'python-pip', // So we can install commandt.score and redis (for deoplete plugins).
+      'ripgrep', // Grep replacement.
+      'ruby', // Scripting language.
+      'screenkey', // Shows keyboard interactions for screencasting.
+      'scrot', // Screenshot tool.
+      'skim', // Fuzzy finder.
+      'slop', // For selecting screen regions (eg. with screenkey).
+      'socat', // Netcat replacement with UNIX domain socket (etc) support.
+      'stack', // Haskell environment.
+      'stress', // CPU (etc) stress tester.
+      'sxhkd', // Hotkey daemon for X (eg. open Dmenu with Super+Space).
+      'sxiv', // Simple X image viewer.
+      'tree', // CLI file hierarchy viewer.
+      'unzip', // For extracting and viewing .zip archive contents.
+      'vi', // Original vi text editor.
+      'vim', // Vim (vi improved) text editor.
+      'vlc', // Media player.
+      'wget', // `curl` alternative.
+      'xautolock', // Screen locker with hot-corner support.
+      'xclip', // CLI access to X clipboard.
+      'xdo', // Window utility for X, used to implement "swallow" functionality.
+      'xdotool', // Another X utility, used to send per-application key strokes.
+      'xorg', // Window system.
+      'xorg-xinit', // X initializer.
+      'xsecurelock', // Secure screen lock from Google.
+      'yarn', // JavaScript package manager.
+      'zsh', // Shell.
+    ],
+  },
 };
index 81d6dae79a5149ee2381d1c042770eb64602e3c7..a756e2830d50dcd7459b9473dc0467daab2270db 100644 (file)
@@ -1,30 +1,30 @@
 import {
-    attributes,
-    command,
-    file,
-    handler,
-    line,
-    path,
-    skip,
-    task as defineTask,
-    variable,
+  attributes,
+  command,
+  file,
+  handler,
+  line,
+  path,
+  skip,
+  task as defineTask,
+  variable,
 } from 'fig';
 
 function task(name: string, callback: () => Promise<void>) {
-    defineTask(name, async () => {
-        if (attributes.distribution === 'arch') {
-            await callback();
-        } else {
-            skip('not on Arch Linux');
-        }
-    });
+  defineTask(name, async () => {
+    if (attributes.distribution === 'arch') {
+      await callback();
+    } else {
+      skip('not on Arch Linux');
+    }
+  });
 }
 
 task('enable multilib repository', async () => {
-    // TODO: make a proper ini module for managing this;
-    // will need it because desired `Include` line here must appear in a
-    // specific section.
-    /*
+  // TODO: make a proper ini module for managing this;
+  // will need it because desired `Include` line here must appear in a
+  // specific section.
+  /*
     await line({
         path: '/etc/pacman.conf',
         regexp: /^\s*#?\s*\[multilib\]\s*$/,
@@ -42,39 +42,39 @@ task('enable multilib repository', async () => {
 });
 
 task('refresh package databases', async () => {
-    await command('pacman', ['-Syy'], {sudo: true});
+  await command('pacman', ['-Syy'], {sudo: true});
 });
 
 task('install packages', async () => {
-    // TODO: make this check rather than running unconditionally?
-    await command(
-        'pacman',
-        ['-S', '--noconfirm', ...variable.strings('packages')],
-        {
-            sudo: true,
-        }
-    );
+  // TODO: make this check rather than running unconditionally?
+  await command(
+    'pacman',
+    ['-S', '--noconfirm', ...variable.strings('packages')],
+    {
+      sudo: true,
+    }
+  );
 });
 
 task('run updatedb', async () => {
-    await command('updatedb', [], {sudo: true});
+  await command('updatedb', [], {sudo: true});
 });
 
 // Tweaks: should be moved into separate aspects.
 task('configure faillock.conf', async () => {
-    await line({
-        path: '/etc/security/faillock.conf',
-        regexp: /^\s*#?\s*deny\s*=/,
-        sudo: true,
-        line: 'deny = 10',
-    });
+  await line({
+    path: '/etc/security/faillock.conf',
+    regexp: /^\s*#?\s*deny\s*=/,
+    sudo: true,
+    line: 'deny = 10',
+  });
 
-    await line({
-        path: '/etc/security/faillock.conf',
-        regexp: /^\s*#?\s*unlock_time\s*=/,
-        sudo: true,
-        line: 'unlock_time = 60',
-    });
+  await line({
+    path: '/etc/security/faillock.conf',
+    regexp: /^\s*#?\s*unlock_time\s*=/,
+    sudo: true,
+    line: 'unlock_time = 60',
+  });
 });
 
 // TODO: `sudo npm install -g n`
@@ -82,19 +82,19 @@ task('configure faillock.conf', async () => {
 // TODO: run `n ??.??.??`
 
 task('create suspend hook', async () => {
-    await file({
-        notify: 'enable suspend hook',
-        path: '/etc/systemd/system/suspend@.service',
-        src: path.aspect.join('files', 'suspend@.service'),
-        state: 'file',
-        sudo: true,
-    });
+  await file({
+    notify: 'enable suspend hook',
+    path: '/etc/systemd/system/suspend@.service',
+    src: path.aspect.join('files', 'suspend@.service'),
+    state: 'file',
+    sudo: true,
+  });
 });
 
 handler('enable suspend hook', async () => {
-    await command('systemctl', ['enable', `suspend@${attributes.username}`], {
-        sudo: true,
-    });
+  await command('systemctl', ['enable', `suspend@${attributes.username}`], {
+    sudo: true,
+  });
 });
 
 // TODO: set up sensors or something... i'm not getting cpu sensors
index 84d84df2a2f43cec6b03511f4d7e5bf2ff04f9fa..5edfb7a45b2bd392804796ac7f1ac61af2eb61bf 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Installs Ruby gems"
+  "description": "Installs Ruby gems"
 }
index 91816a6d810446802003cbb2b04eab6fcd3757b2..382987f22641cf0f4eadeaae216513f4033efc73 100644 (file)
@@ -1,8 +1,8 @@
 import {command, task} from 'fig';
 
 task('install prefnerd', async () => {
-    await command('gem', ['install', 'prefnerd'], {
-        creates: '/usr/local/bin/pn',
-        sudo: true,
-    });
+  await command('gem', ['install', 'prefnerd'], {
+    creates: '/usr/local/bin/pn',
+    sudo: true,
+  });
 });
index 2d0257ad00a8c74c7c119cc5443dcee00457eaf6..d9e284ce56da5bf9736d8ddb0a7cca68033a6d0b 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Sets the use shell to zsh"
+  "description": "Sets the use shell to zsh"
 }
index c12a9a9a13d899cbd22b3f65ae19faf7a0c71774..486a915a1a41be5c7b4b3baf14057ed80eb3bf36 100644 (file)
@@ -1,33 +1,31 @@
 import {attributes, command, line, skip, task, variable} from 'fig';
 
 task('add /usr/local/bin/zsh to /etc/shells', async () => {
-    if (attributes.distribution === 'arch') {
-        skip('no need to touch /etc/shells on Arch');
-    } else {
-        await line({
-            group: 'wheel',
-            line: '/usr/local/bin/zsh',
-            owner: 'root',
-            path: '/etc/shells',
-            sudo: true,
-        });
-    }
+  if (attributes.distribution === 'arch') {
+    skip('no need to touch /etc/shells on Arch');
+  } else {
+    await line({
+      group: 'wheel',
+      line: '/usr/local/bin/zsh',
+      owner: 'root',
+      path: '/etc/shells',
+      sudo: true,
+    });
+  }
 });
 
 task('set user shell to zsh', async () => {
-    if (variable('identity') === 'wincent') {
-        if (attributes.distribution === 'arch') {
-            await command('chsh', ['-s', '/bin/zsh', attributes.username], {
-                sudo: true,
-            });
-        } else {
-            await command(
-                'chsh',
-                ['-s', '/usr/local/bin/zsh', attributes.username],
-                {sudo: true}
-            );
-        }
+  if (variable('identity') === 'wincent') {
+    if (attributes.distribution === 'arch') {
+      await command('chsh', ['-s', '/bin/zsh', attributes.username], {
+        sudo: true,
+      });
     } else {
-        skip();
+      await command('chsh', ['-s', '/usr/local/bin/zsh', attributes.username], {
+        sudo: true,
+      });
     }
+  } else {
+    skip();
+  }
 });
index cdd96aa471845264e742c6e5d53eb044340a7952..e21ae24af3c065808b5c826aa02c2d6fb3a7c7d8 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Manages local SSH config"
+  "description": "Manages local SSH config"
 }
index c240543e3a4ee0646730559b009405e02882edf0..1fe6b341d3437977e541d3825fabbb1f61b76f73 100644 (file)
@@ -2,37 +2,35 @@ import {fail, file, resource, skip, task, template, variable} from 'fig';
 import stat from 'fig/fs/stat.js';
 
 task('create ~/.ssh', async () => {
-    await file({
-        mode: '0700',
-        path: '~/.ssh',
-        state: 'directory',
-    });
+  await file({
+    mode: '0700',
+    path: '~/.ssh',
+    state: 'directory',
+  });
 });
 
 task('install ~/.ssh/config', async () => {
-    if (variable('identity') === 'wincent') {
-        const src = resource.template('.ssh/config.erb');
+  if (variable('identity') === 'wincent') {
+    const src = resource.template('.ssh/config.erb');
 
-        const stats = await stat(src);
+    const stats = await stat(src);
 
-        // TODO: make this warn instead of fail
-        // (on first run on a new machine, we might not have decrypted yet...
-        // because we won't have the GPG key on the machine yet...
-        // although maybe I should just do that...)
-        if (stats === null) {
-            fail(
-                `"${src}" does not exist; run "vendor/git-cipher/bin/git-cipher"`
-            );
-        } else if (stats instanceof Error) {
-            throw stats;
-        } else {
-            await template({
-                mode: '0600',
-                path: '~/.ssh/config',
-                src,
-            });
-        }
+    // TODO: make this warn instead of fail
+    // (on first run on a new machine, we might not have decrypted yet...
+    // because we won't have the GPG key on the machine yet...
+    // although maybe I should just do that...)
+    if (stats === null) {
+      fail(`"${src}" does not exist; run "vendor/git-cipher/bin/git-cipher"`);
+    } else if (stats instanceof Error) {
+      throw stats;
     } else {
-        skip();
+      await template({
+        mode: '0600',
+        path: '~/.ssh/config',
+        src,
+      });
     }
+  } else {
+    skip();
+  }
 });
index b2b434c399aa01854f458a5f5fd22d9686243561..4938791aab57f57a0d4725fd53af06de2eab2870 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Manages /etc/ssh/sshd_config"
+  "description": "Manages /etc/ssh/sshd_config"
 }
index d7c7c42bee24654472cfbfaf259e579eb741fa11..94a0e884ce1c9961b6b9e320f72dc6936ecdde3f 100644 (file)
@@ -1,45 +1,45 @@
 import {command, fail, handler, line, task} from 'fig';
 
 task('disable password-based authentication', async () => {
-    await line({
-        line: 'PasswordAuthentication no',
-        notify: 'restart sshd.service',
-        path: '/etc/ssh/sshd_config',
-        regexp: /\s*#?\s*PasswordAuthentication\s+(?:yes|no)\b/,
-        sudo: true,
-    });
+  await line({
+    line: 'PasswordAuthentication no',
+    notify: 'restart sshd.service',
+    path: '/etc/ssh/sshd_config',
+    regexp: /\s*#?\s*PasswordAuthentication\s+(?:yes|no)\b/,
+    sudo: true,
+  });
 });
 
 task('activate sshd', async () => {
-    const result = await command('systemctl', ['is-active', 'sshd'], {
-        failedWhen: () => false,
-    });
+  const result = await command('systemctl', ['is-active', 'sshd'], {
+    failedWhen: () => false,
+  });
 
-    if (result && typeof result.status === 'number') {
-        if (result.status !== 0) {
-            await command('systemctl', ['start', 'sshd.service'], {sudo: true});
-        }
-    } else {
-        fail('could not determine sshd status');
+  if (result && typeof result.status === 'number') {
+    if (result.status !== 0) {
+      await command('systemctl', ['start', 'sshd.service'], {sudo: true});
     }
+  } else {
+    fail('could not determine sshd status');
+  }
 });
 
 task('enable sshd', async () => {
-    const result = await command('systemctl', ['is-enabled', 'sshd'], {
-        failedWhen: () => false,
-    });
+  const result = await command('systemctl', ['is-enabled', 'sshd'], {
+    failedWhen: () => false,
+  });
 
-    if (result && typeof result.status === 'number') {
-        if (result.status !== 0) {
-            await command('systemctl', ['enable', 'sshd.service'], {
-                sudo: true,
-            });
-        }
-    } else {
-        fail('could not determine sshd status');
+  if (result && typeof result.status === 'number') {
+    if (result.status !== 0) {
+      await command('systemctl', ['enable', 'sshd.service'], {
+        sudo: true,
+      });
     }
+  } else {
+    fail('could not determine sshd status');
+  }
 });
 
 handler('restart sshd.service', async () => {
-    await command('systemctl', ['restart', 'sshd.service'], {sudo: true});
+  await command('systemctl', ['restart', 'sshd.service'], {sudo: true});
 });
index 0f4d476abaca467b6653c1d3879b5f0ed87b5248..ffc9559456a6e7d6e24e6d609fc5bfdd49aadbb7 100644 (file)
@@ -1,6 +1,6 @@
 {
-    "description": "Generic grab bag of stuff that runs out of systemd",
-    "variables": {
-        "hostname": "huertas"
-    }
+  "description": "Generic grab bag of stuff that runs out of systemd",
+  "variables": {
+    "hostname": "huertas"
+  }
 }
index 51bca939da827e9436a5c57c0c6617daab85cb1e..dbe01bb5a730a8e29e78219bf172217bb99cde49 100644 (file)
@@ -2,25 +2,25 @@ import {attributes, command, skip, task as defineTask, variable} from 'fig';
 
 // TODO: need to come up with a better pattern for arch-specific stuff
 function task(name: string, callback: () => Promise<void>) {
-    defineTask(name, async () => {
-        if (attributes.distribution === 'arch') {
-            await callback();
-        } else {
-            skip('not on Arch Linux');
-        }
-    });
+  defineTask(name, async () => {
+    if (attributes.distribution === 'arch') {
+      await callback();
+    } else {
+      skip('not on Arch Linux');
+    }
+  });
 }
 
 task('set up hostname', async () => {
-    const hostname = variable.string('hostname');
-    const result = await command('hostname', []);
+  const hostname = variable.string('hostname');
+  const result = await command('hostname', []);
 
-    if (
-        variable('identity') === 'wincent' &&
-        result!.stdout.trim() !== hostname
-    ) {
-        await command('hostnamectl', ['set-hostname', hostname], {sudo: true});
-    } else {
-        skip();
-    }
+  if (
+    variable('identity') === 'wincent' &&
+    result!.stdout.trim() !== hostname
+  ) {
+    await command('hostnamectl', ['set-hostname', hostname], {sudo: true});
+  } else {
+    skip();
+  }
 });
index aa0494309b12f93a373110386224e35f6b1c2fb3..6a0b99eec34b64580e6426e233910c5d91f5f84f 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Tampermonkey scripts"
+  "description": "Tampermonkey scripts"
 }
index aa268c1f2aa140f8a7129cb9e420ec7b7b198d25..ce1bd34eccaac597b48e816d82f13b7aad3aa462 100644 (file)
@@ -1,95 +1,95 @@
 import {
-    attributes,
-    command,
-    file,
-    handler,
-    line,
-    path,
-    resource,
-    skip,
-    task,
-    template,
-    variable,
+  attributes,
+  command,
+  file,
+  handler,
+  line,
+  path,
+  resource,
+  skip,
+  task,
+  template,
+  variable,
 } from 'fig';
 
 task('make ~/Sites/UserScripts/*', async () => {
-    if (variable('identity') === 'wincent') {
-        const base = path('~/Sites/UserScripts');
+  if (variable('identity') === 'wincent') {
+    const base = path('~/Sites/UserScripts');
 
-        await file({path: '~/Sites', state: 'directory'});
-        await file({path: base, state: 'directory'});
+    await file({path: '~/Sites', state: 'directory'});
+    await file({path: base, state: 'directory'});
 
-        for (const directory of resource.templates('UserScripts/*')) {
-            await file({
-                path: base.join(directory.basename),
-                state: 'directory',
-            });
-        }
-    } else {
-        skip();
+    for (const directory of resource.templates('UserScripts/*')) {
+      await file({
+        path: base.join(directory.basename),
+        state: 'directory',
+      });
     }
+  } else {
+    skip();
+  }
 });
 
 task('fill templates', async () => {
-    if (variable('identity') === 'wincent') {
-        for (const src of resource.templates('UserScripts/*/*.js')) {
-            await template({
-                path: path('~/Sites/UserScripts').join(...src.last(2)),
-                src,
-            });
-        }
-    } else {
-        skip();
+  if (variable('identity') === 'wincent') {
+    for (const src of resource.templates('UserScripts/*/*.js')) {
+      await template({
+        path: path('~/Sites/UserScripts').join(...src.last(2)),
+        src,
+      });
     }
+  } else {
+    skip();
+  }
 });
 
 task('configure Apache', async () => {
-    if (variable('identity') === 'wincent') {
-        await template({
-            group: 'wheel',
-            owner: 'root',
-            notify: 'restart Apache',
-            path: path('/private/etc/apache2/users').join(
-                `${attributes.username}.conf`
-            ),
-            src: resource.template('apache2/users/user.conf.erb'),
-            sudo: true,
-        });
+  if (variable('identity') === 'wincent') {
+    await template({
+      group: 'wheel',
+      owner: 'root',
+      notify: 'restart Apache',
+      path: path('/private/etc/apache2/users').join(
+        `${attributes.username}.conf`
+      ),
+      src: resource.template('apache2/users/user.conf.erb'),
+      sudo: true,
+    });
 
-        await line({
-            notify: 'restart Apache',
-            path: '/etc/apache2/extra/httpd-userdir.conf',
-            regexp: /^\s*#?\s*Include\s+\/private\/etc\/apache2\/users\/\*\.conf\b/,
-            sudo: true,
-            line: 'Include /private/etc/apache2/users/*.conf',
-        });
+    await line({
+      notify: 'restart Apache',
+      path: '/etc/apache2/extra/httpd-userdir.conf',
+      regexp: /^\s*#?\s*Include\s+\/private\/etc\/apache2\/users\/\*\.conf\b/,
+      sudo: true,
+      line: 'Include /private/etc/apache2/users/*.conf',
+    });
 
-        await line({
-            notify: 'restart Apache',
-            path: '/private/etc/apache2/httpd.conf',
-            regexp: /^\s*#?\s*LoadModule\s+userdir_module\s+libexec\/apache2\/mod_userdir\.so\b/,
-            sudo: true,
-            line: 'LoadModule userdir_module libexec/apache2/mod_userdir.so',
-        });
+    await line({
+      notify: 'restart Apache',
+      path: '/private/etc/apache2/httpd.conf',
+      regexp: /^\s*#?\s*LoadModule\s+userdir_module\s+libexec\/apache2\/mod_userdir\.so\b/,
+      sudo: true,
+      line: 'LoadModule userdir_module libexec/apache2/mod_userdir.so',
+    });
 
-        await line({
-            notify: 'restart Apache',
-            path: '/private/etc/apache2/httpd.conf',
-            regexp: /^\s*#?\s*Include\s+\/private\/etc\/apache2\/extra\/httpd-userdir\.conf\b/,
-            sudo: true,
-            line: 'Include /private/etc/apache2/extra/httpd-userdir.conf',
-        });
-    } else {
-        skip();
-    }
+    await line({
+      notify: 'restart Apache',
+      path: '/private/etc/apache2/httpd.conf',
+      regexp: /^\s*#?\s*Include\s+\/private\/etc\/apache2\/extra\/httpd-userdir\.conf\b/,
+      sudo: true,
+      line: 'Include /private/etc/apache2/extra/httpd-userdir.conf',
+    });
+  } else {
+    skip();
+  }
 });
 
 handler('restart Apache', async () => {
-    await command(
-        'launchctl',
-        ['load', '-w', '/System/Library/LaunchDaemons/org.apache.httpd.plist'],
-        {sudo: true}
-    );
+  await command(
+    'launchctl',
+    ['load', '-w', '/System/Library/LaunchDaemons/org.apache.httpd.plist'],
+    {sudo: true}
+  );
 
-    await command('apachectl', ['restart'], {sudo: true});
+  await command('apachectl', ['restart'], {sudo: true});
 });
index 74ab3aeff3edbb9a1c54e4014797a3a7cbd93b5c..1df8f7e7a3873128b8a6ba7463b969fe50efff68 100644 (file)
 // ==/UserScript==
 
 (function () {
-    'use strict';
-
-    const observer = new MutationObserver((_mutationList) => {
-        const radio = document.querySelector(
-            'input[name="pull_request_review[event]"'
-        );
-
-        if (
-            radio &&
-            radio.nextSibling &&
-            radio.nextSibling.nodeType === Node.TEXT_NODE &&
-            radio.nextSibling.textContent.match(/\bComment\b/)
-        ) {
-            radio.nextSibling.textContent = "I'm just sayin'";
-
-            const label = radio.closest('label');
-
-            if (label) {
-                label.style.position = 'relative';
-
-                const img = document.createElement('img');
-
-                // Need a GitHub-hosted image due to Content Security Policy directive:
-                // "img-src data: 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com".
-                img.src =
-                    'https://user-images.githubusercontent.com/905006/85576788-fe5aaa80-b638-11ea-89c6-37281fc3b123.gif';
-                img.style.height = '130px';
-                img.style.position = 'absolute';
-                img.style.right = 0;
-                img.style.top = 0;
-                img.style.width = '150px';
-
-                label.appendChild(img);
-            }
-        }
-    });
-
-    observer.observe(document.body, {
-        attributes: true,
-        childList: true,
-        subtree: true,
-    });
+  'use strict';
+
+  const observer = new MutationObserver((_mutationList) => {
+    const radio = document.querySelector(
+      'input[name="pull_request_review[event]"'
+    );
+
+    if (
+      radio &&
+      radio.nextSibling &&
+      radio.nextSibling.nodeType === Node.TEXT_NODE &&
+      radio.nextSibling.textContent.match(/\bComment\b/)
+    ) {
+      radio.nextSibling.textContent = "I'm just sayin'";
+
+      const label = radio.closest('label');
+
+      if (label) {
+        label.style.position = 'relative';
+
+        const img = document.createElement('img');
+
+        // Need a GitHub-hosted image due to Content Security Policy directive:
+        // "img-src data: 'self' data: github.githubassets.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com".
+        img.src =
+          'https://user-images.githubusercontent.com/905006/85576788-fe5aaa80-b638-11ea-89c6-37281fc3b123.gif';
+        img.style.height = '130px';
+        img.style.position = 'absolute';
+        img.style.right = 0;
+        img.style.top = 0;
+        img.style.width = '150px';
+
+        label.appendChild(img);
+      }
+    }
+  });
+
+  observer.observe(document.body, {
+    attributes: true,
+    childList: true,
+    subtree: true,
+  });
 })();
 
 // <%= variables.figManaged %>
index 62297fed3503be05f838a475358826c396f01877..70ea320db9a125d7a7291717db54ae4adc9d8413 100644 (file)
 // ==/UserScript==
 
 (function () {
-    'use strict';
+  'use strict';
 
-    const style = document.createElement('style');
+  const style = document.createElement('style');
 
-    style.innerHTML = `
+  style.innerHTML = `
         .previewable-comment-form textarea {
             min-height: 300px; /* normally 100px, which is ridiculous */
             max-height: none; /* normally 500px */
         }
     `;
 
-    document.head.appendChild(style);
+  document.head.appendChild(style);
 })();
 
 // <%= variables.figManaged %>
index 83a704676ea339f2a8231a8c478d475a908b5e0c..d9edd7ce0fbe98184a0c88add95c5ac54a49d2f1 100644 (file)
 // ==/UserScript==
 
 (function () {
-    'use strict';
+  'use strict';
 
-    const style = document.createElement('style');
+  const style = document.createElement('style');
 
-    style.innerHTML = `
+  style.innerHTML = `
         .previewable-comment-form textarea {
             font-family: 'Source Code Pro', monospace;
             font-size: 12px;
         }
     `;
 
-    document.head.appendChild(style);
+  document.head.appendChild(style);
 })();
 
 // <%= variables.figManaged %>
index 012f6d8bebf5563da4c81025e8c65ed1ba33eea7..4bc4f9c9cd262f70b498ce70fc7aa966fa35c66c 100644 (file)
 // ==/UserScript==
 
 (function () {
-    'use strict';
+  'use strict';
 
-    const style = document.createElement('style');
+  const style = document.createElement('style');
 
-    style.innerHTML = `
+  style.innerHTML = `
         .im {
             color: initial;
         }
     `;
 
-    document.head.appendChild(style);
+  document.head.appendChild(style);
 })();
 
 // <%= variables.figManaged %>
index d06b2328fd1df49330bffcb4960a88fc309394ce..2c7a7581a0f19feaf8d2fb36cfb46620bc9dd9ca 100644 (file)
 // ==/UserScript==
 
 (function () {
-    'use strict';
+  'use strict';
 
-    document.addEventListener(
-        'click',
-        (event) => {
-            const {target} = event;
+  document.addEventListener(
+    'click',
+    (event) => {
+      const {target} = event;
 
-            if (
-                target.tagName === 'A' &&
-                target.href &&
-                target.href.match(/^https:\/\/t.co\//) &&
-                target.title.match(/^https?:\/\/\w/)
-            ) {
-                window.open(target.title, event.metaKey ? '_blank' : '_self');
-                event.preventDefault();
-                event.stopPropagation();
-            }
-        },
-        true
-    );
+      if (
+        target.tagName === 'A' &&
+        target.href &&
+        target.href.match(/^https:\/\/t.co\//) &&
+        target.title.match(/^https?:\/\/\w/)
+      ) {
+        window.open(target.title, event.metaKey ? '_blank' : '_self');
+        event.preventDefault();
+        event.stopPropagation();
+      }
+    },
+    true
+  );
 })();
 
 // <%= variables.figManaged %>
index f273e7a944a3c186e4fa3acbe37135a8afa84eb0..646f3196467fc5c1a7978167f171446ddc7fbf6e 100644 (file)
 // ==/UserScript==
 
 (function () {
-    'use strict';
+  'use strict';
 
-    const style = document.createElement('style');
+  const style = document.createElement('style');
 
-    style.innerHTML = `
+  style.innerHTML = `
         [aria-label~=Like][role=button] {
             visibility: hidden;
         }
     `;
 
-    document.head.appendChild(style);
+  document.head.appendChild(style);
 })();
 
 // <%= variables.figManaged %>
index 7e60f45d8664a9228a8bec3ec1a0b553d50fa7f9..b045ba0cfe630c6367f727d8f9af2bc69de3c8a9 100644 (file)
@@ -1,3 +1,3 @@
 {
-    "description": "Sets up terminfo database entries for italics and 256-color support"
+  "description": "Sets up terminfo database entries for italics and 256-color support"
 }
index 5092c3f296576e571b083042890bc73f57363ead..bbcc655d4db8a1d1335f77286c852a1946fedd9b 100644 (file)
@@ -1,24 +1,24 @@
 import {attributes, command, file, resource, task} from 'fig';
 
 task('create target directory', async () => {
-    if (attributes.platform === 'linux') {
-        await file({path: '~/share', state: 'directory'});
-        await file({path: '~/share/terminfo', state: 'directory'});
-    } else {
-        await file({path: '~/.terminfo', state: 'directory'});
-    }
+  if (attributes.platform === 'linux') {
+    await file({path: '~/share', state: 'directory'});
+    await file({path: '~/share/terminfo', state: 'directory'});
+  } else {
+    await file({path: '~/.terminfo', state: 'directory'});
+  }
 });
 
 task('update terminfo files', async () => {
-    let terminfoPath: string;
+  let terminfoPath: string;
 
-    if (attributes.platform === 'linux') {
-        terminfoPath = '~/share/terminfo';
-    } else {
-        terminfoPath = '~/.terminfo';
-    }
+  if (attributes.platform === 'linux') {
+    terminfoPath = '~/share/terminfo';
+  } else {
+    terminfoPath = '~/.terminfo';
+  }
 
-    for (const terminfo of resource.files('*.terminfo')) {
-        await command('tic', ['-o', terminfoPath, terminfo]);
-    }
+  for (const terminfo of resource.files('*.terminfo')) {
+    await command('tic', ['-o', terminfoPath, terminfo]);
+  }