Какие функции zsh вы используете? [закрыто]

33

Я много работаю в терминале, поэтому я многое узнал о своей оболочке, zsh. Какие функции zsh вы используете, чтобы сделать себя намного более продуктивным на работе? Один из моих любимых - автозаполнение с несколькими режиссерами. Поэтому вместо того, чтобы печатать, cd /fo{tab}/ba{tab}/ba{tab}я могу просто cd /fo/ba/ba{tab}сохранить и сохранить столько нажатий клавиш!

Фрю Шмидт
источник
2
я не знал об этой функции, я должен попробовать ее!
Рой Рико
1
Какой вариант этого каталога автозаполнения?
Hometoast

Ответы:

50

Просто нашел этот маленький драгоценный камень:

cd old new

Эта форма cdзаменяет все вхождения oldв полном пути к текущему каталогу newи пытается изменить рабочий каталог на результирующий путь.

Например, если ваш рабочий каталог /home/larry/code/backrub/serverи вы хотите переключиться /home/sergei/code/backrub/server, все, что вам нужно сделать, это:

cd larry sergei
Агнель Курьян
источник
7
Хорошо, это правила.
Hometoast
21

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

  • Необычное завершение. Да, в bash есть некоторые из них, но zsh знает больше команд, часто более точен и имеет гораздо больше возможностей для конфигурации.

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

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

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

функция - {
  if [[$ # -eq 0]]; тогда
    CD "$ OLDPWD"
  еще
    встроенный - "$ @"
  фи
}
  • zmvВстроенная, и
псевдоним zcp = 'noglob zmv -C'
псевдоним zln = 'noglob zmv -L'
псевдоним 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 () {
  if [[$ # BUFFER -eq 0]]; тогда
    Б.Г.
    Zle Redisplay
  еще
    zle push-input
  фи
}
zle -N fancy-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 -
shortlog - обобщает вывод журнала git
show-branch - показывает ветки и их коммиты
show-index - отображает содержимое файла пакета idx
Марк Талман
источник
1
Да, это отлично! Я также использую это, когда я не совсем уверен, что такое переключатель командной строки, но мне не нужно копаться в файле man.
Фрю Шмидт
Я верю, что у bash есть такая возможность.
Кит Томпсон
10

Мне очень нравятся глобальные псевдонимы, так

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

позвольте мне делать такие вещи, как

somecommand file arg L

и получить пейджинг.

hometoast
источник
Мне также нравится G для grep.
Фрю Шмидт
7

Как уже упоминалось, автозаполнение Zsh отлично.

Вы также можете настроить собственное автозаполнение для пользовательских команд без особых хлопот. Чтобы отобразить полные имена пользователей в качестве аргументов для finger:

# ~/.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

К сожалению, клавиши home и end по умолчанию не работают на 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
theotherreceive
источник
2
Я нахожу исправление орфографии более раздражающим, чем на самом деле полезным.
Фрю Шмидт
@Frew хе, ты не первый, кто мне это говорит. Одна из приятных особенностей исправления заключается в том, что исправленная версия помещается в историю, поэтому вы случайно не запустите ту же вещь снова.
другой прием
5

Включить автозаполнение при использовании scpна удаленном сервере.

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

Роб Уэллс
источник
Верно! У меня очень сложная, но короткая подсказка. Имя хоста [текущая строка] <ошибка №>%
Фрю Шмидт