Делаем из zsh мороженку

Z shell великолепная оболочка, которую просто стыдно не попробовать. Кусочек консольного счастья искрящийся шикарным автодополнением и очень гибко настраивающийся под любой вкус.

Установка #

sudo pacman -S zsh zsh-yaourt wget

Пользователь #

chsh -s $(which zsh)
wget -qNP ~ https://raw.github.com/ksevelyar/dotfiles/master/zsh/.zshrc

root #

sudo chsh -s $(which zsh)
sudo wget -qNP /root https://raw.github.com/ksevelyar/dotfiles/master/zsh/.zshrc

Готово, откройте новый терминал, чтобы увидеть zsh.

Оставшаяся часть статьи будет описанием опций установленного .zshrc.

Prompt и заголовок #

Если вы раньше настраивали шелл, то возможно помните жуткие последовательности символов в подобном стиле:

PROMPT=$'%{\e[0;30m%}[%{\e[0;35m%}%`%{\e[0;30m%}]%{\e[0m%} '

Конечно zsh позволяет использовать и их, но мы же не будем сыпать в вафельный рожок рублёные гвозди? Сделаем всё красиво.

Зададим цвета:

autoload -U colors && colors

for color in red green yellow blue magenta cyan black white; do
    eval $color='%{$fg_no_bold[${color}]%}'
    #eval ${color}_bold='%{$fg_bold[${color}]%}'
done

reset="%{$reset_color%}"

Покажем хост при подключении через ssh:

if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
  host="${black}[${blue}%m${black}] " #SSH
else
  unset host # no SSH
fi

Теперь можно задать prompt:

if [ "$EUID" -eq 0 ]; then
  PROMPT="${host}${red}[${magenta}%2`${red}]${reset} " # root
else
  PROMPT="${host}${black}[${magenta}%2`${black}]${reset} " # user
fi

Закорючки %2` означают две директории в пути. Подробнее здесь. Если показывать одну, то это слишком мало, а если полный путь, то слишком много.

А выглядит это примерно так:

zsh prompt

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

И установим заголовок для терминала:

case $TERM in
    xterm*|rxvt*|screen*)
         precmd() { print -Pn "\e]0;%m:%`\a" }
         preexec () { print -Pn "\e]0;$1\a" }
        ;;
esac

Тут всегда будет отображаться хост и полный путь.

Разное #

Позволяет не писать cd перед адресом:

setopt autocd

Совершенно невообразимые штуки: http://linuxshellaccount.blogspot.ru/2008/07/fancy-globbing-with-zsh-on-linux-and.html

setopt extended_glob

Можно вводить комментарии начинающиеся с #.

setopt interactive_comments

Чтобы по ctrl-w удалялся не весь текст до следующего пробела, а только до специсмвола, например /.

WORDCHARS=''@"

Ваш любимый редактор для команд вроде visudo и crontab -e.

export EDITOR="vim"

Жёлтый цвет для grep.

export GREP_COLORS="mt=33"
export GREP_OPTIONS='--color=auto'

Отключаем спикер.

unsetopt beep

Включаем autojump.

[[ -s /etc/profile.d/autojump.sh ]] && . /etc/profile.d/autojump.sh

И RVM.

[[ -s ~/.rvm/scripts/rvm ]] && source ~/.rvm/scripts/rvm
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting

История #

Файл и размер.

HISTFILE=$HOME/.zsh_history
HISTSIZE=9999
SAVEHIST=9999

Добавляет в историю время выполнения команды.

setopt extended_history

Обновляет историю после каждого нажатия enter.

setopt inc_append_history

История становится общей между всеми сессиями / терминалами.

setopt share_history

Игнорируем все дубликаты, строки начинающиеся с пробелов и пустые строки:

setopt hist_ignore_all_dups
setopt hist_ignore_space
setopt hist_reduce_blanks

Дополнение #

Дополнение по табу.

autoload -U compinit && compinit

Дополняем спрятанные .файлы:

_comp_options+=(globdots)

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

А еесли бы столбцов было больше, то их можно было переключать стрелками влево/вправо.

zstyle ':completion:*' menu select

Привязка клавиш #

В стиле Емакса.

bindkey -e

Кнопка Delete:

bindkey "\e[3`" delete-char

