"Enter"a basıp içeriğe geçin

Zsh Otomatik Tamamlama Sistemi

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
}
  1. 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.
  2. _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.
  3. 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).
  4. Ö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
}
  1. “–input” parametresi satırında yer alan “_files” eylemi, otomatik tamamlama listesine bulunulan dizindeki dosyaların getirilmesini sağlar.
  2. “–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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.