Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
splanes opened this issue Jul 21, 2020 · 0 comments
Open

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

splanes opened this issue Jul 21, 2020 · 0 comments

Comments

@splanes
Copy link

splanes commented Jul 21, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant