Compare commits

...

40 Commits

Author SHA1 Message Date
github-actions[bot]
ee47821089 chore: update pre-commit hooks (#115) 2025-06-02 08:16:06 +03:00
github-actions[bot]
b834ce04f7 chore: update pre-commit hooks (#114) 2025-05-29 14:54:33 +03:00
github-actions[bot]
6a62d73d7f chore: update pre-commit hooks (#113) 2025-05-26 13:15:01 +03:00
github-actions[bot]
440842ed34 chore: update pre-commit hooks (#112) 2025-05-22 08:29:51 +03:00
renovate[bot]
d0563e4a29 chore(deps): update node.js to v22.16.0 (#111) 2025-05-22 01:11:53 +03:00
github-actions[bot]
bc404bfbea chore: update pre-commit hooks (#110) 2025-05-19 08:27:54 +03:00
923f881725 chore(config): change git merge conflictStyle 2025-05-16 21:50:29 +03:00
ccc5903290 chore(config): updated zed settings
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-05-16 21:49:55 +03:00
renovate[bot]
786efc48fa chore(deps): update node.js to v22.15.1 (#109) 2025-05-15 20:09:12 +03:00
2a11a28422 chore(repo): tweak install.conf.yaml
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-05-15 16:39:15 +03:00
812a27ea61 chore(config): updated zed settings
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-05-15 16:38:49 +03:00
e73e61f01b chore(config): added git-profile completions
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-05-15 16:38:23 +03:00
314679b4fc chore(deps): updated Brewfile
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-05-15 16:37:59 +03:00
github-actions[bot]
516b27384a chore: update pre-commit hooks (#108)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2025-05-12 12:28:03 +03:00
github-actions[bot]
9e1af3053d chore: update pre-commit hooks (#107)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2025-05-08 09:51:32 +03:00
github-actions[bot]
9e4f8741b3 chore: update pre-commit hooks (#106)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2025-05-05 11:37:52 +03:00
c0995c1b49 chore(config): zed: settings update 2025-05-03 02:32:38 +03:00
c9f1e824c3 chore(bin): fish support shared.sh and dfm 2025-05-03 02:32:01 +03:00
3d301daeb1 chore: remove x-dupers.pl 2025-05-03 02:29:48 +03:00
8b4198dc90 chore(lint): shfmt local/bin/* 2025-05-03 02:15:04 +03:00
66461f9b1b chore(config): zed: update config 2025-05-03 02:14:19 +03:00
80851d1efd chore(config): vim: fix ctrl-s, ctrl-p 2025-05-03 02:13:45 +03:00
github-actions[bot]
c457c0f3ab chore: update pre-commit hooks (#105)
Co-authored-by: ivuorinen <11024+ivuorinen@users.noreply.github.com>
2025-05-01 11:15:18 +03:00
9936e4bd76 chore(config): reorg of mini plugins
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-29 18:08:23 +03:00
c3a45e2653 chore(deps): update Brewfile
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-29 18:08:00 +03:00
506360a027 chore(config): fish: config cleanup, fixes
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-29 18:07:50 +03:00
github-actions[bot]
00074ec3ff chore: update pre-commit hooks (#104) 2025-04-28 18:53:17 +03:00
renovate[bot]
7c7daf89ea feat(github-action): update actions/setup-python (v5.5.0 → v5.6.0)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-24 21:49:51 +00:00
renovate[bot]
267c54aa56 chore(deps): update node.js to v22.15.0 (#102) 2025-04-24 09:09:01 +03:00
github-actions[bot]
d72409efc0 chore: update pre-commit hooks (#103) 2025-04-24 08:48:35 +03:00
3d9e0477b0 feat(bin): git-attributes rewrite 2025-04-22 10:11:32 +03:00
cfab48eee0 chore(config): zed config mode change 2025-04-22 10:08:12 +03:00
624920b2ab chore(config): nvim, tmux and wezterm tweaks 2025-04-22 10:07:34 +03:00
github-actions[bot]
fd82f1e36c chore: update pre-commit hooks (#101) 2025-04-21 14:23:31 +03:00
dependabot[bot]
48ec8cd7a7 chore(deps): bump http-proxy-middleware (#100) 2025-04-19 13:10:01 +03:00
renovate[bot]
3a61bd2b72 fix(github-action): update softprops/action-gh-release (v2.2.1 → v2.2.2)
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-19 04:34:26 +00:00
895b0ad353 chore(config): aqua: remove extra tools
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-19 04:12:58 +03:00
3c733ec7eb chore(config): tmux: tweak theme
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-19 04:12:36 +03:00
5321ad7bd7 feat(config): fish formatting, secrets, op
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-19 04:11:14 +03:00
196077bea9 feat(nvim): reworked lsp, theme, cleanup
Signed-off-by: Ismo Vuorinen <ismo@ivuorinen.net>
2025-04-19 04:04:26 +03:00
53 changed files with 1670 additions and 1146 deletions

View File

@@ -8,11 +8,14 @@ indent_style = space
insert_final_newline = true insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
[*.fish]
max_line_length = 80
[*.md] [*.md]
max_line_length = 100 max_line_length = 100
[*.lua] [*.lua]
max_line_length = 120 max_line_length = 90
[*.{php,fish}] [*.{php,fish}]
indent_size = 4 indent_size = 4

45
.gitattributes vendored
View File

@@ -1,4 +1,4 @@
## GITATTRIBUTES FOR WEB PROJECTS ## GITATTRIBUTES
# #
# These settings are for any web project. # These settings are for any web project.
# #
@@ -20,20 +20,23 @@
*.bat text eol=crlf *.bat text eol=crlf
*.cmd text eol=crlf *.cmd text eol=crlf
*.coffee text *.coffee text
*.css text diff=css *.css text diff=css eol=lf
*.htm text diff=html *.fish text diff=shell eol=lf
*.html text diff=html *.htm text diff=html eol=lf
*.html text diff=html eol=lf
*.inc text *.inc text
*.ini text *.ini text
*.js text *.js text
*.json text *.json text
*.jsx text *.jsx text
*.less text *.less text
*.lua text diff=lua eol=lf
*.ls text *.ls text
*.map text -diff *.map text -diff
*.od text *.od text
*.onlydata text *.onlydata text
*.php text diff=php *.php text diff=php
*.plist text eol=lf
*.pl text *.pl text
*.ps1 text eol=crlf *.ps1 text eol=crlf
*.py text diff=python *.py text diff=python
@@ -41,15 +44,18 @@
*.sass text *.sass text
*.scm text *.scm text
*.scss text diff=css *.scss text diff=css
*.sh text eol=lf *.sh text eol=lf diff=shell
.husky/* text eol=lf .husky/* text eol=lf
*.sql text *.sql text
*.styl text *.styl text
*.tag text *.tag text
*.tmux text eol=lf diff=tmux
*.ts text *.ts text
*.tsx text *.tsx text
*.vim text eol=lf
*.xml text *.xml text
*.xhtml text diff=html *.xhtml text diff=html
*.zsh text diff=zsh eol=lf
# Docker # Docker
Dockerfile text Dockerfile text
@@ -68,6 +74,7 @@ Dockerfile text
AUTHORS text AUTHORS text
CHANGELOG text CHANGELOG text
CHANGES text CHANGES text
CODEOWNERS text
CONTRIBUTING text CONTRIBUTING text
COPYING text COPYING text
copyright text copyright text
@@ -105,6 +112,8 @@ TODO text
*.config text *.config text
.editorconfig text .editorconfig text
.env text .env text
*.env text
*.env.* text
.gitattributes text .gitattributes text
.gitconfig text .gitconfig text
.htaccess text .htaccess text
@@ -208,15 +217,37 @@ Procfile text
*.gitignore text *.gitignore text
*.gitkeep text *.gitkeep text
.gitattributes export-ignore .gitattributes text export-ignore
*.gitattributes text export-ignore
.gitmodules text export-ignore
*.gitmodules text export-ignore
**/.gitignore export-ignore **/.gitignore export-ignore
**/.gitkeep export-ignore **/.gitkeep export-ignore
# Repo specials # Repo specials
local/bin/* text eol=lf local/bin/* text eol=lf diff=shell
local/bin/*.md text eol=lf diff=markdown
config/antigen.zsh text config/antigen.zsh text
git/* text git/* text
**/git/* text **/git/* text
**/alias text **/alias text
ssh/* text ssh/* text
ssh/shared.d/* text
ssh/local.d/* text
# Auto-generated rules - 2025-04-16 10:28:04
# Shell scripts detected by content
install text eol=lf diff=shell
# File extension-based rules
*.1 text eol=lf
*.applescript text eol=lf
*.d/work-git text eol=lf
*.dirs text eol=lf
*.example text eol=lf
*.itermcolors text eol=lf
*.locale text eol=lf
*.python-version text eol=lf
*.snippets text eol=lf
*.theme text eol=lf
*.yamlfmt text eol=lf

View File

@@ -40,7 +40,7 @@ jobs:
- name: Create release - name: Create release
if: steps.daily-version.outputs.created if: steps.daily-version.outputs.created
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1 uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
tag_name: ${{ steps.daily-version.outputs.version }} tag_name: ${{ steps.daily-version.outputs.version }}

View File

@@ -25,7 +25,7 @@ jobs:
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5.5.0 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
- run: pip install pre-commit && pre-commit autoupdate - run: pip install pre-commit && pre-commit autoupdate

1
.gitignore vendored
View File

@@ -40,6 +40,7 @@ node_modules
ssh/local.d/* ssh/local.d/*
!ssh/local.d/.gitkeep !ssh/local.d/.gitkeep
config/fish/fish_variables config/fish/fish_variables
**/exports.secret.fish
**/exports-secret.fish **/exports-secret.fish
config/fish/completions/asdf.fish config/fish/completions/asdf.fish
config/vim/.netrwhist config/vim/.netrwhist

2
.nvmrc
View File

@@ -1 +1 @@
22.14.0 22.16.0

View File

@@ -23,13 +23,13 @@ repos:
args: [--autofix, --no-sort-keys] args: [--autofix, --no-sort-keys]
- repo: https://github.com/igorshubovych/markdownlint-cli - repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.44.0 rev: v0.45.0
hooks: hooks:
- id: markdownlint - id: markdownlint
args: [-c, .markdownlint.json, --fix] args: [-c, .markdownlint.json, --fix]
- repo: https://github.com/adrienverge/yamllint - repo: https://github.com/adrienverge/yamllint
rev: v1.37.0 rev: v1.37.1
hooks: hooks:
- id: yamllint - id: yamllint
@@ -49,12 +49,12 @@ repos:
- id: actionlint - id: actionlint
- repo: https://github.com/renovatebot/pre-commit-hooks - repo: https://github.com/renovatebot/pre-commit-hooks
rev: 39.248.1 rev: 40.36.8
hooks: hooks:
- id: renovate-config-validator - id: renovate-config-validator
- repo: https://github.com/JohnnyMorganz/StyLua - repo: https://github.com/JohnnyMorganz/StyLua
rev: v2.0.2 rev: v2.1.0
hooks: hooks:
- id: stylua # or stylua-system / stylua-github - id: stylua # or stylua-system / stylua-github

View File

@@ -9,13 +9,7 @@
# - all # - all
registries: registries:
- type: standard - type: standard
ref: v4.331.0 # renovate: depName=aquaproj/aqua-registry ref: v4.346.0 # renovate: depName=aquaproj/aqua-registry
packages: packages:
- name: cli/cli - name: cli/cli
version: 'v2.69.0' version: 'v2.69.0'
- name: junegunn/fzf
version: 'v0.60.3'
- name: jqlang/jq
version: 'jq-1.7.1'
- name: 1password/cli
version: '2.30.3'

View File

@@ -0,0 +1,176 @@
# fish completion for git-profile -*- shell-script -*-
function __git_profile_debug
set -l file "$BASH_COMP_DEBUG_FILE"
if test -n "$file"
echo "$argv" >> $file
end
end
function __git_profile_perform_completion
__git_profile_debug "Starting __git_profile_perform_completion"
# Extract all args except the last one
set -l args (commandline -opc)
# Extract the last arg and escape it in case it is a space
set -l lastArg (string escape -- (commandline -ct))
__git_profile_debug "args: $args"
__git_profile_debug "last arg: $lastArg"
set -l requestComp "$args[1] __complete $args[2..-1] $lastArg"
__git_profile_debug "Calling $requestComp"
set -l results (eval $requestComp 2> /dev/null)
# Some programs may output extra empty lines after the directive.
# Let's ignore them or else it will break completion.
# Ref: https://github.com/spf13/cobra/issues/1279
for line in $results[-1..1]
if test (string trim -- $line) = ""
# Found an empty line, remove it
set results $results[1..-2]
else
# Found non-empty line, we have our proper output
break
end
end
set -l comps $results[1..-2]
set -l directiveLine $results[-1]
# For Fish, when completing a flag with an = (e.g., <program> -n=<TAB>)
# completions must be prefixed with the flag
set -l flagPrefix (string match -r -- '-.*=' "$lastArg")
__git_profile_debug "Comps: $comps"
__git_profile_debug "DirectiveLine: $directiveLine"
__git_profile_debug "flagPrefix: $flagPrefix"
for comp in $comps
printf "%s%s\n" "$flagPrefix" "$comp"
end
printf "%s\n" "$directiveLine"
end
# This function does two things:
# - Obtain the completions and store them in the global __git_profile_comp_results
# - Return false if file completion should be performed
function __git_profile_prepare_completions
__git_profile_debug ""
__git_profile_debug "========= starting completion logic =========="
# Start fresh
set --erase __git_profile_comp_results
set -l results (__git_profile_perform_completion)
__git_profile_debug "Completion results: $results"
if test -z "$results"
__git_profile_debug "No completion, probably due to a failure"
# Might as well do file completion, in case it helps
return 1
end
set -l directive (string sub --start 2 $results[-1])
set --global __git_profile_comp_results $results[1..-2]
__git_profile_debug "Completions are: $__git_profile_comp_results"
__git_profile_debug "Directive is: $directive"
set -l shellCompDirectiveError 1
set -l shellCompDirectiveNoSpace 2
set -l shellCompDirectiveNoFileComp 4
set -l shellCompDirectiveFilterFileExt 8
set -l shellCompDirectiveFilterDirs 16
if test -z "$directive"
set directive 0
end
set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2)
if test $compErr -eq 1
__git_profile_debug "Received error directive: aborting."
# Might as well do file completion, in case it helps
return 1
end
set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2)
set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2)
if test $filefilter -eq 1; or test $dirfilter -eq 1
__git_profile_debug "File extension filtering or directory filtering not supported"
# Do full file completion instead
return 1
end
set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2)
set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2)
__git_profile_debug "nospace: $nospace, nofiles: $nofiles"
# If we want to prevent a space, or if file completion is NOT disabled,
# we need to count the number of valid completions.
# To do so, we will filter on prefix as the completions we have received
# may not already be filtered so as to allow fish to match on different
# criteria than the prefix.
if test $nospace -ne 0; or test $nofiles -eq 0
set -l prefix (commandline -t | string escape --style=regex)
__git_profile_debug "prefix: $prefix"
set -l completions (string match -r -- "^$prefix.*" $__git_profile_comp_results)
set --global __git_profile_comp_results $completions
__git_profile_debug "Filtered completions are: $__git_profile_comp_results"
# Important not to quote the variable for count to work
set -l numComps (count $__git_profile_comp_results)
__git_profile_debug "numComps: $numComps"
if test $numComps -eq 1; and test $nospace -ne 0
# We must first split on \t to get rid of the descriptions to be
# able to check what the actual completion will be.
# We don't need descriptions anyway since there is only a single
# real completion which the shell will expand immediately.
set -l split (string split --max 1 \t $__git_profile_comp_results[1])
# Fish won't add a space if the completion ends with any
# of the following characters: @=/:.,
set -l lastChar (string sub -s -1 -- $split)
if not string match -r -q "[@=/:.,]" -- "$lastChar"
# In other cases, to support the "nospace" directive we trick the shell
# by outputting an extra, longer completion.
__git_profile_debug "Adding second completion to perform nospace directive"
set --global __git_profile_comp_results $split[1] $split[1].
__git_profile_debug "Completions are now: $__git_profile_comp_results"
end
end
if test $numComps -eq 0; and test $nofiles -eq 0
# To be consistent with bash and zsh, we only trigger file
# completion when there are no other completions
__git_profile_debug "Requesting file completion"
return 1
end
end
return 0
end
# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves
# so we can properly delete any completions provided by another script.
# Only do this if the program can be found, or else fish may print some errors; besides,
# the existing completions will only be loaded if the program can be found.
if type -q "git-profile"
# The space after the program name is essential to trigger completion for the program
# and not completion of the program name itself.
# Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish.
complete --do-complete "git-profile " > /dev/null 2>&1
end
# Remove any pre-existing completions for the program since we will be handling all of them.
complete -c git-profile -e
# The call to __git_profile_prepare_completions will setup __git_profile_comp_results
# which provides the program's completion choices.
complete -c git-profile -n '__git_profile_prepare_completions' -f -a '$__git_profile_comp_results'

View File

@@ -1,22 +0,0 @@
function ___paths_plugin_set_colors
if not set -q ___paths_plugin_colors
set -Ux ___paths_plugin_colors 27e6ff 29e0ff 5cd8ff 77d0ff 8ac8ff 9cbfff afb5ff c5a7ff d99bfe ea8feb f684d5 fe7abd ff73a3 ff708a fa7070 ff708a ff73a3 fe7abd f684d5 ea8feb d99bfe c5a7ff afb5ff 9cbfff 8ac8ff 77d0ff 5cd8ff 29e0ff
end
return 0
end
function _paths_uninstall --on-event paths_uninstall
for i in ___paths_plugin_wrap_color ___paths_plugin_output ___paths_plugin_handle_found_item ___paths_plugin_handle_source ___paths_plugin_cycle_color
functions -e $i
end
set -e ___paths_plugin_colors
set -e ___paths_plugin_current_color
end
function _paths_install --on-event _paths_install
___paths_plugin_set_colors
end
function _paths_update --on-event paths_update
___paths_plugin_set_colors
end

View File

@@ -8,13 +8,20 @@ test -e "$HOME/.config/fish/alias.fish" &&
test -e "$HOME/.config/fish/exports.fish" && test -e "$HOME/.config/fish/exports.fish" &&
source "$HOME/.config/fish/exports.fish" source "$HOME/.config/fish/exports.fish"
test -e "$HOME/.dotfiles/config/fzf/key-bindings.fish" &&
source "$HOME/.dotfiles/config/fzf/key-bindings.fish"
if status is-interactive if status is-interactive
# Commands to run in interactive shell # Commands to run in interactive shell
# 1Password plugins if op command is available
type -q op; and test -e "$HOME/.config/op/plugins.sh" &&
source "$HOME/.config/op/plugins.sh"
# version manager initializers # version manager initializers
type -q rbenv; and source (rbenv init -|psub) type -q rbenv; and source (rbenv init -|psub)
type -q pyenv; and source (pyenv init -|psub) type -q pyenv; and source (pyenv init -|psub)
type -q pyenv; and source (pyenv virtualenv-init -) type -q pyenv; and source (pyenv virtualenv-init -|psub)
type -q goenv; and source (goenv init -|psub) type -q goenv; and source (goenv init -|psub)
# type -q fnm; and fnm env --use-on-cd --shell fish | source # type -q fnm; and fnm env --use-on-cd --shell fish | source
type -q load_nvm; and load_nvm > /dev/stderr type -q load_nvm; and load_nvm > /dev/stderr

View File

@@ -22,11 +22,6 @@ fish_add_path "$XDG_BIN_HOME"
# Add cargo bin to path # Add cargo bin to path
fish_add_path "$XDG_SHARE_HOME/cargo/bin" fish_add_path "$XDG_SHARE_HOME/cargo/bin"
# Set Aqua configuration
set -q AQUA_BIN; or set -gx AQUA_BIN "$XDG_DATA_HOME/aquaproj-aqua/bin"
set -q AQUA_CONFIG; or set -gx AQUA_CONFIG "$XDG_CONFIG_HOME/aqua/aqua.yaml"
set -gx PATH $AQUA_BIN $PATH
# NPM/NVM configuration # NPM/NVM configuration
set -q NVM_DIR; or set -x NVM_DIR "$XDG_DATA_HOME/nvm" set -q NVM_DIR; or set -x NVM_DIR "$XDG_DATA_HOME/nvm"
fish_add_path "$NVM_DIR/bin" fish_add_path "$NVM_DIR/bin"
@@ -109,7 +104,6 @@ set -q GNUPGHOME; or set -x GNUPGHOME "$XDG_DATA_HOME/gnupg"
# Go configuration # Go configuration
# set -q GOPATH; or set -x GOPATH "$XDG_DATA_HOME/go" # set -q GOPATH; or set -x GOPATH "$XDG_DATA_HOME/go"
set -q GOBIN; or set -x GOBIN "$XDG_BIN_HOME" set -q GOBIN; or set -x GOBIN "$XDG_BIN_HOME"
fish_add_path "$GOBIN"
set -q GOENV_ROOT; or set -x GOENV_ROOT "$XDG_DATA_HOME/goenv" set -q GOENV_ROOT; or set -x GOENV_ROOT "$XDG_DATA_HOME/goenv"
set -q GOENV_RC_FILE; or set -x GOENV_RC_FILE "$XDG_CONFIG_HOME/goenv/goenvrc.fish" set -q GOENV_RC_FILE; or set -x GOENV_RC_FILE "$XDG_CONFIG_HOME/goenv/goenvrc.fish"
@@ -131,7 +125,6 @@ set -q CARGO_HOME; or set -x CARGO_HOME "$XDG_DATA_HOME/cargo"
set -q CARGO_BIN_HOME; or set -x CARGO_BIN_HOME "$XDG_BIN_HOME" set -q CARGO_BIN_HOME; or set -x CARGO_BIN_HOME "$XDG_BIN_HOME"
set -q RUSTUP_HOME; or set -x RUSTUP_HOME "$XDG_DATA_HOME/rustup" set -q RUSTUP_HOME; or set -x RUSTUP_HOME "$XDG_DATA_HOME/rustup"
set -x RUST_WITHOUT "clippy,docs,rls" set -x RUST_WITHOUT "clippy,docs,rls"
fish_add_path "$CARGO_BIN_HOME"
fish_add_path "$CARGO_HOME/bin" fish_add_path "$CARGO_HOME/bin"
fish_add_path "$XDG_SHARE_HOME/bob/nvim-bin" fish_add_path "$XDG_SHARE_HOME/bob/nvim-bin"

View File

@@ -2,7 +2,6 @@ jorgebucaran/fisher
ilancosman/tide@v6 ilancosman/tide@v6
jethrokuan/z jethrokuan/z
halostatue/fish-macos@v7 halostatue/fish-macos@v7
jgusta/paths
danhper/fish-ssh-agent danhper/fish-ssh-agent
halostatue/fish-brew@v3 halostatue/fish-brew@v3
edc/bass edc/bass

View File

@@ -1,175 +0,0 @@
function ___paths_plugin_wrap_color
set_color normal
set_color "$argv[1]"
echo -n (set_color "$argv[1]")"$argv[2..]"
set_color normal
end
# duplicated in conf.d
function ___paths_plugin_set_colors
if not set -q ___paths_plugin_colors
set -Ux ___paths_plugin_colors 27e6ff 29e0ff 5cd8ff 77d0ff 8ac8ff 9cbfff afb5ff c5a7ff d99bfe ea8feb f684d5 fe7abd ff73a3 ff708a fa7070 ff708a ff73a3 fe7abd f684d5 ea8feb d99bfe c5a7ff afb5ff 9cbfff 8ac8ff 77d0ff 5cd8ff 29e0ff
end
return 0
end
function ___paths_plugin_cycle_color
if not set -q ___paths_plugin_current_color
set -Ux ___paths_plugin_current_color 1
else if test $___paths_plugin_current_color -gt (count $___paths_plugin_colors)
set -Ux ___paths_plugin_current_color 1
end
echo $___paths_plugin_colors[$___paths_plugin_current_color]
set -Ux ___paths_plugin_current_color (math $___paths_plugin_current_color + 1)
end
function ___paths_plugin_handle_found_item -a testName outFlags
set -f flags (string split -n ' ' -- "$outFlags")
set -f options (fish_opt -s c -l clean)
set -a options (fish_opt -s s -l single)
set -a options (fish_opt -s k -l no-color)
set -a options (fish_opt -s n -l inline)
argparse $options -- $flags
set -f arrow "=>"
# check if file exists
if test -e "$testName"
set -f nameOut (string trim -- "$testName")
if not set -q _flag_c # is not clean
if test -L "$testName" # is symlink
set -f __linkname (readlink -f "$testName")
set __linkname (string trim -- "$__linkname")
set testName (string trim -- "$testName")
if not set -q _flag_k # is color
set nameOut (___paths_plugin_wrap_color (___paths_plugin_cycle_color) $testName) (___paths_plugin_wrap_color "yellow" "$arrow") (___paths_plugin_wrap_color (___paths_plugin_cycle_color) $__linkname)
else # is color
set nameOut (echo -n "$testName" "$arrow" "$__linkname")
end
else # is not symlink
if not set -q _flag_k # is color
set testName (string trim -- "$testName")
set nameOut (___paths_plugin_wrap_color (___paths_plugin_cycle_color) "$testName")
else
set testName (string trim -- "$testName")
set nameOut "$testName"
end
end
set nameOut (string trim -- "$nameOut")
# do the tick
if set -q _flag_k # is not color
set nameOut "- $nameOut"
else # is color
set nameOut (___paths_plugin_wrap_color "yellow" "-") "$nameOut"
end
end
set nameOut (string trim -- "$nameOut")
echo -n $nameOut
end
end
function paths --description "Reveal the executable matches in shell paths or fish autoload."
set -f options (fish_opt -s c -l clean)
set -a options (fish_opt -s s -l single)
set -a options (fish_opt -s k -l no-color)
set -a options (fish_opt -s q -l quiet)
set -a options (fish_opt -s n -l inline)
argparse $options -- $argv
if test (count $argv) -lt 1
echo "paths - executable matches in shell paths or fish autoload."
and echo "usage: paths [-c|-s|-k] <name>"
and echo -e "\t-c or --no-color: output without color"
and echo -e "\t-s or --single: output without color or headers, the first result"
and echo -e "\t-k or --clean: output without tick marks or headers"
# and echo -e "\t-n or --inline: output without endline"
and return 1
end
set -f foundStatus 1
set -f input (string trim -- $argv)
# deprecated
if set -q _flag_q
set _flag_c True
end
if set -q _flag_s
set _flag_k True
set _flag_c True
end
set -f outFlags ''
set -q _flag_n; and set -a outFlags -n
set -q _flag_c; and set -a outFlags -c
set -q _flag_k; and set -a outFlags -k
set -q _flag_s; and set -a outFlags -s
set outFlags (string split -n " " -- "$outFlags")
___paths_plugin_set_colors
# loop over list of path lists
for pVar in VIRTUAL_ENV fisher_path fish_function_path fish_user_paths PATH
set -e acc
set -f acc ''
set -e hit
# see if variable is empty
if test -z "$pVar"
continue
end
set -f acc (begin
for t in $$pVar
for snit in "$t/$input.fish" "$t/$input"
set -f found (___paths_plugin_handle_found_item "$snit" "$outFlags")
set found (string trim -- "$found")
if test -n "$found"
set -f hit True
echo "$found"
if set -q _flag_s
break
end
end
end
if set -q _flag_s
if set -q hit
break
end
end
end
end)
# prepend source
if not set -q _flag_c
if set -q hit
set pVar (string trim -- "$pVar")
echo -e -n "$pVar\n"
end
end
if test -n "$acc"
set foundStatus 0
for fk in $acc
echo $fk
if set -q _flag_s
# stop after one
return $foundStatus
end
end
end
end
# check
set -l built (type --type $input 12&>/dev/null)
if test -n "$built"
and test "$built" = 'builtin'
set $foundStatus 0
if not set -q _flag_c
echo -e -n "builtin\n"
if set -q _flag_k
echo - "$input"
else # is color
echo (___paths_plugin_wrap_color "yellow" "-") (___paths_plugin_wrap_color (___paths_plugin_cycle_color) "$input")
end
else
echo "$input"
end
end
return $foundStatus
end

View File

@@ -46,7 +46,7 @@
autoStash = true autoStash = true
updateRefs = true updateRefs = true
[merge] [merge]
conflictstyle = zdiff3 conflictStyle = diff3
[pull] [pull]
rebase = true rebase = true
[color "diff-highlight"] [color "diff-highlight"]

View File

@@ -89,6 +89,8 @@ brew "coreutils"
brew "bats-core" brew "bats-core"
# Parser generator # Parser generator
brew "bison" brew "bison"
# Freely available high-quality data compressor
brew "bzip2"
# 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
@@ -113,10 +115,10 @@ brew "harfbuzz"
brew "dependency-check" brew "dependency-check"
# Lightweight DNS forwarder and DHCP server # Lightweight DNS forwarder and DHCP server
brew "dnsmasq" brew "dnsmasq"
# .NET Core
brew "dotnet@8", link: true
# Spellchecker wrapping library # Spellchecker wrapping library
brew "enchant" brew "enchant"
# Command-line tool to interact with exercism.io
brew "exercism"
# Perl lib for reading and writing EXIF metadata # Perl lib for reading and writing EXIF metadata
brew "exiftool" brew "exiftool"
# Banner-like program prints strings as ASCII art # Banner-like program prints strings as ASCII art
@@ -222,7 +224,7 @@ brew "nginx"
# Port scanning utility for large networks # Port scanning utility for large networks
brew "nmap" brew "nmap"
# Platform built on V8 to build network applications # Platform built on V8 to build network applications
brew "node" brew "node", link: false
# Libraries for security-enabled client and server applications # Libraries for security-enabled client and server applications
brew "nss" brew "nss"
# Command-line Git information tool # Command-line Git information tool
@@ -232,9 +234,9 @@ brew "openldap"
# ISO-C API and CLI for generating UUIDs # ISO-C API and CLI for generating UUIDs
brew "ossp-uuid" brew "ossp-uuid"
# General-purpose scripting language # General-purpose scripting language
brew "php" brew "php", link: false
# General-purpose scripting language # General-purpose scripting language
brew "php@8.2" brew "php@8.2", link: true
# General-purpose scripting language # General-purpose scripting language
brew "php@8.3" brew "php@8.3"
# Pins GitHub Actions to full hashes and versions # Pins GitHub Actions to full hashes and versions
@@ -259,6 +261,8 @@ brew "re2c"
brew "rustup" brew "rustup"
# Static analysis and lint tool, for (ba)sh scripts # Static analysis and lint tool, for (ba)sh scripts
brew "shellcheck" brew "shellcheck"
# User interface to the TELNET protocol
brew "telnet"
# 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
@@ -317,8 +321,6 @@ brew "shivammathur/php/php-debug"
brew "shivammathur/php/php@8.2-debug" brew "shivammathur/php/php@8.2-debug"
# Command-line interface for 1Password # Command-line interface for 1Password
cask "1password-cli" cask "1password-cli"
# AeroSpace is an i3-like tiling window manager for macOS
cask "aerospace"
# Universal database tool and SQL client # Universal database tool and SQL client
cask "dbeaver-community" cask "dbeaver-community"
# Database version management tool # Database version management tool
@@ -340,8 +342,6 @@ cask "jetbrains-toolbox"
cask "keybase" cask "keybase"
# Kubernetes IDE # Kubernetes IDE
cask "lens" cask "lens"
# Neovim Client
cask "neovide"
# Reverse proxy, secure introspectable tunnels to localhost # Reverse proxy, secure introspectable tunnels to localhost
cask "ngrok" cask "ngrok"
# Simple application that will prevent iTunes or Apple Music from launching # Simple application that will prevent iTunes or Apple Music from launching

View File

@@ -1,7 +1,7 @@
# EditorConfig is awesome: https://editorconfig.org # EditorConfig is awesome: https://editorconfig.org
# top-most EditorConfig file # top-most EditorConfig file
root = true root = false
[*] [*]
end_of_line = lf end_of_line = lf
@@ -18,3 +18,7 @@ trim_trailing_whitespace = false
[*.json] [*.json]
max_line_length = off max_line_length = off
[*.lua]
max_line_length = 90

View File

@@ -1,4 +1,4 @@
column_width = 80 column_width = 90
line_endings = "Unix" line_endings = "Unix"
indent_type = "Spaces" indent_type = "Spaces"
indent_width = 2 indent_width = 2

View File

@@ -0,0 +1,2 @@
autocmd BufRead,BufNewFile *.env set ft=env
autocmd BufRead,BufNewFile *.env.* set ft=env

View File

@@ -28,10 +28,7 @@ end
vim.opt.rtp:prepend(lazypath) vim.opt.rtp:prepend(lazypath)
-- ── Add ~/.local/bin to the PATH ──────────────────────────────────── -- ── Add ~/.local/bin to the PATH ────────────────────────────────────
vim.fn.setenv( vim.fn.setenv('PATH', vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH')
'PATH',
vim.fn.expand '$HOME/.local/bin' .. ':' .. vim.fn.expand '$PATH'
)
require 'options' require 'options'
require 'autogroups' require 'autogroups'
@@ -68,4 +65,4 @@ require('lazy').setup(
require 'keymaps' require 'keymaps'
-- vim: ts=2 sts=2 sw=2 et -- vim: set ts=2 sts=2 sw=2 wrap et :

View File

@@ -21,9 +21,7 @@ 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 end
vim.opt.numberwidth = #tostring(max_line_count) + 1
end
end, end,
}) })
@@ -104,5 +102,3 @@ autocmd({ 'BufRead', 'BufNewFile' }, {
}, },
command = 'set filetype=sshconfig', command = 'set filetype=sshconfig',
}) })
-- vim: ts=2 sts=2 sw=2 et

