jak rozwinąć aliasy wbudowane w bash?

84

Czy istnieje sposób na rozszerzenie aliasów wbudowanych w bash?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 
asdfg
źródło

Odpowiedzi:

107

Możesz nacisnąć Ctrl- Alt-, eaby wykonać funkcję readline, shell-expand-linektóra wykona alias, historię i rozszerzenia wyrazów. Zauważ, że na niektórych klawiaturach Metatak nie jest Alt. Być może trzeba nacisnąć Escnastępnie Ctrl-e

Funkcje alias-expand-linei history-and-alias-expand-linenie są domyślnie powiązane, ale można je powiązać, dodając do ~/.inputrcpliku wiersze podobne do poniższych .

"\e\C-l": alias-expand-line

co sprawiłoby, że Ctrl- Alt- l(małe litery „ell”) wykonują tylko rozwinięcie aliasu.

Dennis Williamson
źródło
Czy możemy odwzorować rozszerzenie aliasu na <tab> bez wpływu na inne uzupełnienia bash ?.
asdfg
2
@asdfg: Jeśli to zrobisz, spowoduje to uszkodzenie innych uzupełnień. Może to działać (niesprawdzone), aby utworzyć mapę, jak pokazano powyżej, a następnie dodać tę dodatkową mapę, aby zastąpić istniejącą dla Tab: "\C-i": "\e\C-l\e\e"która tworzy makro, które wykonuje zarówno alias-expand-linei complete. Zależy to od powiązania z mojej powyższej odpowiedzi i od tego, że domyślne powiązanie dla Esc-Esc pozostaje na swoim miejscu. Nadal będziesz mógł wykonać Esc-Esc, jeśli chcesz wykonać domyślne zakończenie.
Dennis Williamson
4
Rzeczywiście, ESC C-edziała dla Bash, ale C-x adziała dla Zsh. Przetestowano również w systemie OS X.
Blaz
Jeśli jesteś po prostu patrząc na Ctrl + coś, gdzie można coś klawisz „x”, można zrobić to w ten sposób w niektórych systemach: Control-x: history-and-alias-expand-line.
igordcard
1
@WeijunZhou: To zależy od menedżera okien i wszelkich niestandardowych ustawień. Na przykład w przypadku Gnome ekranem blokady jest Super + L.
Dennis Williamson
2

To może być znacznie prostszy sposób na robienie tego, co próbujesz ( bashwersja> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt„s manstrona: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

starscream_disco_party
źródło
3
To jest źle. Opcje powłoki „direxpand” i „expand_aliases” nie pomagają w rozwijaniu wbudowanych aliasów, jak określono w pytaniu. Nie wiem z którego kapelusza „direxpand” został wzięty…? Domyślnie „expand_aliases” jest już ustawiony. Jeśli go rozbroisz, wynikiem będzie po prostu wyłączenie działania aliasów (nie są one rozwijane przed interpretacją wiersza poleceń). Np. Pod warunkiem aliasu alias ll='ls -lpowłoka interpretowałaby „ll” jako polecenie / funkcję „ll”, co prawdopodobnie nie istnieje.
FooF
0

To nie działa. Ale zgaduję / mam nadzieję, że coś takiego można zrobić, aby zrobić to, co chcesz. Będziesz musiał użyć własnego skryptu ukończenia. Oto jak to zrobić:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Teraz źródłowy pełny plik bash_completion ( http://caliban.org/bash ) i umieść wyżej wspomniany skrypt w pliku w katalogu bash_completion.d, który skrypt otrzymałeś z odnośników do adresu URL. Daj mi znać, jeśli to nie zadziała.

Dzięki.

0fnt
źródło
0

Dla osób, które zainstalowały zsh i szukają prostego rozwiązania, globalia mogą być twoim przyjacielem

Rozwija wszystkie wyrażenia globalne, podkomendy i aliasy (w tym globalne).

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

aby zainstalować, po prostu dodaj „globalias” do listy wtyczek .zshrc

plugins=(... globalias)

Następnie naciśnij przycisk, SPACEaby uruchomić rozwinięcie napisanego polecenia.

Jeśli chcesz wstawić spację bez rozwijania wiersza poleceń, naciśnij CTRL+SPACE

Mogą
źródło