Jakich funkcji Zsh używasz? [Zamknięte]

33

Dużo pracuję w terminalu, więc wiele się nauczyłem o mojej powłoce wyboru, zsh. Z jakich funkcji zsh korzystasz, aby być bardziej wydajnym w pracy? Jednym z moich ulubionych jest autouzupełnianie multi-dir. Zamiast pisać cd /fo{tab}/ba{tab}/ba{tab}, mogę po prostu cd /fo/ba/ba{tab}zapisać i zapisać tak wiele naciśnięć klawiszy!

Frew Schmidt
źródło
2
nie wiedziałem o tej funkcji, będę musiał spróbować tej!
Roy Rico,
1
Którą opcją jest to autouzupełnianie katalogu?
hometoast

Odpowiedzi:

50

Właśnie znalazłem ten mały klejnot:

cd old new

Ta forma cdzastępuje wszystkie wystąpienia oldw pełnej ścieżce bieżącego katalogu newi próbuje zmienić katalog roboczy na ścieżkę wynikową.

Na przykład, jeśli masz katalog roboczy /home/larry/code/backrub/serveri chcesz się przełączyć /home/sergei/code/backrub/server, wszystko, co musisz zrobić, to:

cd larry sergei
Agnel Kurian
źródło
7
Ok, to rządzi.
hometoast
21

Zajmę się rzeczami, których, o ile mi wiadomo, bash nie może zrobić.

  • Fantazyjne zakończenie. Tak, bash ma go trochę, ale zsh zna więcej poleceń, jest często bardziej precyzyjny i ma wiele innych możliwości konfiguracji.

  • **Glob, np **/fooszuka plików o nazwie foow podkatalogów rekurencyjnie. (I ***/foorównież podąża za dowiązaniami symbolicznymi.) Dwa znaki zamiast długiego findpolecenia (co jest trudne do uzyskania, jeśli niektóre nazwy plików zawierają znaki specjalne, takie jak spacje i cudzysłowy).

  • Rzadziej kwalifikatory glob jak w foo*(*)(jak foo*, ale zachowują tylko pliki wykonywalne), foo(.)(tylko zwykłe pliki, nie katalogi), foo(-@) (tylko wiszące dowiązania symboliczne), foo*(m-5)(tylko pliki zmodyfikowane w ciągu ostatnich 5 minut), foo*(om[1])(ostatnio zmodyfikowany plik) itd.

  • autocd: Wpisanie nazwy katalogu jako polecenia zmienia się w nią ( cdlub w pushdzależności od tego, jak ją skonfigurowałeś). cdKomenda jest trzy znaki zbyt długo! Nie mogę używać uderzenia dłużej niż trzydzieści sekund bez odczuwania bólu. Mam również kilka funkcji jednoznakowych, takich jak

funkcja - {
  if [[$ # -eq 0]]; następnie
    cd „$ OLDPWD”
  jeszcze
    wbudowany - „$ @”
  fi
}
  • zmvWbudowane i
alias zcp = 'noglob zmv -C'
alias zln = 'noglob zmv -L'
alias zmv = 'noglob zmv'
  • W tym momencie noglobwbudowane.

  • Funkcje precmdi preexechook: Używam, preexecaby ustawić tytuł mojego terminala tak, aby zawierał działającą komendę i precmdzastąpić komendę kodem wyjścia. Coś jak

term_title_base = '@% l:% 1 ~'
preexec () {
  print -nr $ '\ e] 2;' "$ {(%) term_title_base} $ *„ ”$ \ a '
}
precmd () {
  print -nr $ '\ e] 2;' "$ {(%) term_title_base} ($?)" '$ \ a'  
}
  • Ctrl + Z:
    • W pustym wierszu poleceń działa bg(tak, że Ctrl + Z Ctrl + Z zawiesza program i natychmiast wznawia go w tle).
    • W niepustym wierszu poleceń zawieś bieżącą edycję polecenia: pozwól mi wpisać inne polecenie, a gdy ten drugi wiersz poleceń zakończy się, otrzymam pierwsze polecenie do edycji.
    • Korzysta z następującej funkcji:
fancy-ctrl-z () {
  if [[$ # BUFFER -eq 0]]; następnie
    bg
    zle redisplay
  jeszcze
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^ Z' fancy-ctrl-z
  • Najważniejsze opcje niezwiązane z ukończeniem: setopt append_history autocd extended_glob no_match
Gilles „SO- przestań być zły”
źródło
3
Uwielbiam sztuczkę ^ Z ^ Z, dzięki! Początkowo szukałem superuser.com/questions/378018 rozwiązania pozwalającego na powiązanie go z jednym kluczem, ale ^ Z ^ Z ma o wiele więcej sensu
Evgeniy Dolzhenko
13

zdolność zsh do autouzupełniania rzeczy oprócz plików i katalogów.

Na przykład, z zainstalowanym pakietem git, git-sh {tab} wyświetla:

- polecenie git -
shortlog - podsumowuje dane wyjściowe dziennika git
show-branch - pokazuje gałęzie i ich zobowiązania
show-index - wyświetla zawartość pliku idx pakietu
Mark Thalman
źródło
1
Tak, to świetnie! Używam tego również, gdy nie jestem całkiem pewien, co to jest przełącznik wiersza poleceń, ale nie muszę zagłębiać się w plik man.
Frew Schmidt,
Wierzę, że bash również ma taką możliwość.
Keith Thompson
10

Bardzo podoba mi się globalne aliasy

alias -g L='|less
alias -g DN='>/dev/null'

pozwól mi zrobić coś takiego

somecommand file arg L

i wywołaj.

hometoast
źródło
Lubię też G jak grep.
Frew Schmidt
7

Jak wspomnieli inni, autouzupełnianie zsh jest doskonałe.

Możesz również skonfigurować własne autouzupełnianie dla niestandardowych poleceń bez zbytniego wysiłku. Aby wstawić do zakładki pełne nazwy użytkowników jako argumenty do palca:

# ~/.zshrc
function userlist {
        reply=(`users | tr ' ' '\n' |sort -u `);}
compctl -K userlist finger
set COMPLETE_ALIASES

Inne opcje, które chciałbym ustawić:

# turn on spelling correction
setopt correct
# don't save duplicates in command history
setopt histignoredups
# don't allow accidental file over-writes
setopt noclobber

Pushd i popd są również bardzo przydatne.

# Always pushd when changing directory
setopt auto_pushd
# Have pushd with no arguments act like `pushd $HOME'.
setopt PUSHD_TO_HOME

Irytujące klucze home i end domyślnie nie działają na Zsh, jak na innych powłokach, ale można to naprawić.

# Make home and end keys work.
[[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
[[ -z "$terminfo[kend]" ]] || bindkey -M emacs "$terminfo[kend]" end-of-line
inne
źródło
2
Korekta pisowni wydaje mi się bardziej irytująca niż pomocna.
Frew Schmidt,
@Frew heh, nie jesteś pierwszą osobą, która mi to powiedziała. Jedną z fajniejszych cech korekty jest to, że wprowadzi poprawioną wersję do historii, więc nie będziesz przypadkowo uruchamiał tego samego.
theotherreceive
5

Włącz automatyczne uzupełnianie podczas korzystania scpze zdalnego serwera.

Właściwy monit o wyświetlenie dodatkowych informacji.

Rob Wells
źródło
W rzeczy samej! Mam bardzo złożony, ale krótki monit. Nazwa hosta [bieżąca linia] <nr błędu>%
załoga Schmidt