From 7c500df9f313fd4677c2968f41821b37c8df0a3b Mon Sep 17 00:00:00 2001 From: ignuki Date: Mon, 31 Mar 2025 20:18:34 +0200 Subject: [PATCH] more refinement --- .gitignore | 1 + README.md | 36 ++++ git/._.gitconfig | Bin 0 -> 163 bytes git/.gitconfig | 18 ++ nvim/.config/nvim/lsp/._terraform.lua | Bin 0 -> 163 bytes nvim/.config/nvim/lsp/terraform.lua | 6 + nvim/.config/nvim/lua/ink/init.lua | 2 +- nvim/.config/nvim/lua/ink/lsp.lua | 179 ++++++++++-------- .../.config/nvim/lua/plugins/._completion.lua | Bin 0 -> 163 bytes nvim/.config/nvim/lua/plugins/completion.lua | 105 ++++++++++ nvim/.config/nvim/lua/plugins/snippets.lua | 22 --- nvim/.config/nvim/lua/plugins/telescope.lua | 15 +- scripts/hcf/._package_repo_changes | Bin 0 -> 163 bytes scripts/hcf/package_repo_changes | 61 ++++++ tmux/.is_vim.sh | 18 +- tmux/.tmux.conf | 9 + zsh/.zshenv | 1 + 17 files changed, 363 insertions(+), 110 deletions(-) create mode 100644 git/._.gitconfig create mode 100644 git/.gitconfig create mode 100644 nvim/.config/nvim/lsp/._terraform.lua create mode 100644 nvim/.config/nvim/lsp/terraform.lua create mode 100644 nvim/.config/nvim/lua/plugins/._completion.lua create mode 100644 nvim/.config/nvim/lua/plugins/completion.lua delete mode 100644 nvim/.config/nvim/lua/plugins/snippets.lua create mode 100755 scripts/hcf/._package_repo_changes create mode 100755 scripts/hcf/package_repo_changes diff --git a/.gitignore b/.gitignore index e033bc6..8bb53c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ lazy-lock.json +.gitconfig.local diff --git a/README.md b/README.md index dd64415..26b913f 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,42 @@ - shellcheck - bash-language-server - terraform +- terraform-ls - tflint - ruff - cbonsai + +# Git Configuration + +This directory contains Git configuration files that can be safely shared in a +public repository. + +## Setup Instructions + +1. Create a symbolic link for the main Git config: + + ``` + ln -sf ~/dotfiles/git/.gitconfig ~/.gitconfig + ``` + +2. Create your personal Git configuration: + + ``` + cp ~/dotfiles/git/.gitconfig.local.example ~/.gitconfig.local + ``` + +3. Edit `~/.gitconfig.local` with your personal information: + ``` + [user] + name = Your Name + email = your.email@example.com + ``` + +## Structure + +- `.gitconfig`: Main configuration file with shareable settings +- `.gitconfig.local.example`: Template for personal/private Git settings +- `~/.gitconfig.local`: (Not tracked) Your personal Git configuration + +This approach keeps your personal information out of the public repository while +still allowing you to manage and version your Git configuration. diff --git a/git/._.gitconfig b/git/._.gitconfig new file mode 100644 index 0000000000000000000000000000000000000000..f390f6464c3af6ee928c2ef1d093f222f84a4ec5 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S nBE&_L^KP0 literal 0 HcmV?d00001 diff --git a/git/.gitconfig b/git/.gitconfig new file mode 100644 index 0000000..04a06d9 --- /dev/null +++ b/git/.gitconfig @@ -0,0 +1,18 @@ +[include] + path = ~/.gitconfig.local + +[alias] + st = status + logg = log --graph --decorate --oneline --all + cm = commit + df = diff + dfs = diff --staged + +[core] + editor = nvim + +[pull] + rebase = true + +[init] + templateDir = ~/.git-template diff --git a/nvim/.config/nvim/lsp/._terraform.lua b/nvim/.config/nvim/lsp/._terraform.lua new file mode 100644 index 0000000000000000000000000000000000000000..f390f6464c3af6ee928c2ef1d093f222f84a4ec5 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S nBE&_L^KP0 literal 0 HcmV?d00001 diff --git a/nvim/.config/nvim/lsp/terraform.lua b/nvim/.config/nvim/lsp/terraform.lua new file mode 100644 index 0000000..21ccf7d --- /dev/null +++ b/nvim/.config/nvim/lsp/terraform.lua @@ -0,0 +1,6 @@ +return { + cmd = { "terraform-ls", "serve" }, + root_markers = { ".terraform.lock", "backend.tf" }, + filetypes = { "terraform", "tf" }, + settings = {}, +} diff --git a/nvim/.config/nvim/lua/ink/init.lua b/nvim/.config/nvim/lua/ink/init.lua index e478638..ce33634 100644 --- a/nvim/.config/nvim/lua/ink/init.lua +++ b/nvim/.config/nvim/lua/ink/init.lua @@ -18,7 +18,7 @@ vim.opt.backup = false -- creates a backup file -- if a file is being edited by another program (or was written to file while editing with another program), it is not -- allowed to be edited vim.opt.writebackup = false -vim.opt.completeopt = "menuone,noselect" -- Set completeopt to have a better completion experience +vim.o.completeopt = "menuone,noinsert,popup,fuzzy" vim.opt.termguicolors = true -- set termguicolors to enable highlight groups vim.opt.whichwrap = "bs<>[]hl" -- which "horizontal" keys are allowed to travel to prev/next line vim.opt.wrap = false -- display lines as one long line diff --git a/nvim/.config/nvim/lua/ink/lsp.lua b/nvim/.config/nvim/lua/ink/lsp.lua index 52a5bb3..e0a91bc 100644 --- a/nvim/.config/nvim/lua/ink/lsp.lua +++ b/nvim/.config/nvim/lua/ink/lsp.lua @@ -4,6 +4,7 @@ vim.lsp.enable("luals") vim.lsp.enable("rust") vim.lsp.enable("bashls") +vim.lsp.enable("terraform") vim.lsp.config("*", { capabilities = { @@ -30,88 +31,116 @@ vim.api.nvim_create_autocmd("LspAttach", { }) -- ]] ----[[AUTOCOMPLETION SETUP -vim.o.completeopt = "menuone,noinsert,popup,fuzzy" +-- [[INLAY HINTS vim.api.nvim_create_autocmd("LspAttach", { callback = function(args) local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) - client.server_capabilities.completionProvider.triggerCharacters = vim.split("qwertyuiopasdfghjklzxcvbnm. ", "") - vim.api.nvim_create_autocmd({ "TextChangedI" }, { - buffer = args.buf, - callback = function() - vim.lsp.completion.get() - end, - }) - -- if client:supports_method("textDocument/implementation") then - -- Create a keymap for vim.lsp.buf.implementation ... - -- end if client.server_capabilities.inlayHintProvider then vim.lsp.inlay_hint.enable(true, { bufnr = vim.fn.bufnr() }) end - vim.lsp.completion.enable(true, client.id, args.buf, { autotrigger = true }) - --- - ---[[Code required to add documentation popup for an item - local _, cancel_prev = nil, function() end - vim.api.nvim_create_autocmd("CompleteChanged", { - buffer = args.buf, - callback = function() - if client:supports_method("textDocument/implementation") then - cancel_prev() - local info = vim.fn.complete_info({ "selected" }) - local completionItem = - vim.tbl_get(vim.v.completed_item, "user_data", "nvim", "lsp", "completion_item") - if nil == completionItem then - return - end - _, cancel_prev = vim.lsp.buf_request( - args.buf, - vim.lsp.protocol.Methods.completionItem_resolve, - completionItem, - function(err, item, ctx) - if not item then - return - end - local docs = (item.documentation or {}).value - local win = vim.api.nvim__complete_set(info["selected"], { info = docs }) - if win.winid and vim.api.nvim_win_is_valid(win.winid) then - vim.treesitter.start(win.bufnr, "markdown") - vim.wo[win.winid].conceallevel = 3 - end - end - ) - end - end, - }) - ---]] end, }) +-- ]] --- Expanding multiline snippets -vim.api.nvim_create_augroup("user-snippet-expand", {}) -vim.api.nvim_create_autocmd("CompleteDone", { - group = "user-snippet-expand", - desc = "Expand LSP snippet", - pattern = "*", - callback = function(opts) - local comp = vim.v.completed_item - local item = vim.tbl_get(comp, "user_data", "nvim", "lsp", "completion_item") +-- +-- vim.api.nvim_create_autocmd("LspAttach", { +-- callback = function(args) +-- local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) +-- client.server_capabilities.completionProvider.triggerCharacters = vim.split("qwertyuiopasdfghjklzxcvbnm. ", "") +-- vim.api.nvim_create_autocmd({ "TextChangedI" }, { +-- buffer = args.buf, +-- callback = function() +-- vim.lsp.completion.get() +-- end, +-- }) +-- -- if client:supports_method("textDocument/implementation") then +-- -- Create a keymap for vim.lsp.buf.implementation ... +-- -- end +-- if client.server_capabilities.inlayHintProvider then +-- vim.lsp.inlay_hint.enable(true, { bufnr = vim.fn.bufnr() }) +-- end - -- check that we were given a snippet - if not item or not item.insertTextFormat or item.insertTextFormat == 1 then - return - end - - -- remove the inserted text - local cursor = vim.api.nvim_win_get_cursor(0) - local line = vim.api.nvim_get_current_line() - local lnum = cursor[1] - 1 - local start_char = cursor[2] - #comp.word - vim.api.nvim_buf_set_text(opts.buf, lnum, start_char, lnum, #line, { "" }) - - -- insert snippet - local snip_text = vim.tbl_get(item, "textEdit", "newText") or item.insertText - assert(snip_text, "Language server indicated it had a snippet, but no snippet text could be found!") - require("luasnip").lsp_expand(snip_text) - end, -}) ----AUTOCOMPLETION SETUP END]] +---[[AUTOCOMPLETION SETUP +-- vim.api.nvim_create_autocmd("LspAttach", { +-- callback = function(args) +-- local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) +-- client.server_capabilities.completionProvider.triggerCharacters = vim.split("qwertyuiopasdfghjklzxcvbnm. ", "") +-- vim.api.nvim_create_autocmd({ "TextChangedI" }, { +-- buffer = args.buf, +-- callback = function() +-- vim.lsp.completion.get() +-- end, +-- }) +-- -- if client:supports_method("textDocument/implementation") then +-- -- Create a keymap for vim.lsp.buf.implementation ... +-- -- end +-- if client.server_capabilities.inlayHintProvider then +-- vim.lsp.inlay_hint.enable(true, { bufnr = vim.fn.bufnr() }) +-- end +-- vim.lsp.completion.enable(true, client.id, args.buf, { autotrigger = true }) +-- --- +-- ---[[Code required to add documentation popup for an item +-- local _, cancel_prev = nil, function() end +-- vim.api.nvim_create_autocmd("CompleteChanged", { +-- buffer = args.buf, +-- callback = function() +-- if client:supports_method("textDocument/implementation") then +-- cancel_prev() +-- local info = vim.fn.complete_info({ "selected" }) +-- local completionItem = +-- vim.tbl_get(vim.v.completed_item, "user_data", "nvim", "lsp", "completion_item") +-- if nil == completionItem then +-- return +-- end +-- _, cancel_prev = vim.lsp.buf_request( +-- args.buf, +-- vim.lsp.protocol.Methods.completionItem_resolve, +-- completionItem, +-- function(err, item, ctx) +-- if not item then +-- return +-- end +-- local docs = (item.documentation or {}).value +-- local win = vim.api.nvim__complete_set(info["selected"], { info = docs }) +-- if win.winid and vim.api.nvim_win_is_valid(win.winid) then +-- vim.treesitter.start(win.bufnr, "markdown") +-- vim.wo[win.winid].conceallevel = 3 +-- end +-- end +-- ) +-- end +-- end, +-- }) +-- ---]] +-- end, +-- }) +-- +-- -- Expanding multiline snippets +-- vim.api.nvim_create_augroup("user-snippet-expand", {}) +-- vim.api.nvim_create_autocmd("CompleteDone", { +-- group = "user-snippet-expand", +-- desc = "Expand LSP snippet", +-- pattern = "*", +-- callback = function(opts) +-- local comp = vim.v.completed_item +-- local item = vim.tbl_get(comp, "user_data", "nvim", "lsp", "completion_item") +-- +-- -- check that we were given a snippet +-- if not item or not item.insertTextFormat or item.insertTextFormat == 1 then +-- return +-- end +-- +-- -- remove the inserted text +-- local cursor = vim.api.nvim_win_get_cursor(0) +-- local line = vim.api.nvim_get_current_line() +-- local lnum = cursor[1] - 1 +-- local start_char = cursor[2] - #comp.word +-- vim.api.nvim_buf_set_text(opts.buf, lnum, start_char, lnum, #line, { "" }) +-- +-- -- insert snippet +-- local snip_text = vim.tbl_get(item, "textEdit", "newText") or item.insertText +-- assert(snip_text, "Language server indicated it had a snippet, but no snippet text could be found!") +-- require("luasnip").lsp_expand(snip_text) +-- end, +-- }) +-- ---AUTOCOMPLETION SETUP END]] diff --git a/nvim/.config/nvim/lua/plugins/._completion.lua b/nvim/.config/nvim/lua/plugins/._completion.lua new file mode 100644 index 0000000000000000000000000000000000000000..f390f6464c3af6ee928c2ef1d093f222f84a4ec5 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S nBE&_L^KP0 literal 0 HcmV?d00001 diff --git a/nvim/.config/nvim/lua/plugins/completion.lua b/nvim/.config/nvim/lua/plugins/completion.lua new file mode 100644 index 0000000..961cdaa --- /dev/null +++ b/nvim/.config/nvim/lua/plugins/completion.lua @@ -0,0 +1,105 @@ +return { + { + "L3MON4D3/LuaSnip", + version = "v2.*", + dependencies = { + "rafamadriz/friendly-snippets", + }, + -- install jsregexp (optional!). + build = "make install_jsregexp", + config = function() + local ls = require("luasnip") + local s = ls.snippet + local t = ls.text_node + local i = ls.insert_node + + ls.add_snippets("lua", { + s("hello", { + t('print("hello world!")'), + }), + }) + end, + }, + { + "saghen/blink.cmp", + -- use a release tag to download pre-built binaries + version = "1.*", + dependencies = { + "moyiz/blink-emoji.nvim", + }, + ---@module 'blink.cmp' + ---@type blink.cmp.Config + opts = { + -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept) + -- 'super-tab' for mappings similar to vscode (tab to accept) + -- 'enter' for enter to accept + -- 'none' for no mappings + -- + -- All presets have the following mappings: + -- C-space: Open menu or open docs if already open + -- C-n/C-p or Up/Down: Select next/previous item + -- C-e: Hide menu + -- C-k: Toggle signature help (if signature.enabled = true) + -- + -- See :h blink-cmp-config-keymap for defining your own keymap + keymap = { preset = "default" }, + + appearance = { + nerd_font_variant = "mono", + }, + + -- (Default) Only show the documentation popup when manually triggered + completion = { documentation = { auto_show = true } }, + cmdline = { + keymap = { + -- recommended, as the default keymap will only show and select the next item + [""] = { "show", "accept" }, + }, + completion = { + menu = { auto_show = true }, + ghost_text = { enabled = true }, + }, + }, + + snippets = { preset = "luasnip" }, + -- Default list of enabled providers defined so that you can extend it + -- elsewhere in your config, without redefining it, due to `opts_extend` + sources = { + default = { "lsp", "path", "snippets", "buffer", "emoji" }, + providers = { + cmdline = { + min_keyword_length = function(ctx) + -- when typing a command, only show when the keyword is 3 characters or longer + if ctx.mode == "cmdline" and string.find(ctx.line, " ") == nil then + return 3 + end + return 0 + end, + }, + emoji = { + module = "blink-emoji", + name = "Emoji", + score_offset = 15, -- Tune by preference + opts = { insert = true }, -- Insert emoji (default) or complete its name + should_show_items = function() + return vim.tbl_contains( + -- Enable emoji completion only for git commits and markdown. + -- By default, enabled for all file-types. + { "gitcommit", "markdown" }, + vim.o.filetype + ) + end, + }, + }, + }, + + -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance + -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation, + -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"` + -- + -- See the fuzzy documentation for more information + fuzzy = { implementation = "prefer_rust_with_warning" }, + }, + opts_extend = { "sources.default" }, + }, +} diff --git a/nvim/.config/nvim/lua/plugins/snippets.lua b/nvim/.config/nvim/lua/plugins/snippets.lua deleted file mode 100644 index 4244939..0000000 --- a/nvim/.config/nvim/lua/plugins/snippets.lua +++ /dev/null @@ -1,22 +0,0 @@ -return { - { - "L3MON4D3/LuaSnip", - dependencies = { - "rafamadriz/friendly-snippets", - }, - -- install jsregexp (optional!). - build = "make install_jsregexp", - config = function() - local ls = require("luasnip") - local s = ls.snippet - local t = ls.text_node - local i = ls.insert_node - - ls.add_snippets("lua", { - s("hello", { - t('print("hello world!")'), - }), - }) - end, - }, -} diff --git a/nvim/.config/nvim/lua/plugins/telescope.lua b/nvim/.config/nvim/lua/plugins/telescope.lua index 8b66ebf..219ff98 100644 --- a/nvim/.config/nvim/lua/plugins/telescope.lua +++ b/nvim/.config/nvim/lua/plugins/telescope.lua @@ -43,11 +43,22 @@ return { "node_modules", "target", ".terraform", - ".git", ".venv", - "Cargo.toml", + ".git", + -- Ignore git submodules + "^./.git/", + "^./*/.git/", + ".gitmodules", + ".gitignore", + ".*/%.git/.*", -- Ignore any .git directories in subdirectories }, hidden = true, + -- Ignore git submodules + follow = true, + }, + git_files = { + recurse_submodules = false, + show_untracked = true, }, buffers = { initial_mode = "normal", diff --git a/scripts/hcf/._package_repo_changes b/scripts/hcf/._package_repo_changes new file mode 100755 index 0000000000000000000000000000000000000000..f390f6464c3af6ee928c2ef1d093f222f84a4ec5 GIT binary patch literal 163 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}aUl?c_=|y<2;dkJ5(HHS(lG;wxzV&S nBE&_L^KP0 literal 0 HcmV?d00001 diff --git a/scripts/hcf/package_repo_changes b/scripts/hcf/package_repo_changes new file mode 100755 index 0000000..0e3984d --- /dev/null +++ b/scripts/hcf/package_repo_changes @@ -0,0 +1,61 @@ +#!/bin/bash + +# Script to package all git changes and untracked files into a single archive +# +# ./package_repo_changes [ARCHIVE_NAME] + +set -euo pipefail + +cleanup() { + local exit_code=$? + echo "Cleaning up temporary files..." + [[ -d "${TEMP_DIR:-}" ]] && rm -rf "$TEMP_DIR" + exit $exit_code +} + +trap cleanup EXIT + +# Get the repository root directory +REPO_DIR=$(git rev-parse --show-toplevel) +cd "$REPO_DIR" + +TEMP_DIR=$(mktemp -d) +echo "Creating temporary directory: $TEMP_DIR" + +# Check if there are any changes to package +if git diff --quiet && [[ -z "$(git ls-files --others --exclude-standard)" ]]; then + echo "No changes detected in the repository. Nothing to package." + exit 0 +fi + +echo "Generating patch file for tracked changes..." +git diff >"$TEMP_DIR/changes.patch" + +# Include staged changes as well +if ! git diff --staged --quiet; then + echo "Including staged changes..." + git diff --staged >>"$TEMP_DIR/changes.patch" +fi + +echo "Packaging untracked files..." +git ls-files --others --exclude-standard >"$TEMP_DIR/untracked_files.txt" + +if [[ -s "$TEMP_DIR/untracked_files.txt" ]]; then + tar -czf "$TEMP_DIR/untracked.tar.gz" -T "$TEMP_DIR/untracked_files.txt" + echo "Untracked files packaged successfully." +else + echo "No untracked files found." + touch "$TEMP_DIR/untracked.tar.gz" +fi + +# Allow custom archive name with default fallback +ARCHIVE_NAME=${1:-"changes_$(date +%Y%m%d_%H%M%S).tar.gz"} +echo "Creating final archive: $ARCHIVE_NAME" +tar -czf "$ARCHIVE_NAME" -C "$TEMP_DIR" changes.patch untracked.tar.gz + +echo "Archive created successfully at: $REPO_DIR/$ARCHIVE_NAME" +echo "" +echo "To apply these changes elsewhere:" +echo "1. Extract the archive: tar -xzf $ARCHIVE_NAME" +echo "2. Apply the patch: git apply changes.patch" +echo "3. Extract untracked files: tar -xzf untracked.tar.gz" diff --git a/tmux/.is_vim.sh b/tmux/.is_vim.sh index 04903de..da587ee 100755 --- a/tmux/.is_vim.sh +++ b/tmux/.is_vim.sh @@ -4,20 +4,18 @@ tty=$1 # Construct process tree. -children=(); -pids=( $(ps -o pid= -t $tty) ) +children=() +pids=($(ps -o pid= -t $tty)) -while read -r pid ppid -do - [[ -n pid && pid -ne ppid ]] && children[ppid]+=" $pid" -done <<< "$(ps -Ao pid=,ppid=)" +while read -r pid ppid; do + [[ -n $pid && $pid -ne $ppid ]] && children[ppid]+=" $pid" +done <<<"$(ps -Ao pid=,ppid=)" # Get all descendant pids of processes in $tty with BFS idx=0 -while (( ${#pids[@]} > idx )) -do - pid=${pids[idx++]} - pids+=( ${children[pid]-} ) +while ((${#pids[@]} > idx)); do + pid=${pids[idx++]} + pids+=(${children[pid]-}) done # Check whether any child pids are vim diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf index 9904868..3d7e987 100644 --- a/tmux/.tmux.conf +++ b/tmux/.tmux.conf @@ -31,6 +31,15 @@ bind-key -n C-S-Right swap-window -t +1\; select-window -t +1 setw -g mode-keys vi +set -g set-clipboard on +set -g focus-events on + +# Increase scrollback buffer size +set -g history-limit 50000 + +# Improve terminal scrolling +set -ga terminal-overrides ',*:smcup@:rmcup@' + set-option -g default-shell $SHELL set -g default-command "$SHELL -i" diff --git a/zsh/.zshenv b/zsh/.zshenv index 871c670..46f5b78 100644 --- a/zsh/.zshenv +++ b/zsh/.zshenv @@ -18,6 +18,7 @@ export MANPAGER='nvim +Man!' export SSH_ENV="$HOME/.ssh/agent-environment" export PATH=~/.local/bin:$PATH +export PATH=$DOTFILES/scripts/hcf/:$PATH case "$(uname -s)" in Linux*) {