rgomezcasas / dotfiles

:penguin: Simple, fast, productivity-increaser dotfiles
MIT License
348 stars 46 forks source link

scripts, aliases, exports, shell con carga jerarquizada #10

Open splanes opened 4 years ago

splanes commented 4 years ago

Hola Rafa!

Veo una oportunidad de mejora muy buena:

Cuando cargas init.sh tomas todos los aliases, exports y funciones comunes a todas las plataformas. Entre los aliases veo que utilizas comandos propios de macos que no servirían para linux.

for aliasToSource in "$DOTFILES_PATH/shell/_aliases/"*; do source "$aliasToSource"; done
for exportToSource in "$DOTFILES_PATH/shell/_exports/"*; do source "$exportToSource"; done
for functionToSource in "$DOTFILES_PATH/shell/_functions/"*; do source "$functionToSource"; done

Claro que puedes tener branches por cada máquina pero eso genera varios inconvenientes. Creo que el desafío es tener alta portabilidad y moverse indistintamente entre plataformas u ordenadores sin inconvenientes.

Siguiendo con el principio DRY, te propongo una estructura de directorios jerarquizada, en el cual defines los aliases, funciones y exports comunes para todas las plataformas en all_platforms, y luego realizas las configuraciones particulares por plataforma o por máquina.

por ejemplo podrías tener una función browse en mac (dentro de /macos/functions/helpers.sh)

browse () {
  open -a "$DOTFILES_DEFAULT_BROWSER" $1
}

mientras que en linux (dentro de /linux/functions/helpers.sh)

browse () {
  sensible-browser  $1
}

El orden de carga sería all_platforms/ <tu_distribución>/ <tu_distribución>//*

Por ejemplo con

platform_name=$(get_platform)
machine_name=$(hostname)

load_hierarchy=(
  "all_platforms"
  "$platform_name"
  "$platform_name/$machine_name"
)
load_file_order=(
  ".sh_exports" ".sh_functions" ".sh_aliases" "key_binds.sh" "prompt.sh"
)

# load all platform and shell functions, aliases, exports and key bindings.
# as an hierarchy. First: /shell/all_platforms, then /shell/<your_platform>,
# then /shell/<your_platform>/<your_machine>
for hierarchy in $load_hierarchy; do
  for load_file in $load_file_order; do
    source_path "$DOTFILES_PATH/shell/$hierarchy/$load_file"
  done
done

A su vez, podrías verificar si el recurso al que le harás source es un directorio o un fichero

# Source the file or directory specified in the path parameter.
#
# param $1 (path) the path to source. Cannot be null.
function source_path {
  if [[ -d "$1" ]]; then
    for script in $1/*; do source "$script"; done
  elif [[ -f "$1" ]]; then
    source $1
  fi
}

Tengo este cambio implementado en mi local. Si deseas abro un PR. Si no estás de acuerdo, simplemente cierra el issue que no me ofenderé. Tus comentarios son más que bienvenidos

Saludos! Sebastián