Vim’e ilk başladığında en çok zorlanılan yer editörün mantığı değil, alışkanlıkları bırakmak oluyor. Herkes tuş kombinasyonu ezberleyerek başlıyor ama asıl fark, Vim’in neden bu şekilde çalıştığını kavrayınca ortaya çıkıyor. Bu yazıda o mantığı baştan sona, kategori kategori anlatıyorum: modlar, hareket komutları, düzenleme, arama değiştirme, makrolar, register kullanımı, pencere ve buffer yönetimi, ayar dosyası ve eklentiler. Sonunda da yeni başlayanların en sık takıldığı hatalara ve çözümlerine bakacağız.
Amaç ezber listesi çıkarmak değil. Bir komutun ne işe yaradığını bilmek başka, ne zaman ve neden o komutu seçtiğini bilmek başka. Bu yazı ikincisini hedefliyor.
1. Mod Mantığı
Vim’i anlamanın anahtarı tek bir şey: bu bir modal editör. Yani klavyenin davranışı sabit değil, hangi moddasın ona göre değişiyor.
Normal mod, Vim açıldığında düştüğün yer. Burada tuşlar harf değil komut anlamına gelir. Mesela d tuşuna bastığında ekrana d yazılmaz, silme işlemi başlar. Gezinme, silme, kopyalama gibi her şey bu modda yapılır.
Insert mod, klasik yazı yazma modu. i, a, o gibi tuşlarla girilir, Esc ile çıkılır.
Visual mod, fareyle sürükleyerek seçim yapmanın klavye karşılığı. v karakter bazlı seçim, V satır bazlı seçim, Ctrl+v ise blok seçimi yapar.
Komut satırı modu, kaydetme, çıkış ya da bul-değiştir gibi işlemlerin yapıldığı yer. Normal moddayken : tuşuna basarak girilir.
Replace mod, yazdığın karakterler mevcut metnin üzerine yazılır, araya eklenmez. R ile girilir.
Yeni başlayanların çoğu bir hataya düşüyor: Vim’i sürekli yazı yazılan bir kutu gibi görüyorlar. Oysa doğru alışkanlık şu: Normal mod ana üssün, çoğu zamanını orada geçir. Insert moda sadece yeni bir şey yazacağın zaman gir, yazmayı bitirince hemen Esc ile çık.
2. Hareket Komutları
Vim’de gezinmek ok tuşlarıyla ilgili değil. Amaç, imleci en az hareketle tam istediğin yere götürmek.
Karakter ve satır bazlı
hjklsırasıyla sol, aşağı, yukarı, sağ yönünde hareket eder. Ana sıra üzerinden gezinme mantığı buradan geliyor.0satırın başına,^ilk boş olmayan karaktere,$satır sonuna götürür.
Kelime bazlı
wbir sonraki kelimenin başına,bbir öncekinin başına,emevcut kelimenin sonuna atlar.- Büyük harfli versiyonları (
W,B,E) noktalama işaretlerini de kelimenin parçası sayıyor. Dosya yolu ya da özel karakter içeren kod satırlarında işe yarıyor.
Dosya ve ekran bazlı
ggdosyanın başına,Gsonuna götürür.{sayı}Gya da:{sayı}belirli bir satıra atlar. Örneğin42Gdoğrudan 42. satıra gider.Ctrl+dveCtrl+uyarım sayfa aşağı ve yukarı kaydırır.H,M,Limleci görünen ekranın üstüne, ortasına, altına taşır.
Satır içinde arama ile hareket
f{karakter}satırda o karakterin bir sonraki geçtiği yere gider,F{karakter}geriye doğru arar.t{karakter}karakterden hemen öncesinde durur, özellikle bir ayraçtan önce durmak istediğinde kullanışlı.;son aramayı tekrarlar,,ters yönde tekrarlar.
Paragraf ve cümle bazlı
{ve}boş satırla ayrılmış paragraflar arasında gezdirir.(ve)cümleler arasında gezdirir.
Buradaki kritik nokta şu: Vim’in hareket komutları birbirine eklenebiliyor. Bu özellik bir sonraki bölümdeki düzenleme komutlarını asıl güçlü kılan şey.
3. Düzenleme Komutları
Vim’in fark yarattığı asıl yer burası. Bu bölümü anladığında editör, fareyle çalışan araçlardan gerçekten hızlı bir şeye dönüşüyor.
Operatör artı hareket mantığı
Vim’in düzenleme komutlarının arkasında sabit bir kural var: operatör + hareket yazıldığında, imleç ile o hareketin gideceği nokta arasındaki metin işleme girer. Birkaç operatörü ve birkaç hareketi öğrendiğinde bunları istediğin gibi birleştirebiliyorsun.
Sık kullanılan operatörler:
dsilmecdeğiştirme (siler, ardından Insert moda geçirir)ykopyalama>ve<girinti ekleme, azaltma
Hareketlerle birlikte örnekler:
dwkelimenin sonuna kadar silerd$satır sonuna kadar silerddmevcut satırın tamamını siler (operatörü iki kez yazmak tüm satırı hedefler)ciwimlecin üzerindeki kelimeyi değiştirirci"tırnak içindeki metni değiştirir, imleç tırnakların içinde herhangi bir yerde olabiliryymevcut satırı kopyalary}paragraf sonuna kadar kopyalar
Metin nesneleri
ciw, ci", di( gibi kombinasyonları mümkün kılan şey metin nesneleri. i “iç kısım” anlamına gelir, sadece içeriği hedefler. a ise içerikle birlikte çevresindeki ayraçları da kapsar. Örnekler:
di(parantez içindekini siler, parantezleri korur.da(parantezleri de içerikle birlikte siler.ci{süslü parantez içindekini değiştirir.ditbir HTML etiketinin içini siler.
Bu, yeni başlayanların en az kullandığı ama günlük kod düzenlemede en çok zaman kazandıran özelliklerden biri.
Geri alma ve tekrar
uson değişikliği geri alır,Ctrl+ryeniden uygular..son yapılan değişikliği tekrar eder. Bu göründüğünden çok daha kullanışlı: bir düzenleme yap, sonra dosyada gezinip aynı işlemi.ile tek tuşla tekrarla.
Kopyala, kes, yapıştır
yVim’in kopyalama karşılığı.dya daxile silme de metni bir register’a kaydeder, yani kesme gibi çalışır.pimleçten sonrasına,Pimleçten öncesine yapıştırır.
Büyük küçük harf ve biçim
~imlecin üzerindeki karakterin büyük küçük harfini çevirir.gU{hareket}büyük harfe,gu{hareket}küçük harfe çevirir. ÖrneğingUiwmevcut kelimeyi büyük harfe çevirir.Jmevcut satırı bir sonrakiyle birleştirir.
4. Arama ve Değiştirme
Vim’de arama sözdizimini bildiğinde hem hızlı hem çok kesin çalışıyor.
Temel arama
/kelimeileri yönde arar,?kelimegeri yönde arar.naramayı aynı yönde tekrarlar,Nters yönde tekrarlar.*imlecin üzerindeki kelimeyi ileri yönde,#geri yönde arar.
Bul değiştir komutu
Genel yapısı şöyle:
:%s/eski/yeni/g
%tüm dosyaya uygulanacağı anlamına gelir, olmazsa komut sadece bulunduğun satıra uygulanır.sdeğiştirme komutu.gbir satırdaki tüm eşleşmeleri değiştirir, sadece ilkini değil.- Sona
ceklersen, mesela:%s/eski/yeni/gc, her eşleşme için ayrı onay ister.
Belirli satır aralığında değiştirme:
:10,20s/eski/yeni/g
Bu komut sadece 10 ile 20. satırlar arasında çalışır.
Büyük küçük harf duyarsız arama
Aranan kelimenin sonuna \c ekle, örneğin /kelime\c, ya da :set ignorecase ile bunu kalıcı ayar haline getir.
5. Register Kullanımı
Çoğu editörde tek bir pano vardır. Vim’de ise register denen düzinelerce pano var.
- İsimsiz register (
") en son kopyalanan ya da silinen metni tutar. "aile"zarası isimli register’lar metni bilerek saklamana izin verir."ayyile a register’ına kopyala,"apile sonradan yapıştır."+sistem panosuna bağlanan register. Vim’den başka programlara"+yile kopyalayabilir, başka programlardan"+pile yapıştırabilirsin."0her zaman en son yapılan kopyalamayı tutar, arada yapılan silme işlemlerinden etkilenmez. Kopyaladığın bir bloğu, aralarda başka şeyler silsen bile birden fazla kez yapıştırmak istediğinde işe yarar.
Register’larda şu an ne olduğunu görmek için :registers yaz.
6. Makrolar
Makro, bir tuş dizisini kaydedip sonra tekrar oynatmanı sağlar. Aynı işlemi çok satırda tekrarlaman gerektiğinde en pratik çözüm.
qqile q register’ına kayıt başlat.- Tekrarlanmasını istediğin işlemi tam olarak yap.
qile kaydı durdur.@qile tekrar oynat.@@ile son çalıştırdığın makroyu tekrar çalıştır.- Birden fazla kez çalıştırmak için, mesela
10@qon kez uygular.
Gerçek hayattan örnek: 40 satırın sonuna noktalı virgül eklemen lazım. Satır sonuna gidip noktalı virgül ekleyen ve bir satır aşağı inen bir makro kaydet, sonra 39@q yaz, kalan 39 satır tek seferde tamamlanır.
7. Buffer, Pencere, Sekme Farkı
Bu üç kavram sürekli karıştırılıyor, o yüzden açık şekilde ayırmak lazım.
Buffer, hafızaya yüklenmiş bir dosya demek. Şu an ekranda görünüp görünmediğine bakılmaksızın açık olan her dosya bir buffer.
:lsaçık buffer’ları listeler.:b {sayı}ya da:b {kısmi isim}ile bir buffer’a geçilir.:bnve:bpsırayla bir sonraki ve önceki buffer’a geçer.
Pencere, bir buffer’ı gösteren görüntü alanı. Aynı ya da farklı buffer’ları gösteren birden fazla pencere aynı anda açık olabilir.
:splitya daCtrl+w syatay böler.:vsplitya daCtrl+w vdikey böler.Ctrl+wsonrasında ok tuşu ya dah j k lpencereler arasında geçiş yapar.Ctrl+w qmevcut pencereyi kapatır.
Sekme, tek bir dosyadan çok bir çalışma alanı grubuna karşılık gelir.
:tabnewyeni sekme açar.gtvegTsırayla sonraki ve önceki sekmeye geçer.
Deneyimli kullanıcıların çoğu her yeni dosya için sekme açmak yerine buffer ve pencere kullanmayı tercih ediyor, çünkü buffer’lar zaten çok dosyayla çalışmayı yeni sekme açmaya gerek kalmadan sağlıyor.
8. Ayar Dosyası: .vimrc
Ayarların ~/.vimrc dosyasında tutulur (Neovim kullanıyorsan ~/.config/nvim/init.vim). Varsayılan deneyimi belirgin şekilde iyileştiren birkaç ayar:
set number relativenumber " satır numaralarını göster, imlece göre set incsearch " yazarken arama sonuçlarını anlık göster set ignorecase smartcase " büyük küçük harf konusunda akıllı arama set expandtab shiftwidth=4 " tab yerine boşluk kullan, 4 boşluk genişliğinde set clipboard=unnamedplus " varsayılan olarak sistem panosunu kullan set hlsearch " tüm arama eşleşmelerini vurgula syntax on " söz dizimi renklendirmeyi aç
relativenumber ayarı özellikle gezinmeyi değiştiriyor. Satır numaraları imlece göre gösterilince 5j ya da 8dd gibi komutlar hemen netleşiyor, çünkü hedefin kaç satır uzakta olduğunu saymana gerek kalmıyor, direkt görüyorsun.
9. Eklentiler
Vim’in eklenti dünyası, iyi bir editörü gerçek anlamda güçlü bir geliştirme ortamına çeviren yer. Profesyonel kurulumlarda sürekli karşına çıkan birkaçı şunlar:
- vim-plug ya da packer.nvim: eklenti yöneticisi. Aşağıdakilerin çoğu önce bir eklenti yöneticisi kurmana bağlı.
- fzf.vim: proje genelinde hızlı dosya bulma ve arama, klasörlerde elle gezinmekten çok daha hızlı.
- NERDTree ya da nvim-tree: dosya gezgini kenar çubuğu. Sadece buffer geçişi yerine görsel proje yapısı istediğinde işine yarar.
- vim-airline: mod, git dalı, dosya bilgisi gibi şeyleri tek bakışta gösteren durum çubuğu.
- coc.nvim ya da Neovim’in kendi LSP desteği: otomatik tamamlama, tanıma gitme, satır içi hata gösterimi getiriyor. Genelde sadece tam kapsamlı IDE’lerde olduğu düşünülen özellikler.
- vim-surround: çevreleyen karakterleri değiştirme komutları ekler. Bir kelimeyi tırnak içine almak ya da parantezi köşeli parantezle değiştirmek elle uğraşmadan tek komutla yapılır.
- vim-fugitive: editörden çıkmadan stage, commit, diff inceleme yapmanı sağlayan Git entegrasyonu.
- ale: arka planda linter çalıştırır, hataları satır içinde gösterir.
Yeni başlıyorsan hepsini bir anda kurmaya kalkma. Önce çekirdek Vim’e hakim ol. Eklentiler asıl değerini, hangi işin seni yorduğunu net şekilde fark edecek kadar temel komutları öğrendiğinde gösteriyor.
10. Sık Karşılaşılan Hatalar ve Çözümleri
“Hiçbir şey yazamıyorum, takıldım kaldım” Muhtemelen Normal moddasın ve direkt yazmaya çalışıyorsun. Önce i tuşuna bas, Insert moda geç.
“Vim’den çıkış yapamıyorum”
:qkaydedilmemiş değişiklik yoksa çıkar.:q!kaydedilmemiş değişiklikleri atarak çıkar.:wqya da:xkaydedip çıkar.:wqaaçık tüm buffer ve pencereleri tek seferde kaydedip çıkar.
“E37: No write since last change” hatası Vim, değiştirilmiş bir dosyayı kapatmayı reddediyor. Ya önce :w ile kaydet ya da ! ekleyerek işlemi zorla, örneğin :q!.
“E45: ‘readonly’ option is set” hatası Vim’in salt okunur işaretlediği bir dosyayı düzenliyorsun, genelde dosya izinlerinden kaynaklanır. :w! ile yazmayı zorlayabilirsin, gerçekten izin sorunuysa Vim dışında sudo gerekebilir, bazı kurulumlarda editörden çıkmadan :w !sudo tee % yükseltilmiş yetkiyle yazmanı sağlar.
Yapıştırılan metin girintisini kaybediyor Bu, Vim dışından kod yapıştırırken karşılaşılan klasik merdiven sorunu. Yapıştırmadan önce :set paste çalıştır, yapıştır, ardından :set nopaste ile geri al. Birçok güncel kurulum bunu otomatik hallediyor ama manuel çözümü bilmekte fayda var.
Arama vurguları gitmiyor :noh yazınca arama vurgulama özelliğini kapatmadan, sadece o anki vurgulanmış eşleşmeleri temizler.
Yanlışlıkla bir makronun üzerine yazdım Makrolar register’larda tutulur, yani farkında olmadan tekrar q‘ya kayıt başlatırsan muhtemelen öncekinin üzerine yazmış olursun. Register’ların geri alma geçmişi yok, o yüzden önemli makroları kullanılmayan harflere kaydetmek ve kayda başlamadan önce :registers ile kontrol etmek mantıklı.
Büyük dosyalarda Vim yavaşlıyor Söz dizimi renklendirme ve bazı eklentiler çok büyük dosyalarda yavaşlığa neden olabiliyor. :syntax off ile geçici kapat, ya da vim -u NONE ile dosyayı ayarlarını hiç yüklemeden aç ve sorunun bir eklentiden gelip gelmediğini gör.
11. Alışkanlık Nasıl Oturuyor
Komut listesi okumak onu otomatik hale getirmiyor, gerçek işte kullanmak getiriyor. Öğrenme sürecini hızlandıran birkaç pratik alışkanlık:
.vimrcdosyanda ok tuşlarını bir hafta kapat. İlk başta yapay hissettiriyor amah j k lkullanımını kademeli alışkanlıktan çok daha hızlı yerleştiriyor..komutunu sürekli kullan. Aynı düzenlemeyi elle iki kez yaptığını fark edersen dur, hangi tek komutun bunu.ile yapabileceğini düşün.- Metin nesnelerini uydurma örnekler yerine gerçek kod üzerinde dene.
ci(,da",ditancak zaten çözmekte olduğun gerçek bir işte kullanınca parmaklarına yerleşiyor. .vimrcdosyanı başta küçük tut. Tamamen anladığın on satırlık bir ayar dosyası, başkasının dotfiles deposundan kopyaladığın beş yüz satırlık bir dosyadan çok daha değerli.
Hızlı Referans Tablosu
| Kategori | Komut | İşlev |
|---|---|---|
| Mod | i / Esc | Insert moda gir / Normal moda dön |
| Hareket | w b e | Kelime ileri, geri, sona |
| Hareket | gg G | Dosya başı / sonu |
| Düzenleme | dd yy p | Satır sil, satır kopyala, yapıştır |
| Düzenleme | ciw di( | İç kelimeyi değiştir, parantez içini sil |
| Arama | :%s/eski/yeni/g | Tüm dosyada değiştir |
| Register | "ayy "ap | a register’ıyla kopyala/yapıştır |
| Makro | qq ... q @q | Makro kaydet ve oynat |
| Pencere | :vsplit Ctrl+w w | Pencere böl, odak değiştir |
| Çıkış | :wq :q! | Kaydedip çık / kaydetmeden çık |
Vim’de ezber değil, tekrar işe yarıyor. Bu yazıdaki her şeyi bir anda öğrenmen gerekmiyor. Bir kategori seç, bir hafta boyunca bilinçli şekilde kullan, bir sonrakine ancak birincisi elinde otomatikleştiğinde geç. Zaman içinde tuş kombinasyonlarını düşünmeden kullandığını fark edeceksin.