Портал

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Портал » Что подкрутить » bash по умолчанию. хочу zsh.


bash по умолчанию. хочу zsh.

Сообщений 1 страница 4 из 4

1

zsh более современная

зачем ?  автозавершение, раскраска. быстрый прыг в нужную папку.

с гитхаба не стоит тянуть. всё уже есть.

https://wiki.archlinux.org/index.php/Zsh_(Русский)
Как указать правильный ? сначала путь смотрим.
chsh -s $(which zsh)
затем
chsh -s полный-путь-до-оболочки

второе. удаляем свой zhrc и в /etc/skel тоже
ставим grml-zsh-config и получаем zhrc в /etc/skel
редактируем.

http://dobroserver.ru/delaem-iz-zsh-morozhenku

https://www.altlinux.org/DotFiles/Shells/Zsh/Советы

0

2

Первым делом я благодарю настоящих авторов этого и перечислил их чуть ниже.
Я оставил это здесь на память, чтобы все было в одном месте. Взято с форума archlinux.
авторы
1. https://archlinux.org.ru/forum/users/arcanis/ и его блог.
2. https://archlinux.org.ru/forum/users/Kycok/
3. https://archlinux.org.ru/forum/users/indeviral/

АВТОЗАВЕРШЕНИЕ, РАСКРАСКА

1. Источник раз https://archlinux.org.ru/forum/post/151946/
indeviral, arcanis в блогах написал хорошую статейку про настройку zsh, я именно благодаря ей переехал :) Конкретно для автокомплита с подсветкой и выбора соответствующего варианта стрелочками нужно прописать это:
autoload -U compinit
compinit
zstyle ':completion:*' max-errors 2
zmodload zsh/complist
zstyle ':completion:*' menu yes select
Также найдете там другие классные плюшки типа autocd и удобного поиска по истории. На всякий случай, мой актуальный конфиг
автор конфига https://archlinux.org.ru/forum/users/Kycok/
если ссылка на конфиг выше не актуальна, то 1 в 1 то же самое брать тут.

2. источник 2. мистер arcanis и его блогhttps://archlinux.org.ru/forum/topic/12752/
    копия содержимого в следующем сообщении

0

3

2. автор мистер arcanis и его блогhttps://archlinux.org.ru/forum/topic/12752/
    весь текст https://raw.github.com/arcan1s/dotfiles/master/zshrc конфига
 

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'

----------------

Для удобства я вытащил все, что есть. Сначала включаем подсветку синтаксиса, потом указываем, что мы хотим видеть - скобочки (brackets), основные цвета (main), специальный шаблон (pattern, нужно устанавливать отдельно, в примере для rm -rf), курсор (cursor), действия рута (root). Синтаксис настроек интуитивно понятен, bg - цвет фона, fg - цвет шрифта.

Так как я условно "виндузятник", то никак не могу запомнить все эти 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

Что тут важно - настройка стрелочек вверх-вниз (первые 2 строки) и настройка PageUp/PageDown (последние 2). В таком варианте стрелочки - поиск по УЖЕ введенной части команды, а PageUp/PageDown игнорируют то, что вы уже написали после приглашения командной строки.

Автокомплит:
# autocomplit
autoload -U compinit
compinit
zstyle ':completion:*' insert-tab false
zstyle ':completion:*' max-errors 2
Подключается полный автокомплит. В предпоследней строчке включается автодополнение, если вы ничего не набрали после приглашения (ненужно, но модно-стильно-молодежно). В последней - указываем максимальное возможное число опечаток, которые zsh может исправить при использовании автокомплита для команд
Приглашение:
# 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
# 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
Первая строка для рута (if true), вторая для других пользователей (if false). $fg - цвет текста, $bg - цвет фона. Дополнения _bold и _no_bold регулируют оттенок. Обратите внимание на бэкслеш в конце каждой строки (чтобы не переносилось). Сбросить цвета ($reset_color) нужно для регулирования оттенков. Команды (например, установку цвета) нужно обрамлять в %{ ... %}, чтобы не отображалось. Доступные цвета:
black
red
green
yellow
blue
magenta
cyan
white
Список переменных для promt'ов:
%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%}"
precmd - показывает, что вот этот кусок нужно каждый раз (к каждому новому приглашению) вычислять. Функция сама по себе довольная простая - определили заряд, подставили цвет, добавили к часам еще и заряд (скрин о5 же, ниже). С returncode немного магии. Конструкции $(if.true.false) в zsh есть условный оператор. Если код возврата true (равен 0), то ставим цвет зеленый, иначе - красный.

---------
ТОЖЕ САМОЕ, Ъ-МЕТОД:
# 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)
}
Конструкции типа %{\e[1;37m%} - начало цвета, {\e[0m%} - конец цвета. Цвета задаются так: модификатор;цвет;фон. Цифры для них приведены ниже:
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 красивый su - с подсказкой:
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
}
Алиасы для ls (man ls)
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-алиасы. Суть их в том, чтобы для 95% команд, которые требуют прав рута, не набирать sudo каждый раз
# 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 &"
Стандартные 4 + перенаправление всего, что можно, в черную дыру.

5. Переменные
Путь
# path
export PATH="$PATH:$HOME/bin"
Маска создаваемых файлов (число эквивалентно chmod $((666-$NUMBER))):
# umask
umask 022
Редактор и пейджер
# editor
export EDITOR="vim"
export PAGER="vimpager"
nafanja ниже подсказывает, что правильнее было бы немного по-другому.
Хэши. Типа как вы вводите ~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
}
Функции запаковки и распаковки архивов (к своему стыду, не помню большинства флагов для tar):
# 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
}

0

4

замечания к тому что выше
HISTFILE=~/.histfile
лучше .zsh_history по аналогии с .bash_history

# path
export PATH="$PATH:$HOME/bin"
а разве не правильнее заюзать вот так
~/.zshenv
typeset -U path
path=(~/.local/bin $path)
по поводу где настраиваются важные переменные и команды http://zsh.sourceforge.net/Intro/intro_3.html
и пользовательский bin должен перекрывать локальный /usr/local/bin и системный /usr/bin, так что он должен быть вначале $PATH

показ используемой ветки git
function 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)

как zsh научить, чтоб после установки программы через pacman, к примеру, она была в автокомплите видна?
легко
pacman () {
  /usr/bin/sudo /usr/bin/pacman $* && echo "$*" | grep -q "S\|R" && rehash
}

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » Портал » Что подкрутить » bash по умолчанию. хочу zsh.