Несколько полезных возможностей 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}'
И выглядит оно как своеобразное меню:
Постоянно писать 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