Compare commits

...

7 Commits

20 changed files with 588 additions and 279 deletions

View File

@@ -46,3 +46,13 @@ repos:
rev: v1.7.4 rev: v1.7.4
hooks: hooks:
- id: actionlint - id: actionlint
- repo: https://github.com/renovatebot/pre-commit-hooks
rev: 39.70.0
hooks:
- id: renovate-config-validator
- repo: https://github.com/JohnnyMorganz/StyLua
rev: v2.0.2
hooks:
- id: stylua # or stylua-system / stylua-github

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
-- vim: set ft=lua ts=2 sw=2 tw=0 et cc=120 : -- vim: set ft=lua ts=2 sw=2 tw=0 et cc=120 :
require('utils') require 'utils'
-- ╭─────────────────────────────────────────────────────────╮ -- ╭─────────────────────────────────────────────────────────╮
-- │ Keymaps │ -- │ Keymaps │
@@ -20,8 +20,16 @@ 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', "v:count == 0 ? 'gk' : 'k'", { desc = 'Move up', noremap = true, expr = true }) K.n(
K.n('j', "v:count == 0 ? 'gj' : 'j'", { desc = 'Move down', noremap = true, expr = true }) 'k',
"v:count == 0 ? 'gk' : 'k'",
{ desc = 'Move up', noremap = true, expr = true }
)
K.n(
'j',
"v:count == 0 ? 'gj' : 'j'",
{ desc = 'Move down', noremap = true, expr = true }
)
-- ── Text manipulation ─────────────────────────────────────────────── -- ── Text manipulation ───────────────────────────────────────────────
K.d('<', { 'n', 'v' }, '<gv', 'Indent Left') K.d('<', { 'n', 'v' }, '<gv', 'Indent Left')
@@ -55,7 +63,7 @@ K.ld('ca', 'n', ':Lspsaga code_action<cr>', 'Code Action')
K.ld('cci', 'n', ':Lspsaga incoming_calls<cr>', 'Incoming Calls') K.ld('cci', 'n', ':Lspsaga incoming_calls<cr>', 'Incoming Calls')
K.ld('cco', 'n', ':Lspsaga outgoing_calls<cr>', 'Outgoing Calls') K.ld('cco', 'n', ':Lspsaga outgoing_calls<cr>', 'Outgoing Calls')
K.ld('cd', 'n', ':Lspsaga show_line_diagnostics<cr>', 'Line Diagnostics') K.ld('cd', 'n', ':Lspsaga show_line_diagnostics<cr>', 'Line Diagnostics')
K.ld('cf', { 'n', 'x' }, ':lua vim.lsp.buf.format()<CR>', 'Format') -- K.ld('cf', { 'n', 'x' }, ':lua vim.lsp.buf.format()<CR>', 'Format')
K.ld('cg', 'n', ':lua require("neogen").generate()<CR>', 'Generate annotations') K.ld('cg', 'n', ':lua require("neogen").generate()<CR>', 'Generate annotations')
K.ld('ci', 'n', ':Lspsaga implement<cr>', 'Implementations') K.ld('ci', 'n', ':Lspsaga implement<cr>', 'Implementations')
K.ld('cl', 'n', ':Lspsaga show_cursor_diagnostics<cr>', 'Cursor Diagnostics') K.ld('cl', 'n', ':Lspsaga show_cursor_diagnostics<cr>', 'Cursor Diagnostics')
@@ -78,21 +86,24 @@ K.nl('cbl', '<Cmd>CBline<CR>', 'CB: Simple Line')
K.nl('cbm', '<Cmd>CBllbox14<CR>', 'CB: Marked') K.nl('cbm', '<Cmd>CBllbox14<CR>', 'CB: Marked')
K.nl('cbt', '<Cmd>CBllline<CR>', 'CB: Titled Line') K.nl('cbt', '<Cmd>CBllline<CR>', 'CB: Titled Line')
-- ── Telescope operations ──────────────────────────────────────────── -- ── Telescope operations ────────────────────────────────────────────
-- Mappings for Telescope operations like finding files, buffers, etc. -- Mappings for Telescope operations like finding files, buffers, etc.
-- Convention: All mappings start with 's' followed by the operation -- Convention: All mappings start with 's' followed by the operation
-- unless it's a generic operation like searching or finding buffers -- unless it's a generic operation like searching or finding buffers
K.nl('f', ':Telescope find_files<cr>', 'Find Files') K.nl('f', ':Telescope find_files<cr>', 'Find Files')
K.nl(',', ':Telescope buffers<cr>', 'Find existing buffers') K.nl(',', ':Telescope buffers<cr>', 'Find existing buffers')
K.nl('/', function() K.nl(
'/',
function()
require('telescope.builtin').current_buffer_fuzzy_find( require('telescope.builtin').current_buffer_fuzzy_find(
require('telescope.themes').get_dropdown { require('telescope.themes').get_dropdown {
winblend = 20, winblend = 20,
previewer = true, previewer = true,
} }
) )
end, 'Fuzzily search in current buffer') end,
'Fuzzily search in current buffer'
)
K.nl('sc', ':Telescope commands<cr>', 'Commands') K.nl('sc', ':Telescope commands<cr>', 'Commands')
K.nl('sd', ':Telescope diagnostics<cr>', 'Search Diagnostics') K.nl('sd', ':Telescope diagnostics<cr>', 'Search Diagnostics')
@@ -101,7 +112,11 @@ K.nl('sh', ':Telescope help_tags<cr>', 'Help tags')
K.nl('sk', ':Telescope keymaps<cr>', 'Search Keymaps') K.nl('sk', ':Telescope keymaps<cr>', 'Search Keymaps')
K.nl('sl', ':Telescope luasnip<CR>', 'Search LuaSnip') K.nl('sl', ':Telescope luasnip<CR>', 'Search LuaSnip')
K.nl('so', ':Telescope oldfiles<CR>', 'Old Files') K.nl('so', ':Telescope oldfiles<CR>', 'Old Files')
K.nl('sp', ':lua require("telescope").extensions.lazy_plugins.lazy_plugins()<cr>', 'Lazy Plugins') K.nl(
'sp',
':lua require("telescope").extensions.lazy_plugins.lazy_plugins()<cr>',
'Lazy Plugins'
)
K.nl('sq', ':Telescope quickfix<cr>', 'Quickfix') K.nl('sq', ':Telescope quickfix<cr>', 'Quickfix')
K.nl('ss', ':Telescope treesitter<cr>', 'Treesitter') K.nl('ss', ':Telescope treesitter<cr>', 'Treesitter')
K.nl('st', ':TodoTelescope<cr>', 'Search Todos') K.nl('st', ':TodoTelescope<cr>', 'Search Todos')
@@ -127,14 +142,14 @@ 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!') vim.cmd 'wq!'
end 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()
if vim.fn.confirm("Force quit without saving?", "&Yes\n&No", 2) == 1 then if vim.fn.confirm('Force quit without saving?', '&Yes\n&No', 2) == 1 then
vim.cmd('q!') vim.cmd 'q!'
end end
end, 'Force quit without saving') end, 'Force quit without saving')

