Skip to content

Instantly share code, notes, and snippets.

@lopesivan
Created November 4, 2025 05:04
Show Gist options
  • Save lopesivan/b8aa0bf492eac33c61c1c8ce545b9b06 to your computer and use it in GitHub Desktop.
Save lopesivan/b8aa0bf492eac33c61c1c8ce545b9b06 to your computer and use it in GitHub Desktop.
mkprojectionist
#!/usr/bin/env bash
set -euo pipefail
FILE=".projections.json"
need() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Falta o comando '$1'. Instale-o e tente novamente."
exit 1
fi
}
need dialog
need jq
# Perguntas
EXT=$(dialog --stdout --inputbox "Extensão (sem ponto):" 8 50 "awk") || exit 1
EXT=${EXT##.} # remove ponto se o usuário digitar com ponto
SUG="model${EXT}"
SKELETON=$(dialog --stdout --inputbox "Skeleton (ex.: ${SUG}):" 8 50 "$SUG") || exit 1
TYPE=$(dialog --stdout --inputbox "Type (padrão: ${EXT}):" 8 50 "${EXT}") || exit 1
KEY="*.$EXT"
# Base mínima correta do arquivo, respeitando seu escopo
BASE_JSON='{
"./.projections.json": { "type": "dit" },
"README.md": { "type": "doc" }
}'
# Se já existe, valida; se não, cria com base
if [[ -f "$FILE" ]]; then
if ! jq empty "$FILE" >/dev/null 2>&1; then
dialog --msgbox "Arquivo existente inválido. Vou recriá-lo com base mínima." 8 60
printf '%s\n' "$BASE_JSON" | jq '.' >"$FILE"
fi
else
printf '%s\n' "$BASE_JSON" | jq '.' >"$FILE"
fi
# Atualiza/insere a entrada "*.ext"
TMP="$(mktemp)"
jq --arg k "$KEY" \
--arg t "$TYPE" \
--arg s "$SKELETON" \
'.[$k] = { "type": $t, "skeleton": $s }' \
"$FILE" >"$TMP"
# Ordena chaves opcionalmente para manter legibilidade (preserva conteúdo)
jq 'to_entries
| sort_by(.key)
| from_entries' "$TMP" >"$FILE"
rm -f "$TMP"
dialog --msgbox "Entrada adicionada/atualizada:\n\n\"$KEY\": {\"type\": \"$TYPE\", \"skeleton\": \"$SKELETON\"}\n\nArquivo: $FILE" 12 70
clear
# Mostra uma prévia no terminal
echo "=== $FILE ==="
jq '.' "$FILE"
echo Snippets:
echo ~/.config/nvim-ide/neovim-pde/UltiSnips/$TYPE.snippets
echo
echo
echo snippet _${SKELETON} \"skeleton\" b
echo code here ...
echo endsnippet
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment