Конфигурация для ZSH (файл .zshrc)


8 комментариев
На днях я просмотрел демонстрационное видео с технологией Ubuntu HUD. Идея отлична, и получит множество поклонников. Однако использование этой системы в терминале вызвало у меня только одну эмоцию: "HUD в консоли?! Да мой zsh куда практичнее будет!". Потом я вспомнил про то, как несколько недель усердно настраивал свой новенький шелл, перерывая весь интернет и стандартные шаблоны, а потом русифицировал отобранное... Зато теперь у меня уже около полугода идеальный шелл, с которым не страшно провести день в консоли.

Вы хотите командную оболочку для консоли, которая имеет множество полезных функций, которых нет в дефолтном баше? Если ответ положительный, то Вы на правильном пути!

После установки Вы получите шелл, имеющий продвинутое автодополнение по TAB (в том числе разворачивание команд - /h/v в /home/vladimir), улучшенное управление файлами, продвинутые функции для работы и многое другое!

Все нижеописанные команды обратимы и не нанесут никакого вреда системе. Конфигурация применима ко всем версиям оболочки.

Примечание: данный рецепт настраивает оболочку для текущего пользователя. Для root'а и прочих пользователей эти действия нужно будет повторить. Как альтернативный способ установки конфигурации "для всех" вполне применим вариант размещения приведённого текста в файле "/etc/zsh/zshrc".

  1. Устанавливаем Z-Shell командой "sudo apt-get install zsh"
  2. Делаем его оболочкой по-умолчанию: "chsh -s /bin/zsh"
  3. Создаём в домашнем каталоге файл .zshrc: "touch ~/.zshrc"
  4. Любимым текстовым редактором приводим файл к такому виду:
#Z-Shell configuration by Vlsu (http://vlsu.blogspot.com)
autoload -U compinit   
compinit -D    
autoload colors && colors   
autoload zcalc     
zstyle ':completion:*' menu yes select 
autoload -U url-quote-magic
zle -N self-insert url-quote-magic
autoload -U pick-web-browser
alias -s html=pick-web-browser

PROMPT="%{$fg[cyan]%}[%~] %{$reset_color%}%(#.%{$fg_bold[red]%}.%{$fg_bold[green]%})%n%{$reset_color%}%{$fg_bold[grey]%}@%m%{$reset_color%}%(?.%{$fg_bold[green]%}.%{$bg[red]%}%{$fg_bold[white]%}) >%{$reset_color%} "
SPROMPT="        Заменить $fg_bold[grey]'$reset_color$fg_bold[red]%R$reset_color$fg_bold[grey]'$reset_color на $fg_bold[grey]'$reset_color$fg_bold[green]%r$reset_color$fg_bold[grey]'$reset_color? ($fg_bold[grey]Y$reset_color$fg_bold[green]es$reset_color, $fg_bold[grey]N$reset_color$fg_bold[red]o$reset_color, $fg_bold[grey]A$reset_color$fg_bold[red]bort$reset_color, $fg_bold[grey]E$reset_color$fg_bold[blue]dit$reset_color) $fg_bold[green]>$reset_color "

bindkey -v

export TERM='xterm-256color'
export EDITOR='vim'
export PAGER='less'
export LC_ALL='ru_RU.UTF-8'
export LANG='ru_RU.UTF-8'
export LC_CTYPE=C
export BLOCKSIZE='Mb'
export GREP_COLOR='1;33'
export LESSCHARSET='UTF-8'
export OOO_FORCE_DESKTOP='gnome'
export LESS_TERMCAP_mb=$'\E[01;31m'       
export LESS_TERMCAP_md=$'\E[01;38;5;74m'  
export LESS_TERMCAP_me=$'\E[0m'           
export LESS_TERMCAP_so=$'\E[38;5;246m'    
export LESS_TERMCAP_se=$'\E[0m'           
export LESS_TERMCAP_us=$'\E[04;38;5;146m' 
export LESS_TERMCAP_ue=$'\E[0m'           

HISTFILE=~/.zsh-history
SAVEHIST=1000
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_IGNORE_SPACE
setopt INC_APPEND_HISTORY
setopt EXTENDED_HISTORY 
setopt histexpiredupsfirst histfindnodups
setopt CORRECT_ALL
setopt AUTO_CD
setopt SH_WORD_SPLIT
setopt IGNORE_EOF
setopt NO_BEEP
setopt extended_glob
setopt correct
setopt MENUCOMPLETE
setopt nohup
setopt ZLE
setopt MULTIBYTE
setopt NUMERIC_GLOB_SORT

precmd() {
  [[ -t 1 ]] || return
 case $TERM in
 *xterm*|rxvt|(dt|k|E|a)term*) print -Pn "\e]0;[%~] %n@%m\a" ;;
 screen(-bce|.linux)) print -Pn "\ek[%~]\e\" && print -Pn "\e]0;[%~] %n@%m (screen)\a" ;;  
 esac
}
preexec() {
 [[ -t 1 ]] || return
 case $TERM in
 *xterm*|rxvt|(dt|k|E|a)term*) print -Pn "\e]0;<$1> [%~] %n@%m\a" ;;
 screen(-bce|.linux)) print -Pn "\ek<$1> [%~]\e\" && print -Pn "\e]0;<$1> [%~] %n@%m (screen)\a" ;;
 esac
}
typeset -g -A key

ccd() { cd $1 && ls}
rmd(){ local P="`pwd`"; cd .. && rmdir "$P" || cd "$P"; }
rnm() {
    name=$1
    vared -c -p 'Переименовать в: ' name
    command mv $1 $name
}

mkd() { mkdir $1; cd $1 }

unpack() {
if [ -f $1 ] ; then
case $1 in
 *.tar.bz2)   tar xjf $1        ;;
 *.tar.gz)    tar xzf $1     ;;
 *.bz2)       bunzip2 $1       ;;
 *.rar)       unrar x $1     ;;
 *.gz)        gunzip $1     ;;
 *.tar)       tar xf $1        ;;
 *.tbz2)      tar xjf $1      ;;
 *.tgz)       tar xzf $1       ;;
 *.zip)       unzip $1     ;;
 *.Z)         uncompress $1  ;;
 *.7z)        7z x $1    ;;
 *)           echo "$fg_bold[red]Ошибка:$reset_color Невозможно распаковать '$1'..." ;;
esac
else
echo "$fg_bold[red]Ошибка:$reset_color '$1' - неподдерживаемый тип файла"
fi
}

pack() {
if [ $1 ] ; then
case $1 in
 tbz)    tar cjvf $2.tar.bz2 $2      ;;
 tgz)    tar czvf $2.tar.gz  $2    ;;
 tar)   tar cpvf $2.tar  $2       ;;
 bz2) bzip $2 ;;
 gz)  gzip -c -9 -n $2 > $2.gz ;;
 zip)    zip -r $2.zip $2   ;;
 7z)     7z a $2.7z $2    ;;
 *)      echo "$fg_bold[red]Ошибка:$reset_color '$1' не может быть упакован через pack()" ;;
esac
else
echo "$fg_bold[red]Ошибка:$reset_color '$1' - неподдерживаемый тип файла"
fi
}

ccopy(){ cp $1 /tmp/ccopy.$1; }
alias cpaste="ls /tmp/ccopy.* | sed 's|/tmp/ccopy.||' | xargs -I % mv /tmp/ccopy.% ./%"

alias mv='nocorrect mv -i'
alias cp='nocorrect cp -iR'
alias rm='nocorrect rm -i'
alias rmf='nocorrect rm -f'
alias rmrf='nocorrect rm -fR'
alias mkdir='nocorrect mkdir'
alias ls='ls --color=auto'   
alias lsd='ls -ld .*'    
alias lls='ls -alFh --color=auto'
alias grep='grep --color=auto'   
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias -g convKU="| iconv -c -f koi8r -t utf8"  
alias -g convCU="| iconv -c -f cp1251 -t utf8"
alias -g convUK="| iconv -c -f utf8 -t koi8r"  
alias -g convUC="| iconv -c -f utf8 -t cp1251"  
alias df='df -h'
alias du='du -h'
alias psgrep='ps aux | grep $(echo $1 | sed "s/^\(.\)/[\1]/g")'
alias dirtree='find . -type d | sed -e "s/[^-][^\/]*\//  |/g" -e "s/|\([^ ]\)/|-\1/"'

alias -s {txt,log,list}=vim
alias -s {pdf,djvu}="nohup evince"
alias -s {avi,mpeg,mpg,mov,m2v,flv}="nohup totem"
alias -s {ogg,mp3,wav,m3u,pls}="nohup totem"
alias -s {jpg,jpeg,png,gif,tif,tiff,bmp}="nohup eog"

zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always
zstyle ':completion:*:*:kill:*:processes' list-colors "=(#b) #([0-9]#)*=$color[cyan]=$color[red]"
zstyle ':completion:*:*:kill:*:processes' command 'ps --forest -A -o pid,user,cmd'
zstyle ':completion:*:processes-names' command 'ps axho command' 
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*::::' completer _expand _complete _correct _ignored _approximate
zstyle -e ':completion:*:approximate:*' max-errors 'reply=( $(( ($#PREFIX+$#SUFFIX)/3 )) numeric )'
zstyle ':completion:*:expand:*' tag-order all-expansions
zstyle ':completion:*' verbose yes
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*:options' auto-description '%d'
zstyle ':completion:*:descriptions' format '> %B%d%b'
zstyle ':completion:*:messages' format '> %d'
zstyle ':completion:*:warnings' format '> Ошибка: нет совпадений для: %d'
zstyle ':completion:*:corrections' format '> %B%d (число ошибок: %e)%b'
zstyle ':completion:*:correct:*' insert-unambiguous true
zstyle ':completion:*:correct:*' original true
zstyle ':completion:*:correct:*' prompt 'исправить на:'
zstyle ':completion:*' prompt 'Исправить (число ошибок: %e) > '
zstyle ':completion:*' group-name ''
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' 'r:|[._-]=** r:|=**' 'l:|=* r:|=*'
zstyle ':completion:*' match-original both
zstyle ':completion:*:matches' group 'yes'
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.o' '*?.c~''*?.old' '*?.pro'
zstyle ':completion:*:rm:*' ignore-line yes
zstyle ':completion:*:functions' ignored-patterns '_*'
zstyle ':completion:*:incremental:*' completer _complete _correct
zstyle ':completion:*:predict:*' completer _complete
zstyle ':mime:*' x-browsers firefox rekonq google-chrome konqueror chromium-browser
zstyle ':mime:*' tty-browsers w3m elinks links lynx
zstyle -e ':completion:*' hosts 'reply=($myhosts)'
zstyle ':completion:*' insert-tab true
zstyle ':completion:*' select-prompt '%SСтрока: %LЭлемент: %M[%p]%s'
zstyle ':completion:*' list-prompt '%SТекущее положение: %p%s'
zstyle ':completion:*' sort true
zstyle ':completion:*' file-sort name
zstyle ':completion:*' keep-prefix changed
zstyle ':completion:*:man:*' separate-sections true
zstyle ':completion:*:history-words' stop yes
zstyle ':completion:*:history-words' remove-all-dups yes
zstyle ':completion:*:history-words' list false
zstyle ':completion:*:history-words' menu yes select
zstyle ':completion:*' old-menu true
zstyle ':completion:*' original true
zstyle ':completion:*' substitute 1
zstyle ':completion:*' use-compctl true
zstyle ':completion:*' word true
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' squeeze-slashes true
zstyle ':completion:*:(ssh|scp|ftp):*' hosts $hosts
zstyle ':completion:*:(ssh|scp|ftp):*' users $users
zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~'
zstyle ':completion:*:*:*:users' ignored-patterns adm apache bin daemon games gdm halt ident junkbust lp mail mailnull named news nfsnobody nobody nscd ntp operator pcap postgres radvd rpc rpcuser rpm shutdown squid sshd sync uucp vcsa xfs

function dialogrun; { rm -rf $(dialog --separate-output --checklist file 100 100 100 $(for l in $(ls -A); do echo "$l" "$(test -d $l && echo "dir" || echo "file")" 0; done) --stdout); clear  }
zle -N dialogrun

Ну вот и всё! Пользуйтесь на здоровье!

8 комментариев


  1. А где можно посмотреть примеры конфигураций, откуда ты производил настройку?

    ОтветитьУдалить
    Ответы
    1. Несколько вещей я взял из сети, но большую часть из пакета "zsh-lovers", плюс добавил перевод интерфейса

      Удалить
  2. Порывался мигрировать на zsh несколько раз, но всегда отталкивала предстоящая возня с конфигами и настройкой. Случайно набрёл на гитхабе на oh-my-zsh. С его помощью буквально за пару минут переключился на zsh в качестве основного shell'а, о чём нисколечки не жалею. Подумываю написать заметку об этом.
    ZSH rocks! :-)

    ОтветитьУдалить
    Ответы
    1. Интересная находка, этот oh-my-zsh. С нетерпением ждём заметку об этом в "Краплёной колоде"

      Удалить
  3. Приветствую.
    Было бы классно увидеть несколько скриншотов того, что получилось в консоли.
    Ну или пару примеров фич, отличающих zsh от bash.
    Я тоже в раздумиях сменить баш... но консерватизм давит )))

    ОтветитьУдалить
    Ответы
    1. Было бы классно увидеть несколько скриншотов того, что получилось в консоли
      Там ничего особо интересного нет. Картинка не сможет передать все прелести использования zsh. Лучше поставить его себе, настроить и опробовать "на деле"

      Ну или пару примеров фич, отличающих zsh от bash
      Самое главное - это, конечно же, продвинутое автодополнение по нажатию TAB. Хоть файлов, хоть команд (с ключами, кстати)

      Я тоже в раздумиях сменить баш... но консерватизм давит )))
      Первая версия zsh вышла в 1990 году. Так что в некоторой степени это вполне консервативно :-)

      Удалить
  4. Ответы
    1. Всё нормально с ls... А в чём, собственно, проблема?

      Удалить



Лицензия:CC BY-NC-SA 3.0 Unported (c) : "Записки линуксоида Vlsu". 2011-2021 гг.
При копировании материалов сайта ссылка обязательна!Подробнее...

Полная версия | Мобильная версия | Динамический просмотр