This commit is contained in:
Gabriel Brown
2026-06-02 09:19:42 -04:00
parent 4c529afae7
commit ac57cfa319
5 changed files with 222 additions and 20 deletions
Executable
+99
View File
@@ -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()
Executable
BIN
View File
Binary file not shown.
+10 -1
View File
@@ -10,17 +10,26 @@ export SSH_ASKPASS_REQUIRE=prefer
export CARGO_PATH="$HOME/.cargo" export CARGO_PATH="$HOME/.cargo"
export BUN_INSTALL="$HOME/.bun" export BUN_INSTALL="$HOME/.bun"
export PYENV_ROOT="$HOME/.pyenv" export PYENV_ROOT="$HOME/.pyenv"
export PNPM_HOME="$HOME/.local/share/pnpm"
export NVM_DIR="$HOME/.nvm" export NVM_DIR="$HOME/.nvm"
export ANDROID_SDK_HOME="$HOME/.local/share/Android" export ANDROID_SDK_HOME="$HOME/.local/share/Android"
export GOPATH="$HOME/.local/share/go" export GOPATH="$HOME/.local/share/go"
export DOTNETPATH="$HOME/.dotnet/tools" export DOTNETPATH="$HOME/.dotnet/tools"
# Set complete path # 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 # Nvm
source /etc/profile.d/nvm.sh 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 # Zoxide
eval "$(zoxide init bash)" eval "$(zoxide init bash)"
+108 -19
View File
@@ -14,25 +14,79 @@ pcall(vim.keymap.del, "t", "<C-l>")
pcall(vim.keymap.del, "n", "<leader>l") pcall(vim.keymap.del, "n", "<leader>l")
-- Window navigation -- Window navigation
vim.keymap.set({ "n", "v", "x" }, "<leader>h", "<C-w>h", { desc = "Go to left window", silent = true }) vim.keymap.set(
vim.keymap.set({ "n", "v", "x" }, "<leader>j", "<C-w>j", { desc = "Go to lower window", silent = true }) { "n", "v", "x" },
vim.keymap.set({ "n", "v", "x" }, "<leader>k", "<C-w>k", { desc = "Go to upper window", silent = true }) "<leader>h",
vim.keymap.set({ "n", "v", "x" }, "<leader>l", "<C-w>l", { desc = "Go to right window", silent = true }) "<C-w>h",
{ desc = "Go to left window", silent = true }
)
vim.keymap.set(
{ "n", "v", "x" },
"<leader>j",
"<C-w>j",
{ desc = "Go to lower window", silent = true }
)
vim.keymap.set(
{ "n", "v", "x" },
"<leader>k",
"<C-w>k",
{ desc = "Go to upper window", silent = true }
)
vim.keymap.set(
{ "n", "v", "x" },
"<leader>l",
"<C-w>l",
{ desc = "Go to right window", silent = true }
)
-- Buffer tab navigation -- Buffer tab navigation
vim.keymap.set("n", "<C-h>", "<cmd>BufferLineCyclePrev<cr>", { desc = "Previous buffer", silent = true }) vim.keymap.set(
vim.keymap.set("n", "<C-l>", "<cmd>BufferLineCycleNext<cr>", { desc = "Next buffer", silent = true }) "n",
vim.keymap.set("n", "<C-j>", "<cmd>BufferLineMovePrev<cr>", { desc = "Move buffer left", silent = true }) "<C-h>",
vim.keymap.set("n", "<C-k>", "<cmd>BufferLineMoveNext<cr>", { desc = "Move buffer right", silent = true }) "<cmd>BufferLineCyclePrev<cr>",
vim.keymap.set("n", "<C-q>", function() Snacks.bufdelete() end, { desc = "Close buffer", silent = true }) { desc = "Previous buffer", silent = true }
vim.keymap.set("n", "<C-a>", function() Snacks.bufdelete.other() end, { desc = "Close other buffers", silent = true }) )
vim.keymap.set(
"n",
"<C-l>",
"<cmd>BufferLineCycleNext<cr>",
{ desc = "Next buffer", silent = true }
)
vim.keymap.set(
"n",
"<C-j>",
"<cmd>BufferLineMovePrev<cr>",
{ desc = "Move buffer left", silent = true }
)
vim.keymap.set(
"n",
"<C-k>",
"<cmd>BufferLineMoveNext<cr>",
{ desc = "Move buffer right", silent = true }
)
vim.keymap.set("n", "<C-q>", function()
Snacks.bufdelete()
end, { desc = "Close buffer", silent = true })
vim.keymap.set("n", "<C-a>", function()
Snacks.bufdelete.other()
end, { desc = "Close other buffers", silent = true })
-- Disable ex mode -- Disable ex mode
vim.keymap.set("n", "Q", "<nop>") vim.keymap.set("n", "Q", "<nop>")
-- Move selected lines up/down -- Move selected lines up/down
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv", { desc = "Move selection down", silent = true }) vim.keymap.set(
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv", { desc = "Move selection up", silent = true }) "v",
"J",
":m '>+1<CR>gv=gv",
{ desc = "Move selection down", silent = true }
)
vim.keymap.set(
"v",
"K",
":m '<-2<CR>gv=gv",
{ desc = "Move selection up", silent = true }
)
-- Join line without moving cursor -- Join line without moving cursor
vim.keymap.set("n", "J", "mzJ`z", { desc = "Join line, keep 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 -- Yank to system clipboard
vim.keymap.set({ "n", "v" }, "<leader>y", '"+y', { desc = "Yank to clipboard" }) vim.keymap.set({ "n", "v" }, "<leader>y", '"+y', { desc = "Yank to clipboard" })
vim.keymap.set("n", "<leader>Y", '"+Y', { desc = "Yank line to clipboard" }) vim.keymap.set("n", "<leader>Y", '"+Y', { desc = "Yank line to clipboard" })
vim.keymap.set("n", "<leader>YY", ":%y+<CR>", { desc = "Yank buffer to clipboard" }) vim.keymap.set(
"n",
"<leader>YY",
":%y+<CR>",
{ desc = "Yank buffer to clipboard" }
)
-- Delete to black hole register (no yank side effect) -- Delete to black hole register (no yank side effect)
vim.keymap.set({ "n", "v" }, "<leader>d", '"_d', { desc = "Delete to black hole" }) vim.keymap.set(
vim.keymap.set("n", "<leader>dd", '"_dd', { desc = "Delete line to black hole" }) { "n", "v" },
"<leader>d",
'"_d',
{ desc = "Delete to black hole" }
)
vim.keymap.set(
"n",
"<leader>dd",
'"_dd',
{ desc = "Delete line to black hole" }
)
-- Paste from system clipboard -- Paste from system clipboard
vim.keymap.set({ "n", "v", "x" }, "<leader>p", '"+p', { desc = "Paste from clipboard (after)" }) vim.keymap.set(
vim.keymap.set({ "n", "v", "x" }, "<leader>P", '"+P', { desc = "Paste from clipboard (before)" }) { "n", "v", "x" },
"<leader>p",
'"+p',
{ desc = "Paste from clipboard (after)" }
)
vim.keymap.set(
{ "n", "v", "x" },
"<leader>P",
'"+P',
{ desc = "Paste from clipboard (before)" }
)
-- Paste over selection without overwriting the yank register -- Paste over selection without overwriting the yank register
vim.keymap.set("x", "<leader>v", '"_dP', { desc = "Paste over selection" }) vim.keymap.set("x", "<leader>v", '"_dP', { desc = "Paste over selection" })
-- Utility -- Utility
vim.keymap.set("n", "<leader><leader>s", ":update<CR>:source<CR>", { desc = "Save and source file" }) vim.keymap.set(
vim.keymap.set("n", "<leader><leader>x", ":!chmod +x %<CR>", { desc = "Make file executable" }) "n",
"<leader>so",
":update<CR>:source<CR>",
{ desc = "Save and source file" }
)
vim.keymap.set(
"n",
"<leader><leader>x",
":!chmod +x %<CR>",
{ desc = "Make file executable" }
)
@@ -19,6 +19,11 @@ return {
bg = colors.terminal_black, bg = colors.terminal_black,
fg = colors.fg, 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, end,
}, },
}, },