Начало и конец строки клавишами home и end.

bindkey "^[OH"  beginning-of-line 
bindkey "^[OF"  end-of-line

Поиск по подстроке, например если вы набрали rails gen, то нажимая стрелочку вверх вы по очереди будете получать все команды которые так начинались. И это мой основной способ поиска по истории:

bindkey "^[[A"  history-beginning-search-backward
bindkey "^[[B"  history-beginning-search-forward

Ctrl+Left/Right для перехода на слово назад/вперёд.

bindkey '^[[1;5D'   backward-word
bindkey '^[[1;5C'   forward-word

Допустим вы хотите привязать какую-нибудь клавишу, код которой не знаете. Как его узнать?

Введите команду cat без аргументов и нажмите нужную клавишу, чтобы увидеть её код.

Алиасы и функции #

Вывод последних команд если не указан аргумент, поиск по истории, если указан:

h() {
  if [[ -z "$1" ]]; then
    history
  else
    history 0 | grep "$*"
  fi
}

Устанавливаем корректные права для файлов и папок одной командой.

perms() {
  if [[ -z "$1" ]]; then
    find .    -type d -print0 | xargs -0 chmod 700
    find .    -type f -print0 | xargs -0 chmod 600
  else
    find "$*" -type d -print0 | xargs -0 chmod 700
    find "$*" -type f -print0 | xargs -0 chmod 600
  fi
}
permsg() {
  if [[ -z "$1" ]]; then
    find .    -type d -print0 | xargs -0 chmod 770
    find .    -type f -print0 | xargs -0 chmod 660
  else
    find "$*" -type d -print0 | xargs -0 chmod 770
    find "$*" -type f -print0 | xargs -0 chmod 660
  fi
}

Пингуем один раз вместо бесконечности.

alias ping='ping -c 1'

Базовые сокращения.

alias l='ls -lAh --color=auto --group-directories-first'
alias ls='ls --color=auto --group-directories-first'
alias g='grep'
alias se='sudoedit'

Cвободное пространство подключенных накопителей в удобоваримом формате.

alias df='df -h'

Размер файлов и папок в текущей директории, ncdu не заменит, но для беглой оценки годится.

alias du='du -h --max-depth=1 | sort -h'

Отправить монитор в спящий режим.

alias off='sleep 1; xset dpms force off'

Таймер, играет случайный .mp3 из /storage/music/fav, примеры использования:

Секунды: t 150, Минуты: t 90m, Часы: t 8h.

t() { (sleep "$1" && cd /storage/music/fav && mpg123 -q "$(ls | shuf -n1)" ) & }

Пакетные менеджеры Арча.

alias  y='yaourt -S --noconfirm'
alias yu='yaourt -Syu --aur --noconfirm'
alias ya='yaourt -Syu --aur'

alias yi='yaourt -Si'
alias ys='yaourt -Ss'

alias yr='yaourt -Rns'
alias yd='yaourt -Rdd'

alias pacman='sudo pacman'

Aptitude для Дебиана и родственных ему дистрибутивов.

alias  a='sudo aptitude install'
alias au='sudo aptitude update && sudo aptitude safe-upgrade'
alias ai='aptitude show'
alias as='aptitude search'

Пополняющийся список команд разработки.

# rails
alias rc='rails c'
alias rs='rails s'

# git
alias gd='git diff'
alias gs='git status'

gf() {
  git add -u
  git commit -m "$*"
  git push all --all
}

Добавляем все файлы, убираем все удалённые файлы, берём случайный текст коммита и отправляем в Мордор. Не пытайтесь повторить в коллективном репозитории:

alias random_commit='git commit -m "$(curl -s http://whatthecommit.com/index.txt)"'
alias grf='git add . ; git add -u ; random_commit ; git push'

Прочие опции #

man zshoptions

Комментарии

aderyabin

ohmyzsh наше все https://github.com/robbyrussell/oh-my-zsh

ksevelyar

Мне он показался перегруженным и не оптимальным. Хотя присутствует «изкоробочность» и интересные плагины, вроде history-substring-search:https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/history-substring-search.

Slava Semushin

Спасибо! Про SHARE_HISTORY и ls --group-directories-first не знал. Попробую.

Добавить комментарий