Zagnieżdżałem aliasy i chcę je wszystkie rozwiązać przed wykonaniem polecenia. W jaki sposób mogę to zrobić?
Jeśli jest funkcja, która nie jest powiązana z żadnym klawiszem, to też M-x foobar
jest dla mnie w porządku. Mogę nawet użyć polecenia zewnętrznego ( type
, command
, which
, cokolwiek). Próbowałem wszystkiego z wątku. Dlaczego nie użyć „który”? Czego więc użyć? ale nic nie działa.
C-x a
rozwija alias pod kursorem (zakładając, że używasz systemu uzupełniania)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
. Jest to pomocne, jednak szkoda, że w bash można rozwinąć całą linię, ale w zsh nie._expand_alias
dopóki bufor edycji nie zmieni się.Odpowiedzi:
Zauważ, że Ctrl-Alt-E in
bash
nie tylko rozwija aliasy. Rozszerza także zmienne, podstawianie poleceń (!), Podstawianie procesów (!), Interpretację arytmetyczną i usuwa cudzysłowy (nie generuje nazw plików (globbing) ani interpretacji tyldy).Nie zawsze udaje się rozwinąć aliasy. Tak więc, chociaż ma swoje zastosowania, ważne jest, aby zdać sobie sprawę, że jego wynik potencjalnie zmienia znaczenie wiersza poleceń, ma skutki uboczne i jest potencjalnie niebezpieczny.
Na przykład w:
Jeśli nacisnę
M-C-E
tutaj, to daje mi:Co daje mi zupełnie inną linię poleceń (i wyobraź sobie, co by się stało, gdybym miał
rm -rf *
zamiastpwd
wyżej) i nie rozszerzafoo
aliasu.Dzięki
zsh
, aby rozwinąć uwagę Gillesa na temat rozszerzonych funkcji aliasów, możesz:Spowoduje to rozwinięcie aliasów tylko wtedy, gdy bieżący wiersz poleceń jest poprawny pod względem składniowym (dlatego też pełni funkcję sprawdzania składni).
W przeciwieństwie do
bash
MCE, rozwiązuje również w pełni aliasy. Na przykład, jeśli masz:Zostanie rozszerzony do:
Zauważ, że kanonizuje również składnię, więc rzeczy takie jak:
zostanie zmieniony na:
źródło
alias ls='ls --color'
i wpiszC-x a
powyżejls
, otrzymuję:\ls --color
(tak, że nowals
nie jest mylnie interpretowane jako alias). Ale z twoimexpand-aliases
rozumiem:,ls --color
czyniąc wynik niejednoznacznym.bash
odpowiednik). Ale to prawda, że po uruchomieniu polecenia otrzymasz kolejną rundę rozszerzenia aliasu (np. Inbash
), więc najlepiej byłoby tymczasowo wyłączyć rozszerzenie aliasu, więc na przykład zawiń to w(){ setopt localoptions noexpandalias; ...; }
. Zauważ, że można powiedzieć, że_expand_alias
jest on błędny, a także rozszerza alias po uruchomieniu\ls
._expand_alias
jest również łatwo oszukać jakalias 'foo=repeat 3 foo'
lubalias ls='ls --color'; alias '\ls=echo fooled'
. Nie ma tutaj idealnego rozwiązania._expand_alias
o toalias 'foo=repeat 3 foo'
, uważam brakujący ukośnik za błąd. Ialias '\ls=echo fooled'
nie powinno być dozwolone; Wolę tu bash, który mówi:bash: alias: '\ls': invalid alias name
.bash
. Jeśli nie lubisz aliasów z odwrotnymi ukośnikami, nie używaj ich, ale dlaczego chcesz, aby powłoka je odrzucała? Podczas gdy aliasy zastępują funkcje biednego człowieka w csh (skąd pochodzą), w powłokach podobnych do Bourne'a są hackami do robienia sztuczek, których nie można wykonać za pomocą funkcji, pewnego rodzaju makropolecenia, które przechwytuje na początku parsera powłoki , Nie widzę sensu w ograniczaniu tego, co może zrobić.Jeśli umieścisz wiersz polecenia w definicji funkcji, a następnie wydrukujesz funkcję, aliasy zostaną rozwinięte. Otrzymasz również znormalizowane białe znaki.
Aby umieścić to wszystko w interaktywnym poleceniu, możesz utworzyć widget ZLE. Możesz zdefiniować funkcję bezpośrednio, umieszczając jej kod we wpisie w
functions
tablicy; dostaniesz efekt normalizacji podczas czytania.Otrzymujesz ten sam efekt normalizacji w
preexec
haku . Aliasy są również rozwijane w momencie automatycznego ładowania funkcji (autoload -U
jest to powszechnie stosowane w celu uniknięcia rozszerzenia aliasu).Funkcja
_expand_alias
uzupełniania rozwija słowo pod kursorem, jeśli jest to alias. Używaaliases
tablicy . To nie jest rekurencyjne. Możesz zaimplementować bardziej ogólny ekspander aliasówaliases
, ale jest to nieco trudne, ponieważ ustalenie lokalizacji, w których aliasy są rozwijane, jest ściśle związane ze składnią powłoki.źródło
autoload -U
po prostu dlatego, że zaleca to dokumentacja zsh, ale nigdy nie zrozumiałem, co-U
właściwie zrobiłem, dopóki tego nie przeczytałem :). Także dla wszystkich zainteresowanych, można powołać się na _expand_alias działać bezpośrednio, wpisując swój alias do linii poleceń, uderzając<Esc>
,x
, aby uruchomić minibufor następnie wpisując_expand_alias<Enter>
Jeśli masz wiele zagnieżdżonych fantazyjnych aliasów i nie masz pewności, co z nimi robi zsh oraz w jakiej kolejności są przekazywane polecenia, możesz zawsze uruchomić zsh z
-x
opcją. Spowoduje to wydrukowanie poleceń i argumentów podczas ich wykonywania.Pamiętaj jednak, że ta opcja jest przeznaczona raczej do debugowania, więc drukuje wiele niepotrzebnych rzeczy zaraz po
zsh -x
wywołaniu (w zasadzie każda funkcja / widget / wtyczka twojego .zshrc), a podczas wykonywania polecenia może być również pełna, szczególnie jeśli zdefiniowałeśpreexec
iprecmd
zaczepisz.Powinienem również wspomnieć, że drukuje tylko te polecenia, które są ostatecznie wykonywane, a oddzielne polecenia są drukowane osobno, więc po
Zobaczysz
źródło