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

Март 4, 2010

Недавно пошла мода, на использование в качестве шелла - 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}'

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

Постоянно писать 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

Или по ссылке - ссылко!

Похожие записи:

  1. Терминальный оконный менеджер Tmux

Тэги: , , , , ,
В категориях: Tutorials by bosha

34 Комментариев к "Несколько полезных возможностей zsh"

  1. SIO написал:

    И чем эта статья принципиально отличается от "моря статей на тему zsh, где ничего интересно и полезного на твой взгляд не было"?

    [Ответить]

    bosha Отвечает:

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

    [Ответить]

  2. muhas написал:

    extract pk это не толкьо zsh но и баш
    name() можно дополнить с помощью vils (класная штука, скажу я тебе) ну или вообще замениить (где-то я видел эту функцию, не?)

    > Немного модернизируется alias, и вуаля
    о глобальных и суфиксных алиасах должен знать каждый пользователь zsh иначе ему и bash хватит =)

    alias gt и ompload к zsh вообще никаким боком...

    в общем ничего нового для меня ты не открыл (скорее закрыл, ибо... ну ты видел мой zshrc =) а он со временем растет меняется)

    [Ответить]

    bosha Отвечает:

    Неа. Я твой zshrc не видел. Я уж и не помню откуда я всё это взял. Кажется находил вики по zsh и собирал по кусочкам :)

    А вот функции extrack и pk да, я даже написал что не помню откуда они взялись :)

    Ну и про gt, ompload я так и написал, что непосредственно к zsh они отношения не имеют..

    Вообще, я даже не видел твой конфиг и твой пост. Так что не знал, но раз уж написал, то пусть будет ;)

    [Ответить]

    muhas Отвечает:

    ну то что посту быть эт однозначно, я к тому похожие посты всё чаще и чаще встречаю. кто бы взялся да русский док по zsh уже написал что бы это остановить (хотя Алекс Отт отлично потрудился, и zsh-refcard офигенная вещь)

    [Ответить]

    muhas Отвечает:

    ах, да.. забыл сказать что и я этим похожим постам посодействовал... писал тож по незнанию :(

    [Ответить]

    bosha Отвечает:

    Каждый учится на ошибках :)

    [Ответить]

    bosha Отвечает:

    Спасибо за наводку на zsh-refcard, я не знал)

    [Ответить]

  3. Allive написал:

    Кстате, по поводу суфиксных алиасов, можно использовать встроенную функцию zsh-mime-setup
    и прописывать нужные хэндлеры через mailcap
    И в любоам случае, спасибо за статью ;)

    [Ответить]

    bosha Отвечает:

    Не за что. А можно подробнее (можно ссылкой), про zsh-mime-setup? ☺

    [Ответить]

    Allive Отвечает:

    Думаю вы и сами уже нашли, но все же вот:
    http://www.bash2zsh.com/essays/essay1_file_manager.html

    [Ответить]

    bosha Отвечает:

    Да, нашёл, но всё равно спасибо :)

    [Ответить]

  4. Тормоз написал:

    Говоришь, что все описания Zsh бесполезные, а сам примерно в том же стиле написал :) Несколько простыней конфигов при этом нифига не понятно за что отвечает каждая конкретная строчка и какие ещё могут быть варианты.

    Я пока подробного описания опций Zsh на русском не нашёл.

    Ладно я английский сейчас ещё хотя бы немножко понимаю, а как быть остальным?

    [Ответить]

    bosha Отвечает:

    Это было лишь предисловием. Главной целью, было описать то, что я использовал на тот момент, и за что я так обожаю zsh =]

    [Ответить]

    Тормоз Отвечает:

    Настраиваю сейчас, пилю .zshrc, да ещё эмулятор терминала надо заставить 256 цветов показывать. Ох, не просто всё это для меня до сих пор. Не быстро.

    [Ответить]

    bosha Отвечает:

    А какой эмулятор терминала?

    [Ответить]

    Тормоз Отвечает:

    Из lxde (lxterminal).

    [Ответить]

    bosha Отвечает:

    Тогда вряд ли могу помочь. Разве что посоветовать поставить rxvt-unicode, но для человека особо не сведущего во всяких гик штучках, его настройка окажется не очень простой..

    Я даже не знал если честно, что у LXDE есть свой эмулятор терминала о_О

    [Ответить]

    Тормоз Отвечает:

    В urxvt по-умолчанию 8 или 10 цветов, насколько я знаю. Чтобы он 256 поддерживал, надо патчить и собирать из исходников.

    [Ответить]

    bosha Отвечает:

    Там 16 цветов если быть точным =) Пересобрать с поддрежкой 256 цветов не большая проблема. Надо его ещё настроить под себя, т.к. там нет ни меню, ничего либо подобного. Всё через файл ~/.Xdefaults. Если хочешь, могу помочь с настройкой =]

    [Ответить]

    Тормоз Отвечает:

    Не, спасибо :) Всё же с терминалом ещё мучаться - это красноглазие совсем. Lxterminal вполне неплох. И он точно может отображать 256 цветов, я это проверял, надо просто найти, как его на это настроить.

    А Zsh, блин, охренительно монстрячный! Осознал, что потратил несколько часов на попытку более-менее настроить .zshrc после чего просто поставил fish.

    Fish очень понравился... БЫ! Если бы не тормозил ужасно. В общем, не было никаких проблем, но Тормоз как обычно придумал их себе :) С оболочками теперь вот. Беда, беда.

    [Ответить]

    Тормоз Отвечает:

    http://brokenbrake.biz/2010/07/23/stupidity#c011781

    [Ответить]

    Тормоз Отвечает:

    Проблема в том, что я его никогда не пойму полностью, это игрушка для постоянной настройки, как vim только хуже. Ну и были глюки всякие (не помню точно).

    Fish недошеллом тебе кажется скорей всего только потому что ты фанат Zsh :)

    bosha Отвечает:

    Я не то чтобы фанат.. Просто пришёл к выводу, что zsh для меня удобнее. и практичнее, чем bash, csh, fish и т.д. К тому же я уже даже не помню когда последний раз открывал файл конфиругации (добавление новых alias'ов не в счёт) =)

    bosha Отвечает:

    Насчёт fish это очень спорно =) Он на мой взгляд недошелл какой-то =)

    А в чём проблема с zsh?

    [Ответить]

    Тормоз Отвечает:

    Здесь пишу, потому что у тебя, видимо, предел вложенности достигнут. Ох не люблю вообще эти "деревья". При этом форма себя очень неадекватно ведёт, пишет "

    Тормоз Отвечает:

    Упс. Видимо, временный был глюк. Но писало что-то вроде "невозможно отправить комментарий". ХЗ в чём дело.

  5. Тормоз написал:

    Кстати, вместо питоновского скриптика для Google Translate лучше использовать локальную консольную утилиту. Я так думаю, она побыстрее будет работать http://habrahabr.ru/blogs/nix/69041/

    [Ответить]

    bosha Отвечает:

    Пожалуй =)

    Что примечательно, так это то, что пост на хабре писал тоже я :D

    [Ответить]

    Тормоз Отвечает:

    Упс :) Извини, не заметил. Смешно получилось.

    [Ответить]

    bosha Отвечает:

    Ничего, ничего =)

    Я правда сам не знаю зачем на хабр написал, а не в блог =)

    [Ответить]

  6. ZekMan написал:

    А я то думал почему у меня нехрена не работало! а я оказывается твой .zshrc забыл!

    Как обычно спасибо за твои конфиги =3

    [Ответить]

    bosha Отвечает:

    @ZekMan, ты хочешь сказать у тебя ФС посыпалась от отсутствия моего конфига о_О

    [Ответить]

    ZekMan Отвечает:

    @bosha, нет))) от чего фс посыпалась так и останется тайной, а вот zsh нормально не работал =)

    [Ответить]

Оставить комментарий