View File

@@ -25,22 +25,17 @@ M.version = '0.1.0' -- x-release-please-version
---@return string? Return the result of the command ---@return string? Return the result of the command
local function run_command(cmd) local function run_command(cmd)
local result = vim.fn.system(cmd) local result = vim.fn.system(cmd)
return vim.v.shell_error == 0 and result:gsub("%s+$", "") or nil return vim.v.shell_error == 0 and result:gsub('%s+$', '') or nil
end end
-- Helper function to show a notification -- Helper function to show a notification
---@param msg string Show a message ---@param msg string Show a message
---@param level number|"info"|"warn"|"error"|"trace" Notification level ---@param level number|"info"|"warn"|"error"|"trace" Notification level
local function n(msg, level) local function n(msg, level)
if msg == nil then if msg == nil then msg = M.name .. ': No message provided' end
msg = M.name .. ": No message provided" if level == nil then level = 'trace' end
end
if level == nil then
level = "trace"
end
vim.notify(M.name .. ": " .. msg, level) vim.notify(M.name .. ': ' .. msg, level)
end end
---@class NvmDefaultOptions ---@class NvmDefaultOptions
@@ -52,59 +47,63 @@ end
---@type NvmDefaultOptions ---@type NvmDefaultOptions
M.defaults = { M.defaults = {
add_to_path = vim.g.nvm_default_add_to_path or true, add_to_path = vim.g.nvm_default_add_to_path or true,
nvm_path = vim.fn.expand(os.getenv("NVM_DIR") or "~/.nvm"), nvm_path = vim.fn.expand(os.getenv 'NVM_DIR' or '~/.nvm'),
notify_level = vim.g.nvm_default_notify_level or "info", notify_level = vim.g.nvm_default_notify_level or 'info',
} }
-- Fetch the NVM default version or fallback to node version -- Fetch the NVM default version or fallback to node version
---@param opts? NvmDefaultOptions Plugin options ---@param opts? NvmDefaultOptions Plugin options
function M.setup(opts) function M.setup(opts)
local options = vim.tbl_deep_extend("force", M.defaults, opts or {}) local options = vim.tbl_deep_extend('force', M.defaults, opts or {})
local nvm_path = options.nvm_path local nvm_path = options.nvm_path
local node_version = local node_version = run_command(
run_command(string.format(". %s/nvm.sh && nvm version default", nvm_path)) or string.format('. %s/nvm.sh && nvm version default', nvm_path)
run_command(string.format(". %s/nvm.sh && nvm version node", nvm_path)) ) or run_command(string.format('. %s/nvm.sh && nvm version node', nvm_path))
if node_version and node_version:match("^v") then if node_version and node_version:match '^v' then
-- 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 = string.format("%s/versions/node/%s", nvm_path, node_version) local current_nvm_version_path =
local current_nvm_node_bin_path = string.format("%s/bin", current_nvm_version_path) string.format('%s/versions/node/%s', nvm_path, node_version)
local current_nvm_node_bin = string.format("%s/node", current_nvm_node_bin_path) local current_nvm_node_bin_path =
local neovim_node_host_bin_path = string.format("%s/neovim-node-host", current_nvm_node_bin_path) string.format('%s/bin', current_nvm_version_path)
local current_nvm_node_bin =
string.format('%s/node', current_nvm_node_bin_path)
local neovim_node_host_bin_path =
string.format('%s/neovim-node-host', current_nvm_node_bin_path)
-- Collect missing files and directories errors for error output -- Collect missing files and directories errors for error output
local missing = {} local missing = {}
-- If node_dir isn't there, stop and show error -- If node_dir isn't there, stop and show error
if not vim.fn.isdirectory(current_nvm_version_path) then if not vim.fn.isdirectory(current_nvm_version_path) then
table.insert(missing, "Node.js directory: " .. current_nvm_version_path) table.insert(missing, 'Node.js directory: ' .. current_nvm_version_path)
end end
-- If node_bin isn't there, stop and show error -- If node_bin isn't there, stop and show error
if not vim.fn.filereadable(current_nvm_node_bin) then if not vim.fn.filereadable(current_nvm_node_bin) then
table.insert(missing, "Node.js binary: " .. current_nvm_node_bin) table.insert(missing, 'Node.js binary: ' .. current_nvm_node_bin)
end end
if not vim.fn.filereadable(neovim_node_host_bin_path) then if not vim.fn.filereadable(neovim_node_host_bin_path) then
table.insert(missing, "Neovim host binary: " .. neovim_node_host_bin_path) table.insert(missing, 'Neovim host binary: ' .. neovim_node_host_bin_path)
end end
if #missing > 0 then if #missing > 0 then
n("Missing required files:\n- " .. table.concat(missing, "\n- "), "error") n('Missing required files:\n- ' .. table.concat(missing, '\n- '), 'error')
return return
end end
-- Add to PATH if requested. Can be turned off by setting if it messes with -- Add to PATH if requested. Can be turned off by setting if it messes with
-- other tools. -- other tools.
if options.add_to_path then if options.add_to_path then
vim.env.PATH = current_nvm_node_bin_path .. ":" .. vim.env.PATH vim.env.PATH = current_nvm_node_bin_path .. ':' .. vim.env.PATH
end end
vim.g.node_host_prog = neovim_node_host_bin_path vim.g.node_host_prog = neovim_node_host_bin_path
vim.g.copilot_node_command = current_nvm_node_bin vim.g.copilot_node_command = current_nvm_node_bin
else else
n("Unable to determine the Node.js version from nvm.", "error") n('Unable to determine the Node.js version from nvm.', 'error')
end end
end end

