Skip to content

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

Open
@splanes

Description

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.

  • init.sh
  • all_platforms
  • linux
    • all.linux.aliases.sh
    • Machine1
      • machine1.aliases.sh
  • macos
    • Machine1
    • Machine2
  • windows

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>/<tu_ordenador>/*

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

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions