Vim Kullanımı

Nitelikli kodlama özelliklerine sahip olmak için bir IDE kullanmak zorunda değilsiniz. Otomatik değişken ismi tamamlamadan ctags ve make ile entegrasyona kadar Vim, C programcısının hayatını kolaylaştırır ve daha verimli yapar.

Vim, Bill Joy'un 30 yıllık vi'sini temel alan fakat bir miktar ek özellikler içeren oldukça güçlü bir düzenleyicidir. Vim'i bu kadar yetenekli yapan özellikleri yeni başlayanlar için bazen korkutucu olabilir. Bu makale C programlama üzerine odaklanmış olarak vim öğrenme seviyesini arttırmayı amaçlar.

make ve Derleme-Test-Düzenleme döngüsü

Tipik bir programcının işi programın istenen işi yaptığı test işlemiyle kanıtlanana kadar derleme ve düzenleme yapmaktan oluşur. Bu uzun döngüyü kısaltacak herhangi bir mekanizma programcının hayatını kolaylaştırır. Vim ve make entegre edilerek programın derlenmesi ve test edilmesi için düzenleyiciden çıkmak zorunda olmadığınız bir düzenleyiciye kavuşursunuz. Aktif dizindeki bir makefile ile Vim içerisinden :make'i çalıştırmak işi halleder.

Vim'in içerisinde :cd ile dizin değiştirebilirsiniz. Nerde olduğunuzu görmek için :pwd kullanın. FreeBSD kullanmanız durumunda ve make yerine gmake'i çağırmak istediğinizde tüm yapmanız gereken :set makeprg=gmake komutu girmektir. Şimdi make'e bazı parametreler vermek istediğinizi söyleyin. Örneğin CC=gcc296 parametresini vermek istiyorsanız: :set makeprg=gmake\ \CC=gcc296 işi halleder.

Şimdi hataları görme, kaynak kodda uygun satıra gitme ve bunu düzeltme işine gelelim. Kaynak kodda satır numaralarını görmek isterseniz :se nu bu seçimi açar, :se nonu ise satır numaralarını göstermeyi kapatır.

Derlemeyi yaptığınızda, Vim sizi hatalı olan ilk satıra götürür. Bir sonraki hataya gitmek için :cn komutunu kullanınız. :cfirst ve :clast sizi sırasıyla ilk ve son hatanın olduğu satıra götürür. Hatayı düzelttiğinizde yeniden derleyebilirsiniz. Hata listesini tekrar görmek isterseniz :clist bunu yapar. Kullanışlı değil mi?

Eğer başka bir kaynak kod dosyasını açmak istiyorsanız, diyelim ki foo.c, belirli bir hatayı düzeltirken :e foo.c yazın.

Bir önceki dosyaya dönmek için dosyanın tam adını yazmaktan kurtaran bir Vim kısayolu da :e # komutudur. Vim içerisinde herhangi bir zamanda açtığınız tüm dosyaları görmek isterseniz :ls veya :buffers komutlarını kullanabilirsiniz.

Eğer bir sürü dosyayı açmış ve bunlardan bazılarını kapatmak istiyorsanız :ls kullanabilirsiniz. Şöyle bir çıktı verir: 2 # "newcachain.c" line 5 3 %a "cachain.c" line 1

Eğer newcachain.c dosyasını kapatmak istiyorsanız :bd 2 veya :bd newcachain.c bu işi yapar.

C kodu görüntülerken çoklu fonksiyonları hızlıca es geçmek durumunda olabilirsiniz. Komut modundayken ]] tuş kombinasyonunu kullanabilirsiniz. Dosya içinde geriye doğru görüntüleme yapmak için [[ kullanılabilir.

Ayrıca, belirli imleç pozisyonlarını işaretlemek için işaretler kullanabilirsiniz. Herhangi bir küçük harfi işaret olarak kullanabilirsiniz. Örneğin 256. satırı b ismiyle işaretlemek istiyorsunuz. :256 ile kolayca o satıra gidin ve komut modunda mb yazın. Vim asla komut modunda yazdığınızı göstermez ama sessizce yazdığınız komutu sizin için çalıştırır. Bir önceki pozisyona gitmek için '' (iki tek tırnak) sizi oraya götürür. 'a yazarak a etiketli yere gidersiniz vs...

Özellikle Makefile dosyalarını düzenlerken, boşlukların sekme olup olmadığını farketmek isteyebilirsiniz. :se list yazabilirsiniz ve tab olan satılarda mavi renkte ^I görünür. Bunu yamanın bir başka yolu da /\t yazmaktır. Bu sekmeleri sarı olaak gösterir.

Global arama ve değiştirme programcılar için temel bir iştir, ve Vim her ikisini de iyi bir şekilde destekler. Komut modundayken basitçe / yazın ve anahtar kelimeyi girin. Eğer adım adım arama yapmak isterseniz, emacs'da olduğu gibi, aramadan önce :se incsearch yazın. Bunu kaldırmak istediğinizde :se nois yazın.

Bul ve değiştir Vim'in güçlü özelliklerinden biridir. Bunu sadece v komutuyla seçtiğiniz belirli bir alanda uygulayabilirsiniz, veya sadece belirli satırlarda veya Ctrl-V ile seçtiğiniz dikdörtgensel bölgede.

Bölgeyi veya satır numaraları aralıklarını seçtiğinizde, örneğin :25,56 25'den 56'ya kadar olan satırları seçer (her ikisi de dahil), veya sadece bölgeyi seçtiğinizde : yazın, :<','> görünür. Şimdi şimdi tüm foo yazısının geçtiği yerleri bar olarak değiştirmek içn s/foo/bar yazın.

Fakat bu komut her satırda sadece bir değişiklik yapar. Stır içinde çoklu değiştirme yapmak isterseniz s/foo/bar/g yazın. Eğer sadece bazılarını değiştirmek istiyorsanız “confirm” seçeneğini s/foo/bar/gc ile kullanabilirsiniz.

Bazen metin bir başka anahtar kelimenin altmetni olarak bulunabilir. Örneğin, diyelim ki “in” değişkenini değiştirmek istiyorsunuz fakat “inta” içindekini değil. Kelimenin tamamını aramak için /\<in>/ yazın.

Daha sıklıkla bir dosyadaki tüm karşılaşmalarda global değişiklik yapmak isteyeceksiniz. Bunu hem :1,$s/foo/bar/g ile hem de :%s/foo/bar/g ile yapabilirsiniz. Bunu açmış olduğunuz tüm dosyalarda yapmak isterseniz :bufdo %s/foo/bar/g yazabilirsiniz.

Bir başa aram yöntemi ise komut moduna geçerek * ve anahtar kelime yazmaktır. Şimdi dosya içinde geçtiği herhangi bir yerde ışıklandırılmış olacaktır. Geriye doğru aramak da basittir; arama yaparken / yerine ? yazınız. Arama bittiğinde Vim bunu hatırlar, böylece bir daha aynı anahtar kelimeyi arayacağınız zaman tüm metni yazmak yerine adece / veya ? yazabilirsiniz.

Aramanın bir yan etkisi metinlerin ışıklandırılmış olarak kalmasıdır. Bu programları düzenlerken rahatsızlık verebilir. :se nohlsearch, :nohlsearch veya :nohl yazarak ışıklandırmayı kapatabilirsiniz.

Komutların tamamlanması için her zaman Tab tuşunu kullanabilirsiniz. Örneğin :nohl<Tab> yazdığınızda Vim sizin için bunu tamamlar. Bu genel olarak kullanılabilir, ve Vim komutu bulana kadar Tab'a basmaya devam edebilirsiniz.

Exuberant ctags ile Vim'in kaynak kodu idare etmesi için etiketler üreten harici bir programdır. Bütün kaynak kodunuz sadece bir dizinin içinde ise o dizine geçerek şu komutu verin: $ ctags

Bu tags isminde bir dosya üretir. Vim bunu fonksiyonlara, sayımlama sabitlerine (enum) ve #define satırlarına sıçramak için kullanır. Eğer kaynak kod değişik dizinlere dağılmışsa ctags bunları belirli bir dizine bağıl olarak üretmek zorundadır. Bunu yapmak için kaynak kodların kök dizinine gidin ve şu komutu girin: $ ctags -R

tags dosyasının üretilip üretilmediğini kontrol edin. tags dosyasını da Vim ile açıp okuyabilirsiniz ayrıca. Şimdi etiketleri kullanarak kaynak kod içinde gezinelim. ctags kullanarak kaynak kod içinde gezinmek bir programcı için en büyüleyici araçlardan biridir.

tags dosyası oluşturulduktan sonra dosyayı Vim ile normal bir şekilde açın. Dosya çok derinlerde değilse kök dizinden açın. Örneğin kaynak kodunuzun dizin yapısı şöyle olsun:

common
|
----> gui --> wxpython
|       |
|       ------>Tk
|
----> backend --> networking
	
include

user

common/backend/networking dizini içerisindeki tcp.c dosyasını düzenlemek isterseniz $ cd common/backend/networking ve $ vim tcp.c komutlarının yerine $ vim common/backend/networking/tcp.c tags dosyası common dizininin üzerinde bulunur, ve Vim otomatik olarak dosyanın yerini bu şekilde bilir. Alternatif olarak yukarıda bahsedilen ikinci metodla dosyayı açabilirsiniz ve bunu Vim'in içinden çalıştırabilirsiniz: :se tags=../../../tags

İlk metod gezinme için uygundur. Dosyayı açtığınızda bir fonksiyon tanımından diğerine Ctrl-] tuş kombinasyonuyla kolayca sıçrayabilirsiniz. Herhangi bir şeyin tanımlandığı yere gitmek için imleç onun üzerinde iken basitçe Ctrl-] tuşlayabilirsiniz. Böylece çağırıldığı yerden tanımlandığı yere gidebiliriz. Sizi oraya hangi dosya içinde olduğuna bakmazsızın götürür. tp.c içinde drawscreen()'i çağırdığımızı farzedelim, sizi otomatik olarak oraya götürür, dosya common/gui içinde olsa bile.

