Z Shell — очень мощный и эффективный инструмент. Про него можно было бы написать многотомную книжку, но я ограничусь описанием своего файла конфигурации .zshrc.
Автодополнение
Пожалуй, это самая эффектная «фича». Z Shell умеет дополнять не только имена файлов, но и многое другое — например, параметры командной строки многих приложений. Итак, для начала надо включить автодополнение:
autoload -U compinit compinit -C
Стало значительно веселее! После этого попробуйте набрать ls - и нажать Tab — вы увидите список опций команды ls.
Автодополнение удобнее всего в «режиме меню» — когда по вариантам можно перемещаться при помощи стрелок (и выбирать нужный вариант Enter'ом). Включается он так:
zstyle ':completion:*' menu yes select
Очень полезная штука — автодополнение имён хостов. Вот пример варианта с простым перечислением нужных хостов (вместо них надо вписать свои):
hosts=(example.com example.net kastaneda.kiev.ua) zstyle '*' hosts $hosts
Впрочем, поддерживать такой список хостов бывает не очень удобно. Мне проще брать имена «знакомых» хостов из файла known_hosts:
hosts=(`cat ~/.ssh/known_hosts | tr , " " | awk '{ print $1 }'`)
zstyle '*' hosts $hosts
Следует отметить, что в Debian GNU/Linux по умолчанию включена опция HashKnownHosts, (чёртовы параноики!) из-за которой вместо имён хостов в файл known_hosts попадают хеши этих имён. Я обычно отключаю эту опцию.
Я никогда не хожу по ssh с использованием системных логинов (таких, как bin, uucp или lp). Все они безжалостно игнорируются:
zstyle ':completion:*:(ssh|scp):*:users' ignored-patterns `cat /etc/passwd | awk -F ":" '{ if($3<1000) print $1 }'`
Автодополнение номеров процессов (например, для команды kill) по умолчанию показывает список принадлежащих вам процессов. Можно вместо этого показывать список всех процессов:
zstyle ':completion:*:processes' command 'ps xua' zstyle ':completion:*:processes' sort false zstyle ':completion:*:processes-names' command 'ps xho command' zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31'
Всё цветное!
Вот так вывод команды ls будет подсвечивать разными цветами файлы в зависимости от их типа:
eval `dircolors` alias ls='ls --color=auto'
А вот так — автодополнение имён файлов и каталогов будет использовать те же цвета:
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
А вы знаете, что grep умеет подсвечивать найденный шаблон?
export GREP_OPTIONS='--color=auto' export GREP_COLOR='1;32'
Если у вас стоит grc, то им можно раскрасить ещё несколько программ:
if [ -f /usr/bin/grc ]; then alias ping="grc --colour=auto ping" alias traceroute="grc --colour=auto traceroute" alias make="grc --colour=auto make" alias diff="grc --colour=auto diff" alias cvs="grc --colour=auto cvs" alias netstat="grc --colour=auto netstat" fi
Красивый prompt
Раньше у меня использовался одно из штатных приглашений командной строки:
autoload promptinit promptinit prompt walters
Сейчас как-то попроще:
PS1='%T %m%# ' PS2='> ' RPROMPT='%~'
А вот эта штука покажет в заголовке эмулятора терминала (или в названии окна screen'а) выполняющуюся сейчас команду (либо текущий каталог, если ничего не выполняется):
case $TERM in
xterm*|rxvt)
precmd () { print -Pn "\e]0;%n@%m: %~\a" }
preexec () { print -Pn "\e]0;%n@%m: $1\a" }
;;
screen)
precmd () { print -Pn "\033k%~\033\\" }
preexec () { print -Pn "\033k$1\033\\" }
;;
esac
Всякое разное
У меня в домашнем каталоге обычно есть подкаталог bin/ для хранения скриптов и всякой мелочи. Желательно иметь его у себя в $PATH:
if [ -d ~/bin ] ; then
PATH=~/bin:"${PATH}"
fi
Разные мелочи настройки Zsh:
setopt autocd setopt extended_glob setopt correct
Ну и «на закуску» — alias'ы и всякая ерунда:
alias sdr="screen -aAdr"
alias la="ls -A"
alias ll="ls -lA"
alias grep='grep --exclude="*.svn*"'
alias iddqd="sudo -s"
alias mkpasswd="head -c16 /dev/urandom | xxd -ps"
fix_mp3() { find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1 }
mpg2flv() { ffmpeg -i $1 -ar 22050 -ab 32 -f flv -s 320x240 `echo $1 | awk -F . '{print $1}'`.flv }
mcd() { mkdir $1; cd $1 }
newday() { mcd `date +%F` }
c() { awk "{ print \$$1 }" }
svnid() { svn propset svn:keywords "Author Date Id Revision" $1 }
ignore() { svn propedit svn:ignore . }