Compare commits

...

10 Commits

Author SHA1 Message Date
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
38 changed files with 1284 additions and 626 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 }}

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

View File

@@ -49,7 +49,7 @@ 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: 39.252.0
hooks: hooks:
- id: renovate-config-validator - id: renovate-config-validator

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

@@ -8,13 +8,23 @@ 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/.config/fish/exports.secret.fish" &&
source "$HOME/.config/fish/exports.secret.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

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

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

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

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

@@ -5,7 +5,7 @@
"assistant": { "assistant": {
"default_model": { "default_model": {
"provider": "copilot_chat", "provider": "copilot_chat",
"model": "claude-3-7-sonnet" "model": "claude-3.7-sonnet-thought"
}, },
"version": "2" "version": "2"
}, },

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:

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

@@ -0,0 +1,675 @@
#!/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

@@ -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,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"