Combinando funções em peixes

3

No shell de peixe eu tenho duas funções:

function be
  bundle exec $argv
end

function rdbm
  rake db:migrate
end

Eu geralmente os uso juntos, ou seja, bundle exec rake db:migrate , mas nem sempre, então gostaria de mantê-los separados.

O problema é que não posso fazer isso com os aliases que defini atualmente:

Para dizer que be rdbm expande a primeira função ( be ), mas passa rdbm como uma cadeia literal (não expandida).

Eu também tentei abbr :

abbr be 'bundle exec'
abbr rdbm 'rake db:migrate'

Mas apenas o primeiro se expande.

Eu descobri que é possível chamar funções de outras funções:

function be_rdbm
  echo (be rake db:migrate)
end

mas isso não dissocia as duas funções, já que a segunda não está sendo usada.

A propósito, gostaria de saber se esse último exemplo pode ser melhorado. Não vejo por que o echo deve ser necessário (ou quais alternativas existem), mas não posso colocar os parênteses como todo o conteúdo da função.

    
por max pleaner 20.12.2016 / 08:13

2 respostas

2

Pessoalmente, eu apenas definiria outra abreviação para o caso combinado. No entanto, você pode definir sua função rdbms da seguinte maneira para permitir que você a combine com sua função be como be (rdbm) :

function rdbm
    if status --is-command-substitution
        echo rake db:migrate
    else
        rake db:migrate
    end
end

Você também pode modificar sua função be para poder digitar apenas o tipo be rdbm quando usado com a alteração anterior:

function be
    if test "$argv" = "rdbm"
        bundle exec (rdbm)
    else
        bundle exec $argv
    end
end
    
por 20.12.2016 / 21:45
1

O zsh tem um recurso "alias global", onde o alias é substituído em qualquer lugar da linha. Mas peixe apenas substitui a primeira palavra na linha de comando.

Você pode fazer isso:

function rdbm
  if [ (count $argv) = 1 ]; and [ $argv[1] = "-n" ]
    echo "rake db:migrate"
  else
    rake db:migrate
  end
end

Então você teria que digitar

be (rdbm -n)
    
por 20.12.2016 / 15:58

Tags