diff --git a/bin/cp-files b/bin/cp-files new file mode 100755 index 0000000..9be0ff2 --- /dev/null +++ b/bin/cp-files @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 + +import os +import sys +import argparse +from pathlib import Path +import pyperclip +import questionary + +# List of directories to exclude +EXCLUDED_DIRS = {'node_modules', '.next', '.venv', '.git', '__pycache__', '.idea', '.vscode', 'ui'} + +def collect_files(project_path): + """ + Collects files from the project directory, excluding specified directories and filtering by extensions. + Returns a list of file paths relative to the project directory. + """ + collected_files = [] + + for root, dirs, files in os.walk(project_path): + # Exclude specified directories + dirs[:] = [d for d in dirs if d not in EXCLUDED_DIRS] + + for file in files: + file_path = Path(root) / file + relative_path = file_path.relative_to(project_path) + collected_files.append(relative_path) + + return collected_files + +def main(): + # Parse command-line arguments + parser = argparse.ArgumentParser(description='Generate Markdown from selected files.') + parser.add_argument('path', nargs='?', default='.', help='Path to the project directory') + args = parser.parse_args() + + project_path = Path(args.path).resolve() + if not project_path.is_dir(): + print(f"Error: '{project_path}' is not a directory.") + sys.exit(1) + + # Collect files from the project directory + file_list = collect_files(project_path) + + if not file_list: + print("No files found in the project directory with the specified extensions.") + sys.exit(1) + + # Sort file_list for better organization + file_list.sort() + + # Interactive file selection using questionary + print("\nSelect the files you want to include:") + selected_files = questionary.checkbox( + "Press space to select files, and Enter when you're done:", + choices=[str(f) for f in file_list] + ).ask() + + if not selected_files: + print("No files selected.") + sys.exit(1) + + # Generate markdown + markdown_lines = [] + markdown_lines.append('') + + for selected_file in selected_files: + file_path = project_path / selected_file + try: + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + # Determine the language for code block from file extension + language = file_path.suffix.lstrip('.') + markdown_lines.append(f'{selected_file}') + markdown_lines.append(f'```{language}') + markdown_lines.append(content) + markdown_lines.append('```') + markdown_lines.append('') + except Exception as e: + print(f"Error reading file {selected_file}: {e}") + + markdown_text = '\n'.join(markdown_lines) + + # Copy markdown content to clipboard + pyperclip.copy(markdown_text) + print("Markdown content has been copied to the clipboard.") + +if __name__ == "__main__": + # Check if required libraries are installed + try: + import questionary + import pyperclip + except ImportError as e: + missing_module = e.name + print(f"Error: Missing required module '{missing_module}'.") + print(f"Please install it by running: pip install {missing_module}") + sys.exit(1) + + main() diff --git a/bin/type-tui b/bin/type-tui new file mode 100755 index 0000000..d0eb164 Binary files /dev/null and b/bin/type-tui differ diff --git a/config/bash/shell b/config/bash/shell index 1a2bc66..928eb6e 100644 --- a/config/bash/shell +++ b/config/bash/shell @@ -10,17 +10,26 @@ export SSH_ASKPASS_REQUIRE=prefer export CARGO_PATH="$HOME/.cargo" export BUN_INSTALL="$HOME/.bun" export PYENV_ROOT="$HOME/.pyenv" +export PNPM_HOME="$HOME/.local/share/pnpm" export NVM_DIR="$HOME/.nvm" export ANDROID_SDK_HOME="$HOME/.local/share/Android" export GOPATH="$HOME/.local/share/go" export DOTNETPATH="$HOME/.dotnet/tools" # Set complete path -export PATH="$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PANAMA_PATH/bin:$BUN_INSTALL/bin:$CARGO_PATH/bin:$PYENV_ROOT/bin:$HOME/.rbenv/bin:/usr/lib/ccache/bin/:$GOPATH/bin:$DOTNETPATH" +export PATH="$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PANAMA_PATH/bin:$BUN_INSTALL/bin:$CARGO_PATH/bin:$PNPM_HOME/bin:$PYENV_ROOT/bin:$HOME/.rbenv/bin:/usr/lib/ccache/bin/:$GOPATH/bin:$DOTNETPATH" # Nvm source /etc/profile.d/nvm.sh +# Auto-switch Node version when entering a directory with .nvmrc +_nvm_auto_use() { + if [[ -f .nvmrc ]]; then + nvm use --silent + fi +} +export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND; }_nvm_auto_use" + # Zoxide eval "$(zoxide init bash)" diff --git a/config/dot/nvim/lua/config/keymaps.lua b/config/dot/nvim/lua/config/keymaps.lua index b498ca9..cb6d9bb 100644 --- a/config/dot/nvim/lua/config/keymaps.lua +++ b/config/dot/nvim/lua/config/keymaps.lua @@ -14,25 +14,79 @@ pcall(vim.keymap.del, "t", "") pcall(vim.keymap.del, "n", "l") -- Window navigation -vim.keymap.set({ "n", "v", "x" }, "h", "h", { desc = "Go to left window", silent = true }) -vim.keymap.set({ "n", "v", "x" }, "j", "j", { desc = "Go to lower window", silent = true }) -vim.keymap.set({ "n", "v", "x" }, "k", "k", { desc = "Go to upper window", silent = true }) -vim.keymap.set({ "n", "v", "x" }, "l", "l", { desc = "Go to right window", silent = true }) +vim.keymap.set( + { "n", "v", "x" }, + "h", + "h", + { desc = "Go to left window", silent = true } +) +vim.keymap.set( + { "n", "v", "x" }, + "j", + "j", + { desc = "Go to lower window", silent = true } +) +vim.keymap.set( + { "n", "v", "x" }, + "k", + "k", + { desc = "Go to upper window", silent = true } +) +vim.keymap.set( + { "n", "v", "x" }, + "l", + "l", + { desc = "Go to right window", silent = true } +) -- Buffer tab navigation -vim.keymap.set("n", "", "BufferLineCyclePrev", { desc = "Previous buffer", silent = true }) -vim.keymap.set("n", "", "BufferLineCycleNext", { desc = "Next buffer", silent = true }) -vim.keymap.set("n", "", "BufferLineMovePrev", { desc = "Move buffer left", silent = true }) -vim.keymap.set("n", "", "BufferLineMoveNext", { desc = "Move buffer right", silent = true }) -vim.keymap.set("n", "", function() Snacks.bufdelete() end, { desc = "Close buffer", silent = true }) -vim.keymap.set("n", "", function() Snacks.bufdelete.other() end, { desc = "Close other buffers", silent = true }) +vim.keymap.set( + "n", + "", + "BufferLineCyclePrev", + { desc = "Previous buffer", silent = true } +) +vim.keymap.set( + "n", + "", + "BufferLineCycleNext", + { desc = "Next buffer", silent = true } +) +vim.keymap.set( + "n", + "", + "BufferLineMovePrev", + { desc = "Move buffer left", silent = true } +) +vim.keymap.set( + "n", + "", + "BufferLineMoveNext", + { desc = "Move buffer right", silent = true } +) +vim.keymap.set("n", "", function() + Snacks.bufdelete() +end, { desc = "Close buffer", silent = true }) +vim.keymap.set("n", "", function() + Snacks.bufdelete.other() +end, { desc = "Close other buffers", silent = true }) -- Disable ex mode vim.keymap.set("n", "Q", "") -- Move selected lines up/down -vim.keymap.set("v", "J", ":m '>+1gv=gv", { desc = "Move selection down", silent = true }) -vim.keymap.set("v", "K", ":m '<-2gv=gv", { desc = "Move selection up", silent = true }) +vim.keymap.set( + "v", + "J", + ":m '>+1gv=gv", + { desc = "Move selection down", silent = true } +) +vim.keymap.set( + "v", + "K", + ":m '<-2gv=gv", + { desc = "Move selection up", silent = true } +) -- Join line without moving cursor vim.keymap.set("n", "J", "mzJ`z", { desc = "Join line, keep cursor" }) @@ -48,19 +102,54 @@ vim.keymap.set("n", "N", "Nzzzv", { desc = "Prev search result" }) -- Yank to system clipboard vim.keymap.set({ "n", "v" }, "y", '"+y', { desc = "Yank to clipboard" }) vim.keymap.set("n", "Y", '"+Y', { desc = "Yank line to clipboard" }) -vim.keymap.set("n", "YY", ":%y+", { desc = "Yank buffer to clipboard" }) +vim.keymap.set( + "n", + "YY", + ":%y+", + { desc = "Yank buffer to clipboard" } +) -- Delete to black hole register (no yank side effect) -vim.keymap.set({ "n", "v" }, "d", '"_d', { desc = "Delete to black hole" }) -vim.keymap.set("n", "dd", '"_dd', { desc = "Delete line to black hole" }) +vim.keymap.set( + { "n", "v" }, + "d", + '"_d', + { desc = "Delete to black hole" } +) +vim.keymap.set( + "n", + "dd", + '"_dd', + { desc = "Delete line to black hole" } +) -- Paste from system clipboard -vim.keymap.set({ "n", "v", "x" }, "p", '"+p', { desc = "Paste from clipboard (after)" }) -vim.keymap.set({ "n", "v", "x" }, "P", '"+P', { desc = "Paste from clipboard (before)" }) +vim.keymap.set( + { "n", "v", "x" }, + "p", + '"+p', + { desc = "Paste from clipboard (after)" } +) +vim.keymap.set( + { "n", "v", "x" }, + "P", + '"+P', + { desc = "Paste from clipboard (before)" } +) -- Paste over selection without overwriting the yank register vim.keymap.set("x", "v", '"_dP', { desc = "Paste over selection" }) -- Utility -vim.keymap.set("n", "s", ":update:source", { desc = "Save and source file" }) -vim.keymap.set("n", "x", ":!chmod +x %", { desc = "Make file executable" }) +vim.keymap.set( + "n", + "so", + ":update:source", + { desc = "Save and source file" } +) +vim.keymap.set( + "n", + "x", + ":!chmod +x %", + { desc = "Make file executable" } +) diff --git a/config/dot/nvim/lua/plugins/colorscheme.lua b/config/dot/nvim/lua/plugins/colorscheme.lua index ddf1d6d..976220c 100644 --- a/config/dot/nvim/lua/plugins/colorscheme.lua +++ b/config/dot/nvim/lua/plugins/colorscheme.lua @@ -19,6 +19,11 @@ return { bg = colors.terminal_black, fg = colors.fg, } + -- Fix LspReference* readability: DiagnosticUnnecessary dims fg for unused + -- imports, making text nearly invisible against LspReferenceText's background + highlights["LspReferenceText"] = { bg = colors.fg_gutter, fg = colors.fg } + highlights["LspReferenceRead"] = { bg = colors.fg_gutter, fg = colors.fg } + highlights["LspReferenceWrite"] = { bg = colors.fg_gutter, fg = colors.fg } end, }, },