Bir önceki okuduğunuz yere dönmek isterseniz Ctrl-T tuşlayınız ve kaldığınız yere dönersiniz. Oradan tekrar Ctrl-] ile bir başka çağırıma gidebilirsiniz. Bu işlemi sınırsız olarak tekrar edebilirsiniz ve her seferinde Ctrl+T ile geri dönersiniz.

Bir fonksiyon tanımını bulmanın bir başka yolu eğer isminin sadece bir kısmını biliyorsanız: :ta /function Bu komut eğer bir çok eşleşme varsa sizi ilk eşleşmeye götürür. Bir sonraki eşleşen yere :tn ile gidebilirsiniz.

Eğer çoklu tanımlama varsa ve bunların arasından birini seçmek isterseniz G Ctrl-] tuşlayabilirsiniz veya :tselect <etiketadı> komutunu girebilirsiniz. Bu şekilde etiketler arasında hangi dosyanın içinde olduğunu bilmeksizin dolaşarak kaynak kodu düzenleyebilirsiniz.

cscope ile Vim

Cscope çeşitli aramalar yapabileceğimiz güçlü bir başka kaynak kodda gezinme aracıdır. Örnek bir Cscope menu çıktısı şöyledir:

Find this C symbol:
Find this global definition:
Find functions called by this function:
Find functions calling this function:
Find this text string:
Change this text string:
Find this egrep pattern:
Find this file:
Find files #including this file:

Şimdi, Vim repertuarına Cscope'u da eklemiştir. Aynı özellikleri Vim'in rahatlığından Cscope içinde kullanmak programcılar için elverişlidir. Tüm yapmanız gereken :cs add cscope.out ile Cscope bağlantısını kurmaktır.

ctags'dan sözederken daha önce bahsettiğimiz gibi, Cscope cscope.out isminde bir indeks üretir. Bunun için şu komutu çalıştırırız: $ cscope -Rbq

Bu cscope.out dosyasını üretir. Bu da Ctags gibi kaynak kodun kök dizininden çalıştırılır. Yine önceki gibi kaynak kod kök dizinine bağıl olarak dosyayı açarsınız, ve :cs add cscope.out ile Cscope bağlantısını yaparsınız. :cs show ile varolan Cscope bağlantısını doğrulayabilirsiniz.

Vim'in içerisinde ne aratabileceğiniz :cs<CR> ile görülebilir. Örneğin belirli bir dosyaya gitmek için, bir başlık veya kaynak kod dosyası için basitçe :cs f f stdio.h (stdio.h'ı açmak için) veya :cs f f foo.c yazabilirsiniz.

foo.c fonksiyonu tarafından çağırılan bir fonksiyonu aramak için :cs f d foo.c yazınız. Bu foo.c tarafından çağırılan fonksiyonların listesini verir. foo.c'yi çağıran fonksiyonlar için :cs f c foo.c.

Bir egrep örüntüsü için :cs f e varName vb. Kullanılabilecek seçenek listesi için :cs yazınız. Bu kullanabileceğiniz seçenek aralığını görüntüler.

Vim ve Sözdizim Işıklandırma

Vim'in diğer düzenleyici veya IDE'lerle karşılaştırıldığında onların bileğini bükebileceği bir özelliği varsa o da tam-donanımlı sözdizim ışıklandırmadır. Vim'de renk kullanımı kaynak kodla çalışmayı gerçek bir eğlenceye dönüştürür. Sadece hayatınızı renklendirmez, ayrıca derlemeden sonraki hatalarında kolayca vurgulanmasını sağlar. ),} veya ] eşleşmemesi gibi genel hataları kodda görmek çok kolaydır. Sizi ayrıca strinlerdeki “ veya ' eksikliğinde de uyarır. Sizi açıklama satırı */ ile kapatılmadığı şeklinde veya iç içe açıklama satırı olduğu yönünde uyarır. Sözdizim ışıklandırma C sözdizimine gelindiğinde akıllıcadır.

Tipik olarak Vim'in sözdizim ışıklandırma özelliğini aktifleştirmek için birşey yapmanız gerekmez; :sy on dağıtımınızın bunu varsayılan olarak desteklemediği durumda kullanılır. Diğer komutlarda olduğu gibi bunu da ~/.vimrc dosyasına ekleyebilirsiniz. Renkler hala gözükmezse terminalinizle ilgili bir problem var demektir. Önce onu düzeltin. :sy enable komutuna ek olarak :se filetype on bunu yapabilmenin bir başka yoludur.

Renkleri düzgünce görüntülediğinizi farzedelim. Diyelim ki bazı renklerden hoşlanmıyorsunuz, veya mavi koyu zeminde görünmüyor diye C açıklama satırlarını okuyamıyorsunuz. İkinci problemi çözmek için sadece :se backgroun=dark yazmak yeterli. C açıklama satırları için sözdizim ışıklandırma özelliğini kaldır istiyorsanız :highlight clear comment yazınız. Renkleri değiştirmek için önce :syntax komutunu kullanarak verilen çalışma ortamı için tüm sözdizim elemanlarını listeleyin. Sonra değiştirmek istediğiniz sözdizim grubunu belirtin. Stringlerin parlak beyaz renkte gözükmesi için -ki böylece siyah zeminde daha kolay okunur- şunu yazın :highlight String ctermfg=white veya gvim kullanıcıları için: :highlight String guifg=white

Ayrıca herhangi bir sözdizim grubunun rengini de değiştirebilirsiniz. Tipik sözdizim grupları şunlardır: Statement, Label, Conditional, Repeat, Todo ve Special. Işıklandırmanın altı çizili veya kalın gibi özniteliklerini de ayrıca değiştirebilirsiniz. Örneğin NOTE, FIXME, TODO ve XXX gibi yazıların altı çizili görünmesini istiyorsanız şunu kullanabilirsiniz: :highlight Todo cterm=underline veya hem kalın hem de renk özelliğini ekleyebilirsiniz: :highlight Repeat ctermfg=yellow cterm=bold

Kendi özel ışıklandırma komut setinizi oluşturup ~/.vimrc dosyasına yazarak her kaynak kod düzenlemesinde belirlediğiniz renkleri görebilirsiniz.

Vim ve Değişken İsmi Tamamlama

Ek olarak Vim değişken ismi tamamlama özelliğine sahiptir. Yazarken Ctrl+N veya ekleme modunda Ctrl+P tuşlayınız. Unutmayın bu sadece ekleme modunda işe yarar. Yukarıda bahsi geçen tüm komutlar komut modunda çalışır. Mümkün olan diğer tamamlama seçenekleri için Ctrl+N'ye tekrar tekrar basabilirsiniz.

Bu yazarken hata yapmamızı engeller çünkü yapı üyeleri ve fonksiyon isimleri sıklıkla yanlış yazılabilir. Bu en iyi Vim'in ctags'ı kullandığı zaman çalışır, bu yüzden ctags dosyasının yerinde olduğundan emin olun.

Vim ve Kaynak Kod Biçimlendirme

Vim C'yi kodu girintili gösterecek kadar iyi anlar. Varsayılan girintileme seçeneği tab kullanır. Bu bazıları için uygun olmayabilir. Kaynak koddan tabları tamamen kaldırmak için şunu giriniz: :set expandtab :retab

Bu tüm tabları boşluğa dönüştürür, bu da girintilemenin devfamını sağlar. C metni yazarken Vim otomatik olarak girintilemeyi sizin için yapar. Bu eşleşen parantezleri farketmenizi sağlar. Komut modundayken ),] ve }'leri % komutuyla eşleştirebilirsiniz. Sadece imleci paranteze götürün % komutunu girin. Sizi ilgili diğer açılan veya kapanan paranteze götürür. Bu açıklama satırlarında ve #if, #ifdef ve #endif ifadelerinde de çalışır.

Programı yazmayı bitirdikten sonra tüm dosyayı bir seferde girintilemek için gg=G komutunu girin. Sonra isterseniz yukarıda bahsedildiği gibi tüm tabları kaldırabilirsiniz. gq açıklama satırlarını girintilemek için olan komuttur. Bir bölgeyi seçip onu da = operatörüyle girintileyebilirsiniz.

Eğer Vim'in varsayılan tab girintilemesi kullanımı eziyetli ise :se nocindent ile bunu pasifleştirebilirsiniz. Diğer girintileme seçenekleri de mevcuttur. İki parantez arasındaki veya belirli iki satır arasındaki kodu da girintileyebilirsiniz. :help indent.txt yazarak daha fazlasını öğrenebilirsiniz.