Zsh!

· by Gürkan · Read in about 4 min · (691 Words)

Ne kadar zamandır bir farklılık yapmayı düşünüyordum. Terminalde "bash"dan "bash"ka alternatiflerim de vardı, zsh, ksh gibi.. Gentoo forumlarındaki zsh aşıkları başlığını görünce dayanamadım zsh ve zsh-completion paketlerini kurup zsh komutu vererek bilmediğim bi aleme daldım.. Nedir yani? Bildiğiniz komut satırı işte, şekli biraz değişik. Yine tab tuşuyla tamamlama var ama biraz daha akıllıca yapmışlar bu elemanlar. Ayrıca eix, equery ve genlop'da bile portage paket ismi tamamlaması yapabiliyor (hayvan!) Ancak biraz ayarlamam gerekti, .bashrc gibi bir .zshrc bakındım ve buldum da. Forumlardan wikilerden derken .zshrc'yi kıvama getirdim. Ham halde kullanınca zsh'dan nefret edebilirsiniz. Home, End, Del gibi tuşlar çalışmayabiliyor. Ama bu sanki bash'dan daha bi esnek, parmaklanabilir.. Neyse, şöyle böyle derken deneye yanıla bir .zshrc ürettim kendime. Tabi bu işi abartıp konsolu şöyle gösteren arkadaşlar da yok değil nette:

(Boru değil o başta yazan yüzde de bataryanın doluluk oranı) Ben sade severim diyip daldım rc dosyasına. İşte açıklamalarıyla benim örnek rc: (Not: "user@computer:$" satırlarını önemsemeyin) Bu kısımda standart gentoo otomatik tamamlamalar vs belirlenmiş, bi de arkasına case falan bi fonksiyon atmışım ama nedir hatırlayamıyorum, kesin işe yarıyordur :) Sanırım Terminal adı ayarlama meselesi..

autoload -U compinit promptinit
compinit
promptinit; prompt gentoo
zstyle ':completion::complete:*' use-cache 1
export PS1='(%n @ %m) %#'
exec 2>>(while read line; do
print '\e[91m'${(q)line}'\e[0m' > /dev/tty; done &)
chpwd() {
[[ -t 1 ]] || return
case $TERM in
sun-cmd) print -Pn "\e]l%~\e\\"
;;
*xterm*|rxvt|(dt|k|E)term) print -Pn "\e]2;%~\a"
;;
esac
}

Bu bölümde de eğer root'san başta yazan isim kırmızı, değilsen yeşil olsun ayarlanması..

if [ `/usr/bin/whoami` = 'root' ]
then
export PS1="%{${fg_bold[red]}%n%}@%{${fg_bold[blue]}%}%m: %~ %{${fg[white]}%}%# "
else
export PS1="%{${fg_bold[green]}%n%}@%{${fg_bold[blue]}%}%m: %~ %{${fg[white]}%}%# "
fi

Burda bi history dosyası ayarlıyoruz ki yukarı basınca eski komutlar gelsin. Bunu bile biz yapıyoz diye sevdim.. Evet manyağım..

export HISTFILE=~/.zsh_history
export HISTSIZE=50000
export SAVEHIST=50000
# eval `dircolors -c`

Setopt zımbırtısı seçenek belirleme.. baya işe yarıyor, kurcalayın..

setopt autopushd pushdminus pushdsilent pushdtohome
setopt autocd
setopt cdablevars
setopt ignoreeof
setopt interactivecomments
setopt nobanghist
setopt noclobber
setopt HIST_REDUCE_BLANKS
setopt HIST_IGNORE_SPACE
setopt SH_WORD_SPLIT
setopt nohup
setopt nonomatch

Bu kısımda home end falan ayarlamaları yaptım. Sizin makinanızda tuş girdileri farklı olabilir..

bindkey "\e[2~" transpose-words
bindkey "\e[3~" delete-char
bindkey '^[[H' beginning-of-line
bindkey '^[[F' end-of-line
bindkey '\e[2~' overwrite-mode
case $TERM in (xterm*)
bindkey '\eOH' beginning-of-line
bindkey '\eOF' end-of-line
esac

Man sayfaları için otomatik tamamlama, belki lazım olur.. Kodun şu haline bak, yazan manyak olmalı..

compctl -f -x 'S[1][2][3][4][5][6][7][8][9]' -k '(1 2 3 4 5 6 7 8 9)' \
- 'R[[1-9nlo]|[1-9](|[a-z]),^*]' -K 'match-man' \
- 's[-M],c[-1,-M]' -g '*(-/)' \
- 's[-P],c[-1,-P]' -c \
- 's[-S],s[-1,-S]' -k '( )' \
- 's[-]' -k '(a d f h k t M P)' \
- 'p[1,-1]' -c + -K 'match-man' \
-- man

Normal aliaslar, kafanıza göre takılın..

alias ls='ls --color=auto -F'
alias lsd='ls -ld *(-/DN)'
alias lsa='ls -ld .*'
alias f='find |grep'
alias c="clear"
alias dir='ls -1'
alias gvim='gvim -geom 82x35'
alias ..='cd ..'
alias mem="free -m"

Bu kod, bir klasörün sadece adını yazarak o klasöre cd ile girmenizi sağlıyo.. Walla ben uyuşuk adamım..

compctl -/ cd

Bunlar da tamamlama ile ilgili daha garip şeyler.. PID tamamlama falan iyice geek stuff'a kaçtık, elemanın birinden buldum, bakının..:)

# allow approximate
zstyle ':completion:*' completer _complete _match _approximate

zstyle ':completion:*:match:*' original only
zstyle ':completion:*:approximate:*' max-errors 1 numeric

# tab completion for PID :)
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:kill:*' force-list always

# cd not select parent dir.
zstyle ':completion:*:cd:*' ignore-parents parent pwd

Belirli dosyaların adını girerek direkt olarak ilişkilendirdiğiniz programla açın..

compctl -g '*.(jpg|jpeg|bmp|tiff|pcx|pbm|pgm|ppm|xpm|png)' eog
compctl -g '*.(gif)' gthumb
compctl -g '*.(avi|mpg|mpeg|flv)' mplayer

Bunu yazan adamın zihnini özellikle merak ediyorum; eğer son işlem başarılı sonuçlandıysa yeşil bir gülen surat ( :) ), başarısız sonuçlandıysa kırmızı bi üzgün surat ( :( ) yazdırıyor.. Not: Bunu kullanırsanız o yukardaki yeşil-kırmızılı root kullanıcısı betiğini kullanamazsınız..

PROMPT=$'%{\e[0;32m%}%B[%b%{\e[0m%}%n%{\e[0;32m%}@%{\e[0m%}%(4c,./%1~,%~)%{\e[0;32m%}%B]%b% %(?,%{\e[0;32m%}:%)%{\e[0m%},%{\e[0;31m%}:(%{\e[0m%}) %# '

Eveet. Sevdiyseniz başlayabilirsiniz zsh’a. Ha bu arada unutmadan, zsh’ı öntanımlı kabuk yapmak isterseniz komut: usermod -s /bin/zsh _kullanıcı_adi_ Tabi bunu root olarak verin. Root kullanıcısı değilseniz bir alternatif yöntem de .bashrc dosyanıza : exec zsh satırı eklemek, başlar başlamaz zsh’a geçiyor, aynı şey yani. Ama bu yöntem root kullanıcısında güvenlik amacıyla engellenmiş sanırım.. Bu kadar, Kolay gelsin :) Not: O resmini gördüğünüz terminal gibi şekil yapmak isterseniz burdan buyrun :[link]