arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
Пока компилятся пакеты решил заняться немного "полезным" =) "Статья" не претендует на описание чего то нового, но, возможно, кому то пригодится при кастомизации шелла у себя (периодически у меня знакомые просят показать мой конфиг). Также дополнения (мб и замечания?) приветствуются. Сразу замечу, что конфиг с livecd меня не устроил по причине его громоздкости и лишнего для меня. 1. Установка запчастей Что нужно для работы основной части конфига: pkgfile (для подсказок), сам шелл, комплит к нему и подсветка синтаксиса pacman -S pkgfile zsh zsh-completions zsh-syntax-highlighting 2. Конфигурация самого шелла Все опции могут быть найдены тут. Указываем файл с историей, число команд хранящихся в кэше текущего сеанса и число команд, хранящихся в файле. # history HISTFILE=~/.zsh_history HISTSIZE=500000 SAVEHIST=500000 Раскраска! # highlighting source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern) # brackets ZSH_HIGHLIGHT_STYLES[bracket-level-1]='fg=blue,bold' ZSH_HIGHLIGHT_STYLES[bracket-level-2]='fg=red,bold' ZSH_HIGHLIGHT_STYLES[bracket-level-3]='fg=yellow,bold' ZSH_HIGHLIGHT_STYLES[bracket-level-4]='fg=magenta,bold' # cursor #ZSH_HIGHLIGHT_STYLES[cursor]='bg=blue' # main # default ZSH_HIGHLIGHT_STYLES[default]='none' # стандартный цвет # unknown ZSH_HIGHLIGHT_STYLES[unknown-token]='fg=red' # неизвестная команда # command ZSH_HIGHLIGHT_STYLES[reserved-word]='fg=magenta,bold' # зарезервированное слово ZSH_HIGHLIGHT_STYLES[alias]='fg=yellow,bold' # алиас ZSH_HIGHLIGHT_STYLES[builtin]='fg=green,bold' # built-in функция (например, echo) ZSH_HIGHLIGHT_STYLES[function]='fg=green,bold' # функция, определенная в шелле ZSH_HIGHLIGHT_STYLES[command]='fg=green' # обычная команда ZSH_HIGHLIGHT_STYLES[precommand]='fg=blue,bold' # пре-команда (например, sudo в sudo cp ...) ZSH_HIGHLIGHT_STYLES[commandseparator]='fg=yellow' # разделитель команд, && || ; ZSH_HIGHLIGHT_STYLES[hashed-command]='fg=green' # команда, найденная в путях (hashed) ZSH_HIGHLIGHT_STYLES[single-hyphen-option]='fg=blue,bold' # флаги типа -* ZSH_HIGHLIGHT_STYLES[double-hyphen-option]='fg=blue,bold' # флаги типа --* # path ZSH_HIGHLIGHT_STYLES[path]='fg=cyan,bold' # станлартный путь ZSH_HIGHLIGHT_STYLES[path_prefix]='fg=cyan' # префикс пути ZSH_HIGHLIGHT_STYLES[path_approx]='fg=cyan' # примерный путь # shell ZSH_HIGHLIGHT_STYLES[globbing]='fg=cyan' # шаблон (например, /dev/sda*) ZSH_HIGHLIGHT_STYLES[history-expansion]='fg=blue' # подстановка из истории (команда, начинающаяся с !) ZSH_HIGHLIGHT_STYLES[assign]='fg=magenta' # присвоение ZSH_HIGHLIGHT_STYLES[dollar-double-quoted-argument]='fg=cyan' # конструкции типа "$VARIABLE" ZSH_HIGHLIGHT_STYLES[back-double-quoted-argument]='fg=cyan' # конструкции типа \" ZSH_HIGHLIGHT_STYLES[back-quoted-argument]='fg=blue' # конструкции типа `command` # quotes ZSH_HIGHLIGHT_STYLES[single-quoted-argument]='fg=yellow,underline' # конструкции типа 'text' ZSH_HIGHLIGHT_STYLES[double-quoted-argument]='fg=yellow' # конструкции типа "text" # pattern #ZSH_HIGHLIGHT_PATTERNS+=('rm -rf *' 'fg=white,bold,bg=red') # root #ZSH_HIGHLIGHT_STYLES[root]='bg=red' Так как я условно "виндузятник", то никак не могу запомнить все эти ctrl-a и прочее, потому использую стандартные home-end... # bindkeys bindkey '^[[A' up-line-or-search # up arrow for back-history-search bindkey '^[[B' down-line-or-search # down arrow for fwd-history-search bindkey '\e[1~' beginning-of-line # home bindkey '\e[2~' overwrite-mode # insert bindkey '\e[3~' delete-char # del bindkey '\e[4~' end-of-line # end bindkey '\e[5~' up-line-or-history # page-up bindkey '\e[6~' down-line-or-history # page-down Автокомплит: # autocomplit autoload -U compinit compinit zstyle ':completion:*' insert-tab false zstyle ':completion:*' max-errors 2 Приглашение: # promptinit autoload -U promptinit promptinit # colors autoload -U colors colors Куча опций Чтобы переходить в другую директорию не по старинке "cd /path/to/dir", а просто "/path/to/dir" # autocd setopt autocd # correct setopt CORRECT_ALL SPROMPT="Correct '%R' to '%r' ? ([Y]es/[N]o/[E]dit/[A]bort) " # append history setopt APPEND_HISTORY # ignore dups in history setopt HIST_IGNORE_ALL_DUPS # ighore additional space in history setopt HIST_IGNORE_SPACE # reduce blanks in history setopt HIST_REDUCE_BLANKS # disable beeps unsetopt beep # autoload calc autoload zcalc # pkgfile source /usr/share/doc/pkgfile/command-not-found.zsh 3. Левое и правое приглашение Левое приглашение (у меня один конфиг для всех пользователей): # PROMPT && RPROMPT if [[ $EUID == 0 ]]; then # [root@host dir]# PROMPT="%{$fg_bold[white]%}[%{$reset_color%}\ %{$fg_bold[red]%}%n%{$reset_color%}\ %{$fg_bold[white]%}@%{$reset_color%}\ %{$fg_no_bold[red]%}%m %{$reset_color%}\ %{$fg_bold[yellow]%}%1/%{$reset_color%}\ %{$fg_bold[white]%}]# %{$reset_color%}" else # [user@host dir]$ PROMPT="%{$fg_bold[white]%}[%{$reset_color%}\ %{$fg_bold[green]%}%n%{$reset_color%}\ %{$fg_bold[white]%}@%{$reset_color%}\ %{$fg_no_bold[green]%}%m %{$reset_color%}\ %{$fg_bold[yellow]%}%1/%{$reset_color%}\ %{$fg_bold[white]%}]$ %{$reset_color%}" fi black red green yellow blue magenta cyan white %n - имя пользователя %m - хостнейм %M - хостнейм %l - текущая tty %? - код возврата предыдущего приложения %# - # для рута и % для обычных пользователей %T - время (HH:MM) %* - время (HH:MM:SS) %D - дата (YY-MM-DD) %~ - текущая директория, хомяк будет заменен на ~ %d - то же, но без замены %1/ - то же, но только последняя директория У меня ноутбук, так что я захотел себе еще заряд батареи вынести (нужен acpi из реп) precmd () { # Battery charge function batcharge { bat_perc=`acpi | awk {'print $4;'} | sed -e "s/\s//" -e "s/%.*//"` if [[ $bat_perc < 15 ]]; then col="%{$fg_bold[red]%}" elif [[ $bat_perc < 50 ]]; then col="%{$fg_bold[yellow]%}" else col="%{$fg_bold[green]%}" fi echo "%{$fg_bold[white]%}["$col$bat_perc"%{$fg_bold[white]%}%%]%{$reset_color%}" } # last command returncode="%(?.%{$fg[green]%}.%{$fg[red]%})%?%{$resetcolor%}" RPROMPT="%{$fg_bold[white]%}[%{$reset_color%}\ %{$fg_bold[cyan]%}%T%{$reset_color%}\ %{$fg_bold[white]%}] %{$reset_color%}"\ $(batcharge)\ "%{$fg_bold[white]%}[%{$reset_color%}"\ $returncode\ "%{$fg_bold[white]%}]%{$reset_color%}" ТОЖЕ САМОЕ, Ъ-МЕТОД: # PROMPT && RPROMPT if [[ $EUID == 0 ]]; then # [root@host dir]# PROMPT=$'%{\e[1;37m%}[%{\e[1;31m%}%n%{\e[1;37m%}@%{\e[0;31m%}%m %{\e[1;33m%}%1/%{\e[1;37m%}]#%{\e[0m%} ' else # [user@host dir]$ PROMPT=$'%{\e[1;37m%}[%{\e[1;32m%}%n%{\e[1;37m%}@%{\e[0;32m%}%m %{\e[1;33m%}%1/%{\e[1;37m%}]$%{\e[0m%} ' fi precmd () { # Battery charge function batcharge { bat_perc=`acpi | awk {'print $4;'} | sed -e "s/\s//" -e "s/%.*//"` if [[ $bat_perc < 15 ]]; then col='%{\e[1;31m%}' elif [[ $bat_perc < 50 ]]; then col='%{\e[1;33m%}' else col='%{\e[1;32m%}' fi echo '%{\e[1;37m%}['$col$bat_perc'%{\e[1;37m%}%%]%{\e[0m%}' } RPROMPT=$'%{\e[1;37m%}[%{\e[1;36m%}%T%{\e[1;37m%}]%{\e[0m%} '$(batcharge) } 0 обычные цвета 1 яркие цвета 3 наклонный 4 подчеркнутый 5 мигающий 30 черный 31 красный 32 зеленый 33 желтый 34 синий 35 фиолетовый 36 циановый 37 белый 40 черный фон 41 красный фон 42 зеленый фон 43 желтый фон 44 синий фон 45 фиолетовый фон 46 циановый фон 47 белый фон 4. Алиасы Сразу оговорюсь, НЕ ПЕРЕНОСИТЕ ИХ БЕЗДУМНО. Алиасы, использующие приложения, которых у вас нет в системе, сфейлятся и не дадут загрузиться конфигу полностью. Функция для повышения секурности (вдруг вам алиасы изменили, чтобы пароль украсть, а тут команда вам подскажет, что вы запускаете) show_which() { OUTPUT=$(which $1 | cut -d " " -f7-) echo "Running '$OUTPUT'" 1>&2 } ## alias # для цветного грепа alias grep='grep --colour=auto' # замена top на htop alias top='show_which top && htop' # использование хрома для хотьбы через разные прокси-серверы (i2p и tor included) alias chrommsu='show_which chrommsu && chromium --proxy-server=cache.msu:3128' alias chromtor='show_which chromtor && chromium --proxy-server="socks://localhost:9050" --incognito' alias chromi2p='show_which chromi2p && chromium --proxy-server="http=127.0.0.1:4444;https=127.0.0.1:4445" --incognito' # человеческие df и du alias df='show_which df && df -k --print-type --human-readable' alias du='show_which du && du -k --total --human-readable' # замена less и zless на симпотяшный vimpager alias less='vimpager' alias zless='vimpager' # чтобы rm был более интерактивным (усложняет выстрелить себе в ногу) alias rm='show_which rm && rm -I' su () { checksu=0 for flags in $*; do if [[ $flags == "-" ]]; then checksu=1 fi done if [[ $checksu == 0 ]]; then echo "Use 'su -', Luke" /usr/bin/su - $* else /usr/bin/su $* fi } alias ls='show_which ls && ls --color=auto' alias ll='show_which ll && ls --group-directories-first -l --human-readable' alias lr='show_which lr && ls --recursive' alias la='show_which la && ll --almost-all' alias lx='show_which lx && ll -X --ignore-backups' alias lz='show_which lz && ll -S --reverse' alias lt='show_which lt && ll -t --reverse' alias lm='show_which lm && la | more' # alias -s alias -s {avi,mpeg,mpg,mov,m2v,mkv}=mpv alias -s {mp3,flac}=qmmp alias -s {odt,doc,xls,ppt,docx,xlsx,pptx,csv}=libreoffice alias -s {pdf}=okular autoload -U pick-web-browser alias -s {html,htm}=opera # sudo alias if [[ $EUID == 0 ]]; then alias fat32mnt='show_which fat32mnt && mount -t vfat -o codepage=866,iocharset=utf8,umask=000' alias synctime='show_which synctime && { ntpd -qg; hwclock -w; date; }' else alias fat32mnt='show_which fat32mnt && sudo mount -t vfat -o codepage=866,iocharset=utf8,umask=000' alias umount='show_which umount && sudo umount' alias mount='show_which mount && sudo mount' alias netctl='show_which netctl && sudo netctl' alias synctime='show_which synctime && { sudo ntpd -qg; sudo hwclock -w; date; }' alias wifi-menu='show_which wifi-menu && sudo wifi-menu' alias dhcpcd='show_which dhcpcd && sudo dhcpcd' alias journalctl='show_which journalctl && sudo journalctl' alias systemctl='show_which systemctl && sudo systemctl' alias modprobe='show_which modprobe && sudo modprobe' alias rmmod='show_which rmmod && sudo rmmod' alias staging-i686-build='show_which staging-i686-build && sudo staging-i686-build' alias staging-x86_64-build='show_which staging-x86_64-build && sudo staging-x86_64-build' fi cat file g foo cat file | grep foo # global alias alias -g g="| grep" alias -g l="| less" alias -g t="| tail" alias -g h="| head" alias -g dn="&> /dev/null &" 5. Переменные Путь # path export PATH="$PATH:$HOME/bin" # umask umask 022 # editor export EDITOR="vim" export PAGER="vimpager" Хэши. Типа как вы вводите ~user эквивалентно /home/user, то тут ~global эквивалентно /mnt/global # hash hash -d global=/mnt/global hash -d windows=/mnt/windows hash -d iso=/mnt/iso hash -d u1=/mnt/usbdev1 hash -d u2=/mnt/usbdev2 6. Функции Мне лень набирать xrandr че-та че-та, потому специальная функция, которая все сделает за меня. # function to contorl xrandr # EXAMPLE: projctl 1024x768 projctl () { if [ $1 ] ; then if [ $1 = "-h" ]; then echo "Usage: projctl [ off/resolution ]" return fi if [ $1 = "off" ]; then echo "Disable VGA1" xrandr --output VGA1 --off --output LVDS1 --mode 1366x768 else echo "Using resolution: $1" xrandr --output VGA1 --mode $1 --output LVDS1 --mode $1 fi else echo "Using default resolution" xrandr --output VGA1 --mode 1366x768 --output LVDS1 --mode 1366x768 fi } # function to extract archives # EXAMPLE: unpack file unpack () { if [[ -f $1 ]]; then case $1 in *.tar.bz2) tar xjfv $1 ;; *.tar.gz) tar xzfv $1 ;; *.tar.xz) tar xvJf $1 ;; *.bz2) bunzip2 $1 ;; *.gz) gunzip $1 ;; *.rar) unrar x $1 ;; *.tar) tar xf $1 ;; *.tbz) tar xjvf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "I don't know how to extract '$1'" ;; esac else case $1 in *help) echo "Usage: unpack ARCHIVE_NAME" ;; *) echo "'$1' is not a valid file" ;; esac fi } # function to create archives # EXAMPLE: pack tar file pack () { if [ $1 ]; then case $1 in tar.bz2) tar -cjvf $2.tar.bz2 $2 ;; tar.gz) tar -czvf $2.tar.bz2 $2 ;; tar.xz) tar -cf - $2 | xz -9 -c - > $2.tar.xz ;; bz2) bzip $2 ;; gz) gzip -c -9 -n $2 > $2.gz ;; tar) tar cpvf $2.tar $2 ;; tbz) tar cjvf $2.tar.bz2 $2 ;; tgz) tar czvf $2.tar.gz $2 ;; zip) zip -r $2.zip $2 ;; 7z) 7z a $2.7z $2 ;; *help) echo "Usage: pack TYPE FILES" ;; *) echo "'$1' cannot be packed via pack()" ;; esac else echo "'$1' is not a valid file" fi } pacman () { /usr/bin/sudo /usr/bin/pacman $* && echo "$*" | grep -q "S\|R" && rehash } yaourt () { /usr/bin/yaourt $* && echo "$*" | grep -q "S\|R" && rehash } # для использования тестовых репозиториев без дополнительных телодвижений (оно мне надо) # файл содержит раскомменченные тестинги /etc/pactest.conf yatest () { /usr/bin/yaourt --config /etc/pactest.conf $* && echo "$*" | grep -q "S\|R" && rehash } 7. Обещанный скриншот 8. Сам файл github (почти актуальная версия) P.S. главное, не бойтесь экспериментировать=) |
akorop |
|
Темы:
111
Сообщения:
1756
Участник с: 29 февраля 2012
|
Спасибо! Мне очень понравился поиск в истории по стрелке вверх и переход к каталогам без cd. Ну и ещё замечательная идея (не связанная, впрочем, именно с zsh) - это алиасы с sudo. Особенно хороша в сочетании с беспарольным sudo, как у меня. |
Jisatsu |
|
Темы:
17
Сообщения:
389
Участник с: 14 июня 2013
|
В закладочки. Спасибо за труды. =) Обожаю этот шелл. Всего раз попробовал и забыл про баш навсегда. Вообще я использую вот эти конфиги. Но теперь я смогу их и подкорректировать, и написать свою тему. ;)
Keep it simple, stupid!
|
nafanja |
|
Темы:
94
Сообщения:
9252
Участник с: 02 июня 2012
заблокирован
|
HISTFILE=~/.histfile # pathа разве не правильнее заюзать вот так ~/.zshenv typeset -U path path=(~/.local/bin $path) и пользовательский bin должен перекрывать локальный /usr/local/bin и системный /usr/bin, так что он должен быть вначале $PATH
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874 |
palpalych |
|
Темы:
89
Сообщения:
1127
Участник с: 09 августа 2011
|
arcanisТак и не понял зачем это...
Арчи ~]$ ...as always want ready-made solutions that would make even tastier
|
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
nafanjaога, но дело вкуса. Главное было показать, как можно сделать. nafanjaценное замечание по поводу перекрывания и того, как должно выглядеть. Но (опять же имхота) мне удобнее, когда настройки как можно менее размазаны по разным файлам. А по поводу перекрытия я бы лучше советовал использовать разные команды) palpalychви таки шелл не настраиваете? |
muffinmad |
|
Темы:
1
Сообщения:
45
Участник с: 17 июля 2012
|
А как zsh научить, чтоб после установки программы через pacman, к примеру, она была в автокомплите видна? |
dekonix |
|
Темы:
3
Сообщения:
10
Участник с: 19 ноября 2011
|
Огромное спасибо) Добавил еще показ используемой ветки gitfunction git_promt { if ! git rev-parse --git-dir > /dev/null 2>&1; then return 0 fi git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p') echo '%{\e[1;37m%}[%{\e[1;32m%}'$git_branch'%{\e[1;37m%}]%{\e[0m%}' } RPROMPT=$(git_promt)$' %{\e[1;37m%}[%{\e[1;36m%}%T%{\e[1;37m%}]%{\e[0m%} '$(batcharge) |
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
muffinmadлегко pacman () { /usr/bin/sudo /usr/bin/pacman $* && echo "$*" | grep -q "S\|R" && rehash } yaourt () { /usr/bin/yaourt $* && echo "$*" | grep -q "S\|R" && rehash } Отписался в апстрим |
arcanis |
|
Темы:
31
Сообщения:
1496
Участник с: 09 сентября 2012
|
небольшое изменение. Переместил zsh-completions и zsh-syntax-highlighting в репы. Теперь их можно установить прямо с установочного образа без дополнительных плясок (навроде ручной сборки, например). Добавил цвета (теперь все). Добавил к ним описание. Изменил скриншот. Отредактировал приглашения |