View File

@@ -21,6 +21,7 @@ g.colors_variant_dark = 'tokyonight-storm' -- Set the dark variant
g.editorconfig = true -- Make sure editorconfig support is enabled g.editorconfig = true -- Make sure editorconfig support is enabled
g.loaded_perl_provider = 0 -- Disable perl provider g.loaded_perl_provider = 0 -- Disable perl provider
g.loaded_ruby_provider = 0 -- Disable ruby provider g.loaded_ruby_provider = 0 -- Disable ruby provider
g.loaded_java_provider = 0 -- Disable java provider
-- vim.options -- vim.options
o.breakindent = true -- Enable break indent o.breakindent = true -- Enable break indent

View File

@@ -12,7 +12,6 @@ return {
'saghen/blink.compat', 'saghen/blink.compat',
version = '*', version = '*',
-- lazy.nvim will automatically load the plugin when it's required by blink.cmp -- lazy.nvim will automatically load the plugin when it's required by blink.cmp
lazy = true,
opts = { opts = {
-- make sure to set opts so that lazy.nvim calls blink.compat's setup -- make sure to set opts so that lazy.nvim calls blink.compat's setup
impersonate_nvim_cmp = true, impersonate_nvim_cmp = true,
@@ -26,7 +25,7 @@ return {
-- Lua plugin to turn github copilot into a cmp source -- Lua plugin to turn github copilot into a cmp source
-- https://github.com/giuxtaposition/blink-cmp-copilot -- https://github.com/giuxtaposition/blink-cmp-copilot
{ {
"giuxtaposition/blink-cmp-copilot", 'giuxtaposition/blink-cmp-copilot',
dependencies = { dependencies = {
-- Fully featured & enhanced replacement for copilot.vim complete -- Fully featured & enhanced replacement for copilot.vim complete
-- with API for interacting with Github Copilot -- with API for interacting with Github Copilot
@@ -76,13 +75,13 @@ return {
menu = { menu = {
draw = { draw = {
columns = { columns = {
{ "label", "label_description", gap = 1 }, { 'label', 'label_description', gap = 1 },
{ "kind_icon", "kind", gap = 1 } { 'kind_icon', 'kind', gap = 1 },
}, },
}, },
}, },
documentation = { documentation = {
auto_show = true auto_show = true,
}, },
ghost_text = { ghost_text = {
enabled = false, enabled = false,
@@ -95,7 +94,7 @@ return {
providers = { providers = {
copilot = { copilot = {
name = 'copilot', name = 'copilot',
module = 'blink-cmp-copilot' module = 'blink-cmp-copilot',
}, },
}, },
completion = { completion = {
@@ -113,10 +112,10 @@ return {
-- completion = { accept = { auto_brackets = { enabled = true } } } -- completion = { accept = { auto_brackets = { enabled = true } } }
-- experimental signature help support -- experimental signature help support
signature = { enabled = true } signature = { enabled = true },
}, },
-- allows extending the enabled_providers array elsewhere in your config -- allows extending the enabled_providers array elsewhere in your config
-- without having to redefine it -- without having to redefine it
opts_extend = { "sources.completion.enabled_providers" }, opts_extend = { 'sources.completion.enabled_providers' },
}, },
} }

View File

@@ -2,7 +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
{ {
"folke/snacks.nvim", 'folke/snacks.nvim',
priority = 1000, priority = 1000,
lazy = false, lazy = false,
---@type snacks.Config ---@type snacks.Config
@@ -17,24 +17,24 @@ return {
quickfile = { enabled = true }, quickfile = { enabled = true },
statuscolumn = { statuscolumn = {
enabled = true, enabled = true,
left = { "mark", "sign" }, -- priority of signs on the left (high to low) left = { 'mark', 'sign' }, -- priority of signs on the left (high to low)
right = { "fold", "git" }, -- priority of signs on the right (high to low) right = { 'fold', 'git' }, -- priority of signs on the right (high to low)
folds = { folds = {
open = true, -- show open fold icons open = true, -- show open fold icons
git_hl = false, -- use Git Signs hl for fold icons git_hl = false, -- use Git Signs hl for fold icons
}, },
git = { git = {
-- patterns to match Git signs -- patterns to match Git signs
patterns = { "GitSign", "MiniDiffSign" }, patterns = { 'GitSign', 'MiniDiffSign' },
}, },
refresh = 50, -- refresh at most every 50ms refresh = 50, -- refresh at most every 50ms
}, },
words = { enabled = true }, words = { enabled = true },
styles = { styles = {
notification = { notification = {
wo = { wrap = true } -- Wrap notifications wo = { wrap = true }, -- Wrap notifications
} },
} },
}, },
}, },
-- A pretty diagnostics, references, telescope results, -- A pretty diagnostics, references, telescope results,

View File

@@ -1,57 +1,12 @@
return { -- ╭─────────────────────────────────────────────────────────╮
-- improve neovim lsp experience -- │ LSP Setup and configuration │
-- https://github.com/nvimdev/lspsaga.nvim -- ╰─────────────────────────────────────────────────────────╯
-- https://nvimdev.github.io/lspsaga/
{ -- LSP Servers are installed and configured by lsp-setup.nvim
'nvimdev/lspsaga.nvim', -- Mason formatters Conform uses to format files
event = 'LspAttach', -- These are automatically configured by zapling/mason-conform.nvim
dependencies = {
'nvim-treesitter/nvim-treesitter', local lsp_servers = {
'nvim-tree/nvim-web-devicons',
},
---@type LspsagaConfig
opts = {
code_action = {
show_server_name = true,
keys = {
quit = { 'q', '<ESC>' },
},
},
diagnostic = {
keys = {
quit = { 'q', '<ESC>' },
},
},
},
},
-- 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',
dependencies = {
{ 'neovim/nvim-lspconfig' },
{
'williamboman/mason.nvim',
cmd = 'Mason',
run = ':MasonUpdate'
},
{ 'williamboman/mason-lspconfig.nvim' },
{ 'folke/neodev.nvim' },
{ 'b0o/schemastore.nvim' },
{ 'saghen/blink.cmp' },
},
opts = {
default_mappings = false,
mappings = {
gd = 'lua require"telescope.builtin".lsp_definitions()',
gi = 'lua require"telescope.builtin".lsp_implementations()',
gr = 'lua require"telescope.builtin".lsp_references()',
},
inlay_hints = {
enabled = true,
},
servers = {
bashls = {}, bashls = {},
-- csharp_ls = {}, -- csharp_ls = {},
diagnosticls = {}, diagnosticls = {},
@@ -76,8 +31,19 @@ return {
lua_ls = { lua_ls = {
settings = { settings = {
Lua = { Lua = {
completion = {
callSnippet = 'Replace',
},
diagnostics = { diagnostics = {
globals = { 'vim' }, globals = {
'vim',
-- busted
'describe',
'it',
'before_each',
'after_each',
'assert',
},
disable = { disable = {
-- Ignore lua_ls noisy `missing-fields` warnings -- Ignore lua_ls noisy `missing-fields` warnings
'missing-fields', 'missing-fields',
@@ -137,39 +103,168 @@ return {
}, },
}, },
}, },
}
return {
-- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins
-- used for completion, annotations and signatures of Neovim apis
-- https://github.com/folke/lazydev.nvim
{
'folke/lazydev.nvim',
ft = 'lua',
opts = {
library = {
-- Load luvit types when the `vim.uv` word is found
{ path = 'luvit-meta/library', words = { 'vim%.uv' } },
}, },
}, },
},
-- Meta type definitions for the Lua platform Luvit.
-- https://github.com/Bilal2453/luvit-meta
{ 'Bilal2453/luvit-meta', lazy = true },
-- improve neovim lsp experience
-- https://github.com/nvimdev/lspsaga.nvim
-- https://nvimdev.github.io/lspsaga/
{
'nvimdev/lspsaga.nvim',
event = 'LspAttach',
dependencies = {
'nvim-treesitter/nvim-treesitter',
'nvim-tree/nvim-web-devicons',
},
---@type LspsagaConfig
opts = {
code_action = {
show_server_name = true,
keys = {
quit = { 'q', '<ESC>' },
},
},
diagnostic = {
keys = {
quit = { 'q', '<ESC>' },
},
},
},
},
-- 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',
dependencies = {
-- Quickstart configs for Nvim LSP
-- https://github.com/neovim/nvim-lspconfig
{ 'neovim/nvim-lspconfig' },
-- Portable package manager for Neovim that runs everywhere Neovim runs.
-- Easily install and manage LSP servers, DAP servers, linters, and formatters.
-- https://github.com/williamboman/mason.nvim
{
'williamboman/mason.nvim',
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 = {
'editorconfig-checker',
'goimports',
'gotests',
'phpcbf',
'pint',
'prettierd',
'shellcheck',
'shfmt',
'staticcheck',
'stylua',
'vint',
'yamlfmt',
},
},
},
-- 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' },
},
opts = {
default_mappings = false,
mappings = {
gd = 'lua require"telescope.builtin".lsp_definitions()',
gi = 'lua require"telescope.builtin".lsp_implementations()',
gr = 'lua require"telescope.builtin".lsp_references()',
},
inlay_hints = {
enabled = true,
},
servers = lsp_servers,
},
config = function(_, opts) config = function(_, opts)
require('neodev').setup() require('lazydev').setup()
require('lsp-setup').setup(opts) require('lsp-setup').setup(opts)
local lspconfig = require('lspconfig') local lspconfig = require 'lspconfig'
for server, config in pairs(opts.servers) do for server, config in pairs(opts.servers) do
-- passing config.capabilities to blink.cmp merges with the capabilities in your -- passing config.capabilities to blink.cmp merges with the capabilities in your
-- `opts[server].capabilities, if you've defined it -- `opts[server].capabilities, if you've defined it
config.capabilities = require('blink.cmp').get_lsp_capabilities(config.capabilities) config.capabilities =
require('blink.cmp').get_lsp_capabilities(config.capabilities)
lspconfig[server].setup(config) lspconfig[server].setup(config)
end end
lspconfig.lua_ls.on_init = function(client) lspconfig.lua_ls.on_init = function(client)
if client.workspace_folders then if client.workspace_folders then
local path = client.workspace_folders[1].name local path = client.workspace_folders[1].name
if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then if
vim.loop.fs_stat(path .. '/.luarc.json')
or vim.loop.fs_stat(path .. '/.luarc.jsonc')
then
return return
end end
end end
client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { client.config.settings.Lua =
vim.tbl_deep_extend('force', client.config.settings.Lua, {
runtime = { runtime = {
-- Tell the language server which version of Lua you're using -- Tell the language server which version of Lua you're using
-- (most likely LuaJIT in the case of Neovim) -- (most likely LuaJIT in the case of Neovim)
version = 'LuaJIT' version = 'LuaJIT',
}, },
-- Make the server aware of Neovim runtime files -- Make the server aware of Neovim runtime files
workspace = { workspace = {
checkThirdParty = false, checkThirdParty = false,
library = { library = {
vim.env.VIMRUNTIME vim.env.VIMRUNTIME,
} },
} },
}) })
end end
lspconfig.jsonls.settings = { lspconfig.jsonls.settings = {
@@ -191,4 +286,53 @@ return {
} }
end, end,
}, },
-- Lightweight yet powerful formatter plugin for Neovim
-- https://github.com/stevearc/conform.nvim
{
'stevearc/conform.nvim',
event = { 'BufWritePre' },
cmd = { 'ConformInfo' },
keys = {
{
'<leader>cf',
function()
require('conform').format { async = true, lsp_format = 'fallback' }
end,
mode = '',
desc = 'Format buffer',
},
},
opts = {
notify_on_error = false,
---@type nil|conform.FormatOpts|fun(bufnr: integer): nil|conform.FormatOpts
format_on_save = function(bufnr)
-- Disable "format_on_save lsp_fallback" for languages that don't
-- have a well standardized coding style. You can add additional
-- languages here or re-enable it for the disabled ones.
local disable_filetypes = { c = true, cpp = true }
local lsp_format_opt
if disable_filetypes[vim.bo[bufnr].filetype] then
lsp_format_opt = 'never'
else
lsp_format_opt = 'fallback'
end
return {
timeout_ms = 500,
lsp_format = lsp_format_opt,
}
end,
formatters_by_ft = {
lua = { 'stylua' },
-- 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 },
},
},
},
-- Automatically install formatters registered with conform.nvim via mason.nvim
-- https://github.com/zapling/mason-conform.nvim
{ 'zapling/mason-conform.nvim', opts = {} },
} }

View File

@@ -99,7 +99,12 @@ return {
{ 'echasnovski/mini.diff', version = '*', opts = {} }, { 'echasnovski/mini.diff', version = '*', opts = {} },
-- Git integration -- Git integration
{ 'echasnovski/mini-git', version = '*', opts = {}, main = 'mini.git' }, {
'echasnovski/mini-git',
version = '*',
opts = {},
main = 'mini.git',
},
-- Highlight patterns in text -- Highlight patterns in text
-- Replaced folke/todo-comments.nvim -- Replaced folke/todo-comments.nvim
@@ -192,7 +197,7 @@ return {
opts = { opts = {
autoread = true, autoread = true,
autowrite = true, autowrite = true,
} },
}, },
-- Split and join arguments, lists, and other sequences -- Split and join arguments, lists, and other sequences
@@ -205,8 +210,8 @@ return {
'echasnovski/mini.starter', 'echasnovski/mini.starter',
version = '*', version = '*',
config = function() config = function()
local starter = require('mini.starter') local starter = require 'mini.starter'
starter.setup({ starter.setup {
items = { items = {
starter.sections.telescope(), starter.sections.telescope(),
starter.sections.builtin_actions(), starter.sections.builtin_actions(),
@@ -217,8 +222,8 @@ return {
starter.gen_hook.indexing('all', { 'Builtin actions' }), starter.gen_hook.indexing('all', { 'Builtin actions' }),
starter.gen_hook.aligning('center', 'center'), starter.gen_hook.aligning('center', 'center'),
}, },
}) }
end end,
}, },
-- Minimal and fast statusline module with opinionated default look -- Minimal and fast statusline module with opinionated default look
@@ -231,13 +236,15 @@ return {
set_vim_settings = true, set_vim_settings = true,
content = { content = {
active = function() active = function()
local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 }) local mode, mode_hl =
local git = MiniStatusline.section_git({ trunc_width = 75 }) MiniStatusline.section_mode { trunc_width = 120 }
local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 }) local git = MiniStatusline.section_git { trunc_width = 75 }
local filename = MiniStatusline.section_filename({ trunc_width = 50 }) local diagnostics =
MiniStatusline.section_diagnostics { trunc_width = 75 }
local filename = MiniStatusline.section_filename { trunc_width = 50 }
-- local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 }) -- local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 })
local location = MiniStatusline.section_location({ trunc_width = 75 }) local location = MiniStatusline.section_location { trunc_width = 75 }
return MiniStatusline.combine_groups({ return MiniStatusline.combine_groups {
{ hl = mode_hl, strings = { mode } }, { hl = mode_hl, strings = { mode } },
{ hl = 'MiniStatuslineDevinfo', strings = { git, diagnostics } }, { hl = 'MiniStatuslineDevinfo', strings = { git, diagnostics } },
'%<', -- Mark general truncate point '%<', -- Mark general truncate point
@@ -245,14 +252,17 @@ return {
'%=', -- End left alignment '%=', -- End left alignment
-- { hl = 'MiniStatuslineFileinfo', strings = { fileinfo } }, -- { hl = 'MiniStatuslineFileinfo', strings = { fileinfo } },
{ hl = mode_hl, strings = { location } }, { hl = mode_hl, strings = { location } },
}) }
end, end,
}, },
} },
}, },
-- Fast and feature-rich surround actions -- Fast and feature-rich surround actions
-- Replaced kylechui/nvim-surround -- 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 [)] [']
{ 'echasnovski/mini.surround', version = '*', opts = {} }, { 'echasnovski/mini.surround', version = '*', opts = {} },
-- Work with trailing whitespace -- Work with trailing whitespace

View File

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

View File

@@ -0,0 +1,7 @@
return {
{
'nvim-lua/plenary.nvim',
version = '*',
lazy = false,
},
}

View File

@@ -49,15 +49,15 @@ return {
config = function(_, opts) config = function(_, opts)
require('nvim-treesitter.configs').setup(opts) require('nvim-treesitter.configs').setup(opts)
vim.api.nvim_create_autocmd({ "FileType" }, { vim.api.nvim_create_autocmd({ 'FileType' }, {
callback = function() callback = function()
-- Set foldmethod to treesitter if available -- Set foldmethod to treesitter if available
if require("nvim-treesitter.parsers").has_parser() then if require('nvim-treesitter.parsers').has_parser() then
vim.opt.foldmethod = "expr" vim.opt.foldmethod = 'expr'
vim.opt.foldexpr = "nvim_treesitter#foldexpr()" vim.opt.foldexpr = 'nvim_treesitter#foldexpr()'
else else
-- Otherwise, set foldmethod to syntax -- Otherwise, set foldmethod to syntax
vim.opt.foldmethod = "syntax" vim.opt.foldmethod = 'syntax'
end end
vim.opt.foldlevel = 9 -- Open all folds by default vim.opt.foldlevel = 9 -- Open all folds by default

View File

@@ -91,7 +91,7 @@ return {
{ {
'LudoPinelli/comment-box.nvim', 'LudoPinelli/comment-box.nvim',
event = 'BufEnter', event = 'BufEnter',
opts = {} opts = {},
}, },
-- Plugin to improve viewing Markdown files in Neovim -- Plugin to improve viewing Markdown files in Neovim

View File

@@ -16,11 +16,11 @@ K = {}
---@param desc string|table? Optional description. Can be a string or a table. ---@param desc string|table? Optional description. Can be a string or a table.
---@return table -- The description as a table. ---@return table -- The description as a table.
local function handleDesc(desc) local function handleDesc(desc)
if type(desc) == "string" then if type(desc) == 'string' then
-- Convert string to table with `desc` as a key -- Convert string to table with `desc` as a key
-- If the string is empty, just return as an empty description -- If the string is empty, just return as an empty description
return { desc = desc } return { desc = desc }
elseif type(desc) == "table" then elseif type(desc) == 'table' then
-- If desc doesn't have 'desc' key, combine it with -- If desc doesn't have 'desc' key, combine it with
-- others with empty description -- others with empty description
if not desc.desc then if not desc.desc then
@@ -79,6 +79,4 @@ end
-- ╰─────────────────────────────────────────────────────────╯ -- ╰─────────────────────────────────────────────────────────╯
-- Toggle background between light and dark -- Toggle background between light and dark
function ToggleBackground() function ToggleBackground() vim.o.bg = vim.o.bg == 'light' and 'dark' or 'light' end
vim.o.bg = vim.o.bg == "light" and "dark" or "light"
end

View File

@@ -29,7 +29,9 @@ if ! declare -f msg_err > /dev/null; then
# $1 - error message (string) # $1 - error message (string)
msg_err() msg_err()
{ {
# shellcheck disable=SC2317
echo "(!) ERROR: $1" >&2 echo "(!) ERROR: $1" >&2
# shellcheck disable=SC2317
exit 1 exit 1
} }
fi fi
@@ -39,7 +41,9 @@ if ! declare -f msg_done > /dev/null; then
# $1 - message (string) # $1 - message (string)
msg_done() msg_done()
{ {
# shellcheck disable=SC2317
echo "✓ $1" echo "✓ $1"
# shellcheck disable=SC2317
return 0 return 0
} }
fi fi
@@ -54,15 +58,15 @@ if ! declare -f array_diff > /dev/null; then
# Source: https://stackoverflow.com/a/42399479/594940 # Source: https://stackoverflow.com/a/42399479/594940
array_diff() array_diff()
{ {
# shellcheck disable=SC1083,SC2086
eval local ARR1=\(\"\${$2[@]}\"\) eval local ARR1=\(\"\${$2[@]}\"\)
# shellcheck disable=SC1083,SC2086
eval local ARR2=\(\"\${$3[@]}\"\) eval local ARR2=\(\"\${$3[@]}\"\)
local IFS=$'\n' local IFS=$'\n'
mapfile -t "$1" < <(comm -23 <(echo "${ARR1[*]}" | sort) <(echo "${ARR2[*]}" | sort)) mapfile -t "$1" < <(comm -23 <(echo "${ARR1[*]}" | sort) <(echo "${ARR2[*]}" | sort))
} }
fi fi
VERSION_NVM="v0.39.5"
# Loads configs for better installation experience # Loads configs for better installation experience
source "$DOTFILES/config/shared.sh" source "$DOTFILES/config/shared.sh"
@@ -148,13 +152,13 @@ section_install()
$0 install macos $0 install macos
$0 install fonts $0 install fonts
$0 brew install $0 brew install
$0 install ohmyposh #$0 install ohmyposh
$0 install asdf $0 install asdf
$0 install composer $0 install composer
$0 install fzf $0 install fzf
$0 install go #$0 install go
$0 install cheat-databases $0 install cheat-databases
$0 install imagick #$0 install imagick
$0 install nvm $0 install nvm
$0 install npm $0 install npm
# $0 install ntfy # $0 install ntfy
@@ -328,7 +332,8 @@ section_brew()
declare -a BREW_LIST_TRACKED_WITHOUT_DEPS declare -a BREW_LIST_TRACKED_WITHOUT_DEPS
for f in "${BREW_LIST_ALL[@]}"; do for f in "${BREW_LIST_ALL[@]}"; do
if [[ ! " ${BREW_LIST_DEPENDENCIES[@]} " =~ " ${f} " ]]; then # shellcheck disable=SC2199
if [[ " ${BREW_LIST_DEPENDENCIES[@]} " != *" ${f} "* ]]; then
BREW_LIST_TRACKED_WITHOUT_DEPS+=("$f") BREW_LIST_TRACKED_WITHOUT_DEPS+=("$f")
fi fi
done done
@@ -416,6 +421,7 @@ section_helpers()
"env:Show environment variables" "env:Show environment variables"
"functions:Show functions" "functions:Show functions"
"nvim:Show nvim keybindings" "nvim:Show nvim keybindings"
# shellcheck disable=SC2016
'path:Show $PATH dir by dir' 'path:Show $PATH dir by dir'
"tmux:Show tmux keybindings" "tmux:Show tmux keybindings"
"wezterm:Show wezterm keybindings" "wezterm:Show wezterm keybindings"
@@ -445,7 +451,29 @@ section_helpers()
esac esac
;; ;;
"colors") "colors")
for i in {0..255}; do echo -en "\e[38;5;${i}m${i} "; done max=255
start=0
while [ "$start" -le "$max" ]; do
for i in $(seq "$start" $((start + 9))); do
if [ "$i" -le "$max" ]; then
# Outputs colored number
# printf " \e[38;5;%sm%4s\e[0m" "$i" "$i"
# Outputs colored block with number inside
# printf " \e[48;5;%sm\e[38;5;15m%5s \e[0m" "$i" "$i"
# Outputs colored block and color number
# printf " \e[48;5;%sm \e[0m %3d" "$i" "$i"
# Outputs color number and colored block
printf "%3d \e[48;5;%sm \e[0m " "$i" "$i"
fi
done
printf "\n"
start=$((start + 10))
done
;; ;;
"env") "env")
env | sort env | sort

View File

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