Я много работаю в терминале, поэтому я многое узнал о своей оболочке, zsh. Какие функции zsh вы используете, чтобы сделать себя намного более продуктивным на работе? Один из моих любимых - автозаполнение с несколькими режиссерами. Поэтому вместо того, чтобы набирать cd /fo{tab}/ba{tab}/ba{tab}
я могу просто сделать cd /fo/ba/ba{tab}
и сохранить столько нажатий клавиш!
6 ответов
Просто нашел этот маленький драгоценный камень:
cd old new
Эта форма cd
заменяет все вхождения old
в полном пути текущего каталога на new
и пытается изменить рабочий каталог на результирующий путь.
Например, если ваш рабочий каталог - /home/larry/code/backrub/server
и вы хотите переключиться на /home/sergei/code/backrub/server
, все, что вам нужно сделать, это:
cd larry sergei
Я буду придерживаться того, что, насколько я знаю, Баш не может сделать.
Необычное завершение. Да, в 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
Способность 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
Мне очень нравятся глобальные псевдонимы, так
alias -g L='|less
alias -g DN='>/dev/null'
позвольте мне делать такие вещи, как
somecommand file arg L
и получить пейджинг.
Как уже упоминалось, автозаполнение 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
Включите автозаполнение при использовании scp
на удаленном сервере.
Правильная подсказка для отображения дополнительной информации.