View File

@@ -1,5 +1,3 @@
-- vim: set ft=lua ts=2 sw=2 tw=0 et cc=130 :
require 'utils' require 'utils'
-- ╭─────────────────────────────────────────────────────────╮ -- ╭─────────────────────────────────────────────────────────╮
@@ -20,16 +18,8 @@ K.n('<C-w>+', ':resize +10<CR>', { desc = 'H Resize +' })
K.n('<C-w>=', '<C-w>=', { desc = 'Equal Size Splits' }) K.n('<C-w>=', '<C-w>=', { desc = 'Equal Size Splits' })
-- ── Deal with word wrap ───────────────────────────────────────────── -- ── Deal with word wrap ─────────────────────────────────────────────
K.n( K.n('k', "v:count == 0 ? 'gk' : 'k'", { desc = 'Move up', noremap = true, expr = true })
'k', K.n('j', "v:count == 0 ? 'gj' : 'j'", { desc = 'Move down', noremap = true, expr = true })
"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 ─────────────────────────────────────────────── -- ── Text manipulation ───────────────────────────────────────────────
K.d('<', { 'n', 'v' }, '<gv', 'Indent Left') K.d('<', { 'n', 'v' }, '<gv', 'Indent Left')
@@ -111,12 +101,10 @@ K.nl('cbt', '<Cmd>CBllline<CR>', 'CB: Titled Line')
-- unless it's a generic operation like searching or finding buffers -- unless it's a generic operation like searching or finding buffers
local fuzzy_search = function() local fuzzy_search = function()
require('telescope.builtin').find_files( require('telescope.builtin').find_files(require('telescope.themes').get_dropdown {
require('telescope.themes').get_dropdown { winblend = 20,
winblend = 20, previewer = true,
previewer = true, })
}
)
end end
local lazy_plugins = function() local lazy_plugins = function()
@@ -159,9 +147,7 @@ K.nl('tn', ':Noice dismiss<cr>', 'Noice: Dismiss Notification')
-- Convention is 'q' followed by the operation -- Convention is 'q' followed by the operation
K.nl('qf', ':q<CR>', 'Quicker close split') K.nl('qf', ':q<CR>', 'Quicker close split')
K.nl('qq', function() K.nl('qq', function()
if vim.fn.confirm('Force save and quit?', '&Yes\n&No', 2) == 1 then if vim.fn.confirm('Force save and quit?', '&Yes\n&No', 2) == 1 then vim.cmd 'wq!' end
vim.cmd 'wq!'
end
end, 'Quit with force saving') end, 'Quit with force saving')
K.nl('qw', ':wq<CR>', 'Write and quit') K.nl('qw', ':wq<CR>', 'Write and quit')
K.nl('qQ', function() K.nl('qQ', function()

View File

@@ -77,10 +77,8 @@ function M.setup(opts)
-- Set vim.g.node_host_prog and vim.g.copilot_node_command -- Set vim.g.node_host_prog and vim.g.copilot_node_command
local current_nvm_version_path = local current_nvm_version_path =
string.format('%s/versions/node/%s', nvm_path, node_version) string.format('%s/versions/node/%s', nvm_path, node_version)
local current_nvm_node_bin_path = local current_nvm_node_bin_path = string.format('%s/bin', current_nvm_version_path)
string.format('%s/bin', current_nvm_version_path) local current_nvm_node_bin = string.format('%s/node', current_nvm_node_bin_path)
local current_nvm_node_bin =
string.format('%s/node', current_nvm_node_bin_path)
local neovim_node_host_bin_path = local neovim_node_host_bin_path =
string.format('%s/neovim-node-host', current_nvm_node_bin_path) string.format('%s/neovim-node-host', current_nvm_node_bin_path)

View File

@@ -64,4 +64,7 @@ vim.schedule(function()
o.clipboard = c o.clipboard = c
end) end)
-- xiyaowong/transparent.nvim
vim.g.transparent_enabled = true
-- vim: ts=2 sts=2 sw=2 et -- vim: ts=2 sts=2 sw=2 et

View File

@@ -3,7 +3,7 @@ return {
-- https:/github.com/saghen/blink.cmp -- https:/github.com/saghen/blink.cmp
{ {
'saghen/blink.cmp', 'saghen/blink.cmp',
version = '*', version = '1.*',
lazy = false, -- lazy loading handled internally lazy = false, -- lazy loading handled internally
dependencies = { dependencies = {
-- Compatibility layer for using nvim-cmp sources on blink.cmp -- Compatibility layer for using nvim-cmp sources on blink.cmp
@@ -58,10 +58,10 @@ return {
-- 'default' for mappings similar to built-in completion -- 'default' for mappings similar to built-in completion
-- 'super-tab' for mappings similar to vscode (tab to accept, arrow keys to navigate) -- 'super-tab' for mappings similar to vscode (tab to accept, arrow keys to navigate)
-- 'enter' for mappings similar to 'super-tab' but with 'enter' to accept -- 'enter' for mappings similar to 'super-tab' but with 'enter' to accept
-- see the "default configuration" section below for full documentation on how to define -- see the "default configuration" section below for full documentation on how to
-- your own keymap. -- define your own keymap.
keymap = { keymap = {
preset = 'super-tab', preset = 'default',
-- Use Ctrl-x to trigger auto completion -- Use Ctrl-x to trigger auto completion
['<C-x>'] = { 'show', 'show_documentation', 'hide_documentation' }, ['<C-x>'] = { 'show', 'show_documentation', 'hide_documentation' },
}, },
@@ -86,7 +86,8 @@ return {
}, },
}, },
documentation = { documentation = {
auto_show = true, auto_show = false,
auto_show_delay_ms = 500,
}, },
ghost_text = { ghost_text = {
enabled = false, enabled = false,
@@ -97,12 +98,12 @@ return {
-- elsewhere in your config, without redefining it, via `opts_extend` -- elsewhere in your config, without redefining it, via `opts_extend`
sources = { sources = {
default = { default = {
'lazydev',
'lsp', 'lsp',
'snippets',
'copilot', 'copilot',
'path', 'path',
'snippets',
'buffer', 'buffer',
'lazydev',
}, },
providers = { providers = {
copilot = { copilot = {
@@ -118,6 +119,15 @@ return {
}, },
}, },
-- Blink.cmp includes an optional, recommended rust fuzzy matcher,
-- which automatically downloads a prebuilt binary when enabled.
--
-- By default, we use the Lua implementation instead, but you may enable
-- the rust implementation via `'prefer_rust_with_warning'`
--
-- See :h blink-cmp-config-fuzzy for more information
fuzzy = { implementation = 'lua' },
-- experimental signature help support -- experimental signature help support
signature = { enabled = true }, signature = { enabled = true },
}, },

View File

@@ -1,17 +1,9 @@
return { 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' },
},
-- Terminal manager for (neo)vim -- Terminal manager for (neo)vim
-- https://github.com/voldikss/vim-floaterm -- https://github.com/voldikss/vim-floaterm
{ {
'voldikss/vim-floaterm', 'voldikss/vim-floaterm',
lazy = true,
cmd = { 'FloatermToggle' }, cmd = { 'FloatermToggle' },
init = function() init = function()
vim.g.floaterm_width = 0.8 vim.g.floaterm_width = 0.8
@@ -49,34 +41,6 @@ return {
end, end,
}, },
-- 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 = '=.+',
},
},
},
},
-- projectionist.vim: Granular project configuration -- projectionist.vim: Granular project configuration
-- https://github.com/tpope/vim-projectionist -- https://github.com/tpope/vim-projectionist
{ {
@@ -150,21 +114,7 @@ return {
{ {
'whatyouhide/vim-textobj-xmlattr', 'whatyouhide/vim-textobj-xmlattr',
dependencies = { 'kana/vim-textobj-user' }, dependencies = { 'kana/vim-textobj-user' },
}, ft = { 'html', 'xml', 'javascriptreact', 'typescriptreact', 'vue' },
-- 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. -- Clarify and beautify your comments using boxes and lines.
@@ -174,38 +124,4 @@ return {
event = 'BufEnter', event = 'BufEnter',
opts = {}, 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
},
-- Mainly a PHP Language Server with more features than you can shake a stick at
-- https://github.com/phpactor/phpactor
{
'phpactor/phpactor',
build = 'composer install --no-dev --optimize-autoloader',
ft = 'php',
},
} }

View File

@@ -0,0 +1,66 @@
return {
{
'stevearc/conform.nvim',
event = 'BufWritePre',
config = function()
local conform = require 'conform'
conform.setup {
formatters_by_ft = {
lua = { 'stylua' },
},
format_on_save = function(bufnr)
-- Disable autoformat for files in a certain paths
local bufname = vim.api.nvim_buf_get_name(bufnr)
if bufname:match '/dist|node_modules|vendor/' then return end
local disable_lsp = {
c = true,
cpp = true,
}
return {
lsp_fallback = not disable_lsp[vim.bo[bufnr].filetype],
timeout_ms = 500,
}
end,
notify_on_error = true,
}
vim.o.formatexpr = "v:lua.require'conform'.formatexpr()"
-- Autoformat toggle keybinding
local autoformat = true
vim.g.autoformat_enabled = autoformat
vim.api.nvim_create_user_command('ToggleFormat', function()
autoformat = not autoformat
vim.g.autoformat_enabled = autoformat
vim.notify('Autoformat on save: ' .. (autoformat and 'enabled' or 'disabled'))
end, {})
vim.keymap.set(
'n',
'<leader>tf',
':ToggleFormat<CR>',
{ desc = 'Toggle autoformat on save' }
)
vim.api.nvim_create_autocmd('BufWritePre', {
callback = function(args)
if autoformat then
conform.format {
bufnr = args.buf,
async = true,
lsp_format = 'fallback',
}
end
end,
})
-- Global statusline helper function
function _G.autoformat_status()
return vim.g.autoformat_enabled and '[ fmt:on]' or '[ fmt:off]'
end
end,
},
}

View File

@@ -2,6 +2,7 @@ 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
{ {
---@module 'snacks'
'folke/snacks.nvim', 'folke/snacks.nvim',
priority = 1000, priority = 1000,
lazy = false, lazy = false,
@@ -21,7 +22,7 @@ return {
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 = true, -- use Git Signs hl for fold icons
}, },
git = { git = {
-- patterns to match Git signs -- patterns to match Git signs
@@ -42,6 +43,7 @@ return {
-- replaces the UI for messages, cmdline and the popupmenu. -- replaces the UI for messages, cmdline and the popupmenu.
-- https://github.com/folke/noice.nvim -- https://github.com/folke/noice.nvim
{ {
---@module 'noice'
'folke/noice.nvim', 'folke/noice.nvim',
event = 'VeryLazy', event = 'VeryLazy',
dependencies = { dependencies = {
@@ -122,10 +124,12 @@ return {
-- trouble your code is causing. -- trouble your code is causing.
-- https://github.com/folke/trouble.nvim -- https://github.com/folke/trouble.nvim
{ {
---@module 'trouble'
'folke/trouble.nvim', 'folke/trouble.nvim',
lazy = false, lazy = false,
cmd = 'Trouble', cmd = 'Trouble',
dependencies = { 'nvim-tree/nvim-web-devicons' }, dependencies = { 'nvim-tree/nvim-web-devicons' },
---@type trouble.Config
opts = { opts = {
auto_preview = true, auto_preview = true,
auto_fold = true, auto_fold = true,

View File

@@ -4,359 +4,296 @@
require 'utils' require 'utils'
-- 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 = {
init_options = {
licenceKey = GetIntelephenseLicense(),
},
},
jsonls = {},
lua_ls = {
settings = {
Lua = {
completion = {
callSnippet = 'Replace',
},
diagnostics = {
globals = {
'vim',
},
disable = {
-- Ignore lua_ls noisy `missing-fields` warnings
'missing-fields',
},
},
hint = {
enable = true,
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,
},
},
},
},
},
}
-- Mason tools to automatically install and configure.
-- These are automatically configured by WhoIsSethDaniel/mason-tool-installer.nvim
local mason_tools = {
'actionlint',
'ast-grep',
'black',
'editorconfig-checker',
'goimports',
'golangci-lint',
'golines',
'gopls',
'gotests',
'isort',
'phpcbf',
'phpmd',
'phpstan',
'pint',
'prettierd',
'revive',
'semgrep',
'shellcheck',
'shfmt',
'sonarlint-language-server',
'staticcheck',
'stylua',
'trivy',
'vint',
'yamlfmt',
}
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', 'neovim/nvim-lspconfig',
ft = 'lua', dependencies = {
opts = { { 'williamboman/mason.nvim', opts = {} },
library = { 'williamboman/mason-lspconfig.nvim',
-- Load luvit types when the `vim.uv` word is found 'WhoIsSethDaniel/mason-tool-installer.nvim',
{ path = 'luvit-meta/library', words = { 'vim%.uv' } },
-- load assert and describe paths 'folke/lazydev.nvim',
{ path = 'luassert/library', words = { 'assert' } }, 'zapling/mason-conform.nvim',
{ path = 'busted/library', words = { 'describe' } },
}, -- Allows extra capabilities provided by blink.cmp
'saghen/blink.cmp',
}, },
}, config = function()
local lazydev = require 'lazydev'
-- Meta type definitions for the Lua platform Luvit. vim.api.nvim_create_autocmd('LspAttach', {
-- https://github.com/Bilal2453/luvit-meta group = vim.api.nvim_create_augroup('lsp-attach', { clear = true }),
{ 'Bilal2453/luvit-meta', lazy = true }, callback = function(event)
local map = function(keys, func, desc, mode)
-- Quickstart configs for Nvim LSP mode = mode or 'n'
-- https://github.com/neovim/nvim-lspconfig vim.keymap.set(
{ 'neovim/nvim-lspconfig' }, mode,
keys,
-- Portable package manager for Neovim that runs everywhere Neovim runs. func,
-- Easily install and manage LSP servers, DAP servers, linters, and formatters. { buffer = event.buf, desc = 'LSP: ' .. desc }
-- https://github.com/williamboman/mason.nvim )
{
'williamboman/mason.nvim',
version = '*',
cmd = 'Mason',
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' },
-- 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 = mason_tools,
},
},
-- JSON schemas for Neovim
-- https://github.com/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' },
-- A simple wrapper for nvim-lspconfig and mason-lspconfig
-- to easily setup LSP servers.
-- https://github.com/junnplus/lsp-setup.nvim
{
'junnplus/lsp-setup.nvim',
opts = {
default_mappings = false,
servers = lsp_servers,
},
config = function(_, opts)
require('lazydev').setup()
require('lsp-setup').setup(opts)
local cmp = require 'blink.cmp'
local lspconfig = require 'lspconfig'
for server, config in pairs(opts.servers) do
-- passing config.capabilities to blink.cmp merges with the capabilities in your
-- `opts[server].capabilities, if you've defined it
config.capabilities = cmp.get_lsp_capabilities(config.capabilities)
lspconfig[server].setup(config)
end
lspconfig.lua_ls.on_init = function(client)
if client.workspace_folders then
local path = client.workspace_folders[1].name
if
vim.loop.fs_stat(path .. '/.luarc.json')
or vim.loop.fs_stat(path .. '/.luarc.jsonc')
then
return
end end
end
client.config.settings.Lua = local tsb = require 'telescope.builtin'
vim.tbl_deep_extend('force', client.config.settings.Lua, {
runtime = { -- Rename the variable under your cursor.
-- Tell the language server which version of Lua you're using -- Most Language Servers support renaming across files, etc.
-- (most likely LuaJIT in the case of Neovim) map('grn', vim.lsp.buf.rename, '[R]e[n]ame')
version = 'LuaJIT',
}, -- Execute a code action, usually your cursor needs to be on top of an error
-- Make the server aware of Neovim runtime files -- or a suggestion from your LSP for this to activate.
workspace = { map('gra', vim.lsp.buf.code_action, '[G]oto Code [A]ction', { 'n', 'x' })
checkThirdParty = false,
library = { -- Find references for the word under your cursor.
vim.env.VIMRUNTIME, map('grr', tsb.lsp_references, '[G]oto [R]eferences')
-- Jump to the implementation of the word under your cursor.
-- Useful when your language has ways of declaring types without
-- an actual implementation.
map('gri', tsb.lsp_implementations, '[G]oto [I]mplementation')
-- Jump to the definition of the word under your cursor.
-- This is where a variable was first declared, or where a function is
-- defined, etc. To jump back, press <C-t>.
map('grd', tsb.lsp_definitions, '[G]oto [D]efinition')
-- WARN: This is not Goto Definition, this is Goto Declaration.
-- For example, in C this would take you to the header.
map('grD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
-- Fuzzy find all the symbols in your current document.
-- Symbols are things like variables, functions, types, etc.
map('gO', tsb.lsp_document_symbols, 'Open Document Symbols')
-- Fuzzy find all the symbols in your current workspace.
-- Similar to document symbols, except searches over your entire project.
map('gW', tsb.lsp_dynamic_workspace_symbols, 'Open Workspace Symbols')
-- Jump to the type of the word under your cursor.
-- Useful when you're not sure what type a variable is and you want to see
-- the definition of its *type*, not where it was *defined*.
map('grt', tsb.lsp_type_definitions, '[G]oto [T]ype Definition')
-- This function resolves a difference between neovim nightly
-- (version 0.11) and stable (version 0.10)
---@param client vim.lsp.Client
---@param method vim.lsp.protocol.Method
---@param bufnr? integer some lsp support methods only in specific files
---@return boolean
local function client_supports_method(client, method, bufnr)
if vim.fn.has 'nvim-0.11' == 1 then
return client:supports_method(method, bufnr)
else
---@diagnostic disable-next-line: param-type-mismatch
return client.supports_method(method, { bufnr = bufnr })
end
end
-- The following two autocommands are used to highlight references of the
-- word under your cursor when your cursor rests there for a little while.
-- See `:help CursorHold` for information about when this is executed
--
-- When you move your cursor, the highlights will be cleared
-- (the second autocommand).
local client = vim.lsp.get_client_by_id(event.data.client_id)
if
client
and client_supports_method(
client,
vim.lsp.protocol.Methods.textDocument_documentHighlight,
event.buf
)
then
local highlight_augroup =
vim.api.nvim_create_augroup('lsp-highlight', { clear = false })
vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
buffer = event.buf,
group = highlight_augroup,
callback = vim.lsp.buf.document_highlight,
})
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
buffer = event.buf,
group = highlight_augroup,
callback = vim.lsp.buf.clear_references,
})
vim.api.nvim_create_autocmd('LspDetach', {
group = vim.api.nvim_create_augroup('lsp-detach', { clear = true }),
callback = function(event2)
vim.lsp.buf.clear_references()
vim.api.nvim_clear_autocmds {
group = 'lsp-highlight',
buffer = event2.buf,
}
end,
})
end
end,
})
-- Diagnostic Config
-- See :help vim.diagnostic.Opts
vim.diagnostic.config {
severity_sort = true,
float = { border = 'rounded', source = 'if_many' },
underline = { severity = vim.diagnostic.severity.ERROR },
signs = vim.g.have_nerd_font and {
text = {
[vim.diagnostic.severity.ERROR] = '󰅚 ',
[vim.diagnostic.severity.WARN] = '󰀪 ',
[vim.diagnostic.severity.INFO] = '󰋽 ',
[vim.diagnostic.severity.HINT] = '󰌶 ',
},
} or {},
virtual_text = {
source = 'if_many',
spacing = 2,
format = function(diagnostic)
local diagnostic_message = {
[vim.diagnostic.severity.ERROR] = diagnostic.message,
[vim.diagnostic.severity.WARN] = diagnostic.message,
[vim.diagnostic.severity.INFO] = diagnostic.message,
[vim.diagnostic.severity.HINT] = diagnostic.message,
}
return diagnostic_message[diagnostic.severity]
end,
},
}
local capabilities = require('blink.cmp').get_lsp_capabilities()
local servers = {
ansiblels = {},
ast_grep = {},
bashls = {},
cssls = {},
dockerls = {},
gopls = {
settings = {
gopls = {
hints = {
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
constantValues = true,
functionTypeParameters = true,
parameterNames = true,
rangeVariableTypes = true,
}, },
}, },
})
end
lspconfig.jsonls.settings = {
json = {
schemas = require('schemastore').json.schemas(),
validate = { enable = true },
},
yaml = {
schemaStore = {
-- You must disable built-in SchemaStore support if you want to use
-- this plugin and its advanced options like `ignore`.
enable = false,
-- Avoid TypeError: Cannot read properties of undefined (reading 'length')
url = '',
}, },
schemas = require('schemastore').yaml.schemas(), },
validate = { enable = true }, html = {},
intelephense = {
init_options = {
licenceKey = vim.env.INTELEPHENSE_LICENSE or GetIntelephenseLicense() or nil,
},
},
jsonls = {},
lua_ls = {
settings = {
Lua = {
diagnostics = {
globals = { 'vim' },
disable = { 'missing-fields' },
},
completion = { callSnippet = 'Replace' },
workspace = { checkThirdParty = true },
hint = {
enable = true,
arrayIndex = 'Auto',
await = true,
paramName = 'All',
paramType = true,
semicolon = 'SameLine',
setType = false,
},
},
},
on_init = function(client)
client.config.settings.Lua.workspace.library = {
vim.env.VIMRUNTIME,
}
client.config.settings.Lua.runtime = { version = 'LuaJIT' }
client.notify(
'workspace/didChangeConfiguration',
{ settings = client.config.settings }
)
end,
},
omnisharp = {}, -- C# OmniSharp (will respect EditorConfig for formatting)
pyright = {},
tailwindcss = {},
terraformls = {},
ts_ls = {},
volar = {
settings = {
typescript = {
inlayHints = {
enumMemberValues = { enabled = true },
functionLikeReturnTypes = { enabled = true },
propertyDeclarationTypes = { enabled = true },
},
},
},
},
vimls = {},
eslint = {},
yamlls = {
settings = {
yaml = {
keyOrdering = false, -- don't auto-sort YAML keys on format
schemaStore = { enable = true }, -- use JSON Schema Store for validation
},
},
}, },
} }
-- Diagnostic configuration local ensure_installed = vim.tbl_keys(servers or {})
local signs = { vim.list_extend(ensure_installed, {
{ name = 'DiagnosticSignError', text = '' }, -- Error icon 'actionlint', -- GitHub Actions linter
{ name = 'DiagnosticSignWarn', text = '' }, -- Warning icon 'shfmt', -- Shell formatter
{ name = 'DiagnosticSignHint', text = '' }, -- Hint icon 'stylua', -- Lua formatter
{ name = 'DiagnosticSignInfo', text = '' }, -- Information icon 'shellcheck', -- Shell linter
})
require('mason-tool-installer').setup {
auto_install = true,
auto_update = true,
ensure_installed = ensure_installed,
} }
local function ensure_sign_defined(name, sign_opts) require('mason-conform').setup {
if vim.tbl_isempty(vim.fn.sign_getdefined(name)) then ensure_installed = ensure_installed,
vim.fn.sign_define(name, sign_opts) }
end
end
for _, sign in ipairs(signs) do require('mason-lspconfig').setup {
ensure_sign_defined(sign.name, { ensure_installed = {}, -- explicitly set to an empty table
text = sign.text, automatic_installation = false,
texthl = sign.texthl or sign.name, handlers = {
numhl = sign.numhl or sign.name, function(server_name)
}) local server = servers[server_name] or {}
end server.capabilities =
vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {})
---@type vim.diagnostic.Opts require('lspconfig')[server_name].setup(server)
local diagnostics_config = { end,
signs = {
active = signs, -- show signs
}, },
update_in_insert = false,
underline = true,
severity_sort = true,
virtual_text = true,
} }
vim.diagnostic.config(diagnostics_config) lazydev.setup {
---@type boolean|(fun(root:string):boolean?)
-- end of junnplus/lsp-setup config enabled = true,
debug = false,
runtime = vim.env.VIMRUNTIME --[[@as string]],
library = {
{ path = '${3rd}/luv/library', words = { 'vim%.uv' } },
},
integrations = {
lspconfig = true,
cmp = true,
},
}
end, end,
}, },
-- Lightweight yet powerful formatter plugin for Neovim
-- https://github.com/stevearc/conform.nvim
{
'stevearc/conform.nvim',
event = { 'BufWritePre' },
cmd = { 'ConformInfo' },
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 paths
local bufname = vim.api.nvim_buf_get_name(bufnr)
if bufname:match '/dist|node_modules|vendor/' then return end
return {
timeout_ms = 500,
lsp_format = lsp_format_opt,
}
end,
formatters_by_ft = {
lua = { 'stylua' },
sh = { 'shfmt' },
bash = { 'shfmt' },
php = { 'phpcbf' },
python = { 'isort', 'black' },
-- 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

@@ -12,6 +12,42 @@ return {
version = '*', version = '*',
priority = 1001, priority = 1001,
config = function() config = function()
-- ╭─────────────────────────────────────────────────────────╮
-- │ Text editing │
-- ╰─────────────────────────────────────────────────────────╯
-- Better Around/Inside textobjects
-- Examples:
-- - va) - [V]isually select [A]round [)]paren
-- - yinq - [Y]ank [I]nside [N]ext [Q]uote
-- - ci' - [C]hange [I]nside [']quote
require('mini.ai').setup { n_lines = 500 }
-- Comment lines
require('mini.comment').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()
-- Split and join arguments, lists, and other sequences
require('mini.splitjoin').setup()
-- Fast and feature-rich surround actions
-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren
-- - sd' - [S]urround [D]elete [']quotes
-- - sr)' - [S]urround [R]eplace [)] [']
-- - sff - find right (`sf`) part of surrounding function call (`f`)
require('mini.surround').setup()
-- ╭─────────────────────────────────────────────────────────╮
-- │ General workflow │
-- ╰─────────────────────────────────────────────────────────╯
-- Presets for common options and mappings -- Presets for common options and mappings
-- h: MiniBasics.config -- h: MiniBasics.config
require('mini.basics').setup { require('mini.basics').setup {
@@ -25,25 +61,12 @@ return {
}, },
} }
-- Better Around/Inside textobjects
--
-- Examples:
-- - va) - [V]isually select [A]round [)]paren
-- - yinq - [Y]ank [I]nside [N]ext [Q]uote
-- - ci' - [C]hange [I]nside [']quote
require('mini.ai').setup { n_lines = 500 }
-- Animate common Neovim actions
-- Replaced anuvyklack/windows.nvim
require('mini.animate').setup()
-- Buffer removing (unshow, delete, wipeout), which saves window layout -- Buffer removing (unshow, delete, wipeout), which saves window layout
-- Replaced famiu/bufdelete.nvim
require('mini.bufremove').setup() require('mini.bufremove').setup()
-- Show next key clues -- Show next key clues
-- Replaced folke/which-key.nvim
local miniclue = require 'mini.clue' local miniclue = require 'mini.clue'
---@modules mini.clue
miniclue.setup { miniclue.setup {
window = { window = {
config = { config = {
@@ -108,22 +131,30 @@ return {
}, },
} }
-- Comment lines
-- Replaced numToStr/Comment.nvim
require('mini.comment').setup()
-- Highlight cursor word and its matches
require('mini.cursorword').setup()
-- Work with diff hunks -- Work with diff hunks
-- Replaced lewis6991/gitsigns.nvim
require('mini.diff').setup() require('mini.diff').setup()
-- Git integration -- Git integration
require('mini.git').setup() require('mini.git').setup()
-- Session management (read, write, delete)
require('mini.sessions').setup {
autowrite = true,
directory = vim.g.sessions_dir or vim.fn.stdpath 'data' .. '/sessions',
file = '',
}
-- ╭─────────────────────────────────────────────────────────╮
-- │ Appearance │
-- ╰─────────────────────────────────────────────────────────╯
-- Animate common Neovim actions
require('mini.animate').setup()
-- Highlight cursor word and its matches
require('mini.cursorword').setup()
-- Highlight patterns in text -- Highlight patterns in text
-- Replaced folke/todo-comments.nvim
local hp = require 'mini.hipatterns' local hp = require 'mini.hipatterns'
hp.setup { hp.setup {
highlighters = { highlighters = {
@@ -170,36 +201,16 @@ return {
} }
-- Visualize and work with indent scope -- Visualize and work with indent scope
-- Replaced lukas-reineke/indent-blankline.nvim
require('mini.indentscope').setup() require('mini.indentscope').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 -- Fast and flexible start screen
-- Replaced glepnir/dashboard-nvim
local starter = require 'mini.starter' local starter = require 'mini.starter'
---@modules mini.starter
starter.setup { starter.setup {
items = { items = {
starter.sections.telescope(), starter.sections.telescope(),
starter.sections.builtin_actions(), starter.sections.builtin_actions(),
starter.sections.sessions(5, true), starter.sections.recent_files(5),
}, },
content_hooks = { content_hooks = {
starter.gen_hook.adding_bullet(), starter.gen_hook.adding_bullet(),
@@ -209,25 +220,38 @@ return {
} }
-- Minimal and fast statusline module with opinionated default look -- Minimal and fast statusline module with opinionated default look
-- Replaced nvim-lualine/lualine.nvim
local sl = require 'mini.statusline' local sl = require 'mini.statusline'
---@modules mini.statusline
sl.setup { sl.setup {
use_icons = true, use_icons = true,
set_vim_settings = true, set_vim_settings = true,
content = { content = {
active = function() active = function()
local mode, mode_hl = sl.section_mode { trunc_width = 120 } local mode, mode_hl = sl.section_mode { trunc_width = 100 }
local git = sl.section_git { trunc_width = 9999 } local git = sl.section_git { trunc_width = 40 }
local diagnostics = sl.section_diagnostics { trunc_width = 9999 } local diagnostics = sl.section_diagnostics {
local filename = sl.section_filename { trunc_width = 9999 } trunc_width = 75,
signs = {
ERROR = 'E ',
WARN = 'W ',
INFO = 'I ',
HINT = 'H ',
},
}
local lsp = MiniStatusline.section_lsp { trunc_width = 75 }
local filename = sl.section_filename { trunc_width = 140 }
local fileinfo = sl.section_fileinfo { trunc_width = 9999 } local fileinfo = sl.section_fileinfo { trunc_width = 9999 }
local location = sl.section_location { trunc_width = 9999 } local location = sl.section_location { trunc_width = 9999 }
return sl.combine_groups { return sl.combine_groups {
{ hl = mode_hl, strings = { mode } }, { hl = mode_hl, strings = { mode } },
{ hl = 'statuslineDevinfo', strings = { git, diagnostics } }, {
hl = 'MiniStatuslineDevinfo',
strings = { git, lsp },
},
'%<', -- Mark general truncate point '%<', -- Mark general truncate point
{ hl = 'statuslineFilename', strings = { filename } }, { hl = 'statuslineFilename', strings = { filename } },
'%=', -- End left alignment '%=', -- End left alignment
{ hl = 'statuslineFileinfo', strings = { diagnostics } },
{ hl = 'statuslineFileinfo', strings = { fileinfo } }, { hl = 'statuslineFileinfo', strings = { fileinfo } },
{ hl = mode_hl, strings = { location } }, { hl = mode_hl, strings = { location } },
} }
@@ -235,13 +259,6 @@ return {
}, },
} }
-- 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 -- Work with trailing whitespace
require('mini.trailspace').setup() require('mini.trailspace').setup()
end, end,

View File

@@ -54,9 +54,7 @@ return {
event_handlers = { event_handlers = {
{ {
event = 'file_opened', event = 'file_opened',
handler = function(_) handler = function(_) require('neo-tree.command').execute { action = 'close' } end,
require('neo-tree.command').execute { action = 'close' }
end,
}, },
}, },
default_component_configs = { default_component_configs = {

View File

@@ -1,44 +1,13 @@
return { return {
{
'rmagatti/auto-session',
lazy = false,
version = '*',
opts = {
suppressed_dirs = {
'/',
'~/',
'~/Downloads',
'~/Library',
},
bypass_save_filetypes = {
'PlenaryTestPopup',
'alpha',
'checkhealth',
'dashboard',
'dbout',
'gitsigns.blame',
'grug-far',
'help',
'lspinfo',
'man',
'neo-tree',
'neotest-output',
'neotest-output-panel',
'neotest-summary',
'notify',
'qf',
'spectre_panel',
'startuptime',
'trouble',
'tsplayground',
},
-- log_level = 'debug',
},
},
{ {
'nvim-lua/plenary.nvim', 'nvim-lua/plenary.nvim',
version = '*', version = '*',
lazy = false, lazy = false,
}, },
-- Vim plugin for automatic time tracking and metrics
-- generated from your programming activity.
-- https://github.com/wakatime/vim-wakatime
{ 'wakatime/vim-wakatime', lazy = false, enabled = true },
} }

View File

@@ -3,7 +3,8 @@ return {
-- https://github.com/nvim-telescope/telescope.nvim -- https://github.com/nvim-telescope/telescope.nvim
'nvim-telescope/telescope.nvim', 'nvim-telescope/telescope.nvim',
version = '*', version = '*',
lazy = false, lazy = true,
cmd = 'Telescope',
dependencies = { dependencies = {
{ 'nvim-lua/plenary.nvim' }, { 'nvim-lua/plenary.nvim' },
{ 'nvim-telescope/telescope-symbols.nvim' }, { 'nvim-telescope/telescope-symbols.nvim' },
@@ -16,10 +17,6 @@ return {
-- https://github.com/polirritmico/telescope-lazy-plugins.nvim -- https://github.com/polirritmico/telescope-lazy-plugins.nvim
{ 'polirritmico/telescope-lazy-plugins.nvim' }, { 'polirritmico/telescope-lazy-plugins.nvim' },
-- Neovim plugin. Telescope.nvim extension that adds LuaSnip integration.
-- https://github.com/benfowler/telescope-luasnip.nvim
{ 'benfowler/telescope-luasnip.nvim' },
-- Fuzzy Finder Algorithm which requires local dependencies to be built. -- Fuzzy Finder Algorithm which requires local dependencies to be built.
-- Only load if `make` is available -- Only load if `make` is available
{ {
@@ -27,27 +24,45 @@ return {
build = 'make', build = 'make',
cond = vim.fn.executable 'make' == 1, cond = vim.fn.executable 'make' == 1,
}, },
-- Import modules with ease
-- https://github.com/piersolenski/telescope-import.nvim
{ 'piersolenski/telescope-import.nvim' },
}, },
config = function() config = function()
local t = require 'telescope' local t = require 'telescope'
local a = require 'telescope.actions' local a = require 'telescope.actions'
local c = require 'telescope.config'
local open_with_trouble = require('trouble.sources.telescope').open local open_with_trouble = require('trouble.sources.telescope').open
local add_to_trouble = require('trouble.sources.telescope').add local add_to_trouble = require('trouble.sources.telescope').add
-- Clone the default Telescope configuration
local vimgrep_arguments = { unpack(c.values.vimgrep_arguments) }
-- I want to search in hidden/dot files.
table.insert(vimgrep_arguments, '--hidden')
-- I don't want to search in the `.git` directory.
table.insert(vimgrep_arguments, '--glob')
table.insert(vimgrep_arguments, '!**/.git/*')
-- [[ Configure Telescope ]] -- [[ Configure Telescope ]]
-- See `:help telescope` and `:help telescope.setup()` -- See `:help telescope` and `:help telescope.setup()`
t.setup { t.setup {
defaults = { defaults = {
-- `hidden = true` is not supported in text grep commands.
vimgrep_arguments = vimgrep_arguments,
layout_strategy = 'horizontal', layout_strategy = 'horizontal',
pickers = { pickers = {
find_files = { find_files = {
-- `hidden = true` will still show the inside of `.git/` as
-- it's not `.gitignore`d.
find_command = { 'rg', '--files', '--hidden', '--glob', '!**/.git/*' },
theme = 'dropdown', theme = 'dropdown',
}, },
mappings = {
i = {
['<C-s>'] = a.cycle_previewers_next,
['<C-a>'] = a.cycle_previewers_prev,
},
},
}, },
mappings = { mappings = {
i = { i = {
@@ -64,28 +79,28 @@ return {
}, },
}, },
}, },
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
node_incremental = '<CR>',
scope_incremental = '<TAB>',
node_decremental = '<S-TAB>',
},
},
context_commentstring = {
enable = true,
enable_autocmd = false,
},
extensions = { extensions = {
lazy_plugins = { lazy_plugins = {
-- Must be a valid path to the file containing the lazy spec and setup() call. -- Must be a valid path to the file containing the lazy spec and setup() call.
lazy_config = vim.fn.stdpath 'config' .. '/init.lua', lazy_config = vim.fn.stdpath 'config' .. '/init.lua',
}, },
import = {
-- Imports can be added at a specified line whilst keeping the cursor in place
insert_at_top = true,
-- Optionally support additional languages or modify existing languages...
custom_languages = {
{
-- The filetypes that ripgrep supports (find these via `rg --type-list`)
extensions = { 'js', 'ts' },
-- The Vim filetypes
filetypes = { 'vue' },
-- Optionally set a line other than 1
insert_at_line = 2, ---@type function|number
-- The regex pattern for the import statement
regex = [[^(?:import(?:[\"'\s]*([\w*{}\n, ]+)from\s*)?[\"'\s](.*?)[\"'\s].*)]],
},
},
},
}, },
} }

View File

@@ -1,17 +1,8 @@
return { return {
-- https://github.com/rmehri01/onenord.nvim
{ {
'rmehri01/onenord.nvim', 'rmehri01/onenord.nvim',
priority = 1000, -- Make sure to load this before all the other start plugins. opts = {},
opts = {
borders = true,
fade_nc = true,
disable = {
float_background = true,
},
},
}, },
-- Automatic dark mode -- Automatic dark mode
-- https://github.com/f-person/auto-dark-mode.nvim -- https://github.com/f-person/auto-dark-mode.nvim
{ {
@@ -33,6 +24,7 @@ return {
-- https://github.com/catgoose/nvim-colorizer.lua -- https://github.com/catgoose/nvim-colorizer.lua
{ {
'catgoose/nvim-colorizer.lua', 'catgoose/nvim-colorizer.lua',
event = 'BufReadPre',
opts = { opts = {
user_default_options = { user_default_options = {
names = false, names = false,
@@ -40,13 +32,27 @@ return {
}, },
}, },
-- A neovim plugin that shows colorcolumn dynamically
-- https://github.com/Bekaboo/deadcolumn.nvim
{ 'Bekaboo/deadcolumn.nvim' },
-- 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',
lazy = false,
config = function()
local t = require 'transparent'
t.setup {
extra_groups = {
'NormalNC',
'NormalFloat',
'FloatBorder',
'TelescopeBorder',
'TelescopePromptBorder',
'TelescopeResultsBorder',
'TelescopePreviewBorder',
},
}
t.clear_prefix 'NeoTree'
end,
},
-- 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

View File

@@ -1,4 +0,0 @@
-- Vim plugin for automatic time tracking and metrics
-- generated from your programming activity.
-- https://github.com/wakatime/vim-wakatime
return { 'wakatime/vim-wakatime', lazy = false, enabled = true }

View File

@@ -0,0 +1,31 @@
" Vim syntax file
" Language: env files (NOT shell code)
" Maintainer: Gernot Schulz <gernot.schulz@overleaf.com>
" Source: https://github.com/overleaf/vim-env-syntax
" quit when a syntax file was already loaded
if exists("b:current_syntax")
finish
endif
syn match envComment '^#.*'
syn match envVariableUnassigned "^\<\h\w*$"
syn match envVariable "^\<\h\w*\ze=" nextgroup=envVarAssign
syn match envVarAssign contained "=" nextgroup=envVar,envQuotedVarOpen,envSpace
syn match envVar contained "\h\w*"
syn match envSpace contained "\s\+" nextgroup=envQuotedVarOpen
syn match envQuotedVarOpen contained "[\"']"
syn match envSpace "\s$"
syn match envQuotedVarClose "[\"']$"
let b:current_syntax = "env"
hi def link envComment Comment
hi def link envVariableUnassigned Error
hi def link envVariable Identifier
hi def link envVarAssign Operator
hi def link envSpace Error
hi def link envQuotedVarOpen Error
hi def link envQuotedVarClose Error

2
config/op/plugins.sh Normal file
View File

@@ -0,0 +1,2 @@
export OP_PLUGIN_ALIASES_SOURCED=1
alias gh="op plugin run -- gh"

15
config/op/plugins/gh.json Normal file
View File

@@ -0,0 +1,15 @@
{
"account_id": "S5Z2DMNFKJEZBPCWRHRWC4DCGI",
"entrypoint": [
"gh"
],
"credentials": [
{
"plugin": "github",
"credential_type": "personal_access_token",
"usage_id": "personal_access_token",
"vault_id": "injcin7obv3jdet3r2u3kfihfy",
"item_id": "f6vinbnc6l7ngdzvlw66ayewlq"
}
]
}

View File

@@ -0,0 +1 @@
[{"account_id":"S5Z2DMNFKJEZBPCWRHRWC4DCGI","vault_id":"injcin7obv3jdet3r2u3kfihfy","item_id":"f6vinbnc6l7ngdzvlw66ayewlq"}]

View File

@@ -17,13 +17,53 @@ DEBUG="${DEBUG:-0}"
# Enable debugging with DEBUG=1 # Enable debugging with DEBUG=1
[ "${DEBUG:-0}" -eq 1 ] && set -x [ "${DEBUG:-0}" -eq 1 ] && set -x
# Detect the current shell
CURRENT_SHELL=$(ps -p $$ -ocomm= | awk -F/ '{print $NF}')
# Function to prepend a path to PATH based on the shell
x-path-prepend()
{
local dir=$1
case "$CURRENT_SHELL" in
fish)
set -U fish_user_paths "$dir" $fish_user_paths
;;
sh | bash | zsh)
PATH="$dir:$PATH"
;;
*)
echo "Unsupported shell: $CURRENT_SHELL"
exit 1
;;
esac
}
# Function to set environment variables based on the shell
x-set-env()
{
local var=$1
local value=$2
case "$CURRENT_SHELL" in
fish)
set -x "$var" "$value"
;;
sh | bash | zsh)
export "$var=$value"
;;
*)
echo "Unsupported shell: $CURRENT_SHELL"
exit 1
;;
esac
}
# Explicitly set XDG folders, if not already set # Explicitly set XDG folders, if not already set
# https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html # https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
[ -z "$XDG_CONFIG_HOME" ] && export XDG_CONFIG_HOME="$HOME/.config" x-set-env XDG_CONFIG_HOME "$HOME/.config"
[ -z "$XDG_DATA_HOME" ] && export XDG_DATA_HOME="$HOME/.local/share" x-set-env XDG_DATA_HOME "$HOME/.local/share"
[ -z "$XDG_CACHE_HOME" ] && export XDG_CACHE_HOME="$HOME/.cache" x-set-env XDG_CACHE_HOME "$HOME/.cache"
[ -z "$XDG_STATE_HOME" ] && export XDG_STATE_HOME="$HOME/.local/state" x-set-env XDG_STATE_HOME "$HOME/.local/state"
[ -z "$XDG_BIN_HOME" ] && export XDG_BIN_HOME="$HOME/.local/bin" x-set-env XDG_BIN_HOME "$HOME/.local/bin"
# Paths # Paths
x-path-prepend "/usr/local/bin" x-path-prepend "/usr/local/bin"

View File

@@ -1,7 +1,7 @@
set-option -g status-style 'fg=#4c4f69,bg=#eff1f5' set-option -g status-style 'fg=#4c4f69,bg=default'
set-window-option -g window-status-style 'fg=#4c4f69,bg=#eff1f5 dim' set-window-option -g window-status-style 'fg=#4c4f69,bg=default dim'
set-window-option -g window-status-current-style 'fg=#8839ef,bg=#eff1f5' set-window-option -g window-status-current-style 'fg=#8839ef,bg=default'
set-window-option -g window-status-activity-style 'fg=#4c4f69,bg=#eff1f5 nodim' set-window-option -g window-status-activity-style 'fg=#4c4f69,bg=default nodim'
set-window-option -g window-status-bell-style 'fg=#4c4f69,bg=#eff1f5' set-window-option -g window-status-bell-style 'fg=#4c4f69,bg=default'
set -g message-style 'fg=#8839ef bg=#e6e9ef bold' # fg magenta, bg black set -g message-style 'fg=#8839ef bg=#e6e9ef bold' # fg magenta, bg black

View File

@@ -15,6 +15,9 @@
# -o : Set the option only if it is not already set. # -o : Set the option only if it is not already set.
# -u : Unset the specified option. # -u : Unset the specified option.
set -ag terminal-overrides ",xterm-256color:RGB"
set -ag terminal-features 'xterm-256color:RGB'
set -g default-terminal "tmux-256color" # Set default terminal to 256 colors set -g default-terminal "tmux-256color" # Set default terminal to 256 colors
set -g detach-on-destroy off # don't detach tmux when killing a session set -g detach-on-destroy off # don't detach tmux when killing a session
set -g display-time 0 # Hide clock set -g display-time 0 # Hide clock
@@ -49,11 +52,12 @@ if-shell '[ "$DEBUG" = "1" ]' 'set -g debug-file ~/.cache/tmux-debug.log'
set -g pane-active-border-style "fg=#7aa2f7" set -g pane-active-border-style "fg=#7aa2f7"
set -g pane-border-style "fg=#3b4261" set -g pane-border-style "fg=#3b4261"
set -g status-style "bg=default"
set -g status-justify "left" set -g status-justify "left"
set -g status-left '' set -g status-left ''
set -g status-left-length "0" set -g status-left-length "0"
set -g status-position "bottom" set -g status-position "bottom"
set -g status-right "#S@#{hostname_short} #{tmux_mode_indicator}" set -g status-right "#S@#h #{tmux_mode_indicator}"
set -g status-right-length "30" set -g status-right-length "30"
set -g window-status-current-format ' #I:#W#{?window_zoomed_flag, ◈ ,} ' set -g window-status-current-format ' #I:#W#{?window_zoomed_flag, ◈ ,} '
set -g window-status-format ' #I:#W ' set -g window-status-format ' #I:#W '

View File

@@ -17,7 +17,7 @@ cnoreabbrev Qall qall " quit all
"" Mappings "" Mappings
"***************************************************************************** "*****************************************************************************
noremap <C-S> :w<CR> " save buffer noremap <C-s> :w<CR> " save buffer
" Split " Split
noremap <Leader>h :<C-u>split<CR> " horizontal split noremap <Leader>h :<C-u>split<CR> " horizontal split
@@ -57,7 +57,7 @@ noremap <Leader>r :tabe <C-R>=expand("%:p:h") . "/" <CR>
" fzf.vim " fzf.vim
let $FZF_DEFAULT_COMMAND = "find * -path '*/\.*' -prune -o -path 'node_modules/**' -prune -o -path 'target/**' -prune -o -path 'vendor/**' -prune -o -path 'dist/**' -prune -o -type f -print -o -type l -print 2> /dev/null" let $FZF_DEFAULT_COMMAND = "find * -path '*/\.*' -prune -o -path 'node_modules/**' -prune -o -path 'target/**' -prune -o -path 'vendor/**' -prune -o -path 'dist/**' -prune -o -type f -print -o -type l -print 2> /dev/null"
cnoremap <C-P> <C-R>=expand("%:p:h") . "/" <CR> cnoremap <C-p> <C-R>=expand("%:p:h") . "/" <CR>
nnoremap <silent> <leader>b :Buffers<CR> nnoremap <silent> <leader>b :Buffers<CR>
nnoremap <silent> <leader>e :FZF -m<CR> nnoremap <silent> <leader>e :FZF -m<CR>
" Recovery commands from history through FZF " Recovery commands from history through FZF

View File

@@ -6,7 +6,7 @@ config.set_environment_variables = {
} }
-- Font and font size -- Font and font size
config.font_size = 14.0 config.font_size = 14.5
config.font = wezterm.font_with_fallback { config.font = wezterm.font_with_fallback {
{ {
family = 'Operator Mono', family = 'Operator Mono',
@@ -17,16 +17,31 @@ config.font = wezterm.font_with_fallback {
'JetBrains Mono', 'JetBrains Mono',
'Symbols Nerd Font Mono', 'Symbols Nerd Font Mono',
} }
config.harfbuzz_features = { 'zero', 'ss01', 'cv05' } config.font_shaper = 'Harfbuzz'
config.harfbuzz_features = { 'calt=1', 'clig=1', 'liga=1' }
-- Make the window a bit transparent config.selection_word_boundary = ' \t\n{[}]()"\'`,;:'
config.window_background_opacity = 0.98
-- Window configuration
config.window_background_opacity = 0.95
config.window_decorations = 'RESIZE'
config.macos_window_background_blur = 10
config.window_padding = {
left = 5,
right = 5,
top = 5,
bottom = 5,
}
-- Don't show tab bar -- Don't show tab bar
config.enable_tab_bar = false config.enable_tab_bar = false
-- Fix alt on macOS -- Fix alt on macOS
config.send_composed_key_when_left_alt_is_pressed = true config.send_composed_key_when_left_alt_is_pressed = true
config.send_composed_key_when_right_alt_is_pressed = true
-- Scrolling deactivated, using tmux for that
config.scrollback_lines = 0
-- Function to detect the theme based on appearance -- Function to detect the theme based on appearance
function Scheme_for_appearance(appearance) function Scheme_for_appearance(appearance)

View File

@@ -3,13 +3,19 @@
"metrics": false "metrics": false
}, },
"assistant": { "assistant": {
"always_allow_tool_actions": false,
"default_model": { "default_model": {
"provider": "copilot_chat", "provider": "copilot_chat",
"model": "claude-3-7-sonnet" "model": "gpt-4.1"
}, },
"version": "2" "version": "2"
}, },
"languages": { "languages": {
"Python": {
"enable_language_server": true,
"allow_rewrap": "anywhere",
"auto_indent_on_paste": true
},
"Shell Script": { "Shell Script": {
"enable_language_server": true "enable_language_server": true
}, },
@@ -49,8 +55,8 @@
"vim_mode": true, "vim_mode": true,
"theme": { "theme": {
"mode": "system", "mode": "system",
"light": "Iceberg", "light": "Tokyo Night Light",
"dark": "Iceberg" "dark": "Tokyo Night Storm"
}, },
"inlay_hints": { "inlay_hints": {
"enabled": true, "enabled": true,
@@ -60,13 +66,9 @@
}, },
"ui_font_size": 16, "ui_font_size": 16,
"buffer_font_size": 16, "buffer_font_size": 16,
"buffer_font_fallbacks": [ "buffer_font_fallbacks": ["JetBrainsMono Nerd Font"],
"JetBrainsMono Nerd Font"
],
"edit_predictions": { "edit_predictions": {
"disabled_globs": [ "disabled_globs": [".env", ".env.*"]
".env"
]
}, },
"hour_format": "hour24" "hour_format": "hour24"
} }

View File

@@ -35,11 +35,20 @@
glob: true glob: true
path: base/* path: base/*
prefix: '.' prefix: '.'
# Most of the configs
~/.config/: ~/.config/:
glob: true glob: true
relink: true relink: true
path: config/* path: config/*
exclude: [config/nvm, config/fzf] exclude: [config/nvm, config/fzf, config/op]
# 1Password CLI plugins
~/.config/op/plugins.sh:
relink: true
path: config/op/plugins.sh
~/.config/op/plugins:
relink: true
path: config/op/plugins
# Scripts
~/.local/bin: ~/.local/bin:
glob: true glob: true
path: local/bin/* path: local/bin/*
@@ -47,22 +56,27 @@
~/.local/fzf: ~/.local/fzf:
glob: true glob: true
path: config/fzf/* path: config/fzf/*
# Manuals
~/.local/man: ~/.local/man:
glob: true glob: true
path: local/man/** path: local/man/**
~/.local/share: ~/.local/share:
glob: true glob: true
path: local/share/* path: local/share/*
# SSH Configuration
~/.ssh/: ~/.ssh/:
glob: true glob: true
mode: 0600 mode: 0600
path: ssh/* path: ssh/*
- shell: - shell:
# Add Git submodules and remove old ones
- bash add-submodules.sh || true - bash add-submodules.sh || true
# Update submodules recursively
- git submodule update --init --recursive --force - git submodule update --init --recursive --force
- shell: - shell:
# Use my dotfiles manager to install everything
- bash local/bin/dfm install all - bash local/bin/dfm install all
- pipx: - pipx:

View File

@@ -15,9 +15,35 @@
SCRIPT=$(basename "$0") SCRIPT=$(basename "$0")
# Loads configs for better installation experience # Detect the current shell
source "$DOTFILES/config/shared.sh" CURRENT_SHELL=$(ps -p $$ -ocomm= | awk -F/ '{print $NF}')
source "${DOTFILES}/local/bin/msgr"
# Function to source files based on the shell
source_file()
{
local file=$1
case "$CURRENT_SHELL" in
fish)
if [[ -f "$file.fish" ]]; then
source "$file.fish"
else
echo "Fish shell file not found: $file.fish"
exit 1
fi
;;
sh | bash | zsh)
source "$file"
;;
*)
echo "Unsupported shell: $CURRENT_SHELL"
exit 1
;;
esac
}
# Modify the source commands to use the new function
source_file "$DOTFILES/config/shared.sh"
source_file "${DOTFILES}/local/bin/msgr"
# Menu builder # Menu builder
menu_builder() menu_builder()
@@ -267,7 +293,7 @@ section_helpers()
{ {
USAGE_PREFIX="$SCRIPT helpers <command>" USAGE_PREFIX="$SCRIPT helpers <command>"
MENU=( MENU=(
"aliases:<shell> (bash, zsh) Show aliases" "aliases:<shell> (bash, zsh, fish) Show aliases"
"colors:Show colors" "colors:Show colors"
"env:Show environment variables" "env:Show environment variables"
"functions:Show functions" "functions:Show functions"
@@ -297,8 +323,11 @@ section_helpers()
"bash") "bash")
bash -ixc : 2>&1 | grep -E '> alias' | sed "s|$HOME|~|" | grep -v "(eval)" bash -ixc : 2>&1 | grep -E '> alias' | sed "s|$HOME|~|" | grep -v "(eval)"
;; ;;
"fish")
fish -ic "alias" | sed "s|$HOME|~|"
;;
*) *)
echo "$SCRIPT helpers aliases <shell> (bash, zsh)" echo "$SCRIPT helpers aliases <shell> (bash, zsh, fish)"
;; ;;
esac esac
;; ;;

694
local/bin/git-attributes Executable file
View File

@@ -0,0 +1,694 @@
#!/usr/bin/env bash
#
# Check git repo's files .gitattributes and ensure all of them are mapped.
#
# Author: Ismo Vuorinen <https://github.com/ivuorinen> 2022
# License: MIT
set -euo pipefail
# Default configuration
VERBOSE=0
CHECK_PATTERN="text: auto"
EXIT_ON_MISSING=0
SUGGEST_RULES=1 # Suggestions enabled by default
WRITE_RULES=0 # Writing to file is opt-in
FORMAT_WIDTH=0 # Auto-width by default (0 means auto)
MIN_FORMAT_WIDTH=20 # Minimum format width
DEBUG="${DEBUG:-0}"
if [ "$DEBUG" -eq 1 ]; then
set -x
fi
# Output functions
msg_err()
{
echo -e "\e[31m$@\e[0m" >&2
}
msg_success()
{
echo -e "\e[32m$@\e[0m"
}
msg_warn()
{
echo -e "\e[33m$@\e[0m" >&2
}
msg_info()
{
echo -e "\e[36m$@\e[0m"
}
msg_debug()
{
[[ $VERBOSE -eq 1 ]] && echo -e "\e[35m$@\e[0m"
}
show_help()
{
cat << EOF
Usage: $(basename "$0") [OPTIONS]
Check if all git-tracked files have corresponding rules in .gitattributes
Options:
-h, --help Display this help message
-v, --verbose Enable verbose output
-e, --exit Exit with error code if missing attributes found
-p, --pattern Pattern to check (default: "text: auto")
-n, --no-suggest Don't suggest .gitattributes rules (suggestions are on by default)
-w, --write Write suggested rules to .gitattributes file
-f, --format-width Specify width for formatting rule patterns (default: auto, min: $MIN_FORMAT_WIDTH)
EOF
}
# Parse arguments
while [[ $# -gt 0 ]]; do
case "$1" in
-h | --help)
show_help
exit 0
;;
-v | --verbose)
VERBOSE=1
shift
;;
-e | --exit)
EXIT_ON_MISSING=1
shift
;;
-p | --pattern)
CHECK_PATTERN="$2"
shift 2
;;
-n | --no-suggest)
SUGGEST_RULES=0
shift
;;
-w | --write)
WRITE_RULES=1
shift
;;
-f | --format-width)
if [[ $2 =~ ^[0-9]+$ ]]; then
FORMAT_WIDTH=$2
shift 2
else
msg_err "Error: --format-width requires a numeric argument"
exit 1
fi
;;
*)
msg_err "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Function to check if git is installed
check_git_installed()
{
if ! command -v git &> /dev/null; then
msg_err "git could not be found, please install it first"
exit 1
fi
}
# Check if we're in a git repository
check_git_repo()
{
if ! git rev-parse --is-inside-work-tree &> /dev/null; then
msg_err "Not inside a git repository"
exit 1
fi
}
# Check if we're in the git root directory
check_git_root()
{
local git_root
git_root=$(git rev-parse --show-toplevel)
local current_dir
current_dir=$(pwd)
if [[ "$git_root" != "$current_dir" ]]; then
msg_err "Not in git repository root directory"
msg_warn "Please run this command from: $git_root"
exit 1
fi
}
# Check if .gitattributes exists
check_gitattributes_exists()
{
if [[ ! -f ".gitattributes" ]]; then
msg_err ".gitattributes file not found in the repository root"
msg_warn "Create a .gitattributes file before running this command"
exit 1
fi
}
# Format rule with proper alignment
format_rule()
{
local pattern="$1"
local attributes="$2"
local width="$3"
# If pattern starts with "#", it's a comment, don't format
if [[ "$pattern" == "#"* ]]; then
echo "$pattern"
return
fi
# If pattern is empty, return empty
if [[ -z "$pattern" ]]; then
echo ""
return
fi
printf "%-${width}s %s\n" "$pattern" "$attributes"
}
# Get the file extension properly, handling special cases
get_file_extension()
{
local file="$1"
local basename=$(basename "$file")
local extension=""
# Check if file has no extension or is a dotfile
if [[ "$basename" == .* && ! "$basename" =~ \..+$ ]]; then
# It's a dotfile without extension (like .gitignore)
extension="$basename"
elif [[ "$basename" =~ \..+$ ]]; then
# Normal file with extension
extension="${basename##*.}"
# Check for special cases like .d/ directories
if [[ "$extension" == "d" ]]; then
# This is likely a .d directory - use the full filename as pattern
if [[ -f "$file" ]]; then
# For files in .d directories, use the complete path as pattern
extension=$(basename "$file")
else
# For .d directory itself, use *.d
extension="d"
fi
fi
else
# No extension at all
extension="$basename"
fi
echo "$extension"
}
# Suggest appropriate gitattributes rules based on file extension
suggest_rule()
{
local file="$1"
local extension=""
local pattern=""
local attributes=""
msg_debug "Checking file: $file"
# Skip directories
if [[ -d "$file" ]]; then
return
fi
# Get proper file extension
extension=$(get_file_extension "$file")
# If file path contains .d/ pattern, we need special handling
if [[ "$file" =~ \.d/ ]]; then
# Extract the pattern part that includes the .d/ directory
local dir_part=$(dirname "$file")
local base_name=$(basename "$file")
# Check if it's a config directory pattern worth capturing
if [[ "$dir_part" =~ /(\.d|[^/]+\.d)$ ]]; then
pattern="$dir_part/*"
msg_debug "Detected .d directory pattern: $pattern"
else
# Use standard extension pattern
pattern="*.${extension}"
fi
else
# Standard file with extension
pattern="*.${extension}"
fi
# Common text files
case "$extension" in
# Shell scripts
sh | bash | zsh | fish)
attributes="text eol=lf diff=shell"
;;
# Web development
html | htm | xhtml | css | scss | sass | less)
attributes="text eol=lf diff=html"
;;
js | jsx | ts | tsx | json | json5)
attributes="text eol=lf diff=javascript"
;;
# Programming languages
php)
attributes="text eol=lf diff=php"
;;
py)
attributes="text eol=lf diff=python"
;;
rb)
attributes="text eol=lf diff=ruby"
;;
go)
attributes="text eol=lf diff=golang"
;;
java | kt | scala)
attributes="text eol=lf diff=java"
;;
c | cpp | h | hpp)
attributes="text eol=lf diff=cpp"
;;
# Documentation
md | markdown | txt)
attributes="text eol=lf"
;;
# Configuration files
yml | yaml | toml | ini | cfg | conf)
attributes="text eol=lf"
;;
# Git config files and similar patterns
git)
attributes="text eol=lf"
;;
gitignore | gitattributes)
attributes="text eol=lf"
;;
# Binary files
png | jpg | jpeg | gif | ico | svg | webp | avif)
attributes="binary"
;;
pdf | doc | docx | xls | xlsx | ppt | pptx)
attributes="binary"
;;
zip | tar | gz | 7z | rar)
attributes="binary"
;;
mp3 | mp4 | avi | mov | wav | ogg)
attributes="binary"
;;
ttf | otf | woff | woff2 | eot)
attributes="binary"
;;
# Default for unknown extensions
*)
# Try to guess if it's text by checking if it contains null bytes
if file "$file" | grep -q text; then
attributes="text eol=lf"
else
attributes="binary"
fi
;;
esac
msg_debug "...suggesting $pattern $attributes"
echo "$pattern:$attributes"
}
# Function to check for missing .gitattributes
check_gitattributes()
{
local missing_attributes
msg_info "Checking for pattern: $CHECK_PATTERN"
missing_attributes=$(git ls-files | git check-attr -a --stdin | grep "$CHECK_PATTERN" || true)
if [[ -n "$missing_attributes" ]]; then
msg_warn "Missing .gitattributes rules detected"
if [[ $SUGGEST_RULES -eq 1 ]]; then
# Generate suggestions
local suggestions
# Generate the suggestions
suggestions=$(suggest_gitattributes "$missing_attributes")
# Display the suggestions
echo ""
echo "$suggestions"
echo ""
if [[ $WRITE_RULES -eq 1 ]]; then
msg_debug "...writing to .gitattributes"
write_to_gitattributes "$suggestions"
fi
else
msg_err ".gitattributes rule missing for the following files:"
echo "$missing_attributes"
fi
if [[ $EXIT_ON_MISSING -eq 1 ]]; then
return 1
fi
else
msg_success "All files have a corresponding rule in .gitattributes"
fi
return 0
}
# Parse rule string and extract pattern and attributes
parse_rule()
{
local rule="$1"
if [[ "$rule" == "#"* ]]; then
# This is a comment line
echo "$rule::"
return
fi
if [[ "$rule" =~ ^([^[:space:]]+)[[:space:]]+(.*)$ ]]; then
echo "${BASH_REMATCH[1]}:${BASH_REMATCH[2]}"
else
echo "$rule::"
fi
}
# Check shell scripts by name regardless of extension
detect_shell_scripts()
{
msg_debug "Detecting shell scripts by name regardless of extension..."
local shell_scripts_rules=""
local shell_scripts_found=0
local patterns=()
local attributes=()
# Get already defined rules in .gitattributes
local existing_rules
existing_rules=$(grep -v "^#" .gitattributes || true)
# Get all shell scripts regardless of extension
local shell_scripts
shell_scripts=$(git ls-files | xargs file | grep "shell script" | cut -d: -f1)
if [[ -n "$shell_scripts" ]]; then
shell_scripts_found=$(echo "$shell_scripts" | wc -l | tr -d ' ')
msg_debug "Found $shell_scripts_found potential shell scripts."
# Track scripts that need rules
declare -A scripts_by_dir=()
local need_rule_count=0
# Process each script
while IFS= read -r script; do
local rel_path="${script#./}"
# Skip if exact path already in .gitattributes
if grep -q "^${rel_path} " <<< "$existing_rules"; then
msg_debug "Script already in .gitattributes: $rel_path"
continue
fi
# Skip if file extension already covered
local extension=$(get_file_extension "$rel_path")
if [[ "$extension" != "$rel_path" ]] && grep -q "^\*\.$extension " <<< "$existing_rules"; then
msg_debug "Script covered by extension rule: $rel_path (*.$extension)"
continue
fi
# Check if any parent directory is already covered
local is_covered=0
local dir_path="$rel_path"
while [[ "$dir_path" != "." && "$dir_path" != "/" ]]; do
dir_path=$(dirname "$dir_path")
if [[ "$dir_path" == "." ]]; then
break
fi
# Check if directory or any of its contents are covered
if grep -q "^${dir_path}/\?" <<< "$existing_rules" || grep -q "^${dir_path}/\*" <<< "$existing_rules"; then
msg_debug "Script covered by directory rule: $rel_path (${dir_path})"
is_covered=1
break
fi
done
if [[ $is_covered -eq 1 ]]; then
continue
fi
# Group by directory
local dir=$(dirname "$rel_path")
if [[ "$dir" == "." ]]; then
dir="root"
fi
# Add to appropriate group
if [[ -z "${scripts_by_dir[$dir]:-}" ]]; then
scripts_by_dir[$dir]="$rel_path"
else
scripts_by_dir[$dir]="${scripts_by_dir[$dir]}\n$rel_path"
fi
((need_rule_count++))
done <<< "$shell_scripts"
# Output grouped results
if [[ $need_rule_count -gt 0 ]]; then
patterns+=("# Shell scripts detected by content")
attributes+=("")
# Check if we can use directory-based rules instead of individual files
for dir in "${!scripts_by_dir[@]}"; do
local files_in_dir=$(echo -e "${scripts_by_dir[$dir]}" | wc -l)
local dir_path="$dir"
if [[ "$dir" == "root" ]]; then
# For root directory files, list each individually
while IFS= read -r file; do
patterns+=("$file")
attributes+=("text eol=lf diff=shell")
done <<< "$(echo -e "${scripts_by_dir[$dir]}")"
elif [[ $files_in_dir -gt 2 ]]; then
# If directory has multiple scripts, suggest a directory pattern
patterns+=("# Found $files_in_dir scripts in $dir_path")
attributes+=("")
# Special handling for .d directories
if [[ "$dir_path" =~ \.d$ || "$dir_path" =~ \.d/ ]]; then
patterns+=("$dir_path/*")
else
patterns+=("$dir_path/*")
fi
attributes+=("text eol=lf diff=shell")
# List the files as comments for reference
while IFS= read -r file; do
patterns+=("# - ${file}")
attributes+=("")
done <<< "$(echo -e "${scripts_by_dir[$dir]}" | sort)"
else
# For directories with few scripts, list them individually
while IFS= read -r file; do
patterns+=("$file")
attributes+=("text eol=lf diff=shell")
done <<< "$(echo -e "${scripts_by_dir[$dir]}")"
fi
done
msg_debug "Adding $need_rule_count shell scripts to suggestions (grouped by directory)."
else
msg_debug "All detected shell scripts already have rules."
fi
else
msg_debug "No shell scripts detected."
fi
# Return the formatted arrays
local rules_count=${#patterns[@]}
for ((i = 0; i < rules_count; i++)); do
echo "${patterns[$i]}:${attributes[$i]}"
done
}
# Function to suggest gitattributes rules
suggest_gitattributes()
{
local missing_attributes="$1"
local files
local extension_suggestions=()
local formatted_suggestions=""
local all_patterns=()
local all_attributes=()
local max_pattern_length=0
# Add header to suggestions
all_patterns+=("# Auto-generated rules - $(date +"%Y-%m-%d %H:%M:%S")")
all_attributes+=("")
msg_info "Suggested .gitattributes rules:"
# First, detect shell scripts and add them to suggestions
msg_info "Detecting shell scripts by content..."
local shell_scripts_rules
shell_scripts_rules=$(detect_shell_scripts)
# Add shell script rules to patterns and attributes arrays
if [[ -n "$shell_scripts_rules" ]]; then
while IFS=':' read -r pattern attributes; do
if [[ -n "$pattern" ]]; then
all_patterns+=("$pattern")
all_attributes+=("$attributes")
# Update max pattern length (skip comments)
if [[ "$pattern" != "#"* ]] && [[ ${#pattern} -gt $max_pattern_length ]]; then
max_pattern_length=${#pattern}
fi
fi
done <<< "$shell_scripts_rules"
fi
# Extract filenames from git check-attr output
files=$(echo "$missing_attributes" | awk -F': ' '{print $1}')
# Get suggestions for each file
declare -A seen_patterns=()
while IFS= read -r file; do
local suggestion=$(suggest_rule "$file")
if [[ -n "$suggestion" ]]; then
IFS=':' read -r pattern attributes <<< "$suggestion"
# Only add each pattern once
if [[ -z "${seen_patterns[$pattern]:-}" ]]; then
extension_suggestions+=("$suggestion")
seen_patterns[$pattern]=1
fi
fi
done <<< "$files"
# Remove duplicates and sort
local unique_extensions=()
mapfile -t unique_extensions < <(printf '%s\n' "${extension_suggestions[@]}" | sort -u)
# Add extension-based suggestions header if we have any
if [[ ${#unique_extensions[@]} -gt 0 ]]; then
all_patterns+=("")
all_attributes+=("")
all_patterns+=("# File extension-based rules")
all_attributes+=("")
# Add extension rules to patterns and attributes arrays
for suggestion in "${unique_extensions[@]}"; do
IFS=':' read -r pattern attributes <<< "$suggestion"
all_patterns+=("$pattern")
all_attributes+=("$attributes")
# Update max pattern length
if [[ ${#pattern} -gt $max_pattern_length ]]; then
max_pattern_length=${#pattern}
fi
done
fi
# Use user-specified format width if provided, otherwise use max_pattern_length
# But ensure it's at least MIN_FORMAT_WIDTH
local format_width=$max_pattern_length
if [[ $FORMAT_WIDTH -gt 0 ]]; then
format_width=$FORMAT_WIDTH
fi
# Ensure minimum width
if [[ $format_width -lt $MIN_FORMAT_WIDTH ]]; then
format_width=$MIN_FORMAT_WIDTH
fi
msg_debug "Using format width: $format_width"
# Format and output all suggestions with proper alignment
local rule_count=${#all_patterns[@]}
for ((i = 0; i < rule_count; i++)); do
local pattern="${all_patterns[$i]}"
local attributes="${all_attributes[$i]}"
# Handle comments separately
if [[ "$pattern" == "#"* ]] || [[ -z "$attributes" ]]; then
formatted_suggestions+="$pattern\n"
echo "$pattern"
else
local formatted_rule=$(printf "%-${format_width}s %s\n" "$pattern" "$attributes")
formatted_suggestions+="$formatted_rule\n"
echo "$formatted_rule"
fi
done
# Add final message
echo ""
msg_info "Add these rules to your .gitattributes file to resolve missing attributes."
# Return the full suggestion text so it can be both displayed and written to file
echo -e "$formatted_suggestions"
}
# Write suggestions to .gitattributes file
write_to_gitattributes()
{
local suggestions="$1"
local gitattributes=".gitattributes"
# Check if file exists and is writable
if [[ ! -w "$gitattributes" ]]; then
msg_err "Cannot write to $gitattributes. Check permissions."
return 1
fi
# Add a newline at the end of the file if it doesn't have one
if [[ -s "$gitattributes" ]] && [[ $(tail -c 1 "$gitattributes" | wc -l) -eq 0 ]]; then
echo "" >> "$gitattributes"
fi
# Append suggestions to the file
echo -e "$suggestions" >> "$gitattributes"
msg_success "Added suggested rules to $gitattributes"
# Remind to check the file
msg_warn "Please review the changes to ensure they're appropriate for your project."
return 0
}
# Main function
main()
{
check_git_installed
check_git_repo
check_git_root
check_gitattributes_exists
check_gitattributes
}
main "$@"

View File

@@ -201,7 +201,7 @@ process_args()
# Initialize log file if specified # Initialize log file if specified
if [[ -n "$LOG_FILE" ]]; then if [[ -n "$LOG_FILE" ]]; then
# Create log directory if it doesn't exist # Create log directory if it doesn't exist
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true mkdir -p "$(dirname "$LOG_FILE")" 2> /dev/null || true
# Initialize log file # Initialize log file
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] Started git-update-dirs version $VERSION" > "$LOG_FILE" echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] Started git-update-dirs version $VERSION" > "$LOG_FILE"
fi fi
@@ -375,7 +375,7 @@ cleanup_branches()
local cleaned=0 local cleaned=0
local current_branch output local current_branch output
current_branch=$(git symbolic-ref --short HEAD 2>/dev/null) current_branch=$(git symbolic-ref --short HEAD 2> /dev/null)
# Skip branch cleanup if we're not on a main branch # Skip branch cleanup if we're not on a main branch
if [[ ! "$current_branch" =~ ^(master|main|develop)$ ]]; then if [[ ! "$current_branch" =~ ^(master|main|develop)$ ]]; then
@@ -397,7 +397,7 @@ cleanup_branches()
# Delete branches # Delete branches
for branch in $output; do for branch in $output; do
if [[ -n "$branch" ]]; then if [[ -n "$branch" ]]; then
if git branch -d "$branch" &>/dev/null; then if git branch -d "$branch" &> /dev/null; then
((cleaned++)) ((cleaned++))
log "INFO" "Deleted merged branch $branch in $(pwd)" log "INFO" "Deleted merged branch $branch in $(pwd)"
else else
@@ -426,7 +426,7 @@ update_repo()
# Show progress before starting the operation # Show progress before starting the operation
show_progress "$PROCESSED" "$TOTAL" "${dir%/}" show_progress "$PROCESSED" "$TOTAL" "${dir%/}"
cd "$dir" 2>/dev/null || { cd "$dir" 2> /dev/null || {
log "ERROR" "Could not enter directory $dir" log "ERROR" "Could not enter directory $dir"
echo -e "\n${RED}Error: Could not enter directory $dir${NC}" >&2 echo -e "\n${RED}Error: Could not enter directory $dir${NC}" >&2
((FAILED++)) ((FAILED++))
@@ -438,37 +438,37 @@ update_repo()
log "INFO" "Skipping directory with no remotes: $dir" log "INFO" "Skipping directory with no remotes: $dir"
msg "Skipping directory with no remotes: $dir" msg "Skipping directory with no remotes: $dir"
((SKIPPED++)) ((SKIPPED++))
cd - >/dev/null || true cd - > /dev/null || true
return 1 return 1
fi fi
# Get current branch name # Get current branch name
current_branch=$(git symbolic-ref --short HEAD 2>/dev/null) current_branch=$(git symbolic-ref --short HEAD 2> /dev/null)
if [[ -z "$current_branch" ]]; then if [[ -z "$current_branch" ]]; then
log "INFO" "Skipping repository in detached HEAD state: $dir" log "INFO" "Skipping repository in detached HEAD state: $dir"
msg "Skipping repository in detached HEAD state: $dir" msg "Skipping repository in detached HEAD state: $dir"
((SKIPPED++)) ((SKIPPED++))
cd - >/dev/null || true cd - > /dev/null || true
return 1 return 1
fi fi
# Check if current branch has tracking information # Check if current branch has tracking information
eval "git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null" &>/dev/null || { eval "git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null" &> /dev/null || {
log "INFO" "Skipping branch '$current_branch' without tracking info in $dir" log "INFO" "Skipping branch '$current_branch' without tracking info in $dir"
msg "Skipping branch '$current_branch' without tracking info in $dir" msg "Skipping branch '$current_branch' without tracking info in $dir"
((SKIPPED++)) ((SKIPPED++))
cd - >/dev/null || true cd - > /dev/null || true
return 1 return 1
} }
# Check if remote is accessible # Check if remote is accessible
remote_name=$(git config --get branch."$current_branch".remote) remote_name=$(git config --get branch."$current_branch".remote)
if [[ -n "$remote_name" ]]; then if [[ -n "$remote_name" ]]; then
if ! git ls-remote --exit-code "$remote_name" &>/dev/null; then if ! git ls-remote --exit-code "$remote_name" &> /dev/null; then
log "WARNING" "Skipping repository with inaccessible remote '$remote_name': $dir" log "WARNING" "Skipping repository with inaccessible remote '$remote_name': $dir"
msg "Skipping repository with inaccessible remote: $dir" msg "Skipping repository with inaccessible remote: $dir"
((SKIPPED++)) ((SKIPPED++))
cd - >/dev/null || true cd - > /dev/null || true
return 1 return 1
fi fi
fi fi
@@ -478,7 +478,7 @@ update_repo()
log "WARNING" "Skipping repository with unmerged files: $dir" log "WARNING" "Skipping repository with unmerged files: $dir"
msg "Skipping repository with unmerged files: $dir" msg "Skipping repository with unmerged files: $dir"
((UNMERGED++)) ((UNMERGED++))
cd - >/dev/null || true cd - > /dev/null || true
return 1 return 1
fi fi
@@ -579,7 +579,7 @@ update_repo()
fi fi
# Return to original directory # Return to original directory
cd - >/dev/null || true cd - > /dev/null || true
# Show progress after completion # Show progress after completion
show_progress "$PROCESSED" "$TOTAL" "${dir%/} - Done" show_progress "$PROCESSED" "$TOTAL" "${dir%/} - Done"

View File

@@ -1,41 +0,0 @@
#!/usr/bin/env bash
#
# Check git repo's files .gitattributes and ensure all of them are mapped.
# Ismo Vuorinen <https://github.com/ivuorinen> 2022
source "${DOTFILES}/config/shared.sh"
set -euo pipefail
# Enable verbosity with VERBOSE=1
VERBOSE="${VERBOSE:-0}"
# Function to check if git is installed
check_git_installed()
{
if ! command -v git &> /dev/null; then
msg_err "git could not be found, please install it first"
fi
}
# Function to check for missing .gitattributes
check_gitattributes()
{
local missing_attributes
missing_attributes=$(git ls-files | git check-attr -a --stdin | grep "text: auto" || true)
if [[ -n "$missing_attributes" ]]; then
echo ".gitattributes rule missing for the following files:"
echo "$missing_attributes"
else
echo "All files have a corresponding rule in .gitattributes"
fi
}
# Main function
main()
{
check_git_installed
check_gitattributes
}
main "$@"

View File

@@ -1,209 +0,0 @@
#!/usr/bin/env perl
=head1 NAME
dupes - Report on files with duplicate contents, via SHA1 hash.
=cut
=head1 SYNOPSIS
dupes [options] directory
General Options:
--help Show the help information for this script.
--verbose Show useful debugging information.
=cut
=head1 ABOUT
dupes is a simple script to report upon files that are identical,
recursively.
The process involves calculating the SHA1 hash of the file contents
and reporting on anything collisions we see.
Note that a collision might be caused by a symbolic link, or hardlink,
so blindly deleting duplicates without investigation is almost certainly
a mistake.
=cut
=head1 AUTHOR
Steve
--
http://www.steve.org.uk/
=cut
=head1 LICENSE
Copyright (c) 2013 by Steve Kemp. All rights reserved.
This script is free software;you can redistribute it and/or modify it under
the same terms as Perl itself.
The LICENSE file contains the full text of the license.
=cut
use strict;
use warnings;
use File::Find;
use Getopt::Long;
use Pod::Usage;
#
# Parse the arguments
#
my %config = parsedOptions();
#
# The path to examine.
#
my $path = $ARGV[0] || '.';
#
# Get the hashing object, dynamically.
#
my $ctx = getHashObject();
my %digest;
#
# Find files and store the hash of their contents.
#
find( {
'wanted' => sub {
if ( -f $_ )
{
lstat;
if ( ( -r _ ) && ( !-l _ ) )
{
$ctx->reset;
$ctx->addfile($_);
my $md5 = $ctx->hexdigest;
if ( exists $digest{ $md5 } )
{
push @{ $digest{ $md5 }->{ 'dupes' } }, $_;
}
else
{
$digest{ $md5 } = { 'file' => $_,
'dupes' => [] };
}
}
}
else
{
$config{ 'verbose' } && print "Entering $_\n";
}
},
'no_chdir' => 1
},
$path
);
#
# Report upon collisions.
#
foreach my $hash ( keys %digest )
{
my $dupes = $digest{ $hash }->{ 'dupes' };
my $src = $digest{ $hash }->{ 'file' };
if (@$dupes)
{
print $src . "\n";
foreach my $dupe (@$dupes)
{
print "\t$dupe\n";
}
}
}
#
# All done.
#
exit(0);
=begin doc
Load one of M<Digest::SHA> and M<Digest::SHA1>, depending on what is available.
=end doc
=cut
sub getHashObject
{
my $hash = undef;
foreach my $module (qw! Digest::SHA Digest::SHA1 !)
{
# If we succeeded in calculating the hash we're done.
next if ( defined($hash) );
# Attempt to load the module
my $eval = "use $module;";
## no critic (Eval)
eval($eval);
## use critic
if ( !$@ )
{
$hash = $module->new;
}
}
if ($hash)
{
return ($hash);
}
else
{
print "Failed to load either DIgest::SHA or Digest::SHA1\n";
exit(1);
}
}
=begin doc
Parse the options and return suitable values.
=end doc
=cut
sub parsedOptions
{
my %vars;
exit
if (
!GetOptions( "help" => \$vars{ 'help' },
"verbose" => \$vars{ 'verbose' } ) );
pod2usage(1) if ( $vars{ 'help' } );
return (%vars);
}

View File

@@ -1,4 +1,4 @@
column_width = 120 column_width = 90
line_endings = "Unix" line_endings = "Unix"
indent_type = "Spaces" indent_type = "Spaces"
indent_width = 2 indent_width = 2

View File

@@ -6947,9 +6947,9 @@ http-proxy-agent@^7.0.0:
debug "^4.3.4" debug "^4.3.4"
http-proxy-middleware@^2.0.3: http-proxy-middleware@^2.0.3:
version "2.0.7" version "2.0.9"
resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz#915f236d92ae98ef48278a95dedf17e991936ec6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef"
integrity sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA== integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==
dependencies: dependencies:
"@types/http-proxy" "^1.17.8" "@types/http-proxy" "^1.17.8"
http-proxy "^1.18.1" http-proxy "^1.18.1"