Bilgisayarlarımıza herhangi bir GNU/Linux dağıtımını kurduğumuzda %99 olasılıkla Bash kabuğu kurulu gelecektir, bunu kullandığınız dağıtımda kullandığınız masaüstü ortamına göre gnome-terminal, konsole gibi uygulamaları çalıştırarak doğrulayabilirsiniz:
Zsh, bilgisayarlarımızda kullanabileceğimiz bir başka kabuk yazılımıdır. Kullandığınız dağıtıma göre apt / dnf / pacman / vs ile zsh paketini bilgisayarınıza kurabilir ve /etc/passwd
dosyasında kendi kullanıcı satırınızda yer alan /bin/bash
kısmını /bin/zsh
olarak değiştirerek kullanmaya başlayabilirsiniz:
Zsh hakkında kaleme aldığım eski ve kısa bir yazıya https://blog.efeciftci.com/2013/05/oh-my-zsh/ adresinden erişebilirsiniz. Ben bu yazıda Zsh kabuğunun (Bash gibi diğer kabuklarda da bulunan) otomatik komut tamamlama özelliğinin nasıl çalıştığından ve kendi hazırladığımız programlar için otomatik tamamlama tanımlarının nasıl yapılabileceğinden bahsedeceğim.
Öncelikle otomatik tamamlama nedir onun hakkında konuşalım. Otomatik tamamlama, komut satırında yazmak istediğiniz komutun baştan bir kısmını yazdıktan sonra geri kalanını kullandığınız kabuğa tamamlatmaktır. Örneğin yeni bir dizin oluşturmak için “mkdir
” komutunu yazmak istediğinizde “mkd
” yazıp klavyenizden TAB tuşuna basarsanız aşağıdaki listenin benzeri ile karşılaşırsınız:
Zsh sadece komut adları için değil, ayrıca bu komutların parametrelerini de tamamlama seçeneği sunar. Örneğin “mkdir --help
” çalıştırdığınızda görebileceğiniz gibi mkdir parametreleri hep “-
” veya “--
” ile başlamaktadır, bu sebeple “mkdir -
” yazıp TAB tuşuna bastığınızda aşağıdaki görünümle karşılaşırsınız:
Zsh hangi komutun hangi parametreleri olduğunu ve bu parametreleri nasıl tamamlayabileceğini “zsh completion system” sayesinde bilmektedir. Bu özelliğin çalışması için hangi komutların ne şekillerde tamamlanabileceğinin tarif edildiği otomatik tamamlama dosyalarına ihtiyaç duyar. Örneğin Linux terminalindeki standart komutlarla ilgili dosyalar (en azından Debian/Ubuntu/vs dağıtımlarda) /usr/share/zsh/functions/Completion/Unix
dizininde yer almaktadır:
% ls /usr/share/zsh/functions/Completion/Unix
_a2ps _feh _mosh _signals
_aap _fetchmail _mount _sisu
_abcde _ffmpeg _mpc _slrn
...
_espeak _module _shred
_etags _monotone _shuf
_fakeroot _moosic _shutdown
Görebileceğiniz gibi otomatik tamamlama dosyaları “_” karakteri ile başlayıp komutun adı ile devam etmektedir. Örneğin incelemek isterseniz biraz önceki mkdir komutunun nasıl otomatik tamamlandığına dair bilgileri /usr/share/zsh/functions/Completion/Unix/_mkdir
dosyası içersinde bulabilirsiniz.
Bu otomatik tamamlama tanımlarının yer aldığı dosyaların Zsh $fpath değişkeni içersinde listelenen dizinler altında yer almaları gerekmektedir, bu dizinlerin listesine “echo $fpath
” komutu ile erişilebilir. Bu listeye yeni bir dizin eklemek için (örneğin Documents/zsh) ev dizininizdeki .zshrc dosyasında “autoload -Uz compinit
” satırından önce “fpath=(~/Documents/zsh $fpath)
” gibi bir satır eklemeniz ve bu dosyayı kaydedip kapattıktan sonra terminal uygulamasını kapatıp yeniden açarak bu değişikliğin uygulanmasını sağlamanız gereklidir.
Yeni Bir Otomatik Tamamlama Dosyası Oluşturmak
Örnek olarak Python’da aşağıdaki kısa uygulamayı yazdınız diyelim:
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser(description='Arg Test')
parser.add_argument('-w', '--word', type=str, default='Telefon', help='ekrana yazdırılacak kelime')
parser.add_argument('-a', '--amount', type=int, default=4, help='kelimenin kaç kere yazdırılacağı')
args = parser.parse_args()
for i in range(args.amount):
print(args.word)
Bu uygulamayı “python3 ./argtest.py --help
” şeklinde çalıştırdığınızda uygulamanızda kullanabileceğin parametrelerin bir listesini görürsünüz:
% python ./argtest.py --help
usage: argtest.py [-h] [-w WORD] [-a AMOUNT]
Arg Test
options:
-h, --help show this help message and exit
-w WORD, --word WORD ekrana yazdırılacak kelime
-a AMOUNT, --amount AMOUNT kelimenin kaç kere yazdırılacağı
Bu uygulamanın nasıl çalıştığını merak ederseniz “python3 ./argtest.py -w kitap
“, “python3 ./argtest.py --word defter -a 10
” gibi farklı şekillerde çalıştırmayı deneyebilirsiniz.
Örnek uygulamamız hazır olduğuna göre bu uygulama için Zsh tamamlama dosyası oluşturmaya geçebiliriz. Biraz önce .zshrc dosyasında fpath değişkenine eklediğiniz dizin altında “_argtest” adlı bir dosya oluşturalım ve içine aşağıdaki örnek dosyayı yapıştıralım:
compdef _argtest argtest.py
function _argtest() {
_arguments \
'-a[kelimenin kaç kere yazdırılacağı]:sayı' \
'--amount=[kelimenin kaç kere yazdırılacağı]:sayı:' \
'-h[yardım metnini göster]' \
'--help[yardım metnini göster]' \
'(-w --word)'{-w,--word=}'[ekrana yazdırılacak kelime]:kelime' \
return 0
}
- Her otomatik tamamlama dosyası “compdef” satırı ile başlar. Örnek dosyadaki satırdaki “argtest.py” hangi komut çalıştırıldığında bu dosyanın tetikleneceğini, “_argtest” ise dosya tetiklendiğinde çalıştırılacak fonksiyonun adını bildirmektedir.
- _arguments ve devamında gelen satırlar otomatik tamamlama sırasında kullanıcıya gösterilecek seçenekleri tanımlamaktadır. Satırlar genel olarak
'-PARAMETRE[AÇIKLAMA]:MESAJ:EYLEM'
biçimindedir. - Aynı işlemi gerçekleştirilecek olan birden fazla parametre varsa bunlar ayrı ayrı da yazılabilir (
-h
ve--help
örneğindeki gibi), birleşik olarak da yazılabilir (-w
ve--word
örneğinde olduğu gibi). - Örnek dosyada
--amount
ve--word
parametrelerinde göreceğiniz “=” karakteri, otomatik tamamlama sırasında = karakterinin de otomatik konmasını sağlar (--amount=5
gibi).
Yukarıdaki açıklamalarda geçen EYLEM ile ilgili olarak aşağıdaki Python programını inceleyelim:
#!/usr/bin/env python3
import argparse
parser = argparse.ArgumentParser(description='Arg Test 2')
parser.add_argument('-i', '--input', required=True, type=str, help='okunacak dosya')
parser.add_argument('-c', '--count', type=str, default='tum', help='sayılacak harfler (tum sesli sessiz)')
args = parser.parse_args()
f = open(args.input)
# dosya okuma islemleri...
Bu program için aşağıdaki Zsh tamamlama dosyası tanımlanabilir:
compdef _argtest2 argtest2.py
function _argtest2() {
_arguments \
'(-h --help)'{-h,--help}'[yardım metnini göster]' \
'(-i --input)'{-i,--input=}'[okunacak dosya]:dosya:_files' \
'(-c --count)'{-c,--count=}'[sayılacak harfler]::when:(tum sesli sessiz)'
return 0
}
- “–input” parametresi satırında yer alan “_files” eylemi, otomatik tamamlama listesine bulunulan dizindeki dosyaların getirilmesini sağlar.
- “–count” parametresi satırında yer alan “when” kelimesi, peşinden gelen kelimelerin (tum, sesli ve sessiz) otomatik tamamlama önerisi olarak getirilmesini sağlar.
Bu yazıda Zsh otomatik tamamlama özelliği hakkında kısa bir giriş yaptık ancak işi ilerletip regular expressions, işletim sistemi türüne göre farklı tanımlar eklemek, tamamlama seçeneklerini dinamik ürettirmek (örneğin “git diff” komutu ardından geçmiş revizyon numaralarının tek tek listelenmesi gibi) ve çok daha fazlası mümkün. Daha fazla açıklama için aşağıdaki bağlantılardan faydalanabilir veya yazının başında bahsettiğim /usr/share/zsh/functions/Completion/Unix
dizini altındaki dosyaları inceleyebilirsiniz.