Несколько полезных возможностей zsh

Недавно пошла мода, на использование в качестве шелла - zsh. Даже не знаю, откуда она взялась. В общем, не в этом и суть. Мода понесла за собой море статей на тему zsh, но нигде ничего интересно и полезного на мой взгляд не было. Не раскрывало и половины потенциала zsh. Я конечно, не претендую на полноту. Я лишь опишу то, что я действительно использую повседневно, и что позволяет мне обходится без файлового менеджера и переложить эти задачи на zsh.

И так, самое первое, это конечно же автодополнение по Tab. Все знают что оно крайне удобно и заметно более продвинутое чем в bash и других командных оболочках. Для него нужно добавить в конфиг следующее:

zstyle ':completion:*' completer _expand _complete _ignored
zstyle ':completion:*' group-name ''
zstyle ':completion:*' list-colors ''
zstyle ':completion:*' list-prompt '%SAt %p: Hit TAB for more, or the character to insert%s'
zstyle ':completion:*' max-errors 1
zstyle ':completion:*' menu select=long-list select=0
zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
zstyle ':completion:*' use-compctl false
zstyle ':completion:*' verbose true
zstyle :compinstall filename '/home/bosha/.zsh/.zshrc'
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'

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

Автодополнение в ZSH

Автодополнение в ZSH

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

setopt AUTO_CD

Теперь для перехода по каталогам не нужно использовать cd, но и это тоже далеко не предел :) Например можно перемещаться по директориям с использованием сокращённого ввода. Т.е. вместо /mnt/hard/music, можно написать /m/h/m/ и нажать Enter и сразу переместимся в каталог. Если вариантов перехода несколько, то zsh предложит выбрать:

autoload -Uz compinit  
compinit

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

extract () {
 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    ;;
 *.tbz)       tar xjvf  ;;
 *)           echo "я не в курсе как распаковать '$1'..." ;;
 esac
 else
 echo "'$1' is not a valid file"
 fi
}

# упаковка в архив
pk () {
 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 "'$1' cannot be packed via pk()" ;;
 esac
 else
 echo "'$1' is not a valid file"
 fi
}

extract разархивирует исходя из расширения, а pk запаковывает в архив. В качестве аргумента, pk, надо передать тип ахрива (например tar), и имя файла\директории для «запаковки».

Для переименования файлов, использую функцию name:

name() {
    name=$1
    vared -c -p 'rename to: ' name
    command mv $1 $name
}

С ней переименование становится явно проще. name file_name и появится небольшой диалог, в котором необходимо будет ввести новое имя для файла.

Теперь самое интересное на мой взгляд: то, из-за чего я более не нуждаюсь в файловом менеджере - алиасы. В zsh есть более продвинутые алиасы, позволяющие открывать файл в определённом приложении. Выглядят они примерно так:

alias -s {pdf,djvu}=evince

Теперь можно открыть любой pdf документ просто набрав его имя в терминале, но тут есть одно но: терминал становится занят выводом программы и если убить терминал, то и программа завершится. Эта небольшая проблема решается с помощью nohup. Немного модернизируется alias, и вуаля! Всё работает прекрасно:

alias -s {pdf,djvu}="nohup evince"

Теперь запуская программу, можно будет смело закрывать терминал, а если требуется продолжить работу в нём же, то можно просто добавить & в конце имени, чтобы «увести программу в фон».

Это в принципе почти всё что я использую. Чуть ниже ещё пара функций которые я особо описывать не стал(ибо они не относятся непосредственно к zsh), и ссылка на мой конфигурационный файл zsh. Вдруг кому пригодится =]

Перевод и использованием google translate. Требуется скрипт. Брать тут.

alias gt="\~/.scripts/google-translate.py"

Использование: gt en ru word or phrase to translate

Мини-скрипт для загрузки файлов на сервис omploader.org:

ompload() { curl -F file1=@"$1" http://omploader.org/upload|awk '/Info:|File:|Thumbnail:|BBCode:/{gsub(/< [^<]*?\/?>/,"");$1=$1;print}';}

Автодополнение для kill\kilall:

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]"

Мои конфиги доступны в git репозитории github:

git clone git://github.com/bosha/zshrc

Или по ссылке - http://github.com/bosha/zshrc


Понравилась статья? Поделись с друзьями!




Комментарии на этом сайте требуют включенного Javascript в вашем браузере. Вероятно, ваш браузер не поддерживает Javascript, или он был отключен по каким-то причинам. Если вы хотите прокомментировать пост, или просто почитать комментарии, то пожалуйста, включите Javascript или попробуйте открыть эту страницу другим браузером.