Compare commits

...

64 Commits

Author SHA1 Message Date
0b03acebd8 feat(config): tmux plugin tmux-fzf-url 2025-01-02 22:22:59 +02:00
d172b86cb8 chore(docs): update nvim, tmux, wezterm keymaps 2025-01-02 17:46:07 +02:00
f910dfb9ac chore(nvim): add lazy dev path, enable profiling 2025-01-02 17:36:53 +02:00
ee95d57ba0 chore(config): aerospace tweaks 2025-01-02 17:34:48 +02:00
f8a317f3c7 chore(dfm): install script cleanup 2025-01-02 15:18:48 +02:00
3762e10932 chore(config): aerospace docker desktop layout 2025-01-02 14:53:59 +02:00
afda96902b chore(config): ghostty tweaks 2025-01-02 14:53:20 +02:00
3060b6ad66 chore(nvim): mason tools, sessionopts 2025-01-02 14:15:06 +02:00
github-actions[bot]
4f154cf509 chore: update pre-commit hooks (#62)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2025-01-02 11:41:43 +02:00
863d803483 feat(config): zed config 2024-12-30 17:53:56 +02:00
07bb2b56d1 feat(config): glow config 2024-12-30 17:51:47 +02:00
84a753100e feat(config): ghostty config 2024-12-30 17:51:26 +02:00
c8b01f3fda chore(config): aerospace tweaks 2024-12-30 17:50:47 +02:00
8e6a110aac chore(ci): pre-commit - detect-aws-creds 2024-12-30 17:49:50 +02:00
a8baa1671f chore(config): fix terminfo, add ghostty inits 2024-12-30 17:27:45 +02:00
2ccdd042f6 chore: sort gitignore, echo submodule ignore status 2024-12-30 17:26:35 +02:00
github-actions[bot]
8cf43ed555 chore: update pre-commit hooks (#60)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-30 15:05:15 +02:00
e22094e0da fix(dfm): asdf plugin-install, docs translations 2024-12-30 11:26:54 +02:00
6186c5cba4 chore(config): tmux ignore md5 in window name 2024-12-28 19:02:55 +02:00
c453dcbf84 chore(nvim): statusline tweaks 2024-12-28 19:02:14 +02:00
4daaa62aed feat(dfm): scripts/install-* to autocomplete, docs 2024-12-28 19:01:45 +02:00
f56d5682d1 chore(nvim): shellscript formatting with shfmt 2024-12-28 18:59:59 +02:00
439638b686 chore(config): tweaks to aerospace config 2024-12-28 18:59:38 +02:00
a8a473a46d chore: shfmt, cleanup 2024-12-28 18:59:09 +02:00
eb91a43bbd feat(asdf): drop asdf-plugin-manager, use dotbot-asdf 2024-12-28 16:58:31 +02:00
github-actions[bot]
193fae662e chore: update pre-commit hooks (#58)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-27 05:18:32 +02:00
github-actions[bot]
117ca1a944 chore: update pre-commit hooks (#57)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-25 15:31:39 +02:00
1f1a6d42ad fix(ci): update-submodules cron syntax 2024-12-25 15:30:49 +02:00
cca265cd99 chore(ci): update update-submodules schedule 2024-12-25 15:15:53 +02:00
cc6abb53ba chore(ci): update pre-commit-autoupdate 2024-12-25 14:34:38 +02:00
ab34c148a6 feat(bin): age tools (#20)
* wip: ae for encryption, ad for decryption
* feat: finished ad and ae, created a for both uses
2024-12-24 09:31:25 +02:00
github-actions[bot]
910b29ed9f chore: update pre-commit hooks (#56) 2024-12-24 06:50:02 +02:00
3fb0a75a62 feat(asdf): update automation, versions, plugins 2024-12-24 00:59:50 +02:00
github-actions[bot]
f73abb508b chore: update pre-commit hooks (#55)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-23 13:00:01 +02:00
github-actions[bot]
1dd3d952cf chore: update pre-commit hooks (#54)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-22 02:07:59 +02:00
1ffd6e1569 feat(nvim): update blink config 2024-12-20 22:54:17 +02:00
a76033a48a chore(deps): update Brewfile 2024-12-20 18:55:14 +02:00
34dc18883e chore(config): aerospace tweaks 2024-12-20 18:14:57 +02:00
832d8b94f3 chore(nvim): add the awesome youtube video to mini 2024-12-20 12:37:00 +02:00
c40eb765f8 chore(config): tweak aerospace config 2024-12-20 12:06:37 +02:00
github-actions[bot]
1bb7e9076b chore: update pre-commit hooks (#53)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-20 10:11:10 +02:00
ivuorinen
17821dfefa chore(git): Update submodules (automated)
asdf 54d15e3
antidote
dotbot v1.20.4
2024-12-20 03:09:26 +00:00
19327947ed chore(config): tweak aerospace config 2024-12-19 12:48:41 +02:00
2356fc4c61 chore(deps): update asdf submodule 2024-12-19 12:48:26 +02:00
45219deccb fix(nvim): nvmdef - fix log levels for now 2024-12-19 12:46:53 +02:00
5471aba1a4 chore(nvim): autosession, configs, tweaks 2024-12-19 12:42:20 +02:00
github-actions[bot]
6f6ee3611c chore: update pre-commit hooks (#52)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-19 12:24:10 +02:00
ivuorinen
d8f9cdf265 chore(git): Update submodules (automated)
asdf 9c12b79
antidote
2024-12-19 03:14:30 +00:00
abb6de05be feat(config): AeroSpace config 2024-12-18 17:22:26 +02:00
60ef48e918 feat(nvim): consolidate code related plugins 2024-12-18 17:12:30 +02:00
e58c79a3c3 fix(dotbot): fix installer config 2024-12-18 17:11:50 +02:00
d47f21286d feat(nvim): drop opts defined in mini.basics 2024-12-18 14:27:03 +02:00
3f108c9353 feat(nvim): use full mini.nvim instead of subrepos 2024-12-18 14:16:19 +02:00
github-actions[bot]
4a68146786 chore: update pre-commit hooks (#51)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-18 09:56:47 +02:00
github-actions[bot]
cf79e61943 chore: update pre-commit hooks (#50)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2024-12-17 09:16:33 +02:00
43dcb303a0 chore(dfm): improved colors helper 2024-12-16 08:25:29 +02:00
1b03f0bbd6 chore(config): add container arch to actrc 2024-12-16 05:04:38 +02:00
8a52c9a97e chore(nvim): fixed mason formatters, config 2024-12-16 05:04:01 +02:00
8e84c3aef7 chore(lint): fixed stylua and linted nvim configs 2024-12-16 05:02:25 +02:00
acd2f7fc6d chore(config): move personal cheat db to last 2024-12-16 03:55:26 +02:00
1e4aa1558a chore(ci): add renovate-config-validator 2024-12-16 03:54:41 +02:00
b314c0ba76 feat(nvim): nvm-default package (#49) 2024-12-12 10:21:25 +02:00
ece46561c4 chore(nvim): configs, keymaps, utils.lua, docs 2024-12-12 02:13:00 +02:00
196d217c34 feat(shell): switch zsh to use p10k 2024-12-11 14:14:05 +02:00
84 changed files with 3055 additions and 1450 deletions

View File

@@ -11,6 +11,9 @@ trim_trailing_whitespace = true
[*.md] [*.md]
max_line_length = 100 max_line_length = 100
[*.lua]
max_line_length = 120
[*.php] [*.php]
indent_size = 4 indent_size = 4
@@ -23,6 +26,8 @@ indent_size = 1
indent_style = tab indent_style = tab
[{local/bin/*,**/*.sh,**/zshrc,config/*,scripts/*}] [{local/bin/*,**/*.sh,**/zshrc,config/*,scripts/*}]
indent_size = 2
tab_width = 2
shell_variant = bash # --language-variant shell_variant = bash # --language-variant
binary_next_line = true binary_next_line = true
switch_case_indent = true # --case-indent switch_case_indent = true # --case-indent
@@ -34,5 +39,5 @@ function_next_line = true # --func-next-line
# such as "shfmt -l -w .". When formatting files directly, # such as "shfmt -l -w .". When formatting files directly,
# like "shfmt -w third_party/foo.sh" or "shfmt --filename=third_party/foo.sh", # like "shfmt -w third_party/foo.sh" or "shfmt --filename=third_party/foo.sh",
# the ignore logic is applied only when the --apply-ignore flag is given. # the ignore logic is applied only when the --apply-ignore flag is given.
[{tools/**,local/bin/asdf/**,config/cheat/cheatsheets/**}] [{tools/**,local/bin/asdf/**,config/cheat/cheatsheets/**,config/tmux/plugins/**}]
ignore = true ignore = true

View File

@@ -2,7 +2,8 @@
name: Pre-commit autoupdate name: Pre-commit autoupdate
on: on:
schedule: schedule:
- cron: "0 0 * * *" # At 04:00 on Monday and Thursday.
- cron: "0 4 * * 1,4"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
auto-update: auto-update:

View File

@@ -1,7 +1,9 @@
--- ---
name: Update submodules name: Update submodules
on: on:
schedule: [{ cron: 0 3 * * * }] schedule:
# At 04:00 on Monday and Thursday.
- cron: "0 4 * * 1,4"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
update-submodules: update-submodules:

45
.gitignore vendored
View File

@@ -1,32 +1,35 @@
Brewfile.lock.json !.gitkeep
lazy-lock.json
config/nvim/lazy-lock.json
*.log
*-secret *-secret
*.bak
*.log
*.socket
*cache *cache
.env
.idea .idea
.nfs*
.vscode .vscode
Brewfile.lock.json
antidote_plugins.zsh
config/alacritty/theme-active.toml
config/cheat/cheatsheets/pure-bash-bible/* config/cheat/cheatsheets/pure-bash-bible/*
config/cheat/cheatsheets/tldr/* config/cheat/cheatsheets/tldr/*
config/git/credentials config/git/credentials
config/npm/npmrc
config/zsh/.zcompdump
config/alacritty/theme-active.toml
ssh/local.d/*
!ssh/local.d/.gitkeep
!.gitkeep
.env
local/share/fonts/*
node_modules
.nfs*
*.socket
iTermServer-*
lock
config/iterm2/AppSupport
config/gnupg/S.* config/gnupg/S.*
config/gnupg/s
config/gnupg/private-keys-v1.d config/gnupg/private-keys-v1.d
config/gnupg/s
config/iterm2/AppSupport
config/npm/npmrc
config/nvim/lazy-lock.json
config/nvim/spell/* config/nvim/spell/*
!config/nvim/spell/.gitkeep !config/nvim/spell/.gitkeep
antidote_plugins.zsh config/zed/*
!config/zed/settings.json
config/zsh/.zcompdump
iTermServer-*
lazy-lock.json
local/share/fonts/*
local/bin/asdf/plugins/*
lock
node_modules
ssh/local.d/*
!ssh/local.d/.gitkeep

3
.gitmodules vendored
View File

@@ -64,3 +64,6 @@
path = tools/antidote path = tools/antidote
url = https://github.com/mattmc3/antidote.git url = https://github.com/mattmc3/antidote.git
shallow = true shallow = true
[submodule "dotbot-asdf"]
path = tools/dotbot-asdf
url = https://github.com/sobolevn/dotbot-asdf

View File

@@ -3,6 +3,7 @@ repos:
rev: v5.0.0 rev: v5.0.0
hooks: hooks:
- id: requirements-txt-fixer - id: requirements-txt-fixer
- id: detect-aws-credentials
- id: detect-private-key - id: detect-private-key
- id: trailing-whitespace - id: trailing-whitespace
args: [--markdown-linebreak-ext=md] args: [--markdown-linebreak-ext=md]
@@ -25,15 +26,15 @@ repos:
rev: v0.43.0 rev: v0.43.0
hooks: hooks:
- id: markdownlint - id: markdownlint
args: [-c, .markdownlint.yaml, --fix] args: [-c, .markdownlint.json, --fix]
- repo: https://github.com/adrienverge/yamllint - repo: https://github.com/adrienverge/yamllint
rev: v1.35.1 rev: v1.35.1
hooks: hooks:
- id: yamllint - id: yamllint
- repo: https://github.com/shellcheck-py/shellcheck-py - repo: https://github.com/koalaman/shellcheck-precommit
rev: v0.10.0.1 rev: v0.10.0
hooks: hooks:
- id: shellcheck - id: shellcheck
@@ -43,6 +44,16 @@ repos:
- id: shfmt - id: shfmt
- repo: https://github.com/rhysd/actionlint - repo: https://github.com/rhysd/actionlint
rev: v1.7.4 rev: v1.7.5
hooks: hooks:
- id: actionlint - id: actionlint
- repo: https://github.com/renovatebot/pre-commit-hooks
rev: 39.86.3
hooks:
- id: renovate-config-validator
- repo: https://github.com/JohnnyMorganz/StyLua
rev: v2.0.2
hooks:
- id: stylua # or stylua-system / stylua-github

View File

@@ -24,3 +24,7 @@ disable=SC1091
# SC2174: When used with -p, -m only applies to the deepest directory. # SC2174: When used with -p, -m only applies to the deepest directory.
# https://github.com/koalaman/shellcheck/wiki/SC2174 # https://github.com/koalaman/shellcheck/wiki/SC2174
disable=SC2174 disable=SC2174
# SC2016: Expressions don't expand in single quotes, use double quotes for that.
# https://www.shellcheck.net/wiki/SC2016
disable=SC2016

View File

@@ -9,6 +9,8 @@ git submodule add --name dotbot-include \
-f https://gitlab.com/gnfzdz/dotbot-include.git tools/dotbot-include -f https://gitlab.com/gnfzdz/dotbot-include.git tools/dotbot-include
git submodule add --name dotbot-pip \ git submodule add --name dotbot-pip \
-f https://github.com/sobolevn/dotbot-pip.git tools/dotbot-pip -f https://github.com/sobolevn/dotbot-pip.git tools/dotbot-pip
git submodule add --name dotbot-asdf \
-f https://github.com/sobolevn/dotbot-asdf tools/dotbot-asdf
# other repos # other repos
git submodule add --name cheat-community \ git submodule add --name cheat-community \
@@ -19,8 +21,7 @@ git submodule add --name asdf \
-f https://github.com/asdf-vm/asdf.git local/bin/asdf -f https://github.com/asdf-vm/asdf.git local/bin/asdf
git submodule add --name antidote \ git submodule add --name antidote \
--depth 1 \ --depth 1 \
-f https://github.com/mattmc3/antidote.git tools/antidote \ -f https://github.com/mattmc3/antidote.git tools/antidote
# tmux plugin manager and plugins # tmux plugin manager and plugins
git submodule add --name tmux/tmux-continuum \ git submodule add --name tmux/tmux-continuum \
@@ -44,6 +45,7 @@ git submodule add --name tmux/tmux-dark-notify \
# Takes submodules and sets them to ignore all changes # Takes submodules and sets them to ignore all changes
for MODULE in $(git config --file .gitmodules --get-regexp path | awk '{ print $2 }'); do for MODULE in $(git config --file .gitmodules --get-regexp path | awk '{ print $2 }'); do
echo "Ignoring submodule changes for submodule.${MODULE}..."
git config "submodule.${MODULE}.ignore" all git config "submodule.${MODULE}.ignore" all
done done

View File

@@ -7,6 +7,10 @@ export SHARED_SCRIPTS_SOURCED=0
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
if [ -n "${GHOSTTY_RESOURCES_DIR}" ]; then
builtin source "${GHOSTTY_RESOURCES_DIR}/shell-integration/bash/ghostty.bash"
fi
# shellcheck source=../config/fzf/fzf.bash # shellcheck source=../config/fzf/fzf.bash
[ -f "${DOTFILES}/config/fzf/fzf.bash" ] && [ -f "${DOTFILES}/config/fzf/fzf.bash" ] &&
source "${DOTFILES}/config/fzf/fzf.bash" source "${DOTFILES}/config/fzf/fzf.bash"

View File

@@ -1,27 +1,19 @@
asdf-plugin-manager 1.4.0 golang 1.23.4
golang 1.23.3 rust 1.83.0
ruby 3.3.4
rust 1.82.0
direnv 2.35.0 direnv 2.35.0
fd 10.2.0 fd 10.2.0
1password-cli 2.30.3 1password-cli 2.30.3
age 1.2.0 age 1.2.1
bottom 0.10.2
dotenv-linter 3.3.0 dotenv-linter 3.3.0
editorconfig-checker 2.8.0 editorconfig-checker 2.8.0
github-cli 2.61.0 github-cli 2.64.0
hadolint 2.12.0 hadolint 2.12.0
kubectl 1.31.2 kubectl 1.32.0
pre-commit 4.0.1 pre-commit 4.0.1
ripgrep 14.1.1 ripgrep 14.1.1
shellcheck 0.10.0 shellcheck 0.10.0
shfmt 3.10.0 shfmt 3.10.0
terragrunt 0.68.8 terragrunt 0.71.1
tf-summarize 0.3.13 tf-summarize 0.3.14
yamllint 1.35.1 yamllint 1.35.1
yq 4.44.3 yq 4.44.6
bats 1.11.0
gitleaks 8.18.4
delta 0.18.1
eza 0.20.8
sops 3.9.1

View File

@@ -45,6 +45,10 @@ setup_tmux_window_name_plugin()
fi fi
} }
if [[ -n $GHOSTTY_RESOURCES_DIR ]]; then
source "$GHOSTTY_RESOURCES_DIR"/shell-integration/zsh/ghostty-integration
fi
source_fzf_config source_fzf_config
setup_tmux_window_name_plugin setup_tmux_window_name_plugin
x-have antidot && eval "$(antidot init)" x-have antidot && eval "$(antidot init)"
@@ -52,3 +56,7 @@ x-have antidot && eval "$(antidot init)"
autoload -Uz compinit bashcompinit autoload -Uz compinit bashcompinit
compinit -d $ZSH_COMPDUMP compinit -d $ZSH_COMPDUMP
bashcompinit bashcompinit
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
export P10K_CONFIG="$DOTFILES/config/zsh/p10k.zsh"
[[ ! -f "$P10K_CONFIG" ]] || source "$P10K_CONFIG"

View File

@@ -1,3 +1,4 @@
--container-architecture linux/amd64
-P ubuntu-latest=catthehacker/ubuntu:act-latest -P ubuntu-latest=catthehacker/ubuntu:act-latest
-P ubuntu-22.04=catthehacker/ubuntu:act-22.04 -P ubuntu-22.04=catthehacker/ubuntu:act-22.04
-P ubuntu-20.04=catthehacker/ubuntu:act-20.04 -P ubuntu-20.04=catthehacker/ubuntu:act-20.04

View File

@@ -0,0 +1,212 @@
# Start AeroSpace at login
start-at-login = false
# Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization
enable-normalization-flatten-containers = true
enable-normalization-opposite-orientation-for-nested-containers = true
# See: https://nikitabobko.github.io/AeroSpace/guide#layouts
# The 'accordion-padding' specifies the size of accordion padding
# You can set 0 to disable the padding feature
accordion-padding = 10
# Possible values: tiles|accordion
default-root-container-layout = 'tiles'
# Possible values: horizontal|vertical|auto
# 'auto' means: wide monitor (anything wider than high) gets horizontal orientation,
# tall monitor (anything higher than wide) gets vertical orientation
default-root-container-orientation = 'auto'
# Mouse follows focus when focused monitor changes
# Drop it from your config, if you don't like this behavior
# See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks
# See https://nikitabobko.github.io/AeroSpace/commands#move-mouse
# Fallback value (if you omit the key): on-focused-monitor-changed = []
on-focused-monitor-changed = ['move-mouse monitor-lazy-center']
# You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag
# Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key
# Also see: https://nikitabobko.github.io/AeroSpace/goodness#disable-hide-app
automatically-unhide-macos-hidden-apps = true
# [[on-window-detected]]
# if.app-id = 'com.apple.systempreferences'
# if.app-name-regex-substring = 'settings'
# if.window-title-regex-substring = 'substring'
# if.workspace = 'workspace-name'
# if.during-aerospace-startup = true
# check-further-callbacks = true
# run = ['layout floating', 'move-node-to-workspace S'] # The callback itself
[[on-window-detected]]
if.app-name-regex-substring = 'settings' # All settings
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'org.ferdium.ferdium-app' # Ferdium, has WhatsApp etc.
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.finder' # Finder
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.apple.mail' # Mail
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.DanPristupov.Fork' # Fork
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.flexibits.fantastical2.mac' # Fantastical
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'org.whispersystems.signal-desktop' # Signal
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.tidal.desktop' # TIDAL
run = ['layout floating', 'move-node-to-workspace 2'] # Float and move to workspace 2
[[on-window-detected]]
if.app-id = 'com.apple.TV' # Apple TV app
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.setapp.DesktopClient' # Setapp
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.electron.dockerdesktop' # Docker Desktop
run = ['layout floating']
[[on-window-detected]]
if.app-id = 'com.tinyspeck.slackmacgap' # Slack
run = ['layout floating']
# Possible values: (qwerty|dvorak)
# See https://nikitabobko.github.io/AeroSpace/guide#key-mapping
[key-mapping]
preset = 'qwerty'
# Gaps between windows (inner-*) and between monitor edges (outer-*).
# Possible values:
# - Constant: gaps.outer.top = 8
# - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24]
# In this example, 24 is a default value when there is no match.
# Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'.
# See: https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors
[gaps]
inner.horizontal = 5
inner.vertical = 5
outer.top = [{ monitor.'^built-in retina display$' = 0 }, 0]
outer.right = 0
outer.bottom = 0
outer.left = 0
# 'main' binding mode declaration
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
# 'main' binding mode must be always presented
# Fallback value (if you omit the key): mode.main.binding = {}
[mode.main.binding]
# All possible keys:
# - Letters. a, b, c, ..., z
# - Numbers. 0, 1, 2, ..., 9
# - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9
# - F-keys. f1, f2, ..., f20
# - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, backtick,
# leftSquareBracket, rightSquareBracket, space, enter, esc, backspace, tab
# - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual,
# keypadMinus, keypadMultiply, keypadPlus
# - Arrows. left, down, up, right
# All possible modifiers: cmd, alt, ctrl, shift
# All possible commands: https://nikitabobko.github.io/AeroSpace/commands
# See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget
# You can uncomment the following lines to open up terminal with alt + enter shortcut (like in i3)
# alt-enter = '''exec-and-forget osascript -e '
# tell application "Terminal"
# do script
# activate
# end tell'
# '''
# alt-cmd-shift-f = 'fullscreen'
# alt-shift-f = 'layout floating'
# alt-shift-tab = 'move-workspace-to-monitor --wrap-around next'
# See: https://nikitabobko.github.io/AeroSpace/commands#focus
alt-h = 'focus left'
alt-j = 'focus down'
alt-k = 'focus up'
alt-l = 'focus right'
# See: https://nikitabobko.github.io/AeroSpace/commands#workspace
alt-shift-1 = 'workspace 1' # Main
alt-shift-2 = 'workspace 2' # Media
ctrl-shift-1 = 'move-node-to-workspace 1'
ctrl-shift-2 = 'move-node-to-workspace 2'
alt-shift-tab = 'workspace-back-and-forth'
ctrl-shift-tab = 'move-workspace-to-monitor --wrap-around prev'
# See: https://nikitabobko.github.io/AeroSpace/commands#mode
# See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes
alt-a = 'mode apps'
alt-s = 'mode service'
alt-m = 'mode move'
# ╭──────────────────────────────────────────────────────────╮
# │ alt-m │
# ╰──────────────────────────────────────────────────────────╯
[mode.move.binding]
esc = ['reload-config', 'mode main']
# See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace
1 = ['move-node-to-workspace 1 --focus-follows-window']
2 = ['move-node-to-workspace 2 --focus-follows-window']
# See: https://nikitabobko.github.io/AeroSpace/commands#move
h = 'move left'
j = 'move down'
k = 'move up'
l = 'move right'
# See: https://nikitabobko.github.io/AeroSpace/commands#join-with
shift-h = 'join-with left'
shift-j = 'join-with down'
shift-k = 'join-with up'
shift-l = 'join-with right'
# https://nikitabobko.github.io/AeroSpace/commands#resize
ctrl-h = 'resize smart -70'
ctrl-l = 'resize smart +70'
shift-left = 'resize smart +70'
shift-right = 'resize smart -70'
# https://nikitabobko.github.io/AeroSpace/commands#flatten-workspace-tree
r = ['flatten-workspace-tree', 'mode main'] # reset layout
# ╭──────────────────────────────────────────────────────────╮
# │ alt-a │
# ╰──────────────────────────────────────────────────────────╯
[mode.apps.binding]
esc = ['reload-config', 'mode main']
b = ['exec-and-forget open -a /Applications/Brave Browser.app', 'mode main'] # Browser
c = ['exec-and-forget open -a /Applications/Ferdium.app', 'mode main'] # Chat
g = ['exec-and-forget open -a /Applications/Ghostty.app', 'mode main'] # Ghostty
o = ['exec-and-forget open -a /Applications/Obsidian.app', 'mode main'] # Obsidian
s = ['exec-and-forget open -a /Applications/Slack.app', 'mode main'] # Slack
t = ['exec-and-forget open -a /Applications/TIDAL.app', 'mode main'] # Tidal
w = ['exec-and-forget open -a /Applications/WezTerm.app', 'mode main'] # WezTerm
# ╭──────────────────────────────────────────────────────────╮
# │ alt-s │
# ╰──────────────────────────────────────────────────────────╯
[mode.service.binding]
esc = ['reload-config', 'mode main'] # reload config
r = ['flatten-workspace-tree', 'mode main'] # reset layout
# See: https://nikitabobko.github.io/AeroSpace/commands#layout
f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout
backspace = ['close-all-windows-but-current', 'mode main']

View File

@@ -130,6 +130,6 @@ X_ALIAS_FILES=(
) )
for aliasFile in "${X_ALIAS_FILES[@]}"; do for aliasFile in "${X_ALIAS_FILES[@]}"; do
# shellcheck source=$HOME/.config/alias-secret # shellcheck source=$HOME/.config/alias-secret
[ -f "$aliasFile" ] && source "$aliasFile" && msg "Sourced $aliasFile" [ -f "$aliasFile" ] && source "$aliasFile" && msgr ok "Sourced $aliasFile"
done done
unset X_ALIAS_FILES unset X_ALIAS_FILES

View File

@@ -1,27 +1,20 @@
1password-cli https://github.com/NeoHsu/asdf-1password-cli.git f5d5aab 1password-cli https://github.com/NeoHsu/asdf-1password-cli.git f5d5aab
age https://github.com/threkk/asdf-age.git 396bdf6 age https://github.com/threkk/asdf-age.git 396bdf6
asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git b5862c1 asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git b5862c1
bats https://github.com/timgluz/asdf-bats.git 299551f
bottom https://github.com/carbonteq/asdf-btm.git fd8a55a
delta https://github.com/andweeb/asdf-delta.git 501318b
direnv https://github.com/asdf-community/asdf-direnv.git 6ff3dbe direnv https://github.com/asdf-community/asdf-direnv.git 6ff3dbe
dotenv-linter https://github.com/wesleimp/asdf-dotenv-linter.git 1369f53 dotenv-linter https://github.com/wesleimp/asdf-dotenv-linter.git 1369f53
editorconfig-checker https://github.com/gabitchov/asdf-editorconfig-checker.git 585c1d5 editorconfig-checker https://github.com/gabitchov/asdf-editorconfig-checker.git 585c1d5
eza https://github.com/lwiechec/asdf-eza.git 11f578d
fd https://gitlab.com/wt0f/asdf-fd.git 17d56e0 fd https://gitlab.com/wt0f/asdf-fd.git 17d56e0
github-cli https://github.com/bartlomiejdanek/asdf-github-cli.git e0605b7 github-cli https://github.com/bartlomiejdanek/asdf-github-cli.git e0605b7
gitleaks https://github.com/jmcvetta/asdf-gitleaks.git 0cc0d7e
golang https://github.com/asdf-community/asdf-golang.git e2527a3 golang https://github.com/asdf-community/asdf-golang.git e2527a3
hadolint https://github.com/devlincashman/asdf-hadolint.git 335e230 hadolint https://github.com/devlincashman/asdf-hadolint.git c8eb88b
kubectl https://github.com/asdf-community/asdf-kubectl.git 2fb3b57 kubectl https://github.com/asdf-community/asdf-kubectl.git 2fb3b57
pre-commit https://github.com/jonathanmorley/asdf-pre-commit.git 26bfc42 pre-commit https://github.com/jonathanmorley/asdf-pre-commit.git 26bfc42
ripgrep https://gitlab.com/wt0f/asdf-ripgrep.git e836665 ripgrep https://gitlab.com/wt0f/asdf-ripgrep.git e836665
ruby https://github.com/asdf-vm/asdf-ruby.git 194fe45
rust https://github.com/code-lever/asdf-rust.git 95acf4f rust https://github.com/code-lever/asdf-rust.git 95acf4f
shellcheck https://github.com/luizm/asdf-shellcheck.git 66200ff shellcheck https://github.com/luizm/asdf-shellcheck.git 66200ff
shfmt https://github.com/luizm/asdf-shfmt.git a42c5ff shfmt https://github.com/luizm/asdf-shfmt.git a42c5ff
sops https://github.com/feniix/asdf-sops.git 5c7a2fb terragrunt https://github.com/ohmer/asdf-terragrunt.git 29f2935
terragrunt https://github.com/ohmer/asdf-terragrunt.git 4a6651a
tf-summarize https://github.com/adamcrews/asdf-tf-summarize.git 880ad26 tf-summarize https://github.com/adamcrews/asdf-tf-summarize.git 880ad26
yamllint https://github.com/ericcornelissen/asdf-yamllint.git bc2813e yamllint https://github.com/ericcornelissen/asdf-yamllint.git e4cfb17
yq https://github.com/sudermanjr/asdf-yq.git 772992f yq https://github.com/sudermanjr/asdf-yq.git 772992f

View File

@@ -0,0 +1,73 @@
---
tags: [printf, bash, zsh]
---
# printf
The printf command accepts the following syntax:
`printf [-v var] [format specifiers] [arguments]`
- [-v var]
The optional -v flag assigns the output to the [var]
variable instead of printing it in standard output.
- [format specifiers]
Format specifiers are strings that determine the methods of
formatting specifiers. The following section includes a
list of accepted specifiers.
- [arguments]
Arguments can be any value or variable, and the [format specifiers]
point to the [arguments]. If there are more arguments than format
specifiers, the format string is reused until it interprets
the last argument.
If there are fewer format specifiers than arguments, number formats
are set to zero (0), while string formats are set to null (empty).
## printf Specifiers
Format Description
------ -----------
%c Treat the arguments as a single character.
%d Treat the input as a decimal (integer) number (base 10).
%e Treats the input as an exponential floating-point number.
%f Treat the input as a floating-point number.
%i Treat the input as an integer number (base 10).
%o Treats the input as an octal number (base 8).
%s Treat the input as a string of characters.
%u Treat the input as an unsigned decimal (integer) number.
%x Treats the input as a hexadecimal number (base 16).
%% Print a percent sign.
%Wd Print the W integer X digits wide.
%(format)T Outputs a date-time string resulting from using format as a
format string for strftime. The corresponding argument can
be the number of seconds since Epoch (January 1, 1970, 00:00),
-1 (the current time), or -2 (shell startup time).
Not specifying an argument uses the current time as the default value.
\% Print a percent sign.
\n Prints a newline character.
\t Print a tab character.
Some format specifiers accept format modifiers that modify their actions.
Enter the modifiers between the % character and the character that
specifies the format.
Available format modifiers are:
<N>. Enter a number that specifies a minimum field width.
If the output text is shorter, it's padded with spaces.
If the text is longer, the field expands.
. (dot). When used with a field width modifier, the field doesn't
expand for longer text. Instead, the text is truncated.
-. Left-aligns the printed text. The default alignment is right.
0. Pads the numbers with zeros instead of spaces.
<space>. Pads a positive number with a space, and a negative
number with a minus (-).
+. Prints all numbers signed (+ for positive, - for negative).
'. For decimal conversions, applies the thousands grouping
separator to the integer portion of the output according
to the current LC_NUMERIC file.

View File

@@ -61,12 +61,6 @@ cheatpaths:
path: ~/.config/cheat/cheatsheets/community path: ~/.config/cheat/cheatsheets/community
tags: [community] tags: [community]
readonly: true readonly: true
# If you have personalized cheatsheets, list them last. They will take
# precedence over the more global cheatsheets.
- name: personal
path: ~/.dotfiles/config/cheat/cheatsheets/personal
tags: [personal]
readonly: false
- name: pure-bash-bible - name: pure-bash-bible
path: ~/.dotfiles/config/cheat/cheatsheets/pure-bash-bible path: ~/.dotfiles/config/cheat/cheatsheets/pure-bash-bible
tags: [pure-bash-bible] tags: [pure-bash-bible]
@@ -75,6 +69,13 @@ cheatpaths:
path: ~/.dotfiles/config/cheat/cheatsheets/tldr/tldr path: ~/.dotfiles/config/cheat/cheatsheets/tldr/tldr
tags: [tldr] tags: [tldr]
readonly: true readonly: true
# If you have personalized cheatsheets, list them last. They will take
# precedence over the more global cheatsheets.
- name: personal
path: ~/.dotfiles/config/cheat/cheatsheets/personal
tags: [personal]
readonly: false
# While it requires no configuration here, it's also worth noting that # While it requires no configuration here, it's also worth noting that
# cheat will automatically append directories named '.cheat' within the # cheat will automatically append directories named '.cheat' within the
# current working directory to the 'cheatpath'. This can be very useful if # current working directory to the 'cheatpath'. This can be very useful if

View File

@@ -281,8 +281,8 @@ export LESSHISTFILE="$XDG_STATE_HOME"/less/history
# export LESS_TERMCAP_md="$ORANGE" # export LESS_TERMCAP_md="$ORANGE"
# zsh autoloaded terminfo # zsh autoloaded terminfo
export TERMINFO="${XDG_DATA_HOME}/terminfo" # export TERMINFO="${XDG_DATA_HOME}/terminfo"
export TERMINFO_DIRS="${XDG_DATA_HOME}/terminfo":/usr/share/terminfo # export TERMINFO_DIRS="${XDG_DATA_HOME}/terminfo":/usr/share/terminfo
# Don't clear the screen after quitting a manual page # Don't clear the screen after quitting a manual page
export MANPAGER="less -X" export MANPAGER="less -X"

15
config/ghostty/config Normal file
View File

@@ -0,0 +1,15 @@
# vim: ft=ghostty
theme = "light:tokyonight-day,dark:tokyonight-storm"
font-family = "JetBrainsMono Nerd Font Mono"
background-blur-radius = 15
background-opacity = 0.95
clipboard-read = allow
clipboard-write = allow
cursor-style = bar
custom-shader-animation = true
gtk-single-instance = true
mouse-hide-while-typing = true
shell-integration-features = true
window-theme = system

View File

@@ -11,3 +11,5 @@
[include] [include]
path = ~/.config/git/overrides/config path = ~/.config/git/overrides/config
[advice]
detachedHead = false

6
config/glow/glow.yml Normal file
View File

@@ -0,0 +1,6 @@
# mouse support (TUI-mode only)
mouse: false
# use pager to display markdown
pager: true
# word-wrap at width
width: 80

View File

@@ -13,6 +13,7 @@ tap "jesseduffield/lazygit"
tap "k8sgpt-ai/k8sgpt" tap "k8sgpt-ai/k8sgpt"
tap "keith/formulae" tap "keith/formulae"
tap "mongodb/brew" tap "mongodb/brew"
tap "nikitabobko/tap"
tap "reviewdog/tap" tap "reviewdog/tap"
tap "shivammathur/extensions" tap "shivammathur/extensions"
tap "shivammathur/php" tap "shivammathur/php"
@@ -21,6 +22,20 @@ tap "teamookla/speedtest"
tap "xwmx/taps" tap "xwmx/taps"
# Run your GitHub Actions locally # Run your GitHub Actions locally
brew "act" brew "act"
# Simple, modern, secure file encryption
brew "age"
# Mozilla CA certificate store
brew "ca-certificates"
# Mozilla CA bundle for Python
brew "certifi"
# Cryptographic recipes and primitives for Python
brew "cryptography"
# YAML Parser
brew "libyaml"
# Automate deployment, configuration, and upgrading
brew "ansible"
# Checks ansible playbooks for practices and behaviour
brew "ansible-lint"
# Generic-purpose lossless compression algorithm by Google # Generic-purpose lossless compression algorithm by Google
brew "brotli" brew "brotli"
# Library and utilities for processing GIFs # Library and utilities for processing GIFs
@@ -31,6 +46,8 @@ brew "highway"
brew "imath" brew "imath"
# JPEG image codec that aids compression and decompression # JPEG image codec that aids compression and decompression
brew "jpeg-turbo" brew "jpeg-turbo"
# Library for manipulating PNG images
brew "libpng"
# Zstandard is a real-time compression algorithm # Zstandard is a real-time compression algorithm
brew "zstd" brew "zstd"
# New file format for still image compression # New file format for still image compression
@@ -39,32 +56,38 @@ brew "jpeg-xl"
brew "aom" brew "aom"
# Apache Portable Runtime library # Apache Portable Runtime library
brew "apr" brew "apr"
# Mozilla CA certificate store
brew "ca-certificates"
# Cryptography and SSL/TLS Toolkit
brew "openssl@3"
# Companion library to apr, the Apache Portable Runtime library # Companion library to apr, the Apache Portable Runtime library
brew "apr-util" brew "apr-util"
# Password hashing library and CLI utility # Password hashing library and CLI utility
brew "argon2" brew "argon2"
# Spell checker with better logic than ispell
brew "aspell"
# Automatic configure script builder # Automatic configure script builder
brew "autoconf" brew "autoconf"
# Collection of over 500 reusable autoconf macros # Tool for generating GNU Standards-compliant Makefiles
brew "autoconf-archive" brew "automake"
# Cryptographic recipes and primitives for Python
brew "cryptography"
# Official Amazon AWS command-line interface
brew "awscli"
# Bourne-Again SHell, a UNIX command interpreter
brew "bash"
# GNU multiple precision arithmetic library # GNU multiple precision arithmetic library
brew "gmp" brew "gmp"
# GNU File, Shell, and Text utilities # GNU File, Shell, and Text utilities
brew "coreutils" brew "coreutils"
# Extendable version manager with support for Ruby, Node.js, Erlang & more
brew "asdf"
# Spell checker with better logic than ispell
brew "aspell"
# Collection of over 500 reusable autoconf macros
brew "autoconf-archive"
# Package compiler and linker metadata toolkit
brew "pkgconf"
# Automated text file generator
brew "autogen"
# Official Amazon AWS command-line interface
brew "awscli"
# Bourne-Again SHell, a UNIX command interpreter
brew "bash"
# Clone of cat(1) with syntax highlighting and Git integration
brew "bat"
# Bash Automated Testing System # Bash Automated Testing System
brew "bats-core" brew "bats-core"
# Parser generator
brew "bison"
# Software library to render fonts # Software library to render fonts
brew "freetype" brew "freetype"
# XML-based font configuration API for X Windows # XML-based font configuration API for X Windows
@@ -73,18 +96,32 @@ brew "fontconfig"
brew "gettext" brew "gettext"
# Core application library for C # Core application library for C
brew "glib" brew "glib"
# Mozilla CA bundle for Python # Human-friendly and fast alternative to cut and (sometimes) awk
brew "certifi" brew "choose-rust"
# Cross-platform make
brew "cmake"
# Get a file from an HTTP, HTTPS or FTP server # Get a file from an HTTP, HTTPS or FTP server
brew "curl" brew "curl"
# Lightweight DNS forwarder and DHCP server # Lightweight DNS forwarder and DHCP server
brew "dnsmasq" brew "dnsmasq"
# Spellchecker wrapping library
brew "enchant"
# Perl lib for reading and writing EXIF metadata
brew "exiftool"
# Banner-like program prints strings as ASCII art
brew "figlet"
# Lock file during command # Lock file during command
brew "flock" brew "flock"
# Libraries to talk to Microsoft SQL Server and Sybase databases # Libraries to talk to Microsoft SQL Server and Sybase databases
brew "freetds" brew "freetds"
# Monitor a directory for changes and run a shell command
brew "fswatch"
# Command-line fuzzy finder written in Go
brew "fzf"
# Graphics library to dynamically manipulate images # Graphics library to dynamically manipulate images
brew "gd" brew "gd"
# Disk usage analyzer with console interface written in Go
brew "gdu"
# GitHub command-line tool # GitHub command-line tool
brew "gh" brew "gh"
# OpenType text shaping engine # OpenType text shaping engine
@@ -95,22 +132,40 @@ brew "libb2"
brew "pango" brew "pango"
# Distributed revision control system # Distributed revision control system
brew "git" brew "git"
# Enable transparent encryption/decryption of files in a git repo
brew "git-crypt"
# Small git utilities
brew "git-extras"
# See your latest local git branches, formatted real fancy
brew "git-recent"
# Render markdown on the CLI # Render markdown on the CLI
brew "glow" brew "glow"
# GNU implementation of the famous stream editor
brew "gnu-sed"
# Validating, recursive, caching DNS resolver # Validating, recursive, caching DNS resolver
brew "unbound" brew "unbound"
# GNU Transport Layer Security (TLS) Library # GNU Transport Layer Security (TLS) Library
brew "gnutls" brew "gnutls"
# GNU Pretty Good Privacy (PGP) package # GNU Pretty Good Privacy (PGP) package
brew "gnupg" brew "gnupg"
# Library access to GnuPG
brew "gpgme"
# Open source suite of directory software
brew "openldap"
# Manage your GnuPG keys with ease!
brew "gpg-tui"
# Image manipulation # Image manipulation
brew "netpbm" brew "netpbm"
# Library to render SVG files using Cairo # Library to render SVG files using Cairo
brew "librsvg" brew "librsvg"
# Graph visualization software from AT&T and Bell Labs # Graph visualization software from AT&T and Bell Labs
brew "graphviz" brew "graphviz"
# GNU grep, egrep and fgrep
brew "grep"
# Popular GNU data compression program # Popular GNU data compression program
brew "gzip" brew "gzip"
# Text-based UI library
brew "ncurses"
# Improved top (interactive process viewer) # Improved top (interactive process viewer)
brew "htop" brew "htop"
# Portable abstraction of the hierarchical topology of modern architectures # Portable abstraction of the hierarchical topology of modern architectures
@@ -121,6 +176,8 @@ brew "libheif"
brew "imagemagick" brew "imagemagick"
# Modular IRC client # Modular IRC client
brew "irssi" brew "irssi"
# Image manipulation library
brew "jpeg"
# Lightweight and flexible command-line JSON processor # Lightweight and flexible command-line JSON processor
brew "jq" brew "jq"
# JSON parser for C # JSON parser for C
@@ -129,40 +186,76 @@ brew "json-c"
brew "krb5" brew "krb5"
# Tool to detect/remediate misconfig and security risks of GitHub/GitLab assets # Tool to detect/remediate misconfig and security risks of GitHub/GitLab assets
brew "legitify" brew "legitify"
# BSD-style licensed readline alternative
brew "libedit"
# Conversion library
brew "libiconv"
# Postgres C API library # Postgres C API library
brew "libpq" brew "libpq"
# Version of the SSL/TLS protocol forked from OpenSSL
brew "libressl"
# Multi-platform support library with a focus on asynchronous I/O # Multi-platform support library with a focus on asynchronous I/O
brew "libuv" brew "libuv"
# YAML Parser # GNOME XML library
brew "libyaml" brew "libxml2"
# C library for reading, creating, and modifying zip archives
brew "libzip"
# Package manager for the Lua programming language # Package manager for the Lua programming language
brew "luarocks" brew "luarocks"
# LZMA-based compression program similar to gzip or bzip2
brew "lzip"
# Swiss Army Knife for macOS # Swiss Army Knife for macOS
brew "m-cli" brew "m-cli"
# Collection of tools that nobody wrote when UNIX was young
brew "moreutils"
# NCurses Disk Usage
brew "ncdu"
# HTTP(S) server and reverse proxy, and IMAP/POP3 proxy server # HTTP(S) server and reverse proxy, and IMAP/POP3 proxy server
brew "nginx" brew "nginx"
# Port scanning utility for large networks # Port scanning utility for large networks
brew "nmap" brew "nmap"
# Libraries for security-enabled client and server applications # Libraries for security-enabled client and server applications
brew "nss" brew "nss"
# Open source suite of directory software # Cryptography and SSL/TLS Toolkit
brew "openldap" brew "openssl@1.1"
# General-purpose scripting language # ISO-C API and CLI for generating UUIDs
brew "php" brew "ossp-uuid"
# General-purpose scripting language # General-purpose scripting language
brew "php@8.2" brew "php@8.2"
# Manage compile and link flags for libraries # General-purpose scripting language
brew "pkg-config" brew "php@8.3", link: true
# Python version management
brew "pyenv"
# Migrate pip packages from one Python version to another
brew "pyenv-pip-migrate"
# Pyenv plugin to manage virtualenv
brew "pyenv-virtualenv"
# Interpreted, interactive, object-oriented programming language
brew "python@3.11"
# Install various Ruby versions and implementations
brew "ruby-build"
# Ruby version manager
brew "rbenv"
# Generate C-based recognizers from regular expressions
brew "re2c"
# Static analysis and lint tool, for (ba)sh scripts
brew "shellcheck"
# Send macOS User Notifications from the command-line # Send macOS User Notifications from the command-line
brew "terminal-notifier" brew "terminal-notifier"
# Tool which checks for the support of TLS/SSL ciphers and flaws # Tool which checks for the support of TLS/SSL ciphers and flaws
brew "testssl" brew "testssl"
# Terraform version manager inspired by rbenv
brew "tfenv"
# Linter for Terraform files
brew "tflint"
# Static analysis security scanner for your terraform code # Static analysis security scanner for your terraform code
brew "tfsec" brew "tfsec"
# Terminal multiplexer # Terminal multiplexer
brew "tmux" brew "tmux"
# Display directories as trees (with optional color/HTML output) # Display directories as trees (with optional color/HTML output)
brew "tree" brew "tree"
# Tool for creating isolated virtual python environments
brew "virtualenv"
# Command-line interface to the WakaTime api # Command-line interface to the WakaTime api
brew "wakatime-cli" brew "wakatime-cli"
# Executes a program periodically, showing output fullscreen # Executes a program periodically, showing output fullscreen
@@ -171,10 +264,16 @@ brew "watch"
brew "wget" brew "wget"
# Check your $HOME for unwanted files and directories # Check your $HOME for unwanted files and directories
brew "xdg-ninja", args: ["HEAD"] brew "xdg-ninja", args: ["HEAD"]
# General-purpose lossless data-compression library
brew "zlib"
# Watcher for macOS 10.14+ light/dark mode changes # Watcher for macOS 10.14+ light/dark mode changes
brew "cormacrelf/tap/dark-notify" brew "cormacrelf/tap/dark-notify"
# Igbinary PHP extension # Cleans up your $HOME from those pesky dotfiles
brew "shivammathur/extensions/igbinary@8.3" brew "doron-cohen/tap/antidot"
# lets you quickly switch between multiple git user profiles
brew "gesquive/tap/git-user"
# Automated code review tool integrated with any code analysis tools regardless of programming language.
brew "reviewdog/tap/reviewdog"
# Imagick PHP extension # Imagick PHP extension
brew "shivammathur/extensions/imagick@8.3" brew "shivammathur/extensions/imagick@8.3"
# Mcrypt PHP extension # Mcrypt PHP extension
@@ -190,9 +289,15 @@ brew "shivammathur/extensions/uuid@8.3"
# Yaml PHP extension # Yaml PHP extension
brew "shivammathur/extensions/yaml@8.3" brew "shivammathur/extensions/yaml@8.3"
# General-purpose scripting language # General-purpose scripting language
brew "shivammathur/php/php", link: false
# General-purpose scripting language
brew "shivammathur/php/php-debug" brew "shivammathur/php/php-debug"
# Find & fix known vulnerabilities in open-source dependencies # Find & fix known vulnerabilities in open-source dependencies
brew "snyk/tap/snyk" brew "snyk/tap/snyk"
# Command-line interface for 1Password
cask "1password-cli"
# AeroSpace is an i3-like tiling window manager for macOS
cask "aerospace"
# Text editor # Text editor
cask "coda" cask "coda"
# Universal database tool and SQL client # Universal database tool and SQL client
@@ -206,10 +311,7 @@ cask "font-jetbrains-mono-nerd-font"
cask "font-lato" cask "font-lato"
cask "font-open-sans" cask "font-open-sans"
cask "font-roboto" cask "font-roboto"
cask "font-source-code-pro"
cask "font-source-code-pro-for-powerline" cask "font-source-code-pro-for-powerline"
cask "font-source-sans-pro"
cask "font-source-serif-pro"
# GIT client # GIT client
cask "fork" cask "fork"
# HTTP and GraphQL Client # HTTP and GraphQL Client

View File

@@ -52,12 +52,20 @@ require('lazy').setup(
-- No need to notify about changes -- No need to notify about changes
notify = false, notify = false,
}, },
dev = {
path = '~/Code/nvim', -- Load wip plugins from this path
},
install = { install = {
colorscheme = { vim.g.colors_theme }, colorscheme = { vim.g.colors_theme },
}, },
profiling = {
loader = true,
},
} }
) )
require('nvm-default').setup()
require 'keymaps' require 'keymaps'
-- vim: ts=2 sts=2 sw=2 et -- vim: ts=2 sts=2 sw=2 et

View File

@@ -17,9 +17,9 @@ autocmd('TextYankPost', {
-- --
-- This fixes the issue where the line numbers jump -- This fixes the issue where the line numbers jump
-- around when moving between lines relative line numbers enabled. -- around when moving between lines relative line numbers enabled.
autocmd({ "BufEnter", "BufWinEnter", "TabEnter" }, { autocmd({ 'BufEnter', 'BufWinEnter', 'TabEnter' }, {
callback = function() callback = function()
local max_line_count = vim.fn.line("$") local max_line_count = vim.fn.line '$'
-- Only adjust if the file is large enough to matter -- Only adjust if the file is large enough to matter
if max_line_count > 99 then if max_line_count > 99 then
vim.opt.numberwidth = #tostring(max_line_count) + 1 vim.opt.numberwidth = #tostring(max_line_count) + 1
@@ -68,7 +68,16 @@ autocmd('FileType', {
-- wrap and check for spell in text filetypes -- wrap and check for spell in text filetypes
autocmd('FileType', { autocmd('FileType', {
group = augroup('wrap_spell', { clear = true }), group = augroup('wrap_spell', { clear = true }),
pattern = { 'text', 'plaintex', 'typst', 'gitcommit', 'markdown', 'asciidoc', 'rst', 'tex' }, pattern = {
'text',
'plaintex',
'typst',
'gitcommit',
'markdown',
'asciidoc',
'rst',
'tex',
},
callback = function() callback = function()
vim.opt_local.wrap = true vim.opt_local.wrap = true
vim.opt_local.spell = true vim.opt_local.spell = true
@@ -83,21 +92,16 @@ autocmd({ 'FileType' }, {
}) })
-- Set filetype for SSH config directory -- Set filetype for SSH config directory
-- Pattern handles directories with files like:
-- .dotfiles/ssh/config.d/*, .ssh/config.local, .ssh/config.work
autocmd({ 'BufRead', 'BufNewFile' }, { autocmd({ 'BufRead', 'BufNewFile' }, {
desc = 'Set filetype for SSH config directory', desc = 'Set filetype for SSH config directory',
pattern = { '*/?.ssh/{config|shared}.d/*', '*/?.ssh/config.local', '*/?.ssh/config.work' }, pattern = {
'*/?.ssh/{config|shared}.d/*',
'*/?.ssh/config.local',
'*/?.ssh/config.work',
},
command = 'set filetype=sshconfig', command = 'set filetype=sshconfig',
}) })
-- Format on save, unless disabled
autocmd('BufWritePre', {
group = augroup('Format', { clear = true }),
pattern = '*', -- All files
callback = function()
if not vim.g.disable_autoformat then
vim.lsp.buf.format({ async = false })
end
end,
})
-- vim: ts=2 sts=2 sw=2 et -- vim: ts=2 sts=2 sw=2 et

View File

@@ -1,219 +1,156 @@
-- ╭─────────────────────────────────────────────────────────╮ -- vim: set ft=lua ts=2 sw=2 tw=0 et cc=120 :
-- │ Function shortcuts for keymap set │
-- ╰─────────────────────────────────────────────────────────╯
-- vim: set ft=lua ts=2 sw=2 tw=0 et cc=80 :
-- Keymap set shortcut require 'utils'
--@type vim.keymap.set
local s = vim.keymap.set
-- Handle description
---@param desc string|table? Optional description. Can be a string or a table.
---@return table -- The description as a table.
local function handleDesc(desc)
if type(desc) == "string" then
-- Convert string to table with `desc` as a key
-- If the string is empty, just return as an empty description
return { desc = desc }
elseif type(desc) == "table" then
-- If desc doesn't have 'desc' key, combine it with
-- others with empty description
if not desc.desc then
desc.desc = ''
return desc
end
-- Use the table as is
return desc
else
-- Default to an empty table if `desc` is nil or an unsupported type
return { desc = '' }
end
end
-- Normal mode keymaps
---@param key string rhs, required
---@param cmd string|function lhs, required
---@param opts table? Options, optional
local n = function(key, cmd, opts) s('n', key, cmd, opts) end
-- Leader keymap shortcut function
-- It prepends '<leader>' to the key
---@param key string rhs, required, but will be prepended with '<leader>'
---@param cmd string|function lhs, required
---@param opts table|string? Options (or just description), optional
local nl = function(key, cmd, opts)
opts = handleDesc(opts)
n('<leader>' .. key, cmd, opts)
end
-- Local leader keymap shortcut function
-- It prepends '<leader>' to the key and uses desc from opts
---@param key string rhs, required, but will be prepended with '<leader>'
---@param cmd string|function lhs, required
---@param opts table|string description, required
local nld = function(key, cmd, opts)
opts = handleDesc(opts)
nl(key, cmd, opts)
end
-- Keymap shortcut function with mode defined, good for sorting by rhs
---@param key string rhs, required
---@param mode string|string[] one of n, v, x, or table of modes { 'n', 'v' }
---@param cmd string|function lhs, required
---@param opts string|table description, required
local d = function(key, mode, cmd, opts)
opts = handleDesc(opts)
s(mode, key, cmd, opts)
end
-- Leader based keymap shortcut function with mode defined
---@param key string rhs, required, but will be prepended with '<leader>'
---@param mode string|string[] one of n, v, x, or table of modes { 'n', 'v' }
---@param cmd string|function lhs, required
---@param opts string|table description (or opts), required
local ld = function(key, mode, cmd, opts)
opts = handleDesc(opts)
s(mode, '<leader>' .. key, cmd, opts)
end
-- ╭─────────────────────────────────────────────────────────╮ -- ╭─────────────────────────────────────────────────────────╮
-- │ Keymaps │ -- │ Keymaps │
-- ╰─────────────────────────────────────────────────────────╯ -- ╰─────────────────────────────────────────────────────────╯
-- Disable arrow keys in normal mode -- ── Disable arrow keys in normal mode ───────────────────────────────
n('<left>', ':echo "Use h to move!!"<CR>') K.n('<left>', ':echo "Use h to move!!"<CR>')
n('<right>', ':echo "Use l to move!!"<CR>') K.n('<right>', ':echo "Use l to move!!"<CR>')
n('<up>', ':echo "Use k to move!!"<CR>') K.n('<up>', ':echo "Use k to move!!"<CR>')
n('<down>', ':echo "Use j to move!!"<CR>') K.n('<down>', ':echo "Use j to move!!"<CR>')
n('<C-s>', ':w!<cr>', { desc = 'Save', noremap = true }) -- ── Splits ──────────────────────────────────────────────────────────
n('<esc><esc>', ':nohlsearch<cr>', { desc = 'Clear Search Highlighting' }) K.n('<C-w>,', ':vertical resize -10<CR>', { desc = 'V Resize -' })
K.n('<C-w>.', ':vertical resize +10<CR>', { desc = 'V Resize +' })
K.n('<C-w>-', ':resize -10<CR>', { desc = 'H Resize -' })
K.n('<C-w>+', ':resize +10<CR>', { desc = 'H Resize +' })
K.n('<C-w>=', '<C-w>=', { desc = 'Equal Size Splits' })
-- Buffer operations -- ── Deal with word wrap ─────────────────────────────────────────────
K.n(
'k',
"v:count == 0 ? 'gk' : 'k'",
{ desc = 'Move up', noremap = true, expr = true }
)
K.n(
'j',
"v:count == 0 ? 'gj' : 'j'",
{ desc = 'Move down', noremap = true, expr = true }
)
-- ── Text manipulation ───────────────────────────────────────────────
K.d('<', { 'n', 'v' }, '<gv', 'Indent Left')
K.d('>', { 'n', 'v' }, '>gv', 'Indent Right')
K.d('<C-k>', { 'n', 'v' }, ":m '<-2<CR>gv=gv", 'Move Block Up')
K.d('<C-j>', { 'n', 'v' }, ":m '>+1<CR>gv=gv", 'Move Block Down')
-- ── Other operations ────────────────────────────────────────────────
K.nl('o', function() require('snacks').gitbrowse() end, 'Open repo in browser')
K.n('<C-s>', ':w!<cr>', { desc = 'Save', noremap = true })
K.n('<esc><esc>', ':nohlsearch<cr>', { desc = 'Clear Search Highlighting' })
-- ── Buffer operations ───────────────────────────────────────────────
-- Mappings for buffer management operations like switching, deleting, etc. -- Mappings for buffer management operations like switching, deleting, etc.
-- Convention: All mappings start with 'b' followed by the operation -- Convention: All mappings start with 'b' followed by the operation
nld('ba', ':%bd|e#|bd#<cr>', 'Close all except current') K.nl('ba', ':%bd|e#|bd#<cr>', 'Close all except current')
nld('bd', ':lua MiniBufremove.delete()<CR>', 'Delete') K.nl('bd', ':lua MiniBufremove.delete()<CR>', 'Delete')
nld('bh', ':bprev<cr>', 'Prev') K.nl('bh', ':bprev<cr>', 'Prev')
nld('bj', ':bfirst<cr>', 'First') K.nl('bj', ':bfirst<cr>', 'First')
nld('bk', ':blast<cr>', 'Last') K.nl('bk', ':blast<cr>', 'Last')
nld('bl', ':bnext<cr>', 'Next') K.nl('bl', ':bnext<cr>', 'Next')
nld('bw', ':lua MiniBufremove.wipeout()<CR>', 'Wipeout') K.nl('bw', ':lua MiniBufremove.wipeout()<CR>', 'Wipeout')
-- Code -- ── Code & LSP operations ───────────────────────────────────────────
nld('cg', ':lua require("neogen").generate()<CR>', 'Generate annotations') -- Mappings for code and LSP operations like code actions, formatting, etc.
-- Convention: All mappings start with 'c' followed by the operation
-- unless it's a generic operation like signature help or hover
K.n('<C-l>', ':lua vim.lsp.buf.signature_help()<CR>', { desc = 'Signature' })
K.n('K', ':Lspsaga hover_doc<cr>', { desc = 'Hover Documentation' })
K.ld('ca', 'n', ':Lspsaga code_action<cr>', 'Code Action')
K.ld('cci', 'n', ':Lspsaga incoming_calls<cr>', 'Incoming Calls')
K.ld('cco', 'n', ':Lspsaga outgoing_calls<cr>', 'Outgoing Calls')
K.ld('cd', 'n', ':Lspsaga show_line_diagnostics<cr>', 'Line Diagnostics')
-- K.ld('cf', { 'n', 'x' }, ':lua vim.lsp.buf.format()<CR>', 'Format')
K.ld('cg', 'n', ':lua require("neogen").generate()<CR>', 'Generate annotations')
K.ld('ci', 'n', ':Lspsaga implement<cr>', 'Implementations')
K.ld('cl', 'n', ':Lspsaga show_cursor_diagnostics<cr>', 'Cursor Diagnostics')
K.ld('cp', 'n', ':Lspsaga peek_definition<cr>', 'Peek Definition')
K.ld('cr', 'n', ':Lspsaga rename<cr>', 'Rename')
K.ld('cR', 'n', ':Lspsaga rename ++project<cr>', 'Rename Project wide')
K.ld('cs', 'n', ':Telescope lsp_document_symbols<CR>', 'LSP Document Symbols')
K.ld('ct', 'n', ':Lspsaga peek_type_definition<cr>', 'Peek Type Definition')
K.ld('cT', 'n', ':Telescope lsp_type_definitions<CR>', 'LSP Type Definitions')
K.ld('cu', 'n', ':Lspsaga preview_definition<cr>', 'Preview Definition')
K.ld('cv', 'n', ':Lspsaga diagnostic_jump_prev<cr>', 'Diagnostic Jump Prev')
K.ld('cw', 'n', ':Lspsaga diagnostic_jump_next<cr>', 'Diagnostic Jump Next')
-- LSP -- ── CommentBox operations ───────────────────────────────────────────
n('<C-l>', ':lua vim.lsp.buf.signature_help()<CR>', { desc = 'Signature' })
n('K', ':Lspsaga hover_doc<cr>', { desc = 'Hover Documentation' })
ld('ca', 'n', ':Lspsaga code_action<cr>', 'Code Action')
ld('cci', 'n', ':Lspsaga incoming_calls<cr>', 'Incoming Calls')
ld('cco', 'n', ':Lspsaga outgoing_calls<cr>', 'Outgoing Calls')
ld('cd', 'n', ':Lspsaga show_line_diagnostics<cr>', 'Line Diagnostics')
ld('cf', { 'n', 'x' }, ':lua vim.lsp.buf.format()<CR>', 'Format')
ld('ci', 'n', ':Lspsaga implement<cr>', 'Implementations')
ld('cl', 'n', ':Lspsaga show_cursor_diagnostics<cr>', 'Cursor Diagnostics')
ld('cp', 'n', ':Lspsaga peek_definition<cr>', 'Peek Definition')
ld('cr', 'n', ':Lspsaga rename<cr>', 'Rename')
ld('cR', 'n', ':Lspsaga rename ++project<cr>', 'Rename Project wide')
ld('cs', 'n', ':Telescope lsp_document_symbols<CR>', 'LSP Document Symbols')
ld('ct', 'n', ':Lspsaga peek_type_definition<cr>', 'Peek Type Definition')
ld('cT', 'n', ':Telescope lsp_type_definitions<CR>', 'LSP Type Definitions')
ld('cu', 'n', ':Lspsaga preview_definition<cr>', 'Preview Definition')
ld('cv', 'n', ':Lspsaga diagnostic_jump_prev<cr>', 'Diagnostic Jump Prev')
ld('cw', 'n', ':Lspsaga diagnostic_jump_next<cr>', 'Diagnostic Jump Next')
-- CommentBox operations
-- Mappings for creating and managing comment boxes -- Mappings for creating and managing comment boxes
-- Convention: All mappings start with 'cb' followed by the box type -- Convention: All mappings start with 'cb' followed by the box type
nld('cbb', '<Cmd>CBccbox<CR>', 'CB: Box Title') K.nl('cbb', '<Cmd>CBccbox<CR>', 'CB: Box Title')
nld('cbd', '<Cmd>CBd<CR>', 'CB: Remove a box') K.nl('cbd', '<Cmd>CBd<CR>', 'CB: Remove a box')
nld('cbl', '<Cmd>CBline<CR>', 'CB: Simple Line') K.nl('cbl', '<Cmd>CBline<CR>', 'CB: Simple Line')
nld('cbm', '<Cmd>CBllbox14<CR>', 'CB: Marked') K.nl('cbm', '<Cmd>CBllbox14<CR>', 'CB: Marked')
nld('cbt', '<Cmd>CBllline<CR>', 'CB: Titled Line') K.nl('cbt', '<Cmd>CBllline<CR>', 'CB: Titled Line')
-- ── Telescope operations ────────────────────────────────────────────
-- Mappings for Telescope operations like finding files, buffers, etc.
-- Convention: All mappings start with 's' followed by the operation
-- unless it's a generic operation like searching or finding buffers
K.nl('f', ':Telescope find_files<cr>', 'Find Files')
K.nl(',', ':Telescope buffers<cr>', 'Find existing buffers')
K.nl(
'/',
function()
require('telescope.builtin').current_buffer_fuzzy_find(
require('telescope.themes').get_dropdown {
winblend = 20,
previewer = true,
}
)
end,
'Fuzzily search in current buffer'
)
-- Telescope K.nl('sc', ':Telescope commands<cr>', 'Commands')
nld('f', ':Telescope find_files<cr>', 'Find Files') K.nl('sd', ':Telescope diagnostics<cr>', 'Search Diagnostics')
nld(',', ':Telescope buffers<cr>', 'Find existing buffers') K.nl('sg', ':Telescope live_grep<cr>', 'Search by Grep')
nld('/', function() K.nl('sh', ':Telescope help_tags<cr>', 'Help tags')
require('telescope.builtin').current_buffer_fuzzy_find( K.nl('sk', ':Telescope keymaps<cr>', 'Search Keymaps')
require('telescope.themes').get_dropdown { K.nl('sl', ':Telescope luasnip<CR>', 'Search LuaSnip')
winblend = 20, K.nl('so', ':Telescope oldfiles<CR>', 'Old Files')
previewer = true, K.nl(
} 'sp',
)
end, 'Fuzzily search in current buffer')
nld('sc', ':Telescope commands<cr>', 'Commands')
nld('sd', ':Telescope diagnostics<cr>', 'Search Diagnostics')
nld('sg', ':Telescope live_grep<cr>', 'Search by Grep')
nld('sh', ':Telescope highlights<cr>', 'List Highlights')
nld('sk', ':Telescope keymaps<cr>', 'Search Keymaps')
nld('sl', ':Telescope luasnip<CR>', 'Search LuaSnip')
nld('so', ':Telescope oldfiles<CR>', 'Old Files')
nld('sp',
':lua require("telescope").extensions.lazy_plugins.lazy_plugins()<cr>', ':lua require("telescope").extensions.lazy_plugins.lazy_plugins()<cr>',
'Lazy Plugins') 'Lazy Plugins'
nld('sq', ':Telescope quickfix<cr>', 'Quickfix') )
nld('ss', ':Telescope treesitter<cr>', 'Treesitter') K.nl('sq', ':Telescope quickfix<cr>', 'Quickfix')
nld('st', ':TodoTelescope<cr>', 'Search Todos') K.nl('ss', ':Telescope treesitter<cr>', 'Treesitter')
nld('sw', ':Telescope grep_string<cr>', 'Grep String') K.nl('st', ':TodoTelescope<cr>', 'Search Todos')
nld('sx', ':Telescope import<cr>', 'Telescope: Import') K.nl('sw', ':Telescope grep_string<cr>', 'Grep String')
K.nl('sx', ':Telescope import<cr>', 'Telescope: Import')
-- Trouble -- ── Trouble operations ──────────────────────────────────────────────
nld('xd', -- Convention is 'x' followed by the operation
':Trouble document_diagnostics<cr>', 'Trouble: Document Diagnostics') K.nl('xd', ':Trouble document_diagnostics<cr>', 'Document Diagnostics')
nld('xl', ':Trouble loclist<cr>', 'Trouble: Location List') K.nl('xl', ':Trouble loclist<cr>', 'Location List')
nld('xq', ':Trouble quickfix<cr>', 'Trouble: Quickfix') K.nl('xq', ':Trouble quickfix<cr>', 'Quickfix')
nld('xw', K.nl('xw', ':Trouble workspace_diagnostics<cr>', 'Workspace Diagnostics')
':Trouble workspace_diagnostics<cr>', 'Trouble: Workspace Diagnostics') K.nl('xx', ':Trouble diagnostics<cr>', 'Diagnostic')
nld('xx', ':Trouble diagnostics<cr>', 'Trouble: Diagnostic')
-- Text manipulation -- ── Toggle settings ─────────────────────────────────────────────────
d('<', { 'n', 'v' }, '<gv', 'Indent Left') -- Convention is 't' followed by the operation
d('>', { 'n', 'v' }, '>gv', 'Indent Right') K.nl('tc', ':CloakToggle<cr>', 'Cloak: Toggle')
d('<C-k>', { 'n', 'v' }, ":m '<-2<CR>gv=gv", 'Move Block Up') K.nl('te', ':Neotree toggle<cr>', 'Toggle Neotree')
d('<C-j>', { 'n', 'v' }, ":m '>+1<CR>gv=gv", 'Move Block Down') K.nl('tl', ToggleBackground, 'Toggle Light/Dark Mode')
K.nl('tn', ':Noice dismiss<cr>', 'Noice: Dismiss Notification')
-- Other functionality -- ── Quit operations ─────────────────────────────────────────────────
nld('o', function() require('snacks').gitbrowse() end, 'Open repo in browser') -- Convention is 'q' followed by the operation
K.nl('qf', ':q<CR>', 'Quicker close split')
-- Toggle settings K.nl('qq', function()
local function toggle_background() if vim.fn.confirm('Force save and quit?', '&Yes\n&No', 2) == 1 then
vim.o.bg = vim.o.bg == "light" and "dark" or "light" vim.cmd 'wq!'
end
nld('tc', ':CloakToggle<cr>', 'Cloak: Toggle')
nld('te', ':Neotree toggle<cr>', 'Toggle Neotree')
nld('tl', toggle_background, 'Toggle Light/Dark Mode')
nld('tn', ':Noice dismiss<cr>', 'Noice: Dismiss Notification')
-- Splits
n('<C-w>,', ':vertical resize -10<CR>', { desc = 'V Resize -' })
n('<C-w>.', ':vertical resize +10<CR>', { desc = 'V Resize +' })
n('<C-w>-', ':resize -5<CR>', { desc = 'H Resize -' })
n('<C-w>+', ':resize +5<CR>', { desc = 'H Resize +' })
n('<C-w>=', '<C-w>=', { desc = 'Equal Size Splits' })
-- Deal with word wrap
n('k',
"v:count == 0 ? 'gk' : 'k'",
{ desc = 'Move up', noremap = true, expr = true })
n('j',
"v:count == 0 ? 'gj' : 'j'",
{ desc = 'Move down', noremap = true, expr = true })
-- Quit
nld('qf', ':q<CR>', 'Quicker close split')
nld('qq', function()
if vim.fn.confirm("Force save and quit?", "&Yes\n&No", 2) == 1 then
vim.cmd('wq!')
end end
end, 'Quit with force saving') end, 'Quit with force saving')
nld('qw', ':wq<CR>', 'Write and quit') K.nl('qw', ':wq<CR>', 'Write and quit')
nld('qQ', function() K.nl('qQ', function()
if vim.fn.confirm("Force quit without saving?", "&Yes\n&No", 2) == 1 then if vim.fn.confirm('Force quit without saving?', '&Yes\n&No', 2) == 1 then
vim.cmd('q!') vim.cmd 'q!'
end end
end, 'Force quit without saving') end, 'Force quit without saving')
-- That concludes the keymaps section of the config.

View File

@@ -0,0 +1,122 @@
-- Get nvm default version and use it in node_host_prog
-- and g.copilot_node_command.
--
-- This module automatically configures Neovim to use the default Node.js version
-- from NVM. It requires a working NVM installation and 'default' alias to be set,
-- and also neovim npm package to be installed.
--
-- You can install the neovim package by running:
-- npm i --global neovim
--
-- Usage:
-- require('nvm-default').setup({
-- add_to_path = true, -- optional: add NVM bin directory to PATH
-- nvm_path = "~/.nvm", -- optional: custom NVM installation path
-- notify_level = "info" -- optional: notification level
-- })
local M = {}
M.name = 'nvm-default.nvim'
M.version = '0.1.0' -- x-release-please-version
-- Helper function to run a shell command
---@param cmd string Run a shell command
---@return string? Return the result of the command
local function run_command(cmd)
local result = vim.fn.system(cmd)
return vim.v.shell_error == 0 and result:gsub('%s+$', '') or nil
end
-- Helper function to show a notification
---@param msg string Show a message
---@param level "info"|"warn"|"error"|"trace" Notification level
local function n(msg, level)
if msg == nil then msg = M.name .. ': No message provided' end
if level == nil then level = 'trace' end
local log_level = vim.log.levels.INFO
if level == 'info' then
log_level = vim.log.levels.INFO
elseif level == 'warn' then
log_level = vim.log.levels.WARN
elseif level == 'error' then
log_level = vim.log.levels.ERROR
elseif level == 'trace' then
log_level = vim.log.levels.TRACE
end
vim.notify(M.name .. ': ' .. msg, log_level)
end
---@class NvmDefaultOptions
---@field add_to_path boolean Add found NVM bin directory to PATH
---@field nvm_path string Where nvm installation is located
---@field notify_level number|"info"|"warn"|"error"|"trace" Notification level filter
-- Default options
---@type NvmDefaultOptions
M.defaults = {
add_to_path = vim.g.nvm_default_add_to_path or true,
nvm_path = vim.fn.expand(os.getenv 'NVM_DIR' or '~/.nvm'),
notify_level = vim.g.nvm_default_notify_level or 'info',
}
-- Fetch the NVM default version or fallback to node version
---@param opts? NvmDefaultOptions Plugin options
function M.setup(opts)
local options = vim.tbl_deep_extend('force', M.defaults, opts or {})
local nvm_path = options.nvm_path
local node_version = run_command(
string.format('. %s/nvm.sh && nvm version default', nvm_path)
) or run_command(string.format('. %s/nvm.sh && nvm version node', nvm_path))
if node_version and node_version:match '^v' then
-- Set vim.g.node_host_prog and vim.g.copilot_node_command
local current_nvm_version_path =
string.format('%s/versions/node/%s', nvm_path, node_version)
local current_nvm_node_bin_path =
string.format('%s/bin', current_nvm_version_path)
local current_nvm_node_bin =
string.format('%s/node', current_nvm_node_bin_path)
local neovim_node_host_bin_path =
string.format('%s/neovim-node-host', current_nvm_node_bin_path)
-- Collect missing files and directories errors for error output
local missing = {}
-- If node_dir isn't there, stop and show error
if not vim.fn.isdirectory(current_nvm_version_path) then
table.insert(missing, 'Node.js directory: ' .. current_nvm_version_path)
end
-- If node_bin isn't there, stop and show error
if not vim.fn.filereadable(current_nvm_node_bin) then
table.insert(missing, 'Node.js binary: ' .. current_nvm_node_bin)
end
if not vim.fn.filereadable(neovim_node_host_bin_path) then
table.insert(missing, 'Neovim host binary: ' .. neovim_node_host_bin_path)
end
if #missing > 0 then
n('Missing required files:\n- ' .. table.concat(missing, '\n- '), 'error')
return
end
-- Add to PATH if requested. Can be turned off by setting if it messes with
-- other tools.
if options.add_to_path then
vim.env.PATH = current_nvm_node_bin_path .. ':' .. vim.env.PATH
end
vim.g.node_host_prog = neovim_node_host_bin_path
vim.g.copilot_node_command = current_nvm_node_bin
else
n('Unable to determine the Node.js version from nvm.', 'error')
end
end
return M

View File

@@ -5,50 +5,41 @@
-- `:help vim.g` -- `:help vim.g`
-- For more options, you can see `:help option-list` -- For more options, you can see `:help option-list`
local g = vim.g -- A table to store global variables local g = vim.g -- A table to store global variables
local o = vim.opt -- A table to store global options local o = vim.opt -- A table to store global options
vim.loader.enable() -- Enable the plugin loader
-- vim.global -- vim.global
g.mapleader = ' ' -- Space as the leader key g.mapleader = ' ' -- Space as the leader key
g.maplocalleader = ' ' -- Space as the local leader key g.maplocalleader = ' ' -- Space as the local leader key
g.colors_theme = 'tokyonight' -- Set the colorscheme g.colors_theme = 'tokyonight' -- Set the colorscheme
g.colors_variant_light = 'tokyonight-day' -- Set the light variant g.colors_variant_light = 'tokyonight-day' -- Set the light variant
g.colors_variant_dark = 'tokyonight-storm' -- Set the dark variant g.colors_variant_dark = 'tokyonight-storm' -- Set the dark variant
g.editorconfig = true -- Make sure editorconfig support is enabled g.editorconfig = true -- Make sure editorconfig support is enabled
g.loaded_perl_provider = 0 -- Disable perl provider g.loaded_perl_provider = 0 -- Disable perl provider
g.loaded_ruby_provider = 0 -- Disable ruby provider g.loaded_ruby_provider = 0 -- Disable ruby provider
g.loaded_java_provider = 0 -- Disable java provider
-- vim.options -- vim.options
o.breakindent = true -- Enable break indent -- Most of the good defaults are provided by `mini.basics`
o.completeopt = 'menuone,noselect' -- Popup menu when typing -- See: lua/plugins/mini.lua
o.cursorline = true -- Show which line your cursor is on o.ignorecase = true -- Ignore case in search patterns
o.inccommand = 'split' -- Preview substitutions live, as you type! o.inccommand = 'split' -- Preview substitutions live, as you type!
o.mouse = 'a' -- Enable mouse support o.number = true -- Show line numbers
o.number = true -- Show line numbers o.numberwidth = 3 -- Set the width of the number column
o.numberwidth = 3 -- Set the width of the number column o.relativenumber = true -- Show relative line numbers
o.relativenumber = true -- Show relative line numbers o.scrolloff = 15 -- Show context around cursor
o.scrolloff = 15 -- Show context around cursor o.signcolumn = 'yes:3' -- Keep signcolumn on by default
o.showmode = false -- Don't show mode o.spell = true -- Enable spell checking
o.signcolumn = 'yes:2' -- Keep signcolumn on by default o.spelllang = 'en_us' -- Set the spell checking language
o.smartindent = true -- Insert indents automatically o.splitbelow = true -- split to the bottom
o.spell = true -- Enable spell checking o.splitright = true -- vsplit to the right
o.spelllang = 'en_us' -- Set the spell checking language o.termguicolors = true -- Enable GUI colors
o.splitbelow = true -- split to the bottom o.timeoutlen = 250 -- Decrease mapped sequence wait time
o.splitright = true -- vsplit to the right o.updatetime = 250 -- 250 ms = 2,5 seconds
o.termguicolors = true -- Fixes Notify opacity issues o.sessionoptions =
o.timeoutlen = 250 -- Decrease mapped sequence wait time 'buffers,curdir,folds,tabpages,winsize,winpos,terminal,localoptions'
o.undofile = true -- Save undo history
o.updatetime = 250 -- 250 ms = 2,5 seconds
o.ignorecase = true -- Ignore case in search patterns
o.smartcase = true -- Override 'ignorecase' if pattern contains upper case chars
o.list = true -- Show some invisible characters
o.listchars = { tab = '» ', trail = '·', nbsp = '' } -- Which invisible chars to show
-- Enable the colorcolumn -- Enable the colorcolumn
vim.api.nvim_set_option_value('colorcolumn', '+1', { scope = 'global' }) vim.api.nvim_set_option_value('colorcolumn', '+1', { scope = 'global' })

View File

@@ -12,19 +12,20 @@ return {
'saghen/blink.compat', 'saghen/blink.compat',
version = '*', version = '*',
-- lazy.nvim will automatically load the plugin when it's required by blink.cmp -- lazy.nvim will automatically load the plugin when it's required by blink.cmp
lazy = true,
opts = { opts = {
-- make sure to set opts so that lazy.nvim calls blink.compat's setup -- make sure to set opts so that lazy.nvim calls blink.compat's setup
impersonate_nvim_cmp = true, impersonate_nvim_cmp = true,
}, },
}, },
-- Set of preconfigured snippets for different languages. -- Set of preconfigured snippets for different languages.
-- https://github.com/rafamadriz/friendly-snippets -- https://github.com/rafamadriz/friendly-snippets
{ 'rafamadriz/friendly-snippets' }, { 'rafamadriz/friendly-snippets' },
-- Lua plugin to turn github copilot into a cmp source -- Lua plugin to turn github copilot into a cmp source
-- https://github.com/giuxtaposition/blink-cmp-copilot -- https://github.com/giuxtaposition/blink-cmp-copilot
{ {
"giuxtaposition/blink-cmp-copilot", 'giuxtaposition/blink-cmp-copilot',
dependencies = { dependencies = {
-- Fully featured & enhanced replacement for copilot.vim complete -- Fully featured & enhanced replacement for copilot.vim complete
-- with API for interacting with Github Copilot -- with API for interacting with Github Copilot
@@ -73,11 +74,14 @@ return {
completion = { completion = {
menu = { menu = {
draw = { draw = {
columns = { { "label", "label_description", gap = 1 }, { "kind_icon", "kind", gap = 1 } }, columns = {
{ 'label', 'label_description', gap = 1 },
{ 'kind_icon', 'kind', gap = 1 },
},
}, },
}, },
documentation = { documentation = {
auto_show = true auto_show = true,
}, },
ghost_text = { ghost_text = {
enabled = false, enabled = false,
@@ -87,19 +91,17 @@ return {
-- default list of enabled providers defined so that you can extend it -- default list of enabled providers defined so that you can extend it
-- elsewhere in your config, without redefining it, via `opts_extend` -- elsewhere in your config, without redefining it, via `opts_extend`
sources = { sources = {
default = {
'lsp',
'copilot',
'path',
'snippets',
'buffer',
},
providers = { providers = {
copilot = { copilot = {
name = 'copilot', name = 'copilot',
module = 'blink-cmp-copilot' module = 'blink-cmp-copilot',
},
},
completion = {
enabled_providers = {
'lsp',
'copilot',
'path',
'snippets',
'buffer',
}, },
}, },
}, },
@@ -108,10 +110,10 @@ return {
-- completion = { accept = { auto_brackets = { enabled = true } } } -- completion = { accept = { auto_brackets = { enabled = true } } }
-- experimental signature help support -- experimental signature help support
signature = { enabled = true } signature = { enabled = true },
}, },
-- allows extending the enabled_providers array elsewhere in your config -- allows extending the enabled_providers array elsewhere in your config
-- without having to redefine it -- without having to redefine it
opts_extend = { "sources.completion.enabled_providers" }, opts_extend = { 'sources.completion.enabled_providers' },
}, },
} }

View File

@@ -0,0 +1,87 @@
return {
-- A better annotation generator.
-- Supports multiple languages and annotation conventions.
-- https://github.com/danymat/neogen
{
'danymat/neogen',
version = '*',
opts = { enabled = true, snippet_engine = 'luasnip' },
},
-- Cloak allows you to overlay *'s over defined patterns in defined files.
-- https://github.com/laytan/cloak.nvim
{
'laytan/cloak.nvim',
version = '*',
opts = {
enabled = true,
cloak_character = '*',
-- The applied highlight group (colors) on the cloaking, see `:h highlight`.
highlight_group = 'Comment',
patterns = {
{
-- Match any file starting with ".env".
-- This can be a table to match multiple file patterns.
file_pattern = {
'.env*',
'wrangler.toml',
'.dev.vars',
},
-- Match an equals sign and any character after it.
-- This can also be a table of patterns to cloak,
-- example: cloak_pattern = { ":.+", "-.+" } for yaml files.
cloak_pattern = '=.+',
},
},
},
},
-- Describe the regexp under the cursor
-- https://github.com/bennypowers/nvim-regexplainer
{
'bennypowers/nvim-regexplainer',
event = 'BufEnter',
dependencies = {
'nvim-treesitter/nvim-treesitter',
'MunifTanjim/nui.nvim',
},
opts = {
-- automatically show the explainer when the cursor enters a regexp
auto = true,
},
},
-- Clarify and beautify your comments using boxes and lines.
-- https://github.com/LudoPinelli/comment-box.nvim
{
'LudoPinelli/comment-box.nvim',
event = 'BufEnter',
opts = {},
},
-- Plugin to improve viewing Markdown files in Neovim
-- https://github.com/MeanderingProgrammer/render-markdown.nvim
{
'MeanderingProgrammer/render-markdown.nvim',
event = 'BufEnter',
dependencies = {
'nvim-treesitter/nvim-treesitter',
'nvim-tree/nvim-web-devicons',
},
ft = 'markdown',
opts = {},
},
{
'ray-x/go.nvim',
dependencies = { -- optional packages
'ray-x/guihua.lua',
'neovim/nvim-lspconfig',
'nvim-treesitter/nvim-treesitter',
},
config = function() require('go').setup() end,
event = { 'CmdlineEnter' },
ft = { 'go', 'gomod' },
build = ':lua require("go.install").update_all_sync()', -- if you need to install/update all binaries
},
}

View File

@@ -2,36 +2,39 @@ return {
-- A collection of small QoL plugins for Neovim -- A collection of small QoL plugins for Neovim
-- https://github.com/folke/snacks.nvim -- https://github.com/folke/snacks.nvim
{ {
"folke/snacks.nvim", 'folke/snacks.nvim',
priority = 1000, priority = 1000,
lazy = false, lazy = false,
---@type snacks.Config ---@type snacks.Config
opts = { opts = {
bigfile = { enabled = true }, bigfile = { enabled = true },
gitbrowse = { enabled = true }, gitbrowse = { enabled = true },
notifier = {
enabled = true,
timeout = 3000,
},
notify = { enabled = true }, notify = { enabled = true },
notifier = { enabled = true },
quickfile = { enabled = true }, quickfile = { enabled = true },
statuscolumn = { statuscolumn = {
enabled = true, enabled = true,
left = { "mark", "sign" }, -- priority of signs on the left (high to low) left = { 'mark', 'sign' }, -- priority of signs on the left (high to low)
right = { "fold", "git" }, -- priority of signs on the right (high to low) right = { 'fold', 'git' }, -- priority of signs on the right (high to low)
folds = { folds = {
open = true, -- show open fold icons open = true, -- show open fold icons
git_hl = false, -- use Git Signs hl for fold icons git_hl = false, -- use Git Signs hl for fold icons
}, },
git = { git = {
-- patterns to match Git signs -- patterns to match Git signs
patterns = { "GitSign", "MiniDiffSign" }, patterns = { 'GitSign', 'MiniDiffSign' },
}, },
refresh = 50, -- refresh at most every 50ms refresh = 50, -- refresh at most every 50ms
}, },
words = { enabled = true }, words = { enabled = true },
styles = { styles = {
notification = { notification = {
wo = { wrap = true } -- Wrap notifications wo = { wrap = true }, -- Wrap notifications
} },
} },
}, },
}, },
-- A pretty diagnostics, references, telescope results, -- A pretty diagnostics, references, telescope results,

View File

@@ -1,4 +1,129 @@
-- ╭─────────────────────────────────────────────────────────╮
-- │ LSP Setup and configuration │
-- ╰─────────────────────────────────────────────────────────╯
-- LSP Servers are installed and configured by lsp-setup.nvim
-- Mason formatters Conform uses to format files
-- These are automatically configured by zapling/mason-conform.nvim
local lsp_servers = {
bashls = {},
-- csharp_ls = {},
diagnosticls = {},
gopls = {
settings = {
gopls = {
hints = {
rangeVariableTypes = true,
parameterNames = true,
constantValues = true,
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
functionTypeParameters = true,
},
},
},
},
html = {},
intelephense = {},
jsonls = {},
lua_ls = {
settings = {
Lua = {
completion = {
callSnippet = 'Replace',
},
diagnostics = {
globals = {
'vim',
-- busted
'describe',
'it',
'before_each',
'after_each',
'assert',
},
disable = {
-- Ignore lua_ls noisy `missing-fields` warnings
'missing-fields',
},
},
hint = {
enable = false,
arrayIndex = 'Auto',
await = true,
paramName = 'All',
paramType = true,
semicolon = 'SameLine',
setType = false,
},
},
},
},
tailwindcss = {},
ts_ls = {
settings = {
typescript = {
inlayHints = {
includeInlayParameterNameHints = 'all',
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayVariableTypeHintsWhenTypeMatchesName = false,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
},
},
},
},
vimls = {},
volar = {
settings = {
typescript = {
inlayHints = {
enumMemberValues = {
enabled = true,
},
functionLikeReturnTypes = {
enabled = true,
},
propertyDeclarationTypes = {
enabled = true,
},
parameterTypes = {
enabled = true,
suppressWhenArgumentMatchesName = true,
},
variableTypes = {
enabled = true,
},
},
},
},
},
}
return { return {
-- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
-- used for completion, annotations and signatures of Neovim apis
-- https://github.com/folke/lazydev.nvim
{
'folke/lazydev.nvim',
ft = 'lua',
opts = {
library = {
-- Load luvit types when the `vim.uv` word is found
{ path = 'luvit-meta/library', words = { 'vim%.uv' } },
},
},
},
-- Meta type definitions for the Lua platform Luvit.
-- https://github.com/Bilal2453/luvit-meta
{ 'Bilal2453/luvit-meta', lazy = true },
-- improve neovim lsp experience -- improve neovim lsp experience
-- https://github.com/nvimdev/lspsaga.nvim -- https://github.com/nvimdev/lspsaga.nvim
-- https://nvimdev.github.io/lspsaga/ -- https://nvimdev.github.io/lspsaga/
@@ -9,7 +134,6 @@ return {
'nvim-treesitter/nvim-treesitter', 'nvim-treesitter/nvim-treesitter',
'nvim-tree/nvim-web-devicons', 'nvim-tree/nvim-web-devicons',
}, },
---@type LspsagaConfig
opts = { opts = {
code_action = { code_action = {
show_server_name = true, show_server_name = true,
@@ -24,21 +148,77 @@ return {
}, },
}, },
}, },
-- A simple wrapper for nvim-lspconfig and mason-lspconfig -- A simple wrapper for nvim-lspconfig and mason-lspconfig
-- to easily setup LSP servers. -- to easily setup LSP servers.
-- https://github.com/junnplus/lsp-setup.nvim -- https://github.com/junnplus/lsp-setup.nvim
{ {
'junnplus/lsp-setup.nvim', 'junnplus/lsp-setup.nvim',
dependencies = { dependencies = {
-- Quickstart configs for Nvim LSP
-- https://github.com/neovim/nvim-lspconfig
{ 'neovim/nvim-lspconfig' }, { 'neovim/nvim-lspconfig' },
-- Portable package manager for Neovim that runs everywhere Neovim runs.
-- Easily install and manage LSP servers, DAP servers, linters, and formatters.
-- https://github.com/williamboman/mason.nvim
{ {
'williamboman/mason.nvim', 'williamboman/mason.nvim',
version = '*',
cmd = 'Mason', cmd = 'Mason',
run = ':MasonUpdate' run = ':MasonUpdate',
opts = {},
}, },
-- Extensible UI for Neovim notifications and LSP progress messages.
-- https://github.com/j-hui/fidget.nvim
{
'j-hui/fidget.nvim',
version = '*',
opts = {},
},
-- Extension to mason.nvim that makes it easier to use lspconfig with mason.nvim.
-- https://github.com/williamboman/mason-lspconfig.nvim
{ 'williamboman/mason-lspconfig.nvim' }, { 'williamboman/mason-lspconfig.nvim' },
{ 'folke/neodev.nvim' },
-- Install and upgrade third party tools automatically
-- https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim
{
'WhoIsSethDaniel/mason-tool-installer.nvim',
version = '*',
opts = {
auto_install = true,
auto_update = true,
ensure_installed = {
'actionlint',
'editorconfig-checker',
'goimports',
'gotests',
'phpcbf',
'phpmd',
'phpstan',
'pint',
'prettierd',
'semgrep',
'shellcheck',
'shfmt',
'staticcheck',
'stylua',
'trivy',
'vint',
'yamlfmt',
},
},
},
-- JSON schemas for Neovim
-- https://github.com/b0o/SchemaStore.nvim
{ 'b0o/schemastore.nvim' }, { 'b0o/schemastore.nvim' },
-- Performant, batteries-included completion plugin for Neovim
-- https://github.com/saghen/blink.cmp
-- See lua/plugins/blink.lua for configs
{ 'saghen/blink.cmp' }, { 'saghen/blink.cmp' },
}, },
opts = { opts = {
@@ -51,126 +231,45 @@ return {
inlay_hints = { inlay_hints = {
enabled = true, enabled = true,
}, },
servers = { servers = lsp_servers,
bashls = {},
-- csharp_ls = {},
diagnosticls = {},
gopls = {
settings = {
gopls = {
hints = {
rangeVariableTypes = true,
parameterNames = true,
constantValues = true,
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
functionTypeParameters = true,
},
},
},
},
html = {},
intelephense = {},
jsonls = {},
lua_ls = {
settings = {
Lua = {
diagnostics = {
globals = { 'vim' },
disable = {
-- Ignore lua_ls noisy `missing-fields` warnings
'missing-fields',
},
},
hint = {
enable = false,
arrayIndex = 'Auto',
await = true,
paramName = 'All',
paramType = true,
semicolon = 'SameLine',
setType = false,
},
},
},
},
tailwindcss = {},
ts_ls = {
settings = {
typescript = {
inlayHints = {
includeInlayParameterNameHints = 'all',
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayVariableTypeHintsWhenTypeMatchesName = false,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
},
},
},
},
vimls = {},
volar = {
settings = {
typescript = {
inlayHints = {
enumMemberValues = {
enabled = true,
},
functionLikeReturnTypes = {
enabled = true,
},
propertyDeclarationTypes = {
enabled = true,
},
parameterTypes = {
enabled = true,
suppressWhenArgumentMatchesName = true,
},
variableTypes = {
enabled = true,
},
},
},
},
},
},
}, },
config = function(_, opts) config = function(_, opts)
require('neodev').setup() require('lazydev').setup()
require('lsp-setup').setup(opts) require('lsp-setup').setup(opts)
local lspconfig = require('lspconfig') local lspconfig = require 'lspconfig'
for server, config in pairs(opts.servers) do for server, config in pairs(opts.servers) do
-- passing config.capabilities to blink.cmp merges with the capabilities in your -- passing config.capabilities to blink.cmp merges with the capabilities in your
-- `opts[server].capabilities, if you've defined it -- `opts[server].capabilities, if you've defined it
config.capabilities = require('blink.cmp').get_lsp_capabilities(config.capabilities) config.capabilities =
require('blink.cmp').get_lsp_capabilities(config.capabilities)
lspconfig[server].setup(config) lspconfig[server].setup(config)
end end
lspconfig.lua_ls.on_init = function(client) lspconfig.lua_ls.on_init = function(client)
if client.workspace_folders then if client.workspace_folders then
local path = client.workspace_folders[1].name local path = client.workspace_folders[1].name
if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then if
vim.loop.fs_stat(path .. '/.luarc.json')
or vim.loop.fs_stat(path .. '/.luarc.jsonc')
then
return return
end end
end end
client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { client.config.settings.Lua =
runtime = { vim.tbl_deep_extend('force', client.config.settings.Lua, {
-- Tell the language server which version of Lua you're using runtime = {
-- (most likely LuaJIT in the case of Neovim) -- Tell the language server which version of Lua you're using
version = 'LuaJIT' -- (most likely LuaJIT in the case of Neovim)
}, version = 'LuaJIT',
-- Make the server aware of Neovim runtime files },
workspace = { -- Make the server aware of Neovim runtime files
checkThirdParty = false, workspace = {
library = { checkThirdParty = false,
vim.env.VIMRUNTIME library = {
} vim.env.VIMRUNTIME,
} },
}) },
})
end end
lspconfig.jsonls.settings = { lspconfig.jsonls.settings = {
json = { json = {
@@ -189,6 +288,69 @@ return {
validate = { enable = true }, validate = { enable = true },
}, },
} }
-- end of junnplus/lsp-setup config
end, end,
}, },
-- Lightweight yet powerful formatter plugin for Neovim
-- https://github.com/stevearc/conform.nvim
{
'stevearc/conform.nvim',
event = { 'BufWritePre' },
cmd = { 'ConformInfo' },
keys = {
{
'<leader>cf',
function()
require('conform').format { async = true, lsp_format = 'fallback' }
end,
mode = '',
desc = 'Format buffer',
},
},
opts = {
notify_on_error = false,
---@type nil|conform.FormatOpts|fun(bufnr: integer): nil|conform.FormatOpts
format_on_save = function(bufnr)
-- Disable "format_on_save lsp_fallback" for languages that don't
-- have a well standardized coding style. You can add additional
-- languages here or re-enable it for the disabled ones.
local disable_filetypes = { c = true, cpp = true }
local lsp_format_opt
if disable_filetypes[vim.bo[bufnr].filetype] then
lsp_format_opt = 'never'
else
lsp_format_opt = 'fallback'
end
-- Disable autoformat for files in a certain path
local bufname = vim.api.nvim_buf_get_name(bufnr)
if bufname:match '/node_modules/' then return end
return {
timeout_ms = 500,
lsp_format = lsp_format_opt,
}
end,
formatters_by_ft = {
lua = { 'stylua' },
sh = { 'shfmt' },
bash = { 'shfmt' },
php = { 'phpcbf' },
-- Conform can also run multiple formatters sequentially
-- python = { "isort", "black" },
--
-- You can use 'stop_after_first' to run the first available formatter from the list
-- javascript = { "prettierd", "prettier", stop_after_first = true },
},
},
init = function()
-- If you want the formatexpr, here is the place to set it
vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
end,
},
-- Automatically install formatters registered with conform.nvim via mason.nvim
-- https://github.com/zapling/mason-conform.nvim
{ 'zapling/mason-conform.nvim', opts = {} },
} }

View File

@@ -1,25 +1,41 @@
-- https://github.com/echasnovski/mini.nvim
-- https://github.com/echasnovski/mini.nvim/tree/main?tab=readme-ov-file#modules
return { return {
-- Presets for common options and mappings -- Library of 40+ independent Lua modules improving overall Neovim
{ 'echasnovski/mini.basics', version = '*' }, -- (version 0.8 and higher) experience with minimal effort
--
-- Animate common Neovim actions -- https://github.com/echasnovski/mini.nvim
-- Replaced anuvyklack/windows.nvim -- https://github.com/echasnovski/mini.nvim/tree/main?tab=readme-ov-file#modules
{ 'echasnovski/mini.animate', version = '*', opts = {} }, --
-- YouTube: Text editing with 'mini.nvim' - Neovimconf 2024 - Evgeni Chasnovski
-- Buffer removing (unshow, delete, wipeout), which saves window layout -- https://www.youtube.com/watch?v=cNK5kYJ7mrs
-- Replaced famiu/bufdelete.nvim
{ 'echasnovski/mini.bufremove', version = '*', opts = {} },
-- Show next key clues
-- Replaced folke/which-key.nvim
{ {
'echasnovski/mini.clue', 'echasnovski/mini.nvim',
version = '*', version = '*',
priority = 1001,
config = function() config = function()
local miniclue = require 'mini.clue' -- Presets for common options and mappings
-- h: MiniBasics.config
require('mini.basics').setup {
options = {
basics = true,
extra_ui = true,
},
mappings = {
basic = true,
option_toggle_prefix = [[<leader>tm]],
},
}
-- Animate common Neovim actions
-- Replaced anuvyklack/windows.nvim
require('mini.animate').setup()
-- Buffer removing (unshow, delete, wipeout), which saves window layout
-- Replaced famiu/bufdelete.nvim
require('mini.bufremove').setup()
-- Show next key clues
-- Replaced folke/which-key.nvim
local miniclue = require 'mini.clue'
miniclue.setup { miniclue.setup {
window = { window = {
config = { config = {
@@ -66,166 +82,173 @@ return {
miniclue.gen_clues.registers(), miniclue.gen_clues.registers(),
miniclue.gen_clues.windows(), miniclue.gen_clues.windows(),
miniclue.gen_clues.z(), miniclue.gen_clues.z(),
{ mode = 'n', keys = '<Leader>b', desc = '+Buffers' }, { mode = 'n', keys = '<Leader>b', desc = '+Buffers' },
{ mode = 'n', keys = '<Leader>c', desc = '+Code' }, { mode = 'n', keys = '<Leader>c', desc = '+Code' },
{ mode = 'n', keys = '<Leader>cb', desc = '+CommentBox' }, { mode = 'n', keys = '<Leader>cb', desc = '+CommentBox' },
{ mode = 'n', keys = '<Leader>q', desc = '+Quit' }, { mode = 'n', keys = '<Leader>cc', desc = '+Calls' },
{ mode = 'n', keys = '<Leader>s', desc = '+Telescope' }, { mode = 'n', keys = '<Leader>q', desc = '+Quit' },
{ mode = 'n', keys = '<Leader>t', desc = '+Toggle' }, { mode = 'n', keys = '<Leader>s', desc = '+Telescope' },
{ mode = 'n', keys = '<Leader>x', desc = '+Trouble' }, { mode = 'n', keys = '<Leader>t', desc = '+Toggle' },
{ mode = 'n', keys = '<leader>z', desc = '+TreeSitter' }, { mode = 'n', keys = '<Leader>tm', desc = '+Mini' },
{ mode = 'n', keys = '<Leader>x', desc = '+Trouble' },
{ mode = 'n', keys = '<leader>z', desc = '+TreeSitter' },
{ mode = 'n', keys = '<leader>zg', desc = '+Goto' }, { mode = 'n', keys = '<leader>zg', desc = '+Goto' },
{ mode = 'n', keys = '<Leader>?', desc = '+Help' }, { mode = 'n', keys = '<Leader>?', desc = '+Help' },
{ mode = 'n', keys = 'd', desc = '+Diagnostics' }, { mode = 'n', keys = 'd', desc = '+Diagnostics' },
{ mode = 'n', keys = 'y', desc = '+Yank' }, { mode = 'n', keys = 'y', desc = '+Yank' },
}, },
} }
end,
},
-- Comment lines -- Comment lines
-- Replaced numToStr/Comment.nvim -- Replaced numToStr/Comment.nvim
{ 'echasnovski/mini.comment', version = '*', opts = {} }, require('mini.comment').setup()
-- Highlight cursor word and its matches -- Highlight cursor word and its matches
{ 'echasnovski/mini.cursorword', version = '*' }, require('mini.cursorword').setup()
-- Work with diff hunks -- Work with diff hunks
-- Replaced lewis6991/gitsigns.nvim -- Replaced lewis6991/gitsigns.nvim
{ 'echasnovski/mini.diff', version = '*', opts = {} }, require('mini.diff').setup()
-- Git integration -- Git integration
{ 'echasnovski/mini-git', version = '*', opts = {}, main = 'mini.git' }, require('mini.git').setup()
-- Highlight patterns in text -- Highlight patterns in text
-- Replaced folke/todo-comments.nvim -- Replaced folke/todo-comments.nvim
{
'echasnovski/mini.hipatterns',
version = '*',
opts = {
highlighters = {
-- Highlight standalone 'FIXME', 'HACK', 'TODO', 'NOTE'
fixme = {
pattern = '%f[%w]()FIXME:?%s*()%f[%W]',
group = 'MiniHipatternsFixme',
},
hack = {
pattern = '%f[%w]()HACK:?%s*()%f[%W]',
group = 'MiniHipatternsHack',
},
todo = {
pattern = '%f[%w]()NOTE:?%s*()%f[%W]',
group = 'MiniHipatternsTodo',
},
note = {
pattern = '%f[%w]()NOTE()%f[%W]',
group = 'MiniHipatternsNote',
},
bug = {
pattern = '%f[%w]()BUG:?%s*()%f[%W]',
group = 'MiniHipatternsBug',
},
perf = {
pattern = '%f[%w]()PERF:?%s*()%f[%W]',
group = 'MiniHipatternsPerf',
},
},
},
config = function(opts)
local hp = require 'mini.hipatterns' local hp = require 'mini.hipatterns'
hp.setup { hp.setup {
highlighters = opts.highlighters, highlighters = {
-- Highlight standalone 'FIXME', 'HACK', 'TODO', 'NOTE', 'BUG', 'PERF' words
fixme = {
pattern = '%f[%w]()FIXME:?%s*()%f[%W]',
group = 'MiniHipatternsFixme',
},
hack = {
pattern = '%f[%w]()HACK:?%s*()%f[%W]',
group = 'MiniHipatternsHack',
},
todo = {
pattern = '%f[%w]()TODO:?%s*()%f[%W]',
group = 'MiniHipatternsNote',
},
note = {
pattern = '%f[%w]()NOTE()%f[%W]',
group = 'MiniHipatternsNote',
},
bug = {
pattern = '%f[%w]()BUG:?%s*()%f[%W]',
group = 'MiniHipatternsHack',
},
perf = {
pattern = '%f[%w]()PERF:?%s*()%f[%W]',
group = 'MiniHipatternsNote',
},
},
-- Highlight hex color strings (`#rrggbb`) using that color -- Highlight hex color strings (`#rrggbb`) using that color
hex_color = hp.gen_highlighter.hex_color(), hex_color = hp.gen_highlighter.hex_color(),
} }
-- Icons
require('mini.icons').setup {
file = {
['.keep'] = { glyph = '󰊢', hl = 'MiniIconsGrey' },
['devcontainer.json'] = { glyph = '', hl = 'MiniIconsAzure' },
},
filetype = {
dotenv = { glyph = '', hl = 'MiniIconsYellow' },
},
}
-- Visualize and work with indent scope
-- Replaced lukas-reineke/indent-blankline.nvim
require('mini.indentscope').setup()
-- Jump to next/previous single character
require('mini.jump').setup {
mappings = {
forward = 'f',
backward = 'F',
forward_till = 't',
backward_till = 'T',
repeat_jump = ';',
},
}
-- Move lines and blocks of text
require('mini.move').setup()
-- Text edit operators
-- g= - Evaluate text and replace with output
-- gx - Exchange text regions
-- gm - Multiply (duplicate) text
-- gr - Replace text with register
-- gs - Sort text
require('mini.operators').setup()
-- Session management (read, write, delete)
require('mini.sessions').setup {
autowrite = true,
directory = vim.g.sessions_dir or vim.fn.stdpath 'data' .. '/sessions',
file = '',
}
-- Split and join arguments, lists, and other sequences
-- Replaced Wansmer/treesj
require('mini.splitjoin').setup()
-- Fast and flexible start screen
-- Replaced glepnir/dashboard-nvim
local starter = require 'mini.starter'
starter.setup {
items = {
starter.sections.telescope(),
starter.sections.builtin_actions(),
starter.sections.sessions(5, true),
},
content_hooks = {
starter.gen_hook.adding_bullet(),
starter.gen_hook.indexing('all', { 'Builtin actions' }),
starter.gen_hook.aligning('center', 'center'),
},
}
-- Minimal and fast statusline module with opinionated default look
-- Replaced nvim-lualine/lualine.nvim
local sl = require 'mini.statusline'
sl.setup {
use_icons = true,
set_vim_settings = true,
content = {
active = function()
local mode, mode_hl = sl.section_mode { trunc_width = 120 }
local git = sl.section_git { trunc_width = 75 }
local diagnostics = sl.section_diagnostics { trunc_width = 75 }
local filename = sl.section_filename { trunc_width = 9999 }
local fileinfo = sl.section_fileinfo { trunc_width = 120 }
local location = sl.section_location { trunc_width = 75 }
return sl.combine_groups {
{ hl = mode_hl, strings = { mode } },
{ hl = 'statuslineDevinfo', strings = { git, diagnostics } },
'%<', -- Mark general truncate point
{ hl = 'statuslineFilename', strings = { filename } },
'%=', -- End left alignment
{ hl = 'statuslineFileinfo', strings = { fileinfo } },
{ hl = mode_hl, strings = { location } },
}
end,
},
}
-- Fast and feature-rich surround actions
-- Replaced kylechui/nvim-surround
-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren
-- - sd' - [S]urround [D]elete [']quotes
-- - sr)' - [S]urround [R]eplace [)] [']
require('mini.surround').setup()
-- Work with trailing whitespace
require('mini.trailspace').setup()
end, end,
}, },
-- Icons
{
'echasnovski/mini.icons',
opts = {
file = {
['.keep'] = { glyph = '󰊢', hl = 'MiniIconsGrey' },
['devcontainer.json'] = { glyph = '', hl = 'MiniIconsAzure' },
},
filetype = {
dotenv = { glyph = '', hl = 'MiniIconsYellow' },
},
},
},
-- Visualize and work with indent scope
-- Replaced lukas-reineke/indent-blankline.nvim
{ 'echasnovski/mini.indentscope', version = '*', opts = {} },
-- Jump to next/previous single character
{
'echasnovski/mini.jump',
version = '*',
opts = {
mappings = {
forward = 'f',
backward = 'F',
forward_till = 't',
backward_till = 'T',
repeat_jump = ';',
},
},
},
-- Move lines and blocks of text
{ 'echasnovski/mini.move', version = '*', opts = {} },
-- Text edit operators
{ 'echasnovski/mini.operators', version = '*', opts = {} },
-- Session management (read, write, delete)
{ 'echasnovski/mini.sessions', version = '*', opts = {} },
-- Split and join arguments, lists, and other sequences
-- Replaced Wansmer/treesj
{ 'echasnovski/mini.splitjoin', version = '*', opts = {} },
-- Fast and flexible start screen
-- Replaced glepnir/dashboard-nvim
{ 'echasnovski/mini.starter', version = '*', opts = {} },
-- Minimal and fast statusline module with opinionated default look
-- Replaced nvim-lualine/lualine.nvim
{
'echasnovski/mini.statusline',
version = '*',
opts = {
use_icons = true,
set_vim_settings = true,
content = {
active = function()
local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 })
local git = MiniStatusline.section_git({ trunc_width = 75 })
local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 })
local filename = MiniStatusline.section_filename({ trunc_width = 50 })
-- local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 })
local location = MiniStatusline.section_location({ trunc_width = 75 })
return MiniStatusline.combine_groups({
{ hl = mode_hl, strings = { mode } },
{ hl = 'MiniStatuslineDevinfo', strings = { git, diagnostics } },
'%<', -- Mark general truncate point
{ hl = 'MiniStatuslineFilename', strings = { filename } },
'%=', -- End left alignment
-- { hl = 'MiniStatuslineFileinfo', strings = { fileinfo } },
{ hl = mode_hl, strings = { location } },
})
end,
},
}
},
-- Fast and feature-rich surround actions
-- Replaced kylechui/nvim-surround
{ 'echasnovski/mini.surround', version = '*', opts = {} },
-- Work with trailing whitespace
{ 'echasnovski/mini.trailspace', version = '*', opts = {} },
} }

View File

@@ -1,8 +0,0 @@
-- A better annotation generator.
-- Supports multiple languages and annotation conventions.
-- https://github.com/danymat/neogen
return {
'danymat/neogen',
version = '*',
opts = { enabled = true, snippet_engine = 'luasnip' },
}

View File

@@ -31,6 +31,24 @@ return {
cmd = 'Neotree', cmd = 'Neotree',
opts = { opts = {
close_if_last_window = true, close_if_last_window = true,
popup_border_style = 'rounded',
enable_git_status = true,
enable_diagnostics = true,
git_status = {
symbols = {
-- Change type
added = '',
modified = '',
deleted = '',
renamed = '󰁕',
-- Status type
untracked = '',
ignored = '',
unstaged = '󰄱',
staged = '',
conflict = '',
},
},
filesystem = { filesystem = {
window = { window = {
mappings = { mappings = {
@@ -42,8 +60,10 @@ return {
hide_dotfiles = true, hide_dotfiles = true,
hide_gitignored = true, hide_gitignored = true,
hide_hidden = true, -- only works on Windows for hidden files/directories hide_hidden = true, -- only works on Windows for hidden files/directories
hide_by_name = { never_show = {
'.DS_Store', '.DS_Store',
},
hide_by_name = {
'node_modules', 'node_modules',
}, },
always_show = { always_show = {
@@ -85,6 +105,7 @@ return {
'.*rc.*', '.*rc.*',
'.env*', '.env*',
'.prettierrc*', '.prettierrc*',
'.markdownlint*',
'.stylua.*', '.stylua.*',
}, },
}, },

View File

@@ -0,0 +1,24 @@
return {
{
'rmagatti/auto-session',
lazy = false,
version = '*',
---@module "auto-session"
---@type AutoSession.Config
opts = {
suppressed_dirs = {
'/',
'~/',
'~/Downloads',
'~/Library',
},
-- log_level = 'debug',
},
},
{
'nvim-lua/plenary.nvim',
version = '*',
lazy = false,
},
}

View File

@@ -8,6 +8,9 @@ return {
{ 'nvim-lua/plenary.nvim' }, { 'nvim-lua/plenary.nvim' },
{ 'nvim-telescope/telescope-symbols.nvim' }, { 'nvim-telescope/telescope-symbols.nvim' },
-- Telescope plugin for file browsing
{ 'nvim-telescope/telescope-file-browser.nvim' },
-- A Telescope picker to quickly access configurations -- A Telescope picker to quickly access configurations
-- of plugins managed by lazy.nvim. -- of plugins managed by lazy.nvim.
-- https://github.com/polirritmico/telescope-lazy-plugins.nvim -- https://github.com/polirritmico/telescope-lazy-plugins.nvim

View File

@@ -14,7 +14,7 @@ return {
}, },
---@type TSConfig ---@type TSConfig
opts = { opts = {
auto_install = true, -- Auto install the parser generators auto_install = true, -- Auto install the parser generators
sync_install = false, -- Sync install the parser generators, install async sync_install = false, -- Sync install the parser generators, install async
-- Add languages to be installed here that you want installed for treesitter -- Add languages to be installed here that you want installed for treesitter
@@ -49,18 +49,18 @@ return {
config = function(_, opts) config = function(_, opts)
require('nvim-treesitter.configs').setup(opts) require('nvim-treesitter.configs').setup(opts)
vim.api.nvim_create_autocmd({ "FileType" }, { vim.api.nvim_create_autocmd({ 'FileType' }, {
callback = function() callback = function()
-- Set foldmethod to treesitter if available -- Set foldmethod to treesitter if available
if require("nvim-treesitter.parsers").has_parser() then if require('nvim-treesitter.parsers').has_parser() then
vim.opt.foldmethod = "expr" vim.opt.foldmethod = 'expr'
vim.opt.foldexpr = "nvim_treesitter#foldexpr()" vim.opt.foldexpr = 'nvim_treesitter#foldexpr()'
else else
-- Otherwise, set foldmethod to syntax -- Otherwise, set foldmethod to syntax
vim.opt.foldmethod = "syntax" vim.opt.foldmethod = 'syntax'
end end
vim.opt.foldlevel = 9 -- Open all folds by default vim.opt.foldlevel = 9 -- Open all folds by default
vim.opt.foldnestmax = 99 -- Maximum fold nesting vim.opt.foldnestmax = 99 -- Maximum fold nesting
end, end,
}) })

View File

@@ -33,77 +33,13 @@ return {
-- Remove all background colors to make nvim transparent -- Remove all background colors to make nvim transparent
-- https://github.com/xiyaowong/nvim-transparent -- https://github.com/xiyaowong/nvim-transparent
{ 'xiyaowong/nvim-transparent', opts = {} }, { 'xiyaowong/nvim-transparent', opts = {} },
-- Display a character as the colorcolumn -- Display a character as the colorcolumn
-- https://github.com/lukas-reineke/virt-column.nvim -- https://github.com/lukas-reineke/virt-column.nvim
{ 'lukas-reineke/virt-column.nvim', opts = {} }, { 'lukas-reineke/virt-column.nvim', opts = {} },
-- Cloak allows you to overlay *'s over defined patterns in defined files.
-- https://github.com/laytan/cloak.nvim
{
'laytan/cloak.nvim',
version = '*',
opts = {
enabled = true,
cloak_character = '*',
-- The applied highlight group (colors) on the cloaking, see `:h highlight`.
highlight_group = 'Comment',
patterns = {
{
-- Match any file starting with ".env".
-- This can be a table to match multiple file patterns.
file_pattern = {
'.env*',
'wrangler.toml',
'.dev.vars',
},
-- Match an equals sign and any character after it.
-- This can also be a table of patterns to cloak,
-- example: cloak_pattern = { ":.+", "-.+" } for yaml files.
cloak_pattern = '=.+',
},
},
},
},
-- Neovim plugin for locking a buffer to a window -- Neovim plugin for locking a buffer to a window
-- https://github.com/stevearc/stickybuf.nvim -- https://github.com/stevearc/stickybuf.nvim
{ 'stevearc/stickybuf.nvim', opts = {} }, { 'stevearc/stickybuf.nvim', opts = {} },
-- Describe the regexp under the cursor
-- https://github.com/bennypowers/nvim-regexplainer
{
'bennypowers/nvim-regexplainer',
event = 'BufEnter',
dependencies = {
'nvim-treesitter/nvim-treesitter',
'MunifTanjim/nui.nvim',
},
opts = {
-- automatically show the explainer when the cursor enters a regexp
auto = true,
},
},
-- Clarify and beautify your comments using boxes and lines.
-- https://github.com/LudoPinelli/comment-box.nvim
{
'LudoPinelli/comment-box.nvim',
event = 'BufEnter',
opts = {}
},
-- Plugin to improve viewing Markdown files in Neovim
-- https://github.com/MeanderingProgrammer/render-markdown.nvim
{
'MeanderingProgrammer/render-markdown.nvim',
event = 'BufEnter',
dependencies = {
'nvim-treesitter/nvim-treesitter',
'nvim-tree/nvim-web-devicons',
},
ft = 'markdown',
opts = {},
},
} }

82
config/nvim/lua/utils.lua Normal file
View File

@@ -0,0 +1,82 @@
-- These are my utility functions
-- I use to make my life bit easier
-- ╭─────────────────────────────────────────────────────────╮
-- │ Function shortcuts for keymap set │
-- ╰─────────────────────────────────────────────────────────╯
-- Keymap set shortcut
--@type vim.keymap.set
local s = vim.keymap.set
-- Keymap shortcut functions
K = {}
-- Handle description
---@param desc string|table? Optional description. Can be a string or a table.
---@return table -- The description as a table.
local function handleDesc(desc)
if type(desc) == 'string' then
-- Convert string to table with `desc` as a key
-- If the string is empty, just return as an empty description
return { desc = desc }
elseif type(desc) == 'table' then
-- If desc doesn't have 'desc' key, combine it with
-- others with empty description
if not desc.desc then
desc.desc = '?'
return desc
end
-- Use the table as is
return desc
else
-- Default to an empty table if `desc` is nil or an unsupported type
return { desc = '?' }
end
end
-- Normal mode keymaps
---@param key string rhs, required
---@param cmd string|function lhs, required
---@param opts table? Options, optional
K.n = function(key, cmd, opts)
opts = handleDesc(opts or {})
s('n', key, cmd, opts)
end
-- Leader keymap shortcut function
-- It prepends '<leader>' to the key
---@param key string rhs, required, but will be prepended with '<leader>'
---@param cmd string|function lhs, required
---@param opts table|string? Options (or just description), optional
K.nl = function(key, cmd, opts)
opts = handleDesc(opts)
K.n('<leader>' .. key, cmd, opts)
end
-- Keymap shortcut function with mode defined, good for sorting by rhs
---@param key string rhs, required
---@param mode string|string[] one of n, v, x, or table of modes { 'n', 'v' }
---@param cmd string|function lhs, required
---@param opts string|table description, required
K.d = function(key, mode, cmd, opts)
opts = handleDesc(opts or {})
s(mode, key, cmd, opts)
end
-- Leader based keymap shortcut function with mode defined
---@param key string rhs, required, but will be prepended with '<leader>'
---@param mode string|string[] one of n, v, x, or table of modes { 'n', 'v' }
---@param cmd string|function lhs, required
---@param opts string|table description (or opts), required
K.ld = function(key, mode, cmd, opts)
opts = handleDesc(opts or {})
s(mode, '<leader>' .. key, cmd, opts)
end
-- ╭─────────────────────────────────────────────────────────╮
-- │ Options related helper functions │
-- ╰─────────────────────────────────────────────────────────╯
-- Toggle background between light and dark
function ToggleBackground() vim.o.bg = vim.o.bg == 'light' and 'dark' or 'light' end

View File

@@ -42,7 +42,7 @@ if ! declare -f msg > /dev/null; then
# $1 - message (string) # $1 - message (string)
msg() msg()
{ {
[ "$VERBOSE" -eq 1 ] && echo "$1" [ "$VERBOSE" -eq 1 ] && msgr msg "$1"
return 0 return 0
} }
msg "msg was not defined, defined it now" msg "msg was not defined, defined it now"
@@ -54,7 +54,7 @@ if ! declare -f msg_err > /dev/null; then
# $1 - error message (string) # $1 - error message (string)
msg_err() msg_err()
{ {
echo "(!) ERROR: $1" >&2 msgr err "$1" >&2
exit 1 exit 1
} }
fi fi
@@ -65,7 +65,7 @@ if ! declare -f msg_done > /dev/null; then
# $1 - message (string) # $1 - message (string)
msg_done() msg_done()
{ {
echo "$1" msgr done "$1"
return 0 return 0
} }
fi fi
@@ -76,7 +76,7 @@ if ! declare -f msg_run > /dev/null; then
# $1 - message (string) # $1 - message (string)
msg_run() msg_run()
{ {
echo "$1" msgr run "$1"
return 0 return 0
} }
fi fi
@@ -87,10 +87,29 @@ if ! declare -f msg_ok > /dev/null; then
# $1 - message (string) # $1 - message (string)
msg_ok() msg_ok()
{ {
echo "$1" msgr ok "$1"
return 0 return 0
} }
fi fi
if ! declare -f array_diff > /dev/null; then
# Function to compare two arrays and return the difference
# Example: array_diff DIFFERENCE ARRAY1 ARRAY2
# $1 - variable to store the difference
# $2 - first array
# $3 - second array
# Output to $1 the difference between $2 and $3
# Source: https://stackoverflow.com/a/42399479/594940
array_diff()
{
# shellcheck disable=SC1083,SC2086
eval local ARR1=\(\"\${$2[@]}\"\)
# shellcheck disable=SC1083,SC2086
eval local ARR2=\(\"\${$3[@]}\"\)
local IFS=$'\n'
mapfile -t "$1" < <(comm -23 <(echo "${ARR1[*]}" | sort) <(echo "${ARR2[*]}" | sort))
}
fi
source "$DOTFILES/config/exports" source "$DOTFILES/config/exports"
source "$DOTFILES/config/alias" source "$DOTFILES/config/alias"

View File

@@ -0,0 +1 @@
https://wfxr.mit-license.org/2018

View File

@@ -0,0 +1,64 @@
#!/usr/bin/env bash
#===============================================================================
# Author: Wenxuan
# Email: wenxuangm@gmail.com
# Created: 2018-04-06 12:12
#===============================================================================
get_fzf_options()
{
local fzf_options
local fzf_default_options='-w 100% -h 50% --multi -0 --no-preview'
fzf_options="$(tmux show -gqv '@fzf-url-fzf-options')"
[ -n "$fzf_options" ] && echo "$fzf_options" || echo "$fzf_default_options"
}
fzf_filter()
{
eval "fzf-tmux $(get_fzf_options)"
}
custom_open=$3
open_url()
{
if [[ -n $custom_open ]]; then
$custom_open "$@"
elif hash xdg-open &> /dev/null; then
nohup xdg-open "$@"
elif hash open &> /dev/null; then
nohup open "$@"
elif [[ -n $BROWSER ]]; then
nohup "$BROWSER" "$@"
fi
}
limit='screen'
[[ $# -ge 2 ]] && limit=$2
if [[ $limit == 'screen' ]]; then
content="$(tmux capture-pane -J -p -e | sed -r 's/\x1B\[[0-9;]*[mK]//g'))"
else
content="$(tmux capture-pane -J -p -e -S -"$limit" | sed -r 's/\x1B\[[0-9;]*[mK]//g'))"
fi
urls=$(echo "$content" | grep -oE '(https?|ftp|file):/?//[-A-Za-z0-9+&@#/%?=~_|!:,.;]*[-A-Za-z0-9+&@#/%=~_|]')
wwws=$(echo "$content" | grep -oE '(http?s://)?www\.[a-zA-Z](-?[a-zA-Z0-9])+\.[a-zA-Z]{2,}(/\S+)*' | grep -vE '^https?://' | sed 's/^\(.*\)$/http:\/\/\1/')
ips=$(echo "$content" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(:[0-9]{1,5})?(/\S+)*' | sed 's/^\(.*\)$/http:\/\/\1/')
gits=$(echo "$content" | grep -oE '(ssh://)?git@\S*' | sed 's/:/\//g' | sed 's/^\(ssh\/\/\/\)\{0,1\}git@\(.*\)$/https:\/\/\2/')
gh=$(echo "$content" | grep -oE "['\"]([_A-Za-z0-9-]*/[_.A-Za-z0-9-]*)['\"]" | sed "s/['\"]//g" | sed 's#.#https://github.com/&#')
if [[ $# -ge 1 && $1 != '' ]]; then
extras=$(echo "$content" | eval "$1")
fi
items=$(
printf '%s\n' "${urls[@]}" "${wwws[@]}" "${gh[@]}" "${ips[@]}" "${gits[@]}" "${extras[@]}" \
| grep -v '^$' \
| sort -u \
| nl -w3 -s ' '
)
[ -z "$items" ] && tmux display 'tmux-fzf-url: no URLs found' && exit
fzf_filter <<< "$items" | awk '{print $2}' \
| while read -r chosen; do
open_url "$chosen" &> "/tmp/tmux-$(id -u)-fzf-url.log"
done

View File

@@ -0,0 +1,23 @@
#!/usr/bin/env bash
#===============================================================================
# Author: Wenxuan
# Email: wenxuangm@gmail.com
# Created: 2018-04-06 09:30
#===============================================================================
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# $1: option
# $2: default value
tmux_get() {
local value
value="$(tmux show -gqv "$1")"
[ -n "$value" ] && echo "$value" || echo "$2"
}
key="$(tmux_get '@fzf-url-bind' 'u')"
history_limit="$(tmux_get '@fzf-url-history-limit' 'screen')"
extra_filter="$(tmux_get '@fzf-url-extra-filter' '')"
custom_open="$(tmux_get '@fzf-url-open' '')"
echo "$extra_filter" >/tmp/filter
tmux bind-key "$key" run -b "$SCRIPT_DIR/fzf-url.sh '$extra_filter' $history_limit '$custom_open'"

View File

@@ -147,7 +147,7 @@ set -g @tmux_window_name_max_name_len "20"
set -g @tmux_window_name_use_tilde "True" set -g @tmux_window_name_use_tilde "True"
set -g @tmux_window_name_shells "['bash', 'fish', 'sh', 'zsh', 'oh-my-posh']" set -g @tmux_window_name_shells "['bash', 'fish', 'sh', 'zsh', 'oh-my-posh']"
set -g @tmux_window_dir_programs "['nvim', 'vim', 'vi', 'git']" set -g @tmux_window_dir_programs "['nvim', 'vim', 'vi', 'git']"
set -g @tmux_window_name_ignored_programs "['sqlite3', 'oh-my-posh', 'antidot', 'antidote', 'direnv']" # Default is [] set -g @tmux_window_name_ignored_programs "['sqlite3', 'oh-my-posh', 'antidot', 'antidote', 'direnv', 'md5']" # Default is []
set -g @tmux_window_name_substitute_sets "[('.+ipython2', 'ipython2'), ('.+ipython3', 'ipython3'), ('.+\.local', '.local'), ('.+asdf', 'asdf')]" set -g @tmux_window_name_substitute_sets "[('.+ipython2', 'ipython2'), ('.+ipython3', 'ipython3'), ('.+\.local', '.local'), ('.+asdf', 'asdf')]"
## https://github.com/tmux-plugins/tmux-continuum ## https://github.com/tmux-plugins/tmux-continuum
@@ -159,6 +159,10 @@ set -g @mode_indicator_copy_mode_style 'bg=default,fg=yellow'
set -g @mode_indicator_empty_mode_style 'bg=default,fg=#7aa2f7' set -g @mode_indicator_empty_mode_style 'bg=default,fg=#7aa2f7'
set -g @mode_indicator_sync_mode_style 'bg=default,fg=red' set -g @mode_indicator_sync_mode_style 'bg=default,fg=red'
# https://github.com/wfxr/tmux-fzf-url
set -g @fzf-url-bind 'u'
set -g @fzf-url-history-limit '2000'
# ╭──────────────────────────────────────────────────────────╮ # ╭──────────────────────────────────────────────────────────╮
# │ Plugins │ # │ Plugins │
# ╰──────────────────────────────────────────────────────────╯ # ╰──────────────────────────────────────────────────────────╯
@@ -172,7 +176,7 @@ run-shell ~/.dotfiles/config/tmux/plugins/tmux-suspend/suspend.tmux
run-shell ~/.dotfiles/config/tmux/plugins/tmux-yank/yank.tmux run-shell ~/.dotfiles/config/tmux/plugins/tmux-yank/yank.tmux
run-shell ~/.dotfiles/config/tmux/plugins/tmux-current-pane-hostname/current_pane_hostname.tmux run-shell ~/.dotfiles/config/tmux/plugins/tmux-current-pane-hostname/current_pane_hostname.tmux
run-shell ~/.dotfiles/config/tmux/plugins/tmux-dark-notify/main.tmux run-shell ~/.dotfiles/config/tmux/plugins/tmux-dark-notify/main.tmux
run-shell ~/.dotfiles/config/tmux/plugins/tmux-fzf-url/fzf-url.tmux
if-shell "test -e $HOME/.local/state/tmux/tmux-dark-notify-theme.conf" \ if-shell "test -e $HOME/.local/state/tmux/tmux-dark-notify-theme.conf" \
"source-file $HOME/.local/state/tmux/tmux-dark-notify-theme.conf" "source-file $HOME/.local/state/tmux/tmux-dark-notify-theme.conf"

57
config/zed/settings.json Normal file
View File

@@ -0,0 +1,57 @@
{
"formatter": {
"external": {
"command": "node_modules/.bin/prettier",
"arguments": [
"--stdin-filepath",
"{buffer_path}"
]
}
},
"languages": {
"Lua": {
"enable_language_server": true,
"tab_size": 2
}
},
"lsp": {
"gopls": {
"initialization_options": {
"hints": {
"assignVariableTypes": true,
"compositeLiteralFields": true,
"compositeLiteralTypes": true,
"constantValues": true,
"functionTypeParameters": true,
"parameterNames": true,
"rangeVariableTypes": true
}
}
}
},
"preferred_line_length": 100,
"format_on_save": "on",
"vim_mode": true,
"theme": {
"mode": "system",
"light": "Tokyo Night Light",
"dark": "Tokyo Night Storm"
},
"inlay_hints": {
"enabled": true,
"show_type_hints": true,
"show_parameter_hints": true,
"show_other_hints": true
},
"ui_font_size": 16,
"buffer_font_size": 16,
"buffer_font_fallbacks": [
"JetBrainsMono Nerd Font"
],
"inline_completions": {
"disabled_globs": [
".env"
]
},
"hour_format": "hour24"
}

View File

@@ -10,9 +10,11 @@ zsh-users/zsh-completions kind:fpath path:src
getantidote/use-omz # handle OMZ dependencies getantidote/use-omz # handle OMZ dependencies
ohmyzsh/ohmyzsh path:lib # load OMZ's library ohmyzsh/ohmyzsh path:lib # load OMZ's library
# Use pure prompt # Theme
mafredri/zsh-async # mafredri/zsh-async # for pure
sindresorhus/pure # sindresorhus/pure # pure itself
romkatv/powerlevel10k
ohmyzsh/ohmyzsh path:plugins/colored-man-pages ohmyzsh/ohmyzsh path:plugins/colored-man-pages
ohmyzsh/ohmyzsh path:plugins/brew ohmyzsh/ohmyzsh path:plugins/brew

170
config/zsh/completion/_dfm Normal file
View File

@@ -0,0 +1,170 @@
#compdef dfm
# Completion for dfm, the dotfiles manager
_dfm_get_script_description() {
local file="$1"
sed -n '/@description/s/.*@description *\(.*\)/\1/p' "$file" | head -1
}
_dfm_get_available_scripts() {
local scripts=()
local dotfiles="${HOME}/.dotfiles"
for script in "${dotfiles}/scripts/install-"*.sh; do
if [ -f "$script" ]; then
local name=$(basename "$script" .sh | sed 's/install-//')
local desc=$(_dfm_get_script_description "$script")
[ -z "$desc" ] && desc="No description available"
scripts+=("${name}:${desc}")
fi
done
echo ${(F)scripts}
}
_dfm()
{
local -a commands sections
sections=(
'install:Installation commands'
'asdf:ASDF version manager commands'
'brew:Homebrew package manager commands'
'check:System check commands'
'dotfiles:Dotfiles management commands'
'docs:Documentation commands'
'helpers:Helper utilities'
'scripts:Installation scripts'
'tests:Test commands'
)
_arguments -C \
"1: :->sections" \
"*::arg:->args"
case "$state" in
sections)
_describe 'sections' sections
;;
args)
case $line[1] in
install)
local -a install_cmds
install_cmds=(
'all:Install everything in correct order'
'cargo:Install rust/cargo packages'
'cheat-databases:Install cheat external cheatsheet databases'
'composer:Install composer'
'fonts:Install programming fonts'
'gh:Install GitHub CLI Extensions'
'go:Install Go Packages'
'imagick:Install ImageMagick CLI'
'macos:Setup nice macOS defaults'
'nvm:Install Node Version Manager'
'nvm-latest:Install latest LTS node'
'npm-packages:Install NPM Packages'
'ntfy:Install ntfy'
'z:Install z'
)
_describe 'install commands' install_cmds
;;
asdf)
local -a asdf_cmds
asdf_cmds=(
'current:Show current versions'
'global:Show global versions'
'installed:Show installed versions'
'plugins-update:Update all plugins'
'plugins-install:Install plugins from configuration'
'plugins-remove:Remove installed plugins'
'reset:Reset plugins'
'fix-tool-versions:Remove uninstalled plugins from .tool-versions'
'versions:Show versions'
'where:Show where'
'which:Show which'
)
_describe 'asdf commands' asdf_cmds
;;
brew)
local -a brew_cmds
brew_cmds=(
'install:Install items from Brewfile'
'update:Update and upgrade packages'
'updatebundle:Update Brewfile with descriptions'
'autoupdate:Setup brew auto-update'
'leaves:List brew leaves'
'clean:Clean up packages'
'untracked:List untracked packages'
)
_describe 'brew commands' brew_cmds
;;
check)
local -a check_cmds
check_cmds=(
'arch:Check architecture'
'host:Check hostname'
)
_describe 'check commands' check_cmds
;;
dotfiles)
local -a dotfiles_cmds
dotfiles_cmds=(
'fmt:Run all formatters'
'yamlfmt:Run yamlfmt'
'shfmt:Run shfmt'
'reset_all:Reset everything'
'reset_nvim:Reset neovim'
)
_describe 'dotfiles commands' dotfiles_cmds
;;
docs)
local -a docs_cmds
docs_cmds=(
'all:Update all documentation'
'tmux:Update tmux documentation'
'nvim:Update nvim documentation'
'wezterm:Update wezterm documentation'
)
_describe 'docs commands' docs_cmds
;;
helpers)
local -a helpers_cmds
helpers_cmds=(
'aliases:Show aliases'
'colors:Show colors'
'env:Show environment variables'
'functions:Show functions'
'nvim:Show nvim keybindings'
'path:Show PATH'
'tmux:Show tmux keybindings'
'wezterm:Show wezterm keybindings'
)
_describe 'helper commands' helpers_cmds
;;
scripts)
local -a script_cmds
script_cmds=("${(@f)$(_dfm_get_available_scripts)}")
_describe 'available scripts' script_cmds
;;
tests)
local -a test_cmds
test_cmds=(
'msg:List log functions'
'params:List parameters'
)
_describe 'test commands' test_cmds
;;
esac
;;
esac
}
_dfm "$@"

205
config/zsh/p10k.zsh Normal file
View File

@@ -0,0 +1,205 @@
# shellcheck disable=SC1073,SC1072
#
# Generated by Powerlevel10k configuration wizard on 2024-12-10 at 10:05 EET.
# Based on romkatv/powerlevel10k/config/p10k-pure.zsh, checksum 7533.
# Wizard options: nerdfont-v3 + powerline, small icons, pure, original, 2 lines, sparse,
# transient_prompt, instant_prompt=verbose.
# Type `p10k configure` to generate another config.
#
# Config file for Powerlevel10k with the style of Pure (https://github.com/sindresorhus/pure).
#
# Differences from Pure:
#
# - Git:
# - `@c4d3ec2c` instead of something like `v1.4.0~11` when in detached HEAD state.
# - No automatic `git fetch` (the same as in Pure with `PURE_GIT_PULL=0`).
#
# Apart from the differences listed above, the replication of Pure prompt is exact. This includes
# even the questionable parts. For example, just like in Pure, there is no indication of Git status
# being stale; prompt symbol is the same in command, visual and overwrite vi modes; when prompt
# doesn't fit on one line, it wraps around with no attempt to shorten it.
#
# If you like the general style of Pure but not particularly attached to all its quirks, type
# `p10k configure` and pick "Lean" style. This will give you slick minimalist prompt while taking
# advantage of Powerlevel10k features that aren't present in Pure.
# Temporarily change options.
'builtin' 'local' '-a' 'p10k_config_opts'
[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases')
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
() {
emulate -L zsh -o extended_glob
# Unset all configuration options.
unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR'
# Zsh >= 5.1 is required.
[[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return
# Prompt colors.
local grey='242'
local red='1'
local yellow='3'
local blue='33'
local magenta='5'
local cyan='6'
local white='7'
local green='2'
# Left prompt segments.
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
context # user@host
dir # current directory
vcs # git status
# command_execution_time # previous command duration
go
nvm
aws
# =========================[ Line #2 ]=========================
newline # \n
virtualenv # python virtual environment
prompt_char # prompt symbol
)
# Right prompt segments.
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
# =========================[ Line #1 ]=========================
# command_execution_time # previous command duration
# virtualenv # python virtual environment
# context # user@host
# time # current time
# =========================[ Line #2 ]=========================
newline # \n
)
# Basic style options that define the overall prompt look.
typeset -g POWERLEVEL9K_BACKGROUND= # transparent background
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol
typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons
# Add an empty line before each prompt except the first. This doesn't emulate the bug
# in Pure that makes prompt drift down whenever you use the Alt-C binding from fzf or similar.
typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
# Magenta prompt symbol if the last command succeeded.
typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=$green
# Red prompt symbol if the last command failed.
typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=$red
# Default prompt symbol.
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='➜'
# Prompt symbol in command vi mode.
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='←'
# Prompt symbol in visual vi mode is the same as in command mode.
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='←'
# Prompt symbol in overwrite vi mode is the same as in command mode.
typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false
# Grey Python Virtual Environment.
typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=$grey
# Don't show Python version.
typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false
typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=
# Blue current directory.
typeset -g POWERLEVEL9K_DIR_FOREGROUND=$blue
# Context format when root: user@host. The first part red, the rest green.
typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE="%F{$red}%n%f%F{$green}@%m%f"
# Context format when not root: host. The host is green.
typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE="%F{$green}%m%f"
# Don't show context unless root or in SSH.
# typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION=
# Show previous command duration only if it's >= 86400s = 24h.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=86400
# Don't show fractional seconds. Thus, 7s rather than 7.3s.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
# Duration format: 1d 2h 3m 4s.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s'
# Yellow previous command duration.
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$yellow
# Grey Git prompt. This makes stale prompts indistinguishable from up-to-date ones.
typeset -g POWERLEVEL9K_VCS_FOREGROUND=$grey
# Disable async loading indicator to make directories that aren't Git repositories
# indistinguishable from large Git repositories without known state.
typeset -g POWERLEVEL9K_VCS_LOADING_TEXT=
# Don't wait for Git status even for a millisecond, so that prompt always updates
# asynchronously when Git state changes.
typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0
# Cyan ahead/behind arrows.
typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=$cyan
# Don't show remote branch, current tag or stashes.
typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind)
# Don't show the branch icon.
typeset -g POWERLEVEL9K_VCS_BRANCH_ICON=
# When in detached HEAD state, show @commit where branch normally goes.
typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@'
# Don't show staged, unstaged, untracked indicators.
typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON=
# Show '*' when there are staged, unstaged or untracked files.
typeset -g POWERLEVEL9K_VCS_DIRTY_ICON=':'
# Show '⇣' if local branch is behind remote.
typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON=':⇣'
# Show '⇡' if local branch is ahead of remote.
typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON=':⇡'
# Don't show the number of commits next to the ahead/behind arrows.
typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1
# Remove space between '⇣' and '⇡' and all trailing spaces.
typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${${${P9K_CONTENT/⇣* :⇡/⇣⇡}// }//:/ }'
# Grey current time.
typeset -g POWERLEVEL9K_TIME_FOREGROUND=$grey
# Format for the current time: 09:51:02. See `man 3 strftime`.
typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}'
# If set to true, time will update when you hit enter. This way prompts for the past
# commands will contain the start times of their commands rather than the end times of
# their preceding commands.
typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false
# Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt
# when accepting a command line. Supported values:
#
# - off: Don't change prompt when accepting a command line.
# - always: Trim down prompt when accepting a command line.
# - same-dir: Trim down prompt when accepting a command line unless this is the first command
# typed after changing current working directory.
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always
# Instant prompt mode.
#
# - off: Disable instant prompt. Choose this if you've tried instant prompt and found
# it incompatible with your zsh configuration files.
# - quiet: Enable instant prompt and don't print warnings when detecting console output
# during zsh initialization. Choose this if you've read and understood
# https://github.com/romkatv/powerlevel10k#instant-prompt.
# - verbose: Enable instant prompt and print a warning when detecting console output during
# zsh initialization. Choose this if you've never tried instant prompt, haven't
# seen the warning, or if you are unsure what this all means.
typeset -g POWERLEVEL9K_INSTANT_PROMPT=off
# Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized.
# For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload
# can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you
# really need it.
typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true
# If p10k is already loaded, reload configuration.
# This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true.
(( ! $+functions[p10k] )) || p10k reload
}
# Tell `p10k configure` which file it should overwrite.
typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a}
(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}
'builtin' 'unset' 'p10k_config_opts'

View File

@@ -2,62 +2,60 @@
```txt ```txt
x <Space> *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua x <Space> *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "<Space>" Query keys after "<Space>"
n <Space> *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n <Space> *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "<Space>" Query keys after "<Space>"
x " *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua x " *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after """ Query keys after """
n " *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n " *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after """ Query keys after """
x ' *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua x ' *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "'" Query keys after "'"
n ' *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n ' *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "'" Query keys after "'"
x ` *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua x ` *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "`" Query keys after "`"
n ` *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n ` *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "`" Query keys after "`"
x g *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua x g *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "g" Query keys after "g"
n g *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n g *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "g" Query keys after "g"
x z *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua x z *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "z" Query keys after "z"
n z *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n z *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "z" Query keys after "z"
n <C-W> *@~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n <C-W> *@~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Query keys after "<C-W>" Query keys after "<C-W>"
n <Esc><Esc> * :nohlsearch<CR> n <Esc><Esc> * :nohlsearch<CR>
Clear Search Highlighting Clear Search Highlighting
n <Space>qQ * :q!<CR> n <Space>qQ * ~/.config/nvim/lua/keymaps.lua
Force quit without saving Force quit without saving
n <Space>qw * :wq<CR> n <Space>qw * :wq<CR>
Write and quit Write and quit
n <Space>qq * :wq!<CR> n <Space>qq * ~/.config/nvim/lua/keymaps.lua
Quit with force saving Quit with force saving
n <Space>qf * :q<CR> n <Space>qf * :q<CR>
Quicker close split Quicker close split
n <Space>tn * :Noice dismiss<CR> n <Space>tn * :Noice dismiss<CR>
Noice: Dismiss Notification Noice: Dismiss Notification
n <Space>tl * :lua vim.o.bg = vim.o.bg:get() == "light" and "dark" or "light"<CR> n <Space>tl * ~/.config/nvim/lua/utils.lua
Toggle Light/Dark Mode Toggle Light/Dark Mode
n <Space>te * :Neotree toggle<CR> n <Space>te * :Neotree toggle<CR>
Toggle Neotree Toggle Neotree
n <Space>tc * :CloakToggle<CR> n <Space>tc * :CloakToggle<CR>
Cloak: Toggle Cloak: Toggle
n <Space>o * ~/.config/nvim/lua/keymaps.lua
Open repo in browser
n <Space>xx * :Trouble diagnostics<CR> n <Space>xx * :Trouble diagnostics<CR>
Trouble: Diagnostic Diagnostic
n <Space>xw * :Trouble workspace_diagnostics<CR> n <Space>xw * :Trouble workspace_diagnostics<CR>
Trouble: Workspace Diagnostics Workspace Diagnostics
n <Space>xq * :Trouble quickfix<CR> n <Space>xq * :Trouble quickfix<CR>
Trouble: Quickfix Quickfix
n <Space>xl * :Trouble loclist<CR> n <Space>xl * :Trouble loclist<CR>
Trouble: Location List Location List
n <Space>xd * :Trouble document_diagnostics<CR> n <Space>xd * :Trouble document_diagnostics<CR>
Trouble: Document Diagnostics Document Diagnostics
n <Space>sx * :Telescope import<CR> n <Space>sx * :Telescope import<CR>
Telescope: Import Telescope: Import
n <Space>sw * :Telescope grep_string<CR> n <Space>sw * :Telescope grep_string<CR>
@@ -76,8 +74,8 @@ n <Space>sl * :Telescope luasnip<CR>
Search LuaSnip Search LuaSnip
n <Space>sk * :Telescope keymaps<CR> n <Space>sk * :Telescope keymaps<CR>
Search Keymaps Search Keymaps
n <Space>sh * :Telescope highlights<CR> n <Space>sh * :Telescope help_tags<CR>
List Highlights Help tags
n <Space>sg * :Telescope live_grep<CR> n <Space>sg * :Telescope live_grep<CR>
Search by Grep Search by Grep
n <Space>sd * :Telescope diagnostics<CR> n <Space>sd * :Telescope diagnostics<CR>
@@ -122,10 +120,8 @@ n <Space>cl * :Lspsaga show_cursor_diagnostics<CR>
Cursor Diagnostics Cursor Diagnostics
n <Space>ci * :Lspsaga implement<CR> n <Space>ci * :Lspsaga implement<CR>
Implementations Implementations
x <Space>cf * :lua vim.lsp.buf.format()<CR> n <Space>cg * :lua require("neogen").generate()<CR>
Format Generate annotations
n <Space>cf * :lua vim.lsp.buf.format()<CR>
Format
n <Space>cd * :Lspsaga show_line_diagnostics<CR> n <Space>cd * :Lspsaga show_line_diagnostics<CR>
Line Diagnostics Line Diagnostics
n <Space>cco * :Lspsaga outgoing_calls<CR> n <Space>cco * :Lspsaga outgoing_calls<CR>
@@ -134,8 +130,6 @@ n <Space>cci * :Lspsaga incoming_calls<CR>
Incoming Calls Incoming Calls
n <Space>ca * :Lspsaga code_action<CR> n <Space>ca * :Lspsaga code_action<CR>
Code Action Code Action
n <Space>cg * :lua require("neogen").generate()<CR>
Generate annotations
n <Space>bw * :lua MiniBufremove.wipeout()<CR> n <Space>bw * :lua MiniBufremove.wipeout()<CR>
Wipeout Wipeout
n <Space>bl * :bnext<CR> n <Space>bl * :bnext<CR>
@@ -148,6 +142,34 @@ n <Space>bh * :bprev<CR>
Prev Prev
n <Space>bd * :lua MiniBufremove.delete()<CR> n <Space>bd * :lua MiniBufremove.delete()<CR>
Delete Delete
n <Space>ba * :%bd|e#|bd#<CR>
Close all except current
n <Space>o * ~/.config/nvim/lua/keymaps.lua
Open repo in browser
n <Space>tmw * <Cmd>setlocal wrap! wrap?<CR>
Toggle 'wrap'
n <Space>tms * <Cmd>setlocal spell! spell?<CR>
Toggle 'spell'
n <Space>tmr * <Cmd>setlocal relativenumber! relativenumber?<CR>
Toggle 'relativenumber'
n <Space>tmn * <Cmd>setlocal number! number?<CR>
Toggle 'number'
n <Space>tml * <Cmd>setlocal list! list?<CR>
Toggle 'list'
n <Space>tmi * <Cmd>setlocal ignorecase! ignorecase?<CR>
Toggle 'ignorecase'
n <Space>tmh * <Cmd>let v:hlsearch = 1 - v:hlsearch | echo (v:hlsearch ? " " : "no") . "hlsearch"<CR>
Toggle search highlight
n <Space>tmd * <Cmd>lua print(MiniBasics.toggle_diagnostic())<CR>
Toggle diagnostic
n <Space>tmC * <Cmd>setlocal cursorcolumn! cursorcolumn?<CR>
Toggle 'cursorcolumn'
n <Space>tmc * <Cmd>setlocal cursorline! cursorline?<CR>
Toggle 'cursorline'
n <Space>tmb * <Cmd>lua vim.o.bg = vim.o.bg == "dark" and "light" or "dark"; print(vim.o.bg)<CR>
Toggle 'background'
<Space>cf * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Format buffer
x # * vim/_defaults.lua x # * vim/_defaults.lua
:help v_#-default :help v_#-default
o % <Plug>(MatchitOperationForward) o % <Plug>(MatchitOperationForward)
@@ -157,7 +179,7 @@ n & * :&&<CR>
:help &-default :help &-default
x * * vim/_defaults.lua x * * vim/_defaults.lua
:help v_star-default :help v_star-default
o ; * ~/.local/share/nvim/lazy/mini.jump/lua/mini/jump.lua o ; * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua
Repeat jump Repeat jump
x ; * <Cmd>lua MiniJump.jump()<CR> x ; * <Cmd>lua MiniJump.jump()<CR>
Repeat jump Repeat jump
@@ -171,11 +193,11 @@ v > * >gv
Indent Right Indent Right
n > * >gv n > * >gv
Indent Right Indent Right
n @ * ~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n @ * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Execute macro without 'mini.clue' triggers Execute macro without 'mini.clue' triggers
x @ * mode() == 'V' ? ':normal! @'.getcharstr().'<CR>' : '@' x @ * mode() == 'V' ? ':normal! @'.getcharstr().'<CR>' : '@'
:help v_@-default :help v_@-default
o F * ~/.local/share/nvim/lazy/mini.jump/lua/mini/jump.lua o F * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua
Jump backward Jump backward
x F * <Cmd>lua MiniJump.smart_jump(true, false)<CR> x F * <Cmd>lua MiniJump.smart_jump(true, false)<CR>
Jump backward Jump backward
@@ -183,11 +205,11 @@ n F * <Cmd>lua MiniJump.smart_jump(true, false)<CR>
Jump backward Jump backward
n K * :Lspsaga hover_doc<CR> n K * :Lspsaga hover_doc<CR>
Hover Documentation Hover Documentation
n Q * ~/.local/share/nvim/lazy/mini.clue/lua/mini/clue.lua n Q * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/clue.lua
Execute macro without 'mini.clue' triggers Execute macro without 'mini.clue' triggers
x Q * mode() == 'V' ? ':normal! @<C-R>=reg_recorded()<CR><CR>' : 'Q' x Q * mode() == 'V' ? ':normal! @<C-R>=reg_recorded()<CR><CR>' : 'Q'
:help v_Q-default :help v_Q-default
o T * ~/.local/share/nvim/lazy/mini.jump/lua/mini/jump.lua o T * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua
Jump backward till Jump backward till
x T * <Cmd>lua MiniJump.smart_jump(true, true)<CR> x T * <Cmd>lua MiniJump.smart_jump(true, true)<CR>
Jump backward till Jump backward till
@@ -197,10 +219,10 @@ n Y * y$
:help Y-default :help Y-default
n Zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua n Zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash Treesitter Flash Treesitter
x Zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash Treesitter
o Zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua o Zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash Treesitter Flash Treesitter
x Zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash Treesitter
o [% <Plug>(MatchitOperationMultiBackward) o [% <Plug>(MatchitOperationMultiBackward)
x [% <Plug>(MatchitVisualMultiBackward) x [% <Plug>(MatchitVisualMultiBackward)
n [% <Plug>(MatchitNormalMultiBackward) n [% <Plug>(MatchitNormalMultiBackward)
@@ -252,7 +274,7 @@ o ai * <Cmd>lua MiniIndentscope.textobject(true)<CR>
Object scope with border Object scope with border
x ai * <Cmd>lua MiniIndentscope.textobject(true)<CR> x ai * <Cmd>lua MiniIndentscope.textobject(true)<CR>
Object scope with border Object scope with border
o f * ~/.local/share/nvim/lazy/mini.jump/lua/mini/jump.lua o f * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua
Jump forward Jump forward
x f * <Cmd>lua MiniJump.smart_jump(false, false)<CR> x f * <Cmd>lua MiniJump.smart_jump(false, false)<CR>
Jump forward Jump forward
@@ -263,16 +285,10 @@ n gR * :RegexplainerToggle<CR>
o g% <Plug>(MatchitOperationBackward) o g% <Plug>(MatchitOperationBackward)
x g% <Plug>(MatchitVisualBackward) x g% <Plug>(MatchitVisualBackward)
n g% <Plug>(MatchitNormalBackward) n g% <Plug>(MatchitNormalBackward)
o gh * <Cmd>lua MiniDiff.textobject()<CR> x gS * :<C-U>lua MiniSplitjoin.toggle({ region = MiniSplitjoin.get_visual_region() })<CR>
Hunk range textobject Toggle arguments
x gH * ~/.local/share/nvim/lazy/mini.diff/lua/mini/diff.lua n gS * v:lua.MiniSplitjoin.operator("toggle") . " "
Reset hunks Toggle arguments
n gH * ~/.local/share/nvim/lazy/mini.diff/lua/mini/diff.lua
Reset hunks
x gh * ~/.local/share/nvim/lazy/mini.diff/lua/mini/diff.lua
Apply hunks
n gh * ~/.local/share/nvim/lazy/mini.diff/lua/mini/diff.lua
Apply hunks
x gs * <Cmd>lua MiniOperators.sort('visual')<CR> x gs * <Cmd>lua MiniOperators.sort('visual')<CR>
Sort selection Sort selection
n gss ^gsg_ n gss ^gsg_
@@ -299,17 +315,39 @@ n g== g=_
Evaluate line Evaluate line
n g= * v:lua.MiniOperators.evaluate() n g= * v:lua.MiniOperators.evaluate()
Evaluate operator Evaluate operator
x gS * :<C-U>lua MiniSplitjoin.toggle({ region = MiniSplitjoin.get_visual_region() })<CR> o gh * <Cmd>lua MiniDiff.textobject()<CR>
Toggle arguments Hunk range textobject
n gS * v:lua.MiniSplitjoin.operator("toggle") . " " x gH * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/diff.lua
Toggle arguments Reset hunks
n gH * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/diff.lua
Reset hunks
x gh * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/diff.lua
Apply hunks
n gh * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/diff.lua
Apply hunks
x g/ * <Esc>/\%V
Search inside visual selection
n gV * "`[" . strpart(getregtype(), 0, 1) . "`]"
Visually select changed text
x gp * "+P
Paste from system clipboard
n gp * "+p
Paste from system clipboard
x gy * "+y
Copy to system clipboard
n gy * "+y
Copy to system clipboard
n go * v:lua.MiniBasics.put_empty_line(v:false)
Put empty line below
n gO * v:lua.MiniBasics.put_empty_line(v:true)
Put empty line above
o gc * <Cmd>lua MiniComment.textobject()<CR> o gc * <Cmd>lua MiniComment.textobject()<CR>
Comment textobject Comment textobject
n gcc * ~/.local/share/nvim/lazy/mini.comment/lua/mini/comment.lua n gcc * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/comment.lua
Comment line Comment line
x gc * ~/.local/share/nvim/lazy/mini.comment/lua/mini/comment.lua x gc * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/comment.lua
Comment selection Comment selection
n gc * ~/.local/share/nvim/lazy/mini.comment/lua/mini/comment.lua n gc * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/comment.lua
Comment Comment
x gx * <Cmd>lua MiniOperators.exchange('visual')<CR> x gx * <Cmd>lua MiniOperators.exchange('visual')<CR>
Exchange selection Exchange selection
@@ -319,47 +357,49 @@ o ii * <Cmd>lua MiniIndentscope.textobject(false)<CR>
Object scope Object scope
x ii * <Cmd>lua MiniIndentscope.textobject(false)<CR> x ii * <Cmd>lua MiniIndentscope.textobject(false)<CR>
Object scope Object scope
x j * v:count == 0 ? 'gj' : 'j'
n j * v:count == 0 ? 'gj' : 'j' n j * v:count == 0 ? 'gj' : 'j'
Move down Move down
x k * v:count == 0 ? 'gk' : 'k'
n k * v:count == 0 ? 'gk' : 'k' n k * v:count == 0 ? 'gk' : 'k'
Move up Move up
n shn * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n shn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Highlight next surrounding Highlight next surrounding
n sFn * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sFn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Find next left surrounding Find next left surrounding
n sfn * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sfn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Find next right surrounding Find next right surrounding
n srn * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n srn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Replace next surrounding Replace next surrounding
n sdn * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sdn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Delete next surrounding Delete next surrounding
n shl * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n shl * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Highlight previous surrounding Highlight previous surrounding
n sFl * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sFl * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Find previous left surrounding Find previous left surrounding
n sfl * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sfl * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Find previous right surrounding Find previous right surrounding
n srl * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n srl * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Replace previous surrounding Replace previous surrounding
n sdl * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sdl * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Delete previous surrounding Delete previous surrounding
x sa * :<C-U>lua MiniSurround.add('visual')<CR> x sa * :<C-U>lua MiniSurround.add('visual')<CR>
Add surrounding to selection Add surrounding to selection
n sn * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sn * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Update `MiniSurround.config.n_lines` Update `MiniSurround.config.n_lines`
n sh * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sh * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Highlight surrounding Highlight surrounding
n sF * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sF * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Find left surrounding Find left surrounding
n sf * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sf * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Find right surrounding Find right surrounding
n sr * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sr * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Replace surrounding Replace surrounding
n sd * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sd * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Delete surrounding Delete surrounding
n sa * ~/.local/share/nvim/lazy/mini.surround/lua/mini/surround.lua n sa * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/surround.lua
Add surrounding Add surrounding
o t * ~/.local/share/nvim/lazy/mini.jump/lua/mini/jump.lua o t * ~/.local/share/nvim/lazy/mini.nvim/lua/mini/jump.lua
Jump forward till Jump forward till
x t * <Cmd>lua MiniJump.smart_jump(false, true)<CR> x t * <Cmd>lua MiniJump.smart_jump(false, true)<CR>
Jump forward till Jump forward till
@@ -367,20 +407,10 @@ n t * <Cmd>lua MiniJump.smart_jump(false, true)<CR>
Jump forward till Jump forward till
x zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua x zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash Flash
n zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash
o zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua o zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Flash Flash
n <C-W>= * <C-W>= n zk * ~/.local/share/nvim/lazy/lazy.nvim/lua/lazy/core/handler/keys.lua
Equal Size Splits Flash
n <C-W>+ * :resize +5<CR>
H Resize +
n <C-W>- * :resize -5<CR>
H Resize -
n <C-W>. * :vertical resize +10<CR>
V Resize +
n <C-W>, * :vertical resize -10<CR>
V Resize -
v <C-J> * :m '>+1<CR>gv=gv v <C-J> * :m '>+1<CR>gv=gv
Move Block Down Move Block Down
n <C-J> * :m '>+1<CR>gv=gv n <C-J> * :m '>+1<CR>gv=gv
@@ -389,12 +419,24 @@ v <C-K> * :m '<-2<CR>gv=gv
Move Block Up Move Block Up
n <C-K> * :m '<-2<CR>gv=gv n <C-K> * :m '<-2<CR>gv=gv
Move Block Up Move Block Up
n <C-S> * :w!<CR> n <C-W>= * <C-W>=
Save Equal Size Splits
n <C-W>+ * :resize +10<CR>
H Resize +
n <C-W>- * :resize -10<CR>
H Resize -
n <C-W>. * :vertical resize +10<CR>
V Resize +
n <C-W>, * :vertical resize -10<CR>
V Resize -
n <Down> * :echo "Use j to move!!"<CR> n <Down> * :echo "Use j to move!!"<CR>
?
n <Up> * :echo "Use k to move!!"<CR> n <Up> * :echo "Use k to move!!"<CR>
?
n <Right> * :echo "Use l to move!!"<CR> n <Right> * :echo "Use l to move!!"<CR>
?
n <Left> * :echo "Use h to move!!"<CR> n <Left> * :echo "Use h to move!!"<CR>
?
x <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward) x <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward)
o <Plug>(MatchitOperationMultiForward) * :<C-U>call matchit#MultiMatch("W", "o")<CR> o <Plug>(MatchitOperationMultiForward) * :<C-U>call matchit#MultiMatch("W", "o")<CR>
o <Plug>(MatchitOperationMultiBackward) * :<C-U>call matchit#MultiMatch("bW", "o")<CR> o <Plug>(MatchitOperationMultiBackward) * :<C-U>call matchit#MultiMatch("bW", "o")<CR>
@@ -408,6 +450,7 @@ x <Plug>(MatchitVisualBackward) * :<C-U>call matchit#Match_wrapper('',0,'v')<CR
x <Plug>(MatchitVisualForward) * :<C-U>call matchit#Match_wrapper('',1,'v')<CR>:if col("''") != col("$") | exe ":normal! m'" | endif<CR>gv`` x <Plug>(MatchitVisualForward) * :<C-U>call matchit#Match_wrapper('',1,'v')<CR>:if col("''") != col("$") | exe ":normal! m'" | endif<CR>gv``
n <Plug>(MatchitNormalBackward) * :<C-U>call matchit#Match_wrapper('',0,'n')<CR> n <Plug>(MatchitNormalBackward) * :<C-U>call matchit#Match_wrapper('',0,'n')<CR>
n <Plug>(MatchitNormalForward) * :<C-U>call matchit#Match_wrapper('',1,'n')<CR> n <Plug>(MatchitNormalForward) * :<C-U>call matchit#Match_wrapper('',1,'n')<CR>
n <Plug>PlenaryTestFile * :lua require('plenary.test_harness').test_file(vim.fn.expand("%:p"))<CR>
n <M-k> * <Cmd>lua MiniMove.move_line('up')<CR> n <M-k> * <Cmd>lua MiniMove.move_line('up')<CR>
Move line up Move line up
n <M-j> * <Cmd>lua MiniMove.move_line('down')<CR> n <M-j> * <Cmd>lua MiniMove.move_line('down')<CR>
@@ -424,7 +467,10 @@ x <M-l> * <Cmd>lua MiniMove.move_selection('right')<CR>
Move right Move right
x <M-h> * <Cmd>lua MiniMove.move_selection('left')<CR> x <M-h> * <Cmd>lua MiniMove.move_selection('left')<CR>
Move left Move left
n <Plug>PlenaryTestFile * :lua require('plenary.test_harness').test_file(vim.fn.expand("%:p"))<CR> x <C-S> * <Esc><Cmd>silent! update | redraw<CR>
Save and go to Normal mode
n <C-S> * :w!<CR>
Save
n <C-W><C-D> <C-W>d n <C-W><C-D> <C-W>d
Show diagnostics under the cursor Show diagnostics under the cursor
n <C-W>d * vim/_defaults.lua n <C-W>d * vim/_defaults.lua
@@ -433,4 +479,4 @@ n <C-L> * :lua vim.lsp.buf.signature_help()<CR>
Signature Signature
``` ```
- Generated on Mon 9 Dec 2024 10:05:25 EET - Generated on Thu 2 Jan 2025 17:41:13 EET

View File

@@ -2,17 +2,13 @@
Leader: `<ctrl><space>` Leader: `<ctrl><space>`
``` ```txt
C-o Rotate through the panes
C-z Suspend the current client
Space Select next layout Space Select next layout
# List all paste buffers # List all paste buffers
$ Rename current session $ Rename current session
% Split window horizontally % Split window horizontally
& Kill current window & Kill current window
' Prompt for window index to select ' Prompt for window index to select
( Switch to previous client
) Switch to next client
, Rename current window , Rename current window
- Delete the most recent paste buffer - Delete the most recent paste buffer
. Move the current window . Move the current window
@@ -63,6 +59,8 @@ Leader: `<ctrl><space>`
M-3 Set the main-horizontal layout M-3 Set the main-horizontal layout
M-4 Set the main-vertical layout M-4 Set the main-vertical layout
M-5 Select the tiled layout M-5 Select the tiled layout
M-6 Set the main-horizontal-mirrored layout
M-7 Set the main-vertical-mirrored layout
M-n Select the next window with an alert M-n Select the next window with an alert
M-o Rotate through the panes in reverse M-o Rotate through the panes in reverse
M-p Select the previous window with an alert M-p Select the previous window with an alert
@@ -70,6 +68,8 @@ Leader: `<ctrl><space>`
M-Down Resize the pane down by 5 M-Down Resize the pane down by 5
M-Left Resize the pane left by 5 M-Left Resize the pane left by 5
M-Right Resize the pane right by 5 M-Right Resize the pane right by 5
C-o Rotate through the panes
C-z Suspend the current client
C-Up Resize the pane up C-Up Resize the pane up
C-Down Resize the pane down C-Down Resize the pane down
C-Left Resize the pane left C-Left Resize the pane left

View File

@@ -277,4 +277,4 @@ Mouse: alt_screen
``` ```
- Generated on Sat 10 Aug 2024 13:01:59 EEST - Generated on Thu 2 Jan 2025 17:41:13 EET

View File

@@ -1,5 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -e set -e
CONFIG="install.conf.yaml" CONFIG="install.conf.yaml"
@@ -16,6 +15,7 @@ git submodule update --init --recursive "${DOTBOT_DIR}"
"${DOTBOT_BIN_PATH}" \ "${DOTBOT_BIN_PATH}" \
-d "${BASEDIR}" \ -d "${BASEDIR}" \
--plugin-dir=tools/dotbot-asdf \
--plugin-dir=tools/dotbot-brew \ --plugin-dir=tools/dotbot-brew \
--plugin-dir=tools/dotbot-include \ --plugin-dir=tools/dotbot-include \
--plugin-dir=tools/dotbot-pip \ --plugin-dir=tools/dotbot-pip \
@@ -25,10 +25,11 @@ git submodule update --init --recursive "${DOTBOT_DIR}"
if [ "${DOTBOT_HOST}" != "" ]; then if [ "${DOTBOT_HOST}" != "" ]; then
DOTBOT_HOST_CONFIG="${BASEDIR}/hosts/${DOTBOT_HOST}/${CONFIG}" DOTBOT_HOST_CONFIG="${BASEDIR}/hosts/${DOTBOT_HOST}/${CONFIG}"
echo "-> Trying if host config can be found: ${DOTBOT_HOST_CONFIG}" echo "-> Trying if host config can be found: ${DOTBOT_HOST_CONFIG}"
[ -r "$DOTBOT_HOST_CONFIG" ] && [ -f "$DOTBOT_HOST_CONFIG" ] && [ -r "$DOTBOT_HOST_CONFIG" ] && [ -f "$DOTBOT_HOST_CONFIG" ] \
echo "(!) Found $DOTBOT_HOST_CONFIG" && && echo "(!) Found $DOTBOT_HOST_CONFIG" \
"$DOTBOT_BIN_PATH" \ && "$DOTBOT_BIN_PATH" \
-d "$BASEDIR" \ -d "$BASEDIR" \
--plugin-dir=tools/dotbot-asdf \
--plugin-dir=tools/dotbot-brew \ --plugin-dir=tools/dotbot-brew \
--plugin-dir=tools/dotbot-include \ --plugin-dir=tools/dotbot-include \
--plugin-dir=tools/dotbot-pip \ --plugin-dir=tools/dotbot-pip \

View File

@@ -1,5 +1,6 @@
--- ---
- include: 'tools/dotbot-defaults.yaml' - include: 'tools/dotbot-defaults.yaml'
- clean: - clean:
~/: ~/:
~/.config: ~/.config:
@@ -8,6 +9,7 @@
recursive: true recursive: true
~/.ssh: ~/.ssh:
recursive: true recursive: true
- create: - create:
~/.cache: ~/.cache:
~/.cache/git: ~/.cache/git:
@@ -25,6 +27,7 @@
~/.ssh/local.d: ~/.ssh/local.d:
mode: 0700 mode: 0700
~/Code: ~/Code:
- link: - link:
~/: ~/:
force: true force: true
@@ -35,10 +38,14 @@
glob: true glob: true
relink: true relink: true
path: config/* path: config/*
exclude: [config/nvm] exclude: [config/nvm, config/fzf]
~/.local/bin: ~/.local/bin:
glob: true glob: true
path: local/bin/* path: local/bin/*
exclude: [local/bin/fzf]
~/.local/fzf:
glob: true
path: config/fzf/*
~/.local/man: ~/.local/man:
glob: true glob: true
path: local/man/** path: local/man/**
@@ -49,11 +56,55 @@
glob: true glob: true
mode: 0600 mode: 0600
path: ssh/* path: ssh/*
- shell: - shell:
- bash add-submodules.sh || true - bash add-submodules.sh || true
- git submodule update --init --recursive --force - git submodule update --init --recursive --force
- asdf:
- plugin: 1password-cli
url: https://github.com/NeoHsu/asdf-1password-cli.git
- plugin: age
url: https://github.com/threkk/asdf-age.git
- plugin: direnv
url: https://github.com/asdf-community/asdf-direnv.git
- plugin: dotenv-linter
url: https://github.com/wesleimp/asdf-dotenv-linter.git
- plugin: editorconfig-checker
url: https://github.com/gabitchov/asdf-editorconfig-checker.git
- plugin: fd
url: https://gitlab.com/wt0f/asdf-fd.git
- plugin: github-cli
url: https://github.com/bartlomiejdanek/asdf-github-cli.git
- plugin: golang
url: https://github.com/asdf-community/asdf-golang.git
- plugin: hadolint
url: https://github.com/devlincashman/asdf-hadolint.git
- plugin: kubectl
url: https://github.com/asdf-community/asdf-kubectl.git
- plugin: pre-commit
url: https://github.com/jonathanmorley/asdf-pre-commit.git
- plugin: ripgrep
url: https://gitlab.com/wt0f/asdf-ripgrep.git
- plugin: rust
url: https://github.com/code-lever/asdf-rust.git
- plugin: shellcheck
url: https://github.com/luizm/asdf-shellcheck.git
- plugin: shfmt
url: https://github.com/luizm/asdf-shfmt.git
- plugin: terragrunt
url: https://github.com/ohmer/asdf-terragrunt.git
- plugin: tf-summarize
url: https://github.com/adamcrews/asdf-tf-summarize.git
- plugin: yamllint
url: https://github.com/ericcornelissen/asdf-yamllint.git
- plugin: yq
url: https://github.com/sudermanjr/asdf-yq.git
- shell:
- bash local/bin/dfm install all - bash local/bin/dfm install all
- pipx: - pipx:
file: tools/requirements-pipx.txt file: tools/requirements-pipx.txt
stdout: false stdout: true
stderr: true stderr: true

191
local/bin/a Executable file
View File

@@ -0,0 +1,191 @@
#!/usr/bin/env bash
# A script for encrypting and decrypting files or directories with age and SSH keys
VERSION="1.0.0"
# Default ENV values
KEYS_FILE="${AGE_KEYSFILE:-$HOME/.ssh/keys.txt}"
KEYS_SOURCE="${AGE_KEYSSOURCE:-https://github.com/ivuorinen.keys}"
LOG_FILE="${AGE_LOGFILE:-$HOME/.cache/a.log}"
VERBOSE=false
# Parse flags for verbosity
for arg in "$@"; do
if [[ "$arg" == "-v" || "$arg" == "--verbose" ]]; then
VERBOSE=true
break
fi
done
# Ensure log directory and file exist with correct permissions
prepare_log_file()
{
local log_dir
log_dir=$(dirname "$LOG_FILE")
# Create log directory if it does not exist
if [[ ! -d "$log_dir" ]]; then
mkdir -p "$log_dir"
fi
# Create log file if it does not exist
if [[ ! -f "$LOG_FILE" ]]; then
touch "$LOG_FILE"
fi
# Set permissions to 0600
chmod 0600 "$LOG_FILE"
}
prepare_log_file
# Logging function
log_message()
{
local message="$1"
echo "$(date +'%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE"
# Print to user if verbose flag is set
if [[ "$VERBOSE" == true ]]; then
echo "$message"
fi
}
# Function to print usage
print_help()
{
cat << EOF
Usage: a [command] [file_or_directory] [options]
Commands:
e, enc, encrypt Encrypt the specified file or directory
d, dec, decrypt Decrypt the specified file or directory
help, --help Show this help message
version, --version Show version information
Options:
-v, --verbose Print log messages to console in addition to writing to log file
Environment Variables:
AGE_KEYSFILE Path to the SSH keys file (default: $HOME/.ssh/keys.txt)
AGE_KEYSSOURCE URL to fetch SSH keys if keys file does not exist
AGE_LOGFILE Path to the log file (default: $HOME/.cache/a.log)
Examples:
Encrypt a file:
a e file.txt
Encrypt a directory:
a e /path/to/directory
Decrypt a file:
a d file.txt.age
Specify a custom keys file:
AGE_KEYSFILE=/path/to/keys.txt a e file.txt
Specify a custom keys source and log file:
AGE_KEYSSOURCE=https://example.com/keys.txt AGE_LOGFILE=/tmp/a.log a d file.txt.age
EOF
}
# Function to print version
print_version()
{
echo "a version $VERSION"
echo "Created by Ismo Vuorinen <https://github.com/ivuorinen>"
}
# Function to fetch keys if missing
fetch_keys_if_missing()
{
if [[ ! -f "$KEYS_FILE" ]]; then
log_message "Keys file '$KEYS_FILE' not found. Attempting to fetch from $KEYS_SOURCE..."
mkdir -p "$(dirname "$KEYS_FILE")"
curl -s "$KEYS_SOURCE" -o "$KEYS_FILE"
if [[ $? -ne 0 || ! -s "$KEYS_FILE" ]]; then
log_message "Error: Failed to fetch keys from $KEYS_SOURCE"
exit 1
fi
chmod 0400 "$KEYS_FILE"
log_message "Keys file fetched and permissions set to 0400."
fi
}
# Function to encrypt files or directories
encrypt_file_or_directory()
{
local file="$1"
if [[ -d "$file" ]]; then
for f in "$file"/*; do
encrypt_file_or_directory "$f"
done
elif [[ -f "$file" ]]; then
fetch_keys_if_missing
local output_file="${file}.age"
age -R "$KEYS_FILE" "$file" > "$output_file"
if [[ $? -eq 0 ]]; then
log_message "File encrypted successfully: $output_file"
else
log_message "Error: Failed to encrypt file '$file'."
exit 1
fi
fi
}
# Function to decrypt files or directories
decrypt_file_or_directory()
{
local file="$1"
if [[ -d "$file" ]]; then
for f in "$file"/*.age; do
decrypt_file_or_directory "$f"
done
elif [[ -f "$file" ]]; then
fetch_keys_if_missing
local output_file="${file%.age}"
age -d -i "$KEYS_FILE" "$file" > "$output_file"
if [[ $? -eq 0 ]]; then
log_message "File decrypted successfully: $output_file"
else
log_message "Error: Failed to decrypt file '$file'."
exit 1
fi
fi
}
# Main logic
case "$1" in
e | enc | encrypt)
if [[ $# -lt 2 ]]; then
log_message "Error: No file or directory specified for encryption."
print_help
exit 1
fi
encrypt_file_or_directory "$2"
;;
d | dec | decrypt)
if [[ $# -lt 2 ]]; then
log_message "Error: No file or directory specified for decryption."
print_help
exit 1
fi
decrypt_file_or_directory "$2"
;;
help | --help)
print_help
;;
version | --version)
print_version
;;
*)
log_message "Error: Unknown command '$1'"
print_help
exit 1
;;
esac
# vim: ft=bash:syn=sh:ts=2:sw=2:et:ai:nowrap

60
local/bin/ad Executable file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env bash
# age decrypt file with github keys
# Use ENV or default values for keys file and source
KEYS_FILE="${AGE_KEYSFILE:-$HOME/.ssh/keys.txt}"
KEYS_SOURCE="${AGE_KEYSSOURCE:-https://github.com/ivuorinen.keys}"
# Check for required commands
if ! command -v age &> /dev/null; then
echo "Error: age is not installed. Please install it to continue."
exit 1
fi
if ! command -v curl &> /dev/null; then
echo "Error: curl is not installed. Please install it to continue."
exit 1
fi
# Ensure a file is provided
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <file-to-decrypt>"
exit 1
fi
FILE="$1"
if [[ ! -f "$FILE" ]]; then
echo "Error: File '$FILE' does not exist."
exit 1
fi
# Check if keys file exists, otherwise fetch it
if [[ ! -f "$KEYS_FILE" ]]; then
echo "Keys file '$KEYS_FILE' not found. Attempting to fetch from $KEYS_SOURCE..."
# Create the directory if it doesn't exist
mkdir -p "$(dirname "$KEYS_FILE")"
# Fetch the keys and save to the file
curl -s "$KEYS_SOURCE" -o "$KEYS_FILE"
if [[ $? -ne 0 || ! -s "$KEYS_FILE" ]]; then
echo "Error: Failed to fetch keys from $KEYS_SOURCE"
exit 1
fi
# Set permissions to 0400
chmod 0400 "$KEYS_FILE"
echo "Keys file fetched and permissions set to 0400."
fi
# Decrypt the file
OUTPUT_FILE="${FILE%.age}"
age -d -i "$KEYS_FILE" "$FILE" > "$OUTPUT_FILE"
if [[ $? -eq 0 ]]; then
echo "File decrypted successfully: $OUTPUT_FILE"
else
echo "Error: Failed to decrypt file."
exit 1
fi

61
local/bin/ae Executable file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/env bash
# age encrypt file with github keys
# Use ENV or default values for keys file and source
KEYS_FILE="${AGE_KEYSFILE:-$HOME/.ssh/keys.txt}"
KEYS_SOURCE="${AGE_KEYSSOURCE:-https://github.com/ivuorinen.keys}"
# Check for required commands
if ! command -v age &> /dev/null; then
echo "Error: age is not installed. Please install it to continue."
exit 1
fi
if ! command -v curl &> /dev/null; then
echo "Error: curl is not installed. Please install it to continue."
exit 1
fi
# Ensure a file is provided
# shellcheck disable=SC2181
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <file-to-encrypt>"
exit 1
fi
FILE="$1"
if [[ ! -f "$FILE" ]]; then
echo "Error: File '$FILE' does not exist."
exit 1
fi
# Check if keys file exists, otherwise fetch it
if [[ ! -f "$KEYS_FILE" ]]; then
echo "Keys file '$KEYS_FILE' not found. Attempting to fetch from $KEYS_SOURCE..."
# Create the directory if it doesn't exist
mkdir -p "$(dirname "$KEYS_FILE")"
# Fetch the keys and save to the file
curl -s "$KEYS_SOURCE" -o "$KEYS_FILE"
if [[ $? -ne 0 || ! -s "$KEYS_FILE" ]]; then
echo "Error: Failed to fetch keys from $KEYS_SOURCE"
exit 1
fi
# Set permissions to 0400
chmod 0400 "$KEYS_FILE"
echo "Keys file fetched and permissions set to 0400."
fi
# Encrypt the file
OUTPUT_FILE="${FILE}.age"
age -R "$KEYS_FILE" "$FILE" > "$OUTPUT_FILE"
if [[ $? -eq 0 ]]; then
echo "File encrypted successfully: $OUTPUT_FILE"
else
echo "Error: Failed to encrypt file."
exit 1
fi

View File

@@ -14,61 +14,30 @@
SCRIPT=$(basename "$0") SCRIPT=$(basename "$0")
if ! declare -f msg > /dev/null; then
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
return 0
}
fi
if ! declare -f msg_err > /dev/null; then
# Function to print error messages and exit
# $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
fi
if ! declare -f msg_done > /dev/null; then
# Function to print done message
# $1 - message (string)
msg_done()
{
echo "✓ $1"
return 0
}
fi
if ! declare -f array_diff > /dev/null; then
# Function to compare two arrays and return the difference
# Example: array_diff DIFFERENCE ARRAY1 ARRAY2
# $1 - variable to store the difference
# $2 - first array
# $3 - second array
# Output to $1 the difference between $2 and $3
# Source: https://stackoverflow.com/a/42399479/594940
array_diff()
{
eval local ARR1=\(\"\${$2[@]}\"\)
eval local ARR2=\(\"\${$3[@]}\"\)
local IFS=$'\n'
mapfile -t "$1" < <(comm -23 <(echo "${ARR1[*]}" | sort) <(echo "${ARR2[*]}" | sort))
}
fi
VERSION_NVM="v0.39.5"
# Loads configs for better installation experience # Loads configs for better installation experience
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
source "${DOTFILES}/local/bin/msgr" source "${DOTFILES}/local/bin/msgr"
# -- Menu builder -- # # -- Menu builder -- #
menu_builder()
{
local title=$1
local commands=("${@:2}")
local width=60
printf "\n%s\n" "$(printf '%.s─' $(seq 1 $width))"
printf "%-${width}s\n" " $title"
printf "%s\n" "$(printf '%.s─' $(seq 1 $width))"
for cmd in "${commands[@]}"; do
local name=${cmd%%:*}
local desc=${cmd#*:}
printf " %-20s %s\n" "$name" "$desc"
done
# printf "\n"
}
menu_section() menu_section()
{ {
LINE=$(printf '%-18s [ %-15s ]\n' "$1" "$2") LINE=$(printf '%-18s [ %-15s ]\n' "$1" "$2")
@@ -122,23 +91,19 @@ section_install()
MENU=( MENU=(
"all:Installs everything in the correct order" "all:Installs everything in the correct order"
"asdf:Install asdf plugins"
"cargo:Install rust/cargo packages" "cargo:Install rust/cargo packages"
"cheat-databases:Install cheat external cheatsheet databases" "cheat-databases:Install cheat external cheatsheet databases"
"composer:Install composer" "composer:Install composer"
"dotenv:Install dotenv-linter"
"fonts:Install programming fonts" "fonts:Install programming fonts"
"gh:Install GitHub CLI Extensions" "gh:Install GitHub CLI Extensions"
"go:Install Go Packages" "go:Install Go Packages"
"imagick:Install ImageMagick CLI" "imagick:Install ImageMagick CLI"
"starship:Install starship.rs"
"macos:Setup nice macOS defaults" "macos:Setup nice macOS defaults"
"neofetch:Install neofetch" "npm-packages:Install NPM Packages"
"nvm:Install Node Version Manager (nvm)"
"nvm-latest:Install latest lts node using nvm"
"npm:Install NPM Packages"
"ntfy:Install ntfy" "ntfy:Install ntfy"
"ohmybash:Install oh-my-bash" "nvm-latest:Install latest lts node using nvm"
"pip:Install pip/python packages" "nvm:Install Node Version Manager (nvm)"
"z:Install z" "z:Install z"
) )
@@ -148,124 +113,111 @@ section_install()
$0 install macos $0 install macos
$0 install fonts $0 install fonts
$0 brew install $0 brew install
$0 install ohmyposh
$0 install asdf $0 install asdf
$0 install composer $0 install composer
$0 install fzf $0 install fzf
$0 install go
$0 install cheat-databases $0 install cheat-databases
$0 install imagick
$0 install nvm $0 install nvm
$0 install npm $0 install npm-packages
# $0 install ntfy
$0 install z $0 install z
msgr msg "Reloading configurations again..." msgr msg "Reloading configurations again..."
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
msgr yay "All done!" msgr yay "All done!"
;; ;;
asdf) asdf)
msg "Installing asdf..." msgr run "Installing asdf..."
bash "$DOTFILES/scripts/install-asdf.sh both" \ $0 asdf plugins-install \
&& msg_yay "asdf installed!" && msgr yay "asdf plugins installed!"
;; ;;
cargo) cargo)
msg "Installing cargo packages..." msgr run "Installing cargo packages..."
bash "$DOTFILES/scripts/install-cargo-packages.sh" \ bash "$DOTFILES/scripts/install-cargo-packages.sh" \
&& msg_yay "cargo packages installed!" && msgr yay "cargo packages installed!"
;; ;;
cheat-databases) cheat-databases)
msg "Installing cheat databases..." msgr run "Installing cheat databases..."
for database in "$DOTFILES"/scripts/install-cheat-*; do for database in "$DOTFILES"/scripts/install-cheat-*; do
bash "$database" \ bash "$database" \
&& msg_yay "Cheat: $database run" && msgr run_done "Cheat: $database run"
done done
;; ;;
composer) composer)
msg "Installing composer..." msgr run "Installing composer..."
bash "$DOTFILES/scripts/install-composer.sh" \ bash "$DOTFILES/scripts/install-composer.sh" \
&& msg_yay "composer installed!" && msgr run_done "composer installed!"
;; ;;
fonts) fonts)
msg "Installing fonts..." msgr run "Installing fonts..."
bash "$DOTFILES/scripts/install-fonts.sh" \ bash "$DOTFILES/scripts/install-fonts.sh" \
&& msg_yay "Installed fonts!" && msgr yay "Installed fonts!"
;;
fzf)
msg "Installing fzf..."
bash "$DOTFILES/scripts/install-fzf.sh" \
&& msg_yay "fzf installed!"
;; ;;
gh) gh)
msg "Installing GitHub CLI Extensions..." msgr run "Installing GitHub CLI Extensions..."
bash "$DOTFILES/scripts/install-gh-extensions.sh" \ bash "$DOTFILES/scripts/install-gh-extensions.sh" \
&& msg_yay "github cli extensions installed!" && msgr yay "github cli extensions installed!"
;; ;;
go) go)
msg "Installing Go Packages..." msgr run "Installing Go Packages..."
bash "$DOTFILES/scripts/install-go-packages.sh" \ bash "$DOTFILES/scripts/install-go-packages.sh" \
&& msg_yay "go packages installed!" && msgr yay "go packages installed!"
;; ;;
imagick) imagick)
msg "Installing ImageMagick CLI..." msgr run "Downloading and installing ImageMagick CLI..."
curl -L https://imagemagick.org/archive/binaries/magick > "$XDG_BIN_HOME/magick" \ curl -L https://imagemagick.org/archive/binaries/magick > "$XDG_BIN_HOME/magick" \
&& chmod +x "$XDG_BIN_HOME/magick" \ && chmod +x "$XDG_BIN_HOME/magick" \
&& msg_yay "imagick installed!" && msgr yay "imagick downloaded and installed!"
;; ;;
macos) macos)
msg "Setting up macOS defaults..." msgr run "Setting up macOS defaults..."
bash "$DOTFILES/scripts/set-macos-defaults.sh" \ bash "$DOTFILES/scripts/install-macos-defaults.sh" \
&& msg_yay "Brewfile defined apps has been installed!" && msgr yay "macOS defaults set!"
;;
neofetch)
msg "Installing neofetch..."
bash "$DOTFILES/scripts/install-neofetch.sh" \
&& msg_yay "neofetch installed!"
;; ;;
nvm) nvm)
msg "Installing nvm..." msgr run "Installing nvm..."
local NVM_VERSION
NVM_VERSION=$(x-gh-get-latest-version nvm-sh/nvm) NVM_VERSION=$(x-gh-get-latest-version nvm-sh/nvm)
msg "Latest nvm version: $NVM_VERSION" msgr ok "Latest nvm version: $NVM_VERSION"
NVM_INSTALL="https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh" local NVM_INSTALL="https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh"
NVM_CURL="curl -o- \"$NVM_INSTALL\" | bash" local NVM_CURL="curl -o- \"$NVM_INSTALL\" | bash"
PROFILE=/dev/null bash -c "$NVM_CURL" PROFILE=/dev/null bash -c "$NVM_CURL"
$0 install nvm-latest $0 install nvm-latest
msg_yay "nvm installed!" msgr yay "nvm installed!"
;; ;;
nvm-latest) nvm-latest)
msg "Installing latest lts node..." msgr run "Installing latest lts node..."
if [ -n "$NVM_DIR" ]; then if [ -n "$NVM_DIR" ]; then
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
fi fi
nvm install --lts --latest-npm --default nvm install --lts --latest-npm --default
git checkout "$DOTFILES/base/zshrc" git checkout "$DOTFILES/base/zshrc"
git checkout "$DOTFILES/base/bashrc" git checkout "$DOTFILES/base/bashrc"
msg_yay "latest lts node installed!" msgr yay "latest lts node installed!"
;; ;;
npm)
msg "NPM Packages install started..." npm-packages)
msgr run "NPM Packages install started..."
bash "$DOTFILES/scripts/install-npm-packages.sh" \ bash "$DOTFILES/scripts/install-npm-packages.sh" \
&& msg_yay "NPM Packages have been installed!" && msgr yay "NPM Packages have been installed!"
;;
ntfy)
msg "ntfy install started..."
bash "$DOTFILES/scripts/install-ntfy.sh" \
&& msg_yay "ntfy installed!"
;;
ohmyposh)
msg "oh-my-posh install started..."
bash "$DOTFILES/scripts/install-ohmyposh.sh" \
&& msg_yay "oh-my-posh installed!"
;;
pip)
msg "pip install started..."
bash "$DOTFILES/scripts/install-pip-packages.sh"
;; ;;
z) z)
msg "Installing z..." msgr run "Installing z..."
bash "$DOTFILES/scripts/install-z.sh" \ bash "$DOTFILES/scripts/install-z.sh" \
&& msg_yay "z has been installed!" && msgr yay "z has been installed!"
;; ;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;;
*) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
@@ -286,12 +238,14 @@ section_brew()
x-have brew && { x-have brew && {
case "$1" in case "$1" in
install) install)
brew bundle install --file="$BREWFILE" --force --quiet && msg_yay "Done!" brew bundle install --file="$BREWFILE" --force --quiet && msgr yay "Done!"
;; ;;
update) update)
brew update && brew outdated && brew upgrade && brew cleanup brew update && brew outdated && brew upgrade && brew cleanup
msg_yay "Done!" msgr yay "Done!"
;; ;;
updatebundle) updatebundle)
# Updates .dotfiles/homebrew/Brewfile with descriptions # Updates .dotfiles/homebrew/Brewfile with descriptions
brew bundle dump \ brew bundle dump \
@@ -301,11 +255,13 @@ section_brew()
--tap \ --tap \
--formula \ --formula \
--cask \ --cask \
--describe && msg_yay "Done!" --describe && msgr yay "Done!"
;; ;;
leaves) leaves)
brew leaves --installed-on-request brew leaves --installed-on-request
;; ;;
untracked) untracked)
declare -a BREW_LIST_ALL declare -a BREW_LIST_ALL
while IFS= read -r line; do while IFS= read -r line; do
@@ -328,7 +284,8 @@ section_brew()
declare -a BREW_LIST_TRACKED_WITHOUT_DEPS declare -a BREW_LIST_TRACKED_WITHOUT_DEPS
for f in "${BREW_LIST_ALL[@]}"; do for f in "${BREW_LIST_ALL[@]}"; do
if [[ ! " ${BREW_LIST_DEPENDENCIES[@]} " =~ " ${f} " ]]; then # shellcheck disable=SC2199
if [[ " ${BREW_LIST_DEPENDENCIES[@]} " != *" ${f} "* ]]; then
BREW_LIST_TRACKED_WITHOUT_DEPS+=("$f") BREW_LIST_TRACKED_WITHOUT_DEPS+=("$f")
fi fi
done done
@@ -337,7 +294,7 @@ section_brew()
# If there are no untracked packages, exit # If there are no untracked packages, exit
if [ ${#BREW_LIST_UNTRACKED[@]} -eq 0 ]; then if [ ${#BREW_LIST_UNTRACKED[@]} -eq 0 ]; then
msg_yay "No untracked packages found!" msgr yay "No untracked packages found!"
exit 0 exit 0
fi fi
@@ -346,64 +303,176 @@ section_brew()
echo " $f" echo " $f"
done done
;; ;;
clean)
brew bundle cleanup --file="$BREWFILE" && msg_yay "Done!"
;;
autoupdate) autoupdate)
brew autoupdate delete brew autoupdate delete
brew autoupdate start 43200 --upgrade --cleanup --immediate brew autoupdate start 43200 --upgrade --cleanup --immediate
;; ;;
*)
menu_usage "$USAGE_PREFIX" "${MENU[@]}" clean) brew bundle cleanup --file="$BREWFILE" && msgr yay "Done!" ;;
;;
*) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
! x-have brew && menu_section "$USAGE_PREFIX" "brew not available on this system" ! x-have brew && menu_builder "$USAGE_PREFIX" "brew not available on this system"
} }
section_asdf() section_asdf()
{ {
USAGE_PREFIX="$SCRIPT asdf <command>" USAGE_PREFIX="$SCRIPT asdf <command>"
MENU=( MENU=(
"install:Install asdf"
"current:Show asdf current versions" "current:Show asdf current versions"
"global:Show asdf global versions" "global:Show asdf global versions"
"installed:Show asdf installed versions" "installed:Show asdf installed versions"
"local:Show asdf local versions" "plugins-update:Update all asdf plugins"
"plugins-install:Install plugins from configuration"
"plugins-remove:Remove installed plugins"
"reset:Reset asdf plugins"
"fix-tool-versions:Remove uninstalled plugins from .tool-versions"
"versions:Show asdf versions" "versions:Show asdf versions"
"where:Show asdf where" "where:Show asdf where"
"which:Show asdf which" "which:Show asdf which"
) )
case "$1" in case "$1" in
install) plugins-update)
msg "Installing asdf..." msgr run "Updating all asdf plugins"
bash "$DOTFILES/scripts/install-asdf.sh both" \ asdf plugin update --all
&& msg_yay "asdf installed!" msgr run_done "Updated all plugins"
;; ;;
current)
asdf current plugins-install)
msgr run "Installing plugins from configuration"
# First install direnv if it's not installed
if ! asdf plugin list | grep -q "^direnv$"; then
msgr nested "Installing direnv plugin"
asdf plugin add direnv https://github.com/asdf-community/asdf-direnv.git
# Install latest direnv
local latest_direnv
latest_direnv=$(asdf latest direnv)
asdf install direnv "$latest_direnv"
asdf global direnv "$latest_direnv"
fi
# Check that all plugins are installed
local installed_plugins
installed_plugins=$(asdf plugin list)
while IFS= read -r line; do
# Skip empty lines and comments
[[ -z $line || $line =~ ^# ]] && continue
local plugin
plugin=$(echo "$line" | awk '{print $1}')
# Skip direnv, it's already installed
[[ $plugin == "direnv" ]] && continue
if ! echo "$installed_plugins" | grep -q "^${plugin}$"; then
msgr nested "Installing $plugin plugin"
asdf plugin add "$plugin"
fi
done < "$DOTFILES/base/tool-versions"
msgr run_done "All plugins installed"
;; ;;
global)
asdf global plugins-remove)
msgr run "Remove installed plugins"
local installed_plugins
installed_plugins=$(asdf plugin list | grep -v "^direnv$")
for plugin in $installed_plugins; do
msgr nested "Removing $plugin"
asdf plugin remove "$plugin"
done
msgr run_done "Remove plugins done!"
;; ;;
installed)
asdf list reset)
msgr run "Resetting asdf environment"
$0 asdf plugins-remove
$0 asdf plugins-install
asdf reshim
msgr yay "Reset asdf plugins done!"
;; ;;
local)
asdf local fix-tool-versions)
local tool_versions_file="$DOTFILES/base/tool-versions"
local temp_file
temp_file=$(mktemp)
msgr run "Fixing tool-versions file"
# Check that .tool-versions file exists
if [[ ! -f $tool_versions_file ]]; then
msgr error "tool-versions file not found: $tool_versions_file"
rm -f "$temp_file"
return 1
fi
# Check that asdf can be found in the path
if ! command -v asdf > /dev/null; then
msgr error "asdf not found"
rm -f "$temp_file"
return 1
fi
# Read installed plugins
msgr nested "Reading installed plugins"
local installed_plugins
installed_plugins=$(asdf plugin list | sort)
# Compare .tool-versions and installed plugins,
# remove unknown plugins from .tool-versions
msgr nested "Updating tool-versions file"
while IFS= read -r line; do
# Keep comments and empty lines
if [[ -z $line || $line =~ ^[[:space:]]*# ]]; then
echo "$line" >> "$temp_file"
continue
fi
local plugin
plugin=$(echo "$line" | awk '{print $1}')
if echo "$installed_plugins" | grep -q "^${plugin}$"; then
echo "$line" >> "$temp_file"
else
msgr nested "Removing $plugin - not installed"
fi
done < "$tool_versions_file"
# Check that the temp file is valid
if [[ ! -s $temp_file ]] || ! grep -v '^[[:space:]]*#' "$temp_file" | grep -q .; then
msgr error "Generated file is empty or contains only comments, keeping original"
rm -f "$temp_file"
return 1
fi
# Backup the original .tool-versions
cp "$tool_versions_file" "${tool_versions_file}.bak"
# Overwrite .tool-versions with the generated file
mv "$temp_file" "$tool_versions_file"
msgr run_done "Updated $tool_versions_file"
msgr nested "Backup saved as ${tool_versions_file}.bak"
return 0
;; ;;
versions)
asdf list all current) asdf current ;;
;; global) asdf global ;;
where) installed) asdf list ;;
asdf where versions) asdf list all ;;
;; where) asdf where ;;
which) which) asdf which ;;
asdf which *) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
@@ -431,6 +500,7 @@ section_helpers()
# shellcheck disable=2001 # shellcheck disable=2001
for i in $(echo "$PATH" | sed 's/:/ /g'); do echo "$i"; done for i in $(echo "$PATH" | sed 's/:/ /g'); do echo "$i"; done
;; ;;
aliases) aliases)
case "$SECTION" in case "$SECTION" in
"zsh") "zsh")
@@ -444,25 +514,38 @@ section_helpers()
;; ;;
esac esac
;; ;;
"colors") "colors")
for i in {0..255}; do echo -en "\e[38;5;${i}m${i} "; done max=255
start=0
while [ "$start" -le "$max" ]; do
for i in $(seq "$start" $((start + 9))); do
if [ "$i" -le "$max" ]; then
# Outputs colored number
# printf " \e[38;5;%sm%4s\e[0m" "$i" "$i"
# Outputs colored block with number inside
# printf " \e[48;5;%sm\e[38;5;15m%5s \e[0m" "$i" "$i"
# Outputs colored block and color number
# printf " \e[48;5;%sm \e[0m %3d" "$i" "$i"
# Outputs color number and colored block
printf "%3d \e[48;5;%sm \e[0m " "$i" "$i"
fi
done
printf "\n"
start=$((start + 10))
done
;; ;;
"env")
env | sort "env") env | sort ;;
;; "functions") declare -F ;;
"functions") "nvim") cat "$DOTFILES/docs/nvim-keybindings.md" ;;
declare -F "tmux") cat "$DOTFILES/docs/tmux-keybindings.md" ;;
;; "wezterm") cat "$DOTFILES/docs/wezterm-keybindings.md" ;;
"nvim") *) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
cat "$DOTFILES/docs/nvim-keybindings.md"
;;
"tmux")
cat "$DOTFILES/docs/tmux-keybindings.md"
;;
"wezterm")
cat "$DOTFILES/docs/wezterm-keybindings.md"
;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
@@ -486,7 +569,7 @@ section_docs()
tmux) bash "$DOTFILES/local/bin/x-dfm-docs-xterm-keybindings" ;; tmux) bash "$DOTFILES/local/bin/x-dfm-docs-xterm-keybindings" ;;
nvim) bash "$DOTFILES/scripts/create-nvim-keymaps.sh" ;; nvim) bash "$DOTFILES/scripts/create-nvim-keymaps.sh" ;;
wezterm) bash "$DOTFILES/scripts/create-wezterm-keymaps.sh" ;; wezterm) bash "$DOTFILES/scripts/create-wezterm-keymaps.sh" ;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;; *) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
@@ -504,37 +587,42 @@ section_dotfiles()
case "$1" in case "$1" in
fmt) fmt)
msg_ok "Running all formatters" msgr run "Running all formatters"
$0 dotfiles yamlfmt $0 dotfiles yamlfmt
$0 dotfiles shfmt $0 dotfiles shfmt
msg_done "...done!" msgr run_done "...done!"
;; ;;
reset_all) reset_all)
msg_ok "Running all reset commands" msgr ok "Running all reset commands"
$0 dotfiles reset_nvim $0 dotfiles reset_nvim
;; ;;
reset_nvim) reset_nvim)
msgr run "Cleaning nvim state, cache and config"
rm -rf \ rm -rf \
~/.local/share/nvim \ ~/.local/share/nvim \
~/.local/state/nvim \ ~/.local/state/nvim \
~/.cache/nvim \ ~/.cache/nvim \
~/.config/nvim ~/.config/nvim
msg_ok "Deleted old nvim files (share, state and cache + config)" msgr ok "Deleted old nvim files (share, state and cache + config)"
ln -s "$DOTFILES/config/nvim" ~/.config/nvim ln -s "$DOTFILES/config/nvim" ~/.config/nvim
msg_ok "Linked nvim and astronvim" msgr ok "Linked nvim and astronvim"
x-have npm && $0 install npm x-have npm && $0 install npm
msg_ok "Installed packages" msgr ok "Installed packages"
msg_done "nvim reset!" msgr run_done "nvim reset!"
;; ;;
yamlfmt) yamlfmt)
# format yaml files # format yaml files
x-have yamlfmt && yamlfmt -conf "$DOTFILES/.yamlfmt" x-have yamlfmt && yamlfmt -conf "$DOTFILES/.yamlfmt"
! x-have yamlfmt && msg_err "yamlfmt not found" ! x-have yamlfmt && msgr err "yamlfmt not found"
;; ;;
shfmt) shfmt)
# If system doesn't have fd or shfmt installed, exit # If system doesn't have fd or shfmt installed, exit
! x-have fd && msg_err "fd not found, install with asdf" ! x-have fd && msgr err "fd not found, install it to continue"
! x-have shfmt && msg_err "shfmt not found, install with asdf" ! x-have shfmt && msgr err "shfmt not found, install it to continue"
# Format shell scripts according to following rules. # Format shell scripts according to following rules.
fd --full-path "$DOTFILES" -tx \ fd --full-path "$DOTFILES" -tx \
--hidden \ --hidden \
@@ -545,9 +633,10 @@ section_dotfiles()
--func-next-line --list --write \ --func-next-line --list --write \
--indent 2 --case-indent --space-redirects \ --indent 2 --case-indent --space-redirects \
--binary-next-line {} \; --binary-next-line {} \;
msg_yay "dotfiles have been shfmt formatted!" msgr yay "dotfiles have been shfmt formatted!"
;; ;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;;
*) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
@@ -567,11 +656,58 @@ section_check()
[[ $2 == "" ]] && echo "$X_ARCH" && exit 0 [[ $2 == "" ]] && echo "$X_ARCH" && exit 0
[[ $X_ARCH == "$2" ]] && exit 0 || exit 1 [[ $X_ARCH == "$2" ]] && exit 0 || exit 1
;; ;;
h | host | hostname) h | host | hostname)
[[ $2 == "" ]] && echo "$X_HOSTNAME" && exit 0 [[ $2 == "" ]] && echo "$X_HOSTNAME" && exit 0
[[ $X_HOSTNAME == "$2" ]] && exit 0 || exit 1 [[ $X_HOSTNAME == "$2" ]] && exit 0 || exit 1
;; ;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;;
*) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
esac
}
section_scripts()
{
USAGE_PREFIX="$SCRIPT scripts <command>"
# Get description from a file
get_script_description()
{
local file
local desc
file="$1"
desc=$(sed -n '/@description/s/.*@description *\(.*\)/\1/p' "$file" | head -1)
echo "${desc:-No description available}"
}
# Collect scripts and their descriptions
declare -A SCRIPT_MENU
for script in "$DOTFILES/scripts/install-"*.sh; do
if [ -f "$script" ]; then
name=$(basename "$script" .sh | sed 's/install-//')
desc=$(get_script_description "$script")
SCRIPT_MENU[$name]="$desc"
fi
done
case "$1" in
"")
# Show the menu
local menu_items=()
for name in "${!SCRIPT_MENU[@]}"; do
menu_items+=("$name:${SCRIPT_MENU[$name]}")
done
menu_builder "$USAGE_PREFIX" "${menu_items[@]}"
;;
*)
# Run the chosen script
script_path="$DOTFILES/scripts/install-$1.sh"
if [ -f "$script_path" ]; then
bash "$script_path"
else
msgr err "Script not found: $1"
fi
;;
esac esac
} }
@@ -581,7 +717,7 @@ section_tests()
USAGE_PREFIX="$SCRIPT tests <command>" USAGE_PREFIX="$SCRIPT tests <command>"
MENU=( MENU=(
"msg:List all log functions from shared.sh" "msgr:List all available msgr message types"
"params:List all parameters" "params:List all parameters"
) )
@@ -593,29 +729,29 @@ section_tests()
done done
;; ;;
msg) msg)
msg "msg" # shellcheck disable=SC1010
msg_done "msg_done" msgr done "msgr done"
msg_done_suffix "msg_done_suffix" msgr done_suffix "msgr done_suffix"
msg_err "msg_err" msgr err "msgr err"
msg_nested "msg_nested" msgr nested "msgr nested"
msg_nested_done "msg_nested_done" msgr nested_done "msgr nested_done"
msg_ok "msg_ok" msgr ok "msgr ok"
msg_prompt "msg_prompt" msgr prompt "msgr prompt"
msg_prompt_done "msg_prompt_done" msgr prompt_done "msgr prompt_done"
msg_run "msg_run" "second_param" msgr run "msgr run" "second_param"
msg_run_done "msg_run_done" "second_param" msgr run_done "msgr run_done" "second_param"
msg_warn "msg_warn" msgr warn "msgr warn"
msg_yay "msg_yay" msgr yay "msgr yay"
msg_yay_done "msg_yay_done" msgr yay_done "msgr yay_done"
;; ;;
*) menu_usage "$USAGE_PREFIX" "${MENU[@]}" ;; *) menu_builder "$USAGE_PREFIX" "${MENU[@]}" ;;
esac esac
} }
usage() usage()
{ {
echo "" echo ""
msg_prompt "Usage: $SCRIPT <section> <command>" msgr prompt "Usage: $SCRIPT <section> <command>"
echo $" Empty <command> prints <section> help." echo $" Empty <command> prints <section> help."
echo "" echo ""
section_install section_install
@@ -630,6 +766,8 @@ usage()
echo "" echo ""
section_docs section_docs
echo "" echo ""
section_scripts
echo ""
section_helpers section_helpers
} }
@@ -646,6 +784,7 @@ main()
dotfiles) section_dotfiles "$@" ;; dotfiles) section_dotfiles "$@" ;;
helpers) section_helpers "$@" ;; helpers) section_helpers "$@" ;;
docs) section_docs "$@" ;; docs) section_docs "$@" ;;
scripts) section_scripts "$@" ;;
tests) section_tests "$@" ;; tests) section_tests "$@" ;;
*) usage && exit 0 ;; *) usage && exit 0 ;;
esac esac

View File

@@ -23,7 +23,8 @@ generate_tmux_keybindings()
{ {
local tmux_keybindings_docs="$1" local tmux_keybindings_docs="$1"
local cb="\n\`\`\`\n" local cb="\n\`\`\`txt\n"
local cbe="\n\`\`\`\n"
local kb local kb
kb=$(tmux lsk -Tprefix -N | sed -e 's/^/ /;') kb=$(tmux lsk -Tprefix -N | sed -e 's/^/ /;')
local h="# tmux keybindings\n" local h="# tmux keybindings\n"
@@ -33,7 +34,7 @@ generate_tmux_keybindings()
kb="${kb//$HOME/\$HOME}" kb="${kb//$HOME/\$HOME}"
msg "Outputting tmux keybindings to $tmux_keybindings_docs" msg "Outputting tmux keybindings to $tmux_keybindings_docs"
echo -e "${h}${l}${cb}${kb}${cb}" > "$tmux_keybindings_docs" echo -e "${h}${l}${cb}${kb}${cbe}" > "$tmux_keybindings_docs"
msg "Done!" msg "Done!"
} }

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Create file containing key mappings for Neovim # @description Create file containing key mappings for Neovim
# Usage: ./create-nvim-keymaps.sh # Usage: ./create-nvim-keymaps.sh
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh

View File

@@ -1,18 +0,0 @@
#!/usr/bin/env bash
#
# Export oh-my-posh configuration as an image
#
# shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh"
main()
{
cd "$DOTFILES" || msg_err "Failed to change directory to $DOTFILES"
oh-my-posh config export image \
--config "$OHMYPOSH_CFG" \
--output "$HOME/.dotfiles/.github/screenshots/oh-my-posh.png" \
--author "Ismo Vuorinen"
}
main "$@"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Create file containing key mappings for wezterm # @description Create file containing key mappings for wezterm
# Usage: ./create-wezterm-keymaps.sh # Usage: ./create-wezterm-keymaps.sh
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh

View File

@@ -1,126 +0,0 @@
#!/usr/bin/env bash
#
# Install asdf and plugins I use
#
# It also updates asdf and the plugins, and then reshim asdf.
#
# Usage: ./install-asdf.sh [both|install|update|add_plugins]
# Author: Ismo Vuorinen <https://github.com/ivuorinen>
# License: MIT
#
source "${DOTFILES}/config/shared.sh"
export ASDF_DIR="${XDG_BIN_HOME}/asdf"
export PATH="${ASDF_DIR}/bin:$PATH"
# If ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME is not set, set it
if [ -z "${ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME}" ]; then
export ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME="${XDG_CONFIG_HOME}/asdf/plugin-versions"
fi
msg "Sourcing asdf in your shell"
. "$ASDF_DIR/asdf.sh"
ASDF_INSTALLABLES=(
"1password-cli:github.com/NeoHsu/asdf-1password-cli.git"
"age:github.com/threkk/asdf-age.git"
"bottom:github.com/carbonteq/asdf-btm.git"
"direnv:github.com/asdf-community/asdf-direnv.git"
"dotenv-linter:github.com/wesleimp/asdf-dotenv-linter.git"
"editorconfig-checker:github.com/gabitchov/asdf-editorconfig-checker.git"
"fd:gitlab.com/wt0f/asdf-fd.git"
"github-cli:github.com/bartlomiejdanek/asdf-github-cli.git"
"golang:github.com/asdf-community/asdf-golang.git"
"hadolint:github.com/devlincashman/asdf-hadolint.git"
"kubectl:github.com/asdf-community/asdf-kubectl.git"
"pre-commit:github.com/jonathanmorley/asdf-pre-commit.git"
"ripgrep:gitlab.com/wt0f/asdf-ripgrep.git"
"rust:github.com/code-lever/asdf-rust.git"
"shellcheck:github.com/luizm/asdf-shellcheck.git"
"shfmt:github.com/luizm/asdf-shfmt.git"
"terragrunt:github.com/ohmer/asdf-terragrunt.git"
"tf-summarize:github.com/adamcrews/asdf-tf-summarize.git"
"yamllint:github.com/ericcornelissen/asdf-yamllint.git"
"yq:github.com/sudermanjr/asdf-yq.git"
)
# Function to update asdf and plugins
update_asdf()
{
asdf plugin add asdf-plugin-manager https://github.com/asdf-community/asdf-plugin-manager.git
asdf install asdf-plugin-manager latest
asdf global asdf-plugin-manager "$(asdf latest asdf-plugin-manager)"
asdf-plugin-manager version
asdf-plugin-manager add-all
asdf-plugin-manager export > "${ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME}"
asdf install
return 0
}
update_asdf_commands()
{
msg "Updating asdf commands using asdf-plugin-manager"
asdf-plugin-manager update-all
return 0
}
# Function to install asdf plugins
install_asdf_plugins()
{
msg "Installing asdf plugins"
for item in "${ASDF_INSTALLABLES[@]}"; do
CMD=$(echo "${item}" | awk -F ":" '{print $1}')
URL=$(echo "${item}" | awk -F ":" '{print $2}')
asdf plugin add "${CMD}" "https://${URL}"
done
msg "Exporting asdf plugin versions"
asdf-plugin-manager export > "${ASDF_PLUGIN_MANAGER_PLUGIN_VERSIONS_FILENAME}"
return 0
}
reshim()
{
msg "Reshim asdf"
asdf reshim
return 0
}
# create usage function
usage()
{
echo "Usage: $0 [both|install|add_plugins|update]"
exit 1
}
main()
{
case $1 in
"both")
install_asdf_plugins
update_asdf
reshim
;;
"update")
update_asdf_commands
reshim
;;
"install")
update_asdf
reshim
;;
"add_plugins")
install_asdf_plugins
reshim
;;
*)
usage
;;
esac
}
main "$@"

View File

@@ -1,22 +1,18 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install cargo/rust packages. # @description Install cargo/rust packages.
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$HOME/.dotfiles/config/shared.sh"
echo "This file ($0) has been deprecated in favor of asdf. Please use asdf instead." msgr run "Starting to install rust/cargo packages"
exit 0
eval "$HOME/.dotfiles/config/shared.sh"
msg "Starting to install rust/cargo packages"
source "$CARGO_HOME/env" source "$CARGO_HOME/env"
# If we have cargo install-update, use it first # If we have cargo install-update, use it first
if command -v cargo-install-update &> /dev/null; then if command -v cargo-install-update &> /dev/null; then
msg_run "Updating cargo packages with cargo install-update" msgr run "Updating cargo packages with cargo install-update"
cargo install-update -a cargo install-update -a
msg_done "Done with cargo install-update" msgr run_done "Done with cargo install-update"
fi fi
packages=( packages=(
@@ -55,8 +51,9 @@ install_packages()
# Skip comments # Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi if [[ ${pkg:0:1} == "#" ]]; then continue; fi
msg_run "Installing cargo package $pkg" msgr run "Installing cargo package $pkg"
cargo install --jobs $BUILD_JOBS "$pkg" cargo install --jobs $BUILD_JOBS "$pkg"
msgr run_done "Done installing $pkg"
echo "" echo ""
done done
} }
@@ -64,14 +61,14 @@ install_packages()
# Function to perform additional steps for installed cargo packages # Function to perform additional steps for installed cargo packages
post_install_steps() post_install_steps()
{ {
msg_run "Now doing the next steps for cargo packages" msgr run "Now doing the next steps for cargo packages"
# use bob to install latest stable nvim # use bob to install latest stable nvim
if command -v bob &> /dev/null; then if command -v bob &> /dev/null; then
bob use stable && x-path-append "$XDG_DATA_HOME/bob/nvim-bin" bob use stable && x-path-append "$XDG_DATA_HOME/bob/nvim-bin"
fi fi
msg_run "Removing cargo cache" msgr run "Removing cargo cache"
cargo cache --autoclean cargo cache --autoclean
msg_done "Done removing cargo cache" msg_done "Done removing cargo cache"
} }

View File

@@ -1,4 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# @description Update pure-bash-bible cheatsheets
# shellcheck disable=SC2231,SC2034,SC2181,SC2068 # shellcheck disable=SC2231,SC2034,SC2181,SC2068
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh" source "${DOTFILES}/config/shared.sh"

View File

@@ -1,8 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install PHP Package Manager Composer # @description Install PHP Package Manager Composer
# #
# shellcheck source="shared.sh" # shellcheck source="shared.sh"
eval "$HOME/.dotfiles/config/shared.sh" source "$HOME/.dotfiles/config/shared.sh"
if ! command -v php &> /dev/null; then if ! command -v php &> /dev/null; then
msg_err "PHP Not Available, cannot install composer" msg_err "PHP Not Available, cannot install composer"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install NerdFonts # @description Install NerdFonts
# #
# shellcheck source="shared.sh" # shellcheck source="shared.sh"
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
@@ -7,24 +7,21 @@ source "$DOTFILES/config/shared.sh"
GIT_REPO="https://github.com/ryanoasis/nerd-fonts.git" GIT_REPO="https://github.com/ryanoasis/nerd-fonts.git"
TMP_PATH="$XDG_CACHE_HOME/nerd-fonts" TMP_PATH="$XDG_CACHE_HOME/nerd-fonts"
msg "-- NerdFonts --" msgr run "Starting to install NerdFonts"
fonts=( fonts=(
Hack
IntelOneMono
JetBrainsMono JetBrainsMono
OpenDyslexic OpenDyslexic
SpaceMono
) )
# Function to clone or update the NerdFonts repository # Function to clone or update the NerdFonts repository
clone_or_update_repo() clone_or_update_repo()
{ {
if [ ! -d "$TMP_PATH" ]; then if [ ! -d "$TMP_PATH" ]; then
git clone --quiet --filter=blob:none --sparse "$GIT_REPO" "$TMP_PATH" git clone --quiet --filter=blob:none --sparse --depth=1 "$GIT_REPO" "$TMP_PATH"
fi fi
cd "$TMP_PATH" || msg_err "No such folder $TMP_PATH" cd "$TMP_PATH" || msgr err "No such folder $TMP_PATH"
} }
# Function to add fonts to sparse-checkout # Function to add fonts to sparse-checkout
@@ -36,7 +33,7 @@ add_fonts_to_sparse_checkout()
# Skip comments # Skip comments
if [[ ${font:0:1} == "#" ]]; then continue; fi if [[ ${font:0:1} == "#" ]]; then continue; fi
msg_run "Adding $font to sparse-checkout" msgr run "Adding $font to sparse-checkout"
git sparse-checkout add "patched-fonts/$font" git sparse-checkout add "patched-fonts/$font"
echo "" echo ""
done done
@@ -45,9 +42,9 @@ add_fonts_to_sparse_checkout()
# Function to install NerdFonts # Function to install NerdFonts
install_fonts() install_fonts()
{ {
msg "Starting to install NerdFonts..." msgr run "Starting to install NerdFonts..."
./install.sh -q -s ${fonts[*]} ./install.sh -q -s ${fonts[*]}
msg_ok "Done" msgr run_done "Done"
} }
remove_tmp_path() remove_tmp_path()

View File

@@ -1,29 +0,0 @@
#!/usr/bin/env bash
#
# Install fzf
#
echo "This file ($0) has been deprecated in favor of asdf. Please use asdf instead."
exit 0
# shellcheck source=shared.sh
eval "$DOTFILES/config/shared.sh"
FZF_GIT="https://github.com/junegunn/fzf.git"
FZF_PATH="${XDG_CONFIG_HOME}/fzf"
FZF_BUILD="/tmp/fzf"
main()
{
if [ ! -d "$FZF_BUILD" ]; then
git clone --depth 1 "$FZF_GIT" "$FZF_BUILD"
"$FZF_BUILD/install" \
--xdg \
--bin
msg_done "fzf installed"
else
msg_done "fzf ($FZF_PATH/) already installed"
fi
}
main "$@"

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install GitHub CLI extensions # @description Install GitHub CLI extensions
# #
# shellcheck source="shared.sh" # shellcheck source="shared.sh"
source "${DOTFILES}/config/shared.sh" source "${DOTFILES}/config/shared.sh"
@@ -7,10 +7,10 @@ source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}" VERBOSE="${VERBOSE:-0}"
msg_run "Installing gh (GitHub Client) extensions" msgr run "Installing gh (GitHub Client) extensions"
if ! command -v gh &> /dev/null; then if ! command -v gh &> /dev/null; then
msg_err "gh (GitHub Client) could not be found, please install it first" msgr err "gh (GitHub Client) could not be found, please install it first"
exit 0 exit 0
fi fi
@@ -43,7 +43,7 @@ install_extensions()
# Skip comments # Skip comments
if [[ ${ext:0:1} == "#" ]]; then continue; fi if [[ ${ext:0:1} == "#" ]]; then continue; fi
msg_nested "Installing $ext" msgr nested "Installing $ext"
gh extension install "$ext" gh extension install "$ext"
echo "" echo ""
done done
@@ -52,7 +52,7 @@ install_extensions()
main() main()
{ {
install_extensions install_extensions
msg_ok "Done" msgr run_done "Done"
} }
main "$@" main "$@"

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# @description Install git-crypt
# #
# Install git-crypt
# NOTE: Experimental, wip # NOTE: Experimental, wip
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
@@ -9,7 +9,7 @@ source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}" VERBOSE="${VERBOSE:-0}"
msg_run "Installing git-crypt" msgr run "Installing git-crypt"
if ! command -v git-crypt &> /dev/null; then if ! command -v git-crypt &> /dev/null; then
REPO_URL="https://github.com/AGWA/git-crypt.git" REPO_URL="https://github.com/AGWA/git-crypt.git"
@@ -23,8 +23,8 @@ if ! command -v git-crypt &> /dev/null; then
cd "$BUILD_PATH" || msg_err "$BUILD_PATH not found" cd "$BUILD_PATH" || msg_err "$BUILD_PATH not found"
make && make install PREFIX="$HOME/.local" make && make install PREFIX="$HOME/.local"
else else
msg_done "git-crypt ($CHECK_PATH) already installed" msgr run_done "git-crypt ($CHECK_PATH) already installed"
fi fi
fi fi
msg_done "Done installing git-crypt" msgr run_done "Done installing git-crypt"

View File

@@ -1,19 +1,15 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install Go packages # @description Install Go packages
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
echo "This file ($0) has been deprecated in favor of asdf. Please use asdf instead."
exit 0
eval "$DOTFILES/config/shared.sh"
# Enable verbosity with VERBOSE=1 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}" VERBOSE="${VERBOSE:-0}"
msg_run "Installing go packages" msgr run "Installing go packages"
! x-have "go" && msg "go hasn't been installed yet." && exit 0 ! x-have "go" && msgr err "go hasn't been installed yet." && exit 0
packages=( packages=(
# A shell parser, formatter, and interpreter with bash support; includes shfmt # A shell parser, formatter, and interpreter with bash support; includes shfmt
@@ -49,7 +45,7 @@ install_packages()
# Skip comments # Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi if [[ ${pkg:0:1} == "#" ]]; then continue; fi
msg_nested "Installing go package: $pkg" msgr nested "Installing go package: $pkg"
go install "$pkg" go install "$pkg"
echo "" echo ""
done done
@@ -58,23 +54,23 @@ install_packages()
# Function to install completions and run actions for selected packages # Function to install completions and run actions for selected packages
post_install() post_install()
{ {
msg_run "Installing completions for selected packages" msgr run "Installing completions for selected packages"
if command -v git-profile &> /dev/null; then if command -v git-profile &> /dev/null; then
git-profile completion zsh > "$ZSH_CUSTOM_COMPLETION_PATH/_git-profile" \ git-profile completion zsh > "$ZSH_CUSTOM_COMPLETION_PATH/_git-profile" \
&& msg_ok "Installed completions for git-profile" && msgr run_done "Installed completions for git-profile"
fi fi
if command -v antidot &> /dev/null; then if command -v antidot &> /dev/null; then
antidot update \ antidot update \
&& msg_ok "Updated antidot database" && msgr run_done "Updated antidot database"
fi fi
} }
# Function to clear go cache # Function to clear go cache
clear_go_cache() clear_go_cache()
{ {
msg_run "Clearing go cache" msgr run "Clearing go cache"
go clean -cache -modcache go clean -cache -modcache
} }
@@ -83,7 +79,7 @@ main()
install_packages install_packages
post_install post_install
clear_go_cache clear_go_cache
msg_ok "Done" msgr run_done "Done"
} }
main "$@" main "$@"

View File

@@ -1,17 +1,15 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# # @description Sets macOS Defaults that I like
# set-macos-defaults.sh - Sets macOS Defaults that I like
# #
# This script contains large portions from following scripts: # This script contains large portions from following scripts:
# - https://github.com/freekmurze/dotfiles/blob/main/macos/set-defaults.sh # - https://github.com/freekmurze/dotfiles/blob/main/macos/set-defaults.sh
#
[ "$(uname)" != "Darwin" ] && echo "Not a macOS system" && exit 0 [ "$(uname)" != "Darwin" ] && echo "Not a macOS system" && exit 0
# shellcheck source=shared.sh # shellcheck source=shared.sh
eval "$HOME/.dotfiles/config/shared.sh" source "$HOME/.dotfiles/config/shared.sh"
msg_run "Starting to set macOS defaults, these require sudo privileges:" msgr run "Starting to set macOS defaults, these require sudo privileges:"
# Ask for the administrator password upfront # Ask for the administrator password upfront
sudo -v sudo -v
@@ -24,7 +22,7 @@ while true; do
kill -0 "$$" || exit kill -0 "$$" || exit
done 2> /dev/null & done 2> /dev/null &
msg_nested "Change user shell to zsh if it is available and not the current" msgr nested "Change user shell to zsh if it is available and not the current"
# Change user shell to zsh if not that already. # Change user shell to zsh if not that already.
if hash zsh 2> /dev/null; then if hash zsh 2> /dev/null; then
@@ -35,7 +33,7 @@ fi
# General UI/UX # # General UI/UX #
############################################################################### ###############################################################################
msg_nested "Setting General UI/UX settings" msgr nested "Setting General UI/UX settings"
# Disable the sound effects on boot # Disable the sound effects on boot
sudo nvram SystemAudioVolume=" " sudo nvram SystemAudioVolume=" "
@@ -89,7 +87,7 @@ defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
# SSD-specific tweaks # # SSD-specific tweaks #
############################################################################### ###############################################################################
msg_nested "Setting SSD-specific tweaks" msgr nested "Setting SSD-specific tweaks"
# Disable hibernation (speeds up entering sleep mode) # Disable hibernation (speeds up entering sleep mode)
sudo pmset -a hibernatemode 0 sudo pmset -a hibernatemode 0
@@ -101,7 +99,7 @@ sudo pmset -a sms 0
# Trackpad, mouse, keyboard, Bluetooth accessories, and input # # Trackpad, mouse, keyboard, Bluetooth accessories, and input #
############################################################################### ###############################################################################
msg_nested "Settings for Trackpad, mouse, keyboard, Bluetooth accessories, and input" msgr nested "Settings for Trackpad, mouse, keyboard, Bluetooth accessories, and input"
# Increase sound quality for Bluetooth headphones/headsets # Increase sound quality for Bluetooth headphones/headsets
defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Max (editable)" 80 defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Max (editable)" 80
@@ -137,7 +135,7 @@ launchctl unload -w /System/Library/LaunchAgents/com.apple.rcd.plist 2> /dev/nul
# Screen # # Screen #
############################################################################### ###############################################################################
msg_nested "Settings for Screen" msgr nested "Settings for Screen"
# Require password immediately after sleep or screen saver begins # Require password immediately after sleep or screen saver begins
defaults write com.apple.screensaver askForPassword -int 1 defaults write com.apple.screensaver askForPassword -int 1
@@ -147,7 +145,7 @@ defaults write com.apple.screensaver askForPasswordDelay -int 0
# Finder # # Finder #
############################################################################### ###############################################################################
msg_nested "Settings for Finder" msgr nested "Settings for Finder"
# Set Desktop as the default location for new Finder windows # Set Desktop as the default location for new Finder windows
# For other paths, use `PfLo` and `file:///full/path/here/` # For other paths, use `PfLo` and `file:///full/path/here/`
@@ -207,7 +205,7 @@ defaults write com.apple.finder FXInfoPanesExpanded -dict \
# Screenshots # # Screenshots #
############################################################################### ###############################################################################
msg_nested "Settings for Screenshots" msgr nested "Settings for Screenshots"
# Set default screenshot location # Set default screenshot location
mkdir -p "$HOME/Documents/Screenshots" mkdir -p "$HOME/Documents/Screenshots"
@@ -223,7 +221,7 @@ defaults write com.apple.screencapture "name" -string "screenshot"
# Dock, Dashboard, and hot corners # # Dock, Dashboard, and hot corners #
############################################################################### ###############################################################################
msg_nested "Settings for Dock, Dashboard, and hot corners" msgr nested "Settings for Dock, Dashboard, and hot corners"
# Prevent applications from bouncing in Dock # Prevent applications from bouncing in Dock
defaults write com.apple.dock no-bouncing -bool true defaults write com.apple.dock no-bouncing -bool true
@@ -255,7 +253,7 @@ defaults write com.apple.dock showhidden -bool true
# Safari & WebKit # # Safari & WebKit #
############################################################################### ###############################################################################
msg_nested "Settings for Safari & WebKit" msgr nested "Settings for Safari & WebKit"
# Enable Safari's debug menu # Enable Safari's debug menu
defaults write com.apple.Safari IncludeInternalDebugMenu -bool true defaults write com.apple.Safari IncludeInternalDebugMenu -bool true
@@ -281,7 +279,7 @@ defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true
# Activity Monitor # # Activity Monitor #
############################################################################### ###############################################################################
msg_nested "Settings for ActivityMonitor" msgr nested "Settings for ActivityMonitor"
# Show the main window when launching Activity Monitor # Show the main window when launching Activity Monitor
defaults write com.apple.ActivityMonitor OpenMainWindow -bool true defaults write com.apple.ActivityMonitor OpenMainWindow -bool true
@@ -300,7 +298,7 @@ defaults write com.apple.ActivityMonitor SortDirection -int 0
# Address Book, Dashboard, iCal, TextEdit, and Disk Utility # # Address Book, Dashboard, iCal, TextEdit, and Disk Utility #
############################################################################### ###############################################################################
msg_nested "Settings for Address Book, Dashboard, iCal, TextEdit, and Disk Utility" msgr nested "Settings for Address Book, Dashboard, iCal, TextEdit, and Disk Utility"
# Use plain text mode for new TextEdit documents # Use plain text mode for new TextEdit documents
defaults write com.apple.TextEdit RichText -int 0 defaults write com.apple.TextEdit RichText -int 0
@@ -313,7 +311,7 @@ defaults write com.apple.TextEdit PlainTextEncodingForWrite -int 4
# Messages # # Messages #
############################################################################### ###############################################################################
msg_nested "Settings for Messages" msgr nested "Settings for Messages"
# Disable smart quotes as it's annoying for messages that contain code # Disable smart quotes as it's annoying for messages that contain code
defaults write com.apple.messageshelper.MessageController \ defaults write com.apple.messageshelper.MessageController \
@@ -327,7 +325,7 @@ defaults write com.apple.messageshelper.MessageController \
-dict-add "continuousSpellCheckingEnabled" \ -dict-add "continuousSpellCheckingEnabled" \
-bool false -bool false
msg_nested "Restarting applications to apply changes" msgr nested "Restarting applications to apply changes"
############################################################################### ###############################################################################
# Kill affected applications # # Kill affected applications #

View File

@@ -1,73 +0,0 @@
#!/usr/bin/env bash
#
# Install neofetch from source
#
# shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
if ! declare -f msg > /dev/null; then
# Function to print messages if VERBOSE is enabled
# $1 - message (string)
msg()
{
[ "$VERBOSE" -eq 1 ] && echo "$1"
return 0
}
fi
if ! declare -f msg_err > /dev/null; then
# Function to print error messages and exit
# $1 - error message (string)
msg_err()
{
echo "(!) ERROR: $1" >&2
exit 1
}
fi
if ! declare -f msg_done > /dev/null; then
# Function to print done message
# $1 - message (string)
msg_done()
{
echo "$1"
return 0
}
fi
NEOFETCH_VERSION="$(x-gh-get-latest-version dylanaraps/neofetch)"
NEOFETCH_REPO="https://github.com/dylanaraps/neofetch"
NEOFETCH_URL="${NEOFETCH_REPO}/archive/refs/tags/${NEOFETCH_VERSION}.tar.gz"
NEOFETCH_TEMP="/tmp/neofetch"
NEOFETCH_INSTALL_PREFIX="$HOME/.local"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to install neofetch from source
install_neofetch()
{
LC_ALL=C
mkdir -p "$NEOFETCH_TEMP" "$NEOFETCH_INSTALL_PREFIX"
curl -L "$NEOFETCH_URL" -o "$NEOFETCH_TEMP.tar.gz"
tar zxvf "$NEOFETCH_TEMP.tar.gz" --directory="$NEOFETCH_TEMP"
cd "$NEOFETCH_TEMP/neofetch-$NEOFETCH_VERSION" \
&& make PREFIX="${NEOFETCH_INSTALL_PREFIX}" install \
&& rm -rf "$NEOFETCH_TEMP*" \
&& msg_yay "neofetch installed!"
}
main()
{
if ! command -v neofetch &> /dev/null; then
install_neofetch
elif [ "$NEOFETCH_VERSION" != "$(neofetch --version | awk '{print $2}')" ]; then
install_neofetch
else
msg_done "neofetch v.${NEOFETCH_VERSION} already installed"
fi
}
main "$@"

View File

@@ -1,9 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install npm packages globally. # @description Install npm packages globally.
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "$DOTFILES/config/shared.sh"
eval "$DOTFILES/config/shared.sh"
# Enable verbosity with VERBOSE=1 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}" VERBOSE="${VERBOSE:-0}"

View File

@@ -1,16 +1,15 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# # @description Install ntfy
# Install ntfy
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
eval "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
# Enable verbosity with VERBOSE=1 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}" VERBOSE="${VERBOSE:-0}"
# Check if ntfy is already installed # Check if ntfy is already installed
if x-have "ntfy"; then if x-have "ntfy"; then
msg "ntfy already installed" msgr done "ntfy already installed"
exit 0 exit 0
fi fi
@@ -23,7 +22,7 @@ case $(dfm check arch) in
NTFY_ARCH="macOS_all" NTFY_ARCH="macOS_all"
;; ;;
*) *)
msg_err "Unsupported OS" msgr err "Unsupported OS"
;; ;;
esac esac
@@ -51,7 +50,7 @@ install_ntfy()
main() main()
{ {
install_ntfy install_ntfy
msg "ntfy installation complete" msgr done "ntfy installation complete"
} }
main "$@" main "$@"

View File

@@ -1,33 +0,0 @@
#!/usr/bin/env bash
#
# Install oh-my-bash
#
# shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh"
set -euo pipefail
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
OSH="$HOME/.local/share/oh-my-bash"
# Function to install oh-my-bash
install_oh_my_bash()
{
if [ ! -d "$OSH" ]; then
[ -f "$HOME/.bashrc" ] && mv "$HOME/.bashrc" "$HOME/.bashrc.temp"
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" --unattended
[ -f "$HOME/.bashrc.temp" ] && mv "$HOME/.bashrc.temp" "$HOME/.bashrc"
msg "oh-my-bash installed to $OSH"
else
msg_done "oh-my-bash ($OSH) already installed"
fi
}
main()
{
install_oh_my_bash
}
main "$@"

View File

@@ -1,33 +0,0 @@
#!/usr/bin/env zsh
#
# Install oh-my-posh
#
# shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
msg "Starting to install oh-my-posh"
# Install oh-my-posh
install_oh_my_posh()
{
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/.local/bin
msg "oh-my-posh installed to ~/.local/bin"
}
# Initialize oh-my-posh
init_oh_my_posh()
{
eval "$(oh-my-posh init zsh --config $OHMYPOSH_CFG)"
msg "oh-my-posh initialized with config $OHMYPOSH_CFG"
}
main()
{
install_oh_my_posh
init_oh_my_posh
}
main "$@"

View File

@@ -1,21 +1,20 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Install python/pip packages. # @description Install python/pip packages.
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh" source "${DOTFILES}/config/shared.sh"
# Enable verbosity with VERBOSE=1 # Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}" VERBOSE="${VERBOSE:-0}"
msg "Starting to install pip packages" msgr run "Starting to install pip packages"
if ! command -v python3 &> /dev/null; then if ! command -v python3 &> /dev/null; then
msg_err "Could not find python3, something really weird is going on." msgr err "Could not find python3, something really weird is going on."
exit 1 exit 1
fi fi
msg_nested "Upgrading pip" msgr nested "Upgrading pip"
python3 -m pip install --user --upgrade pip python3 -m pip install --user --upgrade pip
packages=( packages=(
@@ -32,11 +31,11 @@ install_packages()
# Skip comments # Skip comments
if [[ ${pkg:0:1} == "#" ]]; then continue; fi if [[ ${pkg:0:1} == "#" ]]; then continue; fi
msg_nested "Installing pip package: $pkg" msgr nested "Installing pip package: $pkg"
python3 -m pip install --user --upgrade "$pkg" python3 -m pip install --user --upgrade "$pkg"
echo "" echo ""
done done
} }
install_packages install_packages
msg_yay "Run pip package installations" msgr run_done "Run pip package installations"

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# # @description Install XCode CLI Tools with osascript magic.
# Install XCode CLI Tools with osascript magic.
# Ismo Vuorinen <https://github.com/ivuorinen> 2018 # Ismo Vuorinen <https://github.com/ivuorinen> 2018
# #
@@ -9,13 +8,13 @@ VERBOSE="${VERBOSE:-0}"
# Check if the script is running on macOS # Check if the script is running on macOS
if [ "$(uname)" != "Darwin" ]; then if [ "$(uname)" != "Darwin" ]; then
echo "Not a macOS system" msgr warn "Not a macOS system"
exit 0 exit 0
fi fi
# Check if xcode-select is available # Check if xcode-select is available
if ! command -v xcode-select &> /dev/null; then if ! command -v xcode-select &> /dev/null; then
msg_err "xcode-select could not be found, skipping" msgr err "xcode-select could not be found, skipping"
exit 0 exit 0
fi fi
@@ -46,7 +45,7 @@ prompt_xcode_install()
if [ "$XCODE_MESSAGE" = "button returned:OK" ]; then if [ "$XCODE_MESSAGE" = "button returned:OK" ]; then
xcode-select --install xcode-select --install
else else
echo "You have cancelled the installation, please rerun the installer." msgr warn "You have cancelled the installation, please rerun the installer."
exit 1 exit 1
fi fi
} }
@@ -57,7 +56,7 @@ main()
keep_alive_sudo keep_alive_sudo
if [ -x "$XCODE_SWIFT_PATH" ]; then if [ -x "$XCODE_SWIFT_PATH" ]; then
echo "You have swift from xcode-select. Continuing..." msgr run "You have swift from xcode-select. Continuing..."
else else
prompt_xcode_install prompt_xcode_install
fi fi

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# # @description Install z
# Install z
# #
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${DOTFILES}/config/shared.sh" source "${DOTFILES}/config/shared.sh"
@@ -16,9 +15,9 @@ clone_z_repo()
if [ ! -d "$bin_path" ]; then if [ ! -d "$bin_path" ]; then
git clone "$git_path" "$bin_path" git clone "$git_path" "$bin_path"
msg "z installed at $bin_path" msgr run_done "z installed at $bin_path"
else else
msg "z ($bin_path/) already installed" msgr ok "z ($bin_path/) already installed"
fi fi
} }

View File

@@ -1,19 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# # Shared bash functions and helpers.
# Shared bash functions and helpers
# that can be sourced to other scripts.
# Helper env variables. Use like this: VERBOSE=1 ./script.sh # Helper env variables. Use like this: VERBOSE=1 ./script.sh
: "${VERBOSE:=0}" : "${VERBOSE:=0}"
# Set variable that checks if the shared.sh script has been sourced only once # Set variable that checks if the shared.sh script has been
# If the script has been sourced more than once, the script not be sourced again # sourced only once If the script has been sourced more than once,
# the script not be sourced again.
[ -z "$SHARED_SCRIPTS_SOURCED" ] && { [ -z "$SHARED_SCRIPTS_SOURCED" ] && {
source "${DOTFILES}/config/shared.sh" source "${DOTFILES}/config/shared.sh"
msgr warn "(!) shared.sh not sourced" msgr warn "(!) shared.sh not sourced"
# Set variable that checks if the shared.sh script has been sourced only once # Set variable that checks if the shared.sh script has been
# sourced only once.
# shellcheck disable=SC2034 # shellcheck disable=SC2034
export SHARED_SCRIPTS_SOURCED=1 export SHARED_SCRIPTS_SOURCED=1
} }

View File

@@ -4,7 +4,7 @@ indent_type = "Spaces"
indent_width = 2 indent_width = 2
quote_style = "AutoPreferSingle" quote_style = "AutoPreferSingle"
call_parentheses = "None" call_parentheses = "None"
collapse_simple_statement = "Always" collapse_simple_statement = "Never"
[sort_requires] [sort_requires]
enabled = true enabled = true

1
tools/dotbot-asdf Submodule

Submodule tools/dotbot-asdf added at 1ff44a2848