Які функції zsh ви використовуєте? [зачинено]


33

Я багато працюю в терміналі, тому я багато чого дізнався про свою оболонку вибору, zsh. Які особливості zsh ви використовуєте, щоб зробити себе набагато продуктивнішими на роботі? Один з моїх улюблених - автозаповнення мультиресурсів. Тож замість набору тексту cd /fo{tab}/ba{tab}/ba{tab}я можу просто зробити cd /fo/ba/ba{tab}і зберегти стільки натискань клавіш!


2
я не знав про цю особливість, мені доведеться спробувати цю!
Рой Ріко

1
Який варіант автозаповнення цього каталогу?
гомеоаст

Відповіді:


50

Щойно знайшов цей маленький дорогоцінний камінь:

cd old new

Ця форма cdзамінює всі випадки виникнення oldв повному шляху цього каталогу newі намагається змінити робочий каталог на отриманий шлях.

Наприклад, якщо ваша робоча директорія є, /home/larry/code/backrub/serverі ви хочете перейти на неї /home/sergei/code/backrub/server, все, що вам потрібно зробити, це:

cd larry sergei

7
Добре, що правила.
гомеоаст

21

Я буду дотримуватися речей, які, наскільки я знаю, баш не можуть робити.

  • Фантастичне завершення. Так, bash має частину цього, але zsh знає більше команд, часто більш точний і має набагато більше можливостей конфігурації.

  • Наприклад, **глобус **/fooшукає файли, викликані fooу підкаталогах, рекурсивно. (А ***/fooтакож слідує за посиланнями.) Два символи замість довгої findкоманди (що важко підібрати, якщо деякі назви файлів містять спеціальні символи, такі як пробіли та лапки).

  • Рідше глобальні класифікатори, як у foo*(*)(наприклад foo*, але зберігають лише виконувані файли), foo(.)(лише звичайні файли, а не каталоги), foo(-@) (лише звисаючі символьні посилання), foo*(m-5)(лише файли, змінені за останні 5 хвилин), foo*(om[1])(останній час змінений файл) тощо.

  • autocd: Введення імені каталогу, коли команда змінюється в ньому ( cdабо pushdзалежно від того, як ви його налаштували). cdКоманда трьох символів занадто довго! Я не можу використовувати баш більше тридцяти секунд, не відчуваючи болю. У мене також є кілька односимвольних функцій, таких як

функція - {
  якщо [[$ # -eq 0]]; потім
    cd "$ OLDPWD"
  ще
    вбудований - "$ @"
  фі
}
  • zmvВбудована, і
псевдонім zcp = 'noglob zmv -C'
псевдонім zln = 'noglob zmv -L'
псевдонім zmv = 'noglob zmv'
  • Поки я на це, noglobвбудований.

  • Функції precmdі preexecгачок: я використовую preexecдля встановлення заголовка мого терміналу, який включає в себе запущену команду, і precmdдля заміни команди на її вихідний код. Щось на зразок

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:
    • У порожньому командному рядку працює bg(так що Ctrl + Z Ctrl + Z призупиняє програму та негайно відновлює її у фоновому режимі).
    • У непустому командному рядку призупиніть поточне командне видання: дозвольте ввести ще одну команду, і коли цей другий командний рядок закінчений, я повертаю першу команду для редагування.
    • Для цього використовується така функція:
fancy-ctrl-z () {
  якщо [[$ # BUFFER -eq 0]]; потім
    bg
    zle redisplay
  ще
    zle push-input
  фі
}
zle -N фантазії-ctrl-z
bindkey '^ Z' fancy-ctrl-z
  • Найважливіші варіанти, що не стосуються завершення: setopt append_history autocd extended_glob no_match

3
Любіть хитрість ^ Z ^ Z, дякую! Спочатку шукав superuser.com/questions/378018 для рішення, щоб прив'язати його до однієї клавіші, але ^ Z ^ Z має набагато більше сенсу
Євгеній Долженко

13

Здатність zsh до автозаповнення речей, крім файлів і каталогів.

Наприклад, із встановленим пакетом git git-sh {tab} відображає:

- команда git -
короткий журнал - підсумовує вихід журналу git
show-branch - показує гілки та їх коміти
show-index - відображає вміст файлу idx пакета

1
Так, це чудово! Я також використовую це, коли я не зовсім впевнений, що таке перемикач командного рядка, але мені не потрібно заглиблюватися у файл man.
Frew Schmidt

Я вважаю, що Баш має таку можливість.
Кіт Томпсон

10

Мені дуже подобаються світові псевдоніми

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

дозвольте мені робити такі речі

somecommand file arg L

і перейдіть на сторінку.


Мені також подобається G за grep.
Фров Шмідт

7

Як зазначають інші, автозаповнення zsh є відмінним.

Ви можете налаштувати власне автозаповнення для спеціальних команд без зайвих клопотів. Щоб встановити вкладку повних імен користувачів в якості аргументів пальцем:

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

Інші варіанти, які мені подобається встановити:

# 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 і popd також дуже зручні.

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

Роздратовано домашні та кінцеві клавіші за замовчуванням не працюють на zsh, як це робиться в інших оболонках, але ви можете це виправити.

# 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

2
Я, як правило, виправлення орфографії більше дратує, ніж насправді корисно.
Frew Schmidt

@Frew heh, ти не перша людина, яка мені це сказала. Однією з приємних особливостей виправлення є те, що вона внесе виправлену версію в історію, тож ви випадково не повторите те саме.
theoterreceive

5

Увімкніть автоматичне завершення під час використання scpна віддаленому сервері.

Правильний запит на відображення додаткової інформації.


Справді! У мене дуже складний, але короткий підказки. Ім'я хоста [поточний рядок] <помилка ні>%
Frew Schmidt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.