aboutsummaryrefslogtreecommitdiff
path: root/mling/tmpl
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-04-28 16:18:12 +0800
committer魏曹先生 <1992414357@qq.com>2026-04-28 16:18:12 +0800
commit881e7399b2417c32fa996d94c6b389c1e06d8eb1 (patch)
treefd88cb181e9c5a0bae8677c43dff859f4cd82d80 /mling/tmpl
parentdbc811d84fd809ea606a8bbed84b3e78e8cda334 (diff)
Add scaffolding CLI tool `mling`
Diffstat (limited to 'mling/tmpl')
-rw-r--r--mling/tmpl/load.fish75
-rw-r--r--mling/tmpl/load.ps185
-rw-r--r--mling/tmpl/load.sh100
3 files changed, 260 insertions, 0 deletions
diff --git a/mling/tmpl/load.fish b/mling/tmpl/load.fish
new file mode 100644
index 0000000..19e1ef7
--- /dev/null
+++ b/mling/tmpl/load.fish
@@ -0,0 +1,75 @@
+#!/usr/bin/env fish
+
+# Save original directory
+set -l _load_original_dir $PWD
+
+# Switch to script directory
+set -l _load_dir (dirname (status filename))
+cd $_load_dir
+
+# Load mling.fish from path
+source .comp/mling_comp.fish
+
+# Add all namespace bin directories to PATH
+for _dir in */bin/
+ if test -d $_dir
+ set -gx PATH $PWD/$_dir $PATH
+ end
+end
+
+function _load_comp_script
+ if string match -q '*.fish' -- $argv[1]
+ source $argv[1] 2>/dev/null
+ end
+end
+
+# Iterate through all namespaces
+for _namespace in */
+ set _namespace (string trim -r -c / $_namespace)
+
+ # Skip if UNTRUSTED marked or no comp directory
+ test -f $_namespace/UNTRUSTED && continue
+ test -d $_namespace/comp || continue
+
+ # Find all loadable scripts in comp
+ set _scripts (find $_namespace/comp -maxdepth 1 -type f \( -name '*.sh' -o -name '*.zsh' -o -name '*.fish' \) 2>/dev/null)
+ test -z "$_scripts" && continue
+
+ # Count scripts
+ set _count (count $_scripts)
+
+ # If TRUSTED marked, load directly
+ if test -f $_namespace/TRUSTED
+ for _script in $_scripts
+ _load_comp_script $_script
+ end
+ continue
+ end
+
+ # Ask user
+ read -l -p 'printf "%s has %d completion script(s) to load, do you trust it? [Y/n] " $_namespace $_count' _answer
+ switch $_answer
+ case '' Y y
+ for _script in $_scripts
+ chmod +x $_script
+ end
+ touch $_namespace/TRUSTED
+
+ # Ask whether to load immediately
+ read -l -p 'printf "Load it immediately? [Y/n] "' _load_answer
+ switch $_load_answer
+ case '' Y y
+ for _script in $_scripts
+ _load_comp_script $_script
+ end
+ end
+ case '*'
+ touch $_namespace/UNTRUSTED
+ end
+end
+
+# Restore original directory
+cd $_load_original_dir
+
+# Clean up
+functions -e _load_comp_script
diff --git a/mling/tmpl/load.ps1 b/mling/tmpl/load.ps1
new file mode 100644
index 0000000..d666338
--- /dev/null
+++ b/mling/tmpl/load.ps1
@@ -0,0 +1,85 @@
+#!/usr/bin/env pwsh
+
+# Save original directory, restore after execution
+$_load_original_dir = Get-Location
+
+# Load completion script mling.ps1 from the current directory
+$mlingScript = Join-Path -Path (Get-Location) -ChildPath ".comp/mling_comp.ps1"
+if (Test-Path $mlingScript) {
+ . $mlingScript
+}
+
+# Change to script directory
+$scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
+try {
+ Set-Location $scriptPath -ErrorAction Stop
+} catch {
+ Write-Error "load.ps1: failed to cd to script directory"
+ return
+}
+
+# Add bin directories from all namespaces to PATH
+Get-ChildItem -Directory -Path "*/bin/" | ForEach-Object {
+ $env:PATH = "$($_.FullName);$env:PATH"
+}
+
+# Helper function: execute script with appropriate shell
+function _load_script {
+ param([string]$script)
+ # Only handle .ps1 scripts
+ if ($script -like "*.ps1") {
+ & $script 2>$null
+ }
+}
+
+# Iterate over all namespaces
+Get-ChildItem -Directory | ForEach-Object {
+ $_namespace = $_.Name
+
+ # Skip if UNTRUSTED marker exists
+ if (Test-Path "$_namespace\UNTRUSTED") { return }
+
+ $_comp_dir = "$_namespace\comp"
+ if (-not (Test-Path $_comp_dir -PathType Container)) { return }
+
+ # Find all loadable scripts under comp
+ $_scripts = Get-ChildItem -Path $_comp_dir -File -Include "*.ps1" -ErrorAction SilentlyContinue
+ if (-not $_scripts) { return }
+
+ # Count scripts
+ $_count = ($_scripts | Measure-Object).Count
+
+ # If TRUSTED marker exists, load directly
+ if (Test-Path "$_namespace\TRUSTED") {
+ $_scripts | ForEach-Object {
+ _load_script $_.FullName
+ }
+ return
+ }
+
+ # No marker, ask user
+ $answer = Read-Host "'$_namespace' has $_count completion script(s) to load, do you trust it? [Y/n] "
+ if ($answer -eq "" -or $answer -match "^(y|yes)$") {
+ # Mark as TRUSTED
+ New-Item -ItemType File -Path "$_namespace\TRUSTED" -Force | Out-Null
+
+ # Ask whether to load immediately
+ $load_answer = Read-Host "Load it immediately? [Y/n] "
+ if ($load_answer -eq "" -or $load_answer -match "^(y|yes)$") {
+ $_scripts | ForEach-Object {
+ _load_script $_.FullName
+ }
+ }
+ } else {
+ New-Item -ItemType File -Path "$_namespace\UNTRUSTED" -Force | Out-Null
+ }
+}
+
+# Restore original working directory
+try {
+ Set-Location $_load_original_dir -ErrorAction Stop
+} catch {}
+
+# Cleanup
+Remove-Variable -Name _load_original_dir -ErrorAction SilentlyContinue
+Remove-Item Function:_load_script -ErrorAction SilentlyContinue
diff --git a/mling/tmpl/load.sh b/mling/tmpl/load.sh
new file mode 100644
index 0000000..0d48e95
--- /dev/null
+++ b/mling/tmpl/load.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+
+# Save original directory, restore after execution
+_load_original_dir="$PWD"
+
+cd "$(dirname "$0")" 2>/dev/null || {
+ echo "load.sh: failed to cd to script directory" >&2
+ return 1
+}
+
+# If in zsh, source mling.zsh, otherwise source mling.sh
+if [ -n "$ZSH_VERSION" ]; then
+ [ -f "./.comp/mling_comp.zsh" ] && source "./.comp/mling_comp.zsh"
+else
+ [ -f "./.comp/mling_comp.sh" ] && source "./.comp/mling_comp.sh"
+fi
+
+# Add bin directories from all namespaces to PATH
+for _dir in */bin/; do
+ [ -d "$_dir" ] && export PATH="$PWD/${_dir%/}:$PATH"
+done
+
+# Helper function: execute script with appropriate shell
+_load_script() {
+ local script="$1"
+ if [ -n "$ZSH_VERSION" ]; then
+ case "$script" in
+ *.zsh|*.sh)
+ source "$script" 2>/dev/null
+ ;;
+ esac
+ else
+ case "$script" in
+ *.sh)
+ bash "$script" 2>/dev/null
+ ;;
+ esac
+ fi
+}
+
+# Iterate over all namespaces
+for _namespace in */; do
+ _namespace="${_namespace%/}"
+ [ "$_namespace" = "*" ] && continue
+
+ # Skip if UNTRUSTED marker exists
+ [ -f "$_namespace/UNTRUSTED" ] && continue
+
+ _comp_dir="$_namespace/comp"
+ [ ! -d "$_comp_dir" ] && continue
+
+ # Find all loadable scripts under comp
+ _scripts=$(find "$_comp_dir" -maxdepth 1 -type f \( -name '*.sh' -o -name '*.zsh' -o -name '*.fish' \) 2>/dev/null)
+ [ -z "$_scripts" ] && continue
+
+ # Count scripts
+ _count=$(echo "$_scripts" | wc -l)
+
+ # If TRUSTED marker exists, load directly
+ if [ -f "$_namespace/TRUSTED" ]; then
+ echo "$_scripts" | while IFS= read -r _script; do
+ _load_script "$_script"
+ done
+ continue
+ fi
+
+ # No marker, ask user
+ printf "'%s' has %d completion script(s) to load, do you trust it? [Y/n] " "$_namespace" "$_count"
+ read _answer
+ case "$_answer" in
+ [Yy]*|"")
+ # Mark as TRUSTED and set executable permissions
+ echo "$_scripts" | while IFS= read -r _script; do
+ chmod +x "$_script"
+ done
+ touch "$_namespace/TRUSTED"
+
+ # Ask whether to load immediately
+ printf "Load it immediately? [Y/n] "
+ read _load_answer
+ case "$_load_answer" in
+ [Yy]*|"")
+ echo "$_scripts" | while IFS= read -r _script; do
+ _load_script "$_script"
+ done
+ ;;
+ esac
+ ;;
+ *)
+ touch "$_namespace/UNTRUSTED"
+ ;;
+ esac
+done
+
+# Restore original working directory
+cd "$_load_original_dir" 2>/dev/null || true
+
+# Cleanup
+unset -f _load_script
+unset _load_original_dir _dir _namespace _comp_dir _scripts _count _answer _load_answer _script