Updates
This commit is contained in:
Executable
+99
@@ -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
Binary file not shown.
+10
-1
@@ -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)"
|
||||
|
||||
|
||||
@@ -14,25 +14,79 @@ pcall(vim.keymap.del, "t", "<C-l>")
|
||||
pcall(vim.keymap.del, "n", "<leader>l")
|
||||
|
||||
-- Window navigation
|
||||
vim.keymap.set({ "n", "v", "x" }, "<leader>h", "<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 })
|
||||
vim.keymap.set(
|
||||
{ "n", "v", "x" },
|
||||
"<leader>h",
|
||||
"<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
|
||||
vim.keymap.set("n", "<C-h>", "<cmd>BufferLineCyclePrev<cr>", { desc = "Previous buffer", 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 })
|
||||
vim.keymap.set(
|
||||
"n",
|
||||
"<C-h>",
|
||||
"<cmd>BufferLineCyclePrev<cr>",
|
||||
{ desc = "Previous buffer", 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
|
||||
vim.keymap.set("n", "Q", "<nop>")
|
||||
|
||||
-- Move selected lines up/down
|
||||
vim.keymap.set("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 })
|
||||
vim.keymap.set(
|
||||
"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
|
||||
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" }, "<leader>y", '"+y', { desc = "Yank 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)
|
||||
vim.keymap.set({ "n", "v" }, "<leader>d", '"_d', { desc = "Delete to black hole" })
|
||||
vim.keymap.set("n", "<leader>dd", '"_dd', { desc = "Delete line to black hole" })
|
||||
vim.keymap.set(
|
||||
{ "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
|
||||
vim.keymap.set({ "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)" })
|
||||
vim.keymap.set(
|
||||
{ "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
|
||||
vim.keymap.set("x", "<leader>v", '"_dP', { desc = "Paste over selection" })
|
||||
|
||||
-- Utility
|
||||
vim.keymap.set("n", "<leader><leader>s", ":update<CR>:source<CR>", { desc = "Save and source file" })
|
||||
vim.keymap.set("n", "<leader><leader>x", ":!chmod +x %<CR>", { desc = "Make file executable" })
|
||||
vim.keymap.set(
|
||||
"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,
|
||||
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,
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user