32

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

6 ответов6

48

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

cd old new

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

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

cd larry sergei
21

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

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

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

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

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

function - {
  if [[ $# -eq 0 ]]; then
    cd "$OLDPWD"
  else
    builtin - "$@"
  fi
}
  • zmv , и
alias zcp='noglob zmv -C'
alias zln='noglob zmv -L'
alias 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 () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
  • Наиболее важные опции, не связанные с завершением: setopt append_history autocd extended_glob no_match
13

Способность zsh к автозаполнению, кроме файлов и каталогов.

Например, с установленным пакетом git, git-sh {tab} вызывает:

- git command -
shortlog     -- summarizes git log output
show-branch  -- shows branches and their commits
show-index   -- displays contents of a pack idx file
10

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

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

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

somecommand file arg L

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

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
5

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .