- Kod yapısını doğrudan manipüle edebilen, çoklu imleç tabanlı bir yapısal editör olup sözdizimi ağacı (AST) merkezli çalışır
- Sözdizimi düğümü düzeyinde etkileşimi destekleyerek, kod yazma niyeti ile gerçek düzenleme davranışı arasındaki farkı azaltır
- Çoklu imleç özelliği sayesinde birden fazla sözdizimi düğümünü aynı anda değiştirip refactor edebilir; böylece toplu düzenleme verimliliğini artırır
- Mod tabanlı düzenleme yaklaşımını yeniden tanımlayarak, kelime, satır, sözdizimi düğümü gibi farklı birimler arasında tutarlı biçimde hareket etmeyi mümkün kılar
- Kod düzenlemede doğruluk ve tutarlılığı güçlendirerek geliştirici üretkenliğini artıran yeni bir düzenleme paradigması sunar
Ki Editor genel bakış
- Ki Editor, kodun sözdizimsel yapısını doğrudan ele alan bir düzenleme ortamı sunan çoklu imleçli yapısal editördür (Multi-cursor structural editor)
- Geleneksel metin tabanlı düzenlemeden farklı olarak, kod öğelerini sözdizimi ağacı (AST) temelinde manipüle eder
- Fare veya klavye kombinasyonları olmadan sözdizimi düğümü düzeyinde doğrudan düzenleme yapılabilir
Sözdizimi düğümü etkileşimi
- First-class syntax node interaction özelliği sayesinde kodun sözdizimsel yapısı doğrudan ele alınır
- Odak noktası, kod yazma niyeti ile gerçek düzenleme davranışı arasındaki farkı azaltmaktır
- Fare hareketleri veya karmaşık tuş girişleri olmadan sözdizimi düzeyinde manipülasyon yapılır
Çoklu imleç özelliği
- Multiple cursors kullanılarak birden fazla sözdizimi düğümü aynı anda düzenlenebilir
- Paralel sözdizimi düğümü manipülasyonu ile toplu düzenleme ve refactor verimliliği artırılır
- Tekrarlayan kod değişiklikleri hızlıca işlenir
Mod tabanlı düzenlemeyi yeniden tanımlama
- Redefine modal editing özelliği ile seçim modu standartlaştırılır
- Kelime, satır, sözdizimi düğümü gibi farklı birimler arasında tutarlı bir şekilde hareket etmeyi destekler
- Mevcut mod tabanlı düzenlemeye kıyasla esneklik ve tutarlılık güçlendirilir
Önemi
- Ki Editor, sözdizimsel yapı merkezli bir düzenleme deneyimi sunarak kod yazma ve düzenleme doğruluğunu artırır
- Çoklu imleç ile sözdizimi düğümü manipülasyonunu birleştirerek geliştirici üretkenliğini artırmaya katkı sağlayan yeni bir kod düzenleme yaklaşımı ortaya koyar
1 yorum
Hacker News görüşleri
“Birinci sınıf sözdizimsel seçim” özelliğini görünce JetBrains IDE’lerde sık kullandığım Expand / Shrink Selection kısayolu aklıma geldi
Ctrl + W,Ctrl + Shift + Wkombinasyonuyla seçim alanını sözdizim birimleri bazında genişletip daraltabiliyorsunuzBu özellik sayesinde bir dosyanın ‘metni’ ile etkileşim kurma biçimime bakışım tamamen değişti
VS Code ve Zed’de de benzer bir özellik var ama fazla kaba biçimde genişleyip/daralıyor gibi geliyor
JetBrains doküman bağlantısı
Cmd+Shift+V ile yığın panosunu açıp geçmiş kopyalama kayıtlarını arayabiliyor ya da seçebiliyorsunuz
Cmd+Shift+E son konumlar listesini gösteriyor, Cmd+Shift+A ise action palette’i açıp tüm komutlarda bulanık arama yapmanızı sağlıyor
Ayrıca Local History özelliğiyle dosya değişiklik geçmişini Git’ten çok daha ayrıntılı şekilde takip edebiliyorsunuz
Bu tür özellikler “arama sonucu tamponundan doğrudan düzenleme” fikrine uzanıyor
incremental selectionile aynı özelliği kullanabiliyorsunuzÇift tıklama bir kelimeyi, üç tıklama bir fonksiyonun tüm argümanlarını, 4 tıklama ise
f(a,r,g,s)ifadesinin tamamını seçiyordu; yani tıklama sayısına göre sözdizimsel birim büyüyorduHâlâ o kas hafızası duruyor
commit, diff ve cherry-pick işlemlerinde de Ctrl+W gibi sözdizim birimleriyle çalışan bir fikri deniyorum
İlgili içerik librdx projesinde derlenmiş
AST farkındalığı olan düzenleme, Lisp ailesi dillerin rahatlığını hatırlatıyor
Lisp’te basit liste işlemleriyle yapılabilen şeyler için JS tarafında LSP ya da ayrı bir parser gerekiyor
Hafta sonu Clojure kullanıp sonra TypeScript’e dönünce paredit komutlarını gerçekten özlüyorum
Eskiden sözdizim ağacı tabanlı bir düzenleyiciyi kendim yapmıştım
Metin girmek yerine yalnızca ağaçla uğraştığınız için sözdizimsel olarak yanlış bir programın var olması mümkün değildi
Ama bunu pratikte kullanılabilir bir giriş yöntemi hâline getirmek büyük bir zorluktu
Şimdi o dönemki görüntüleme donanımım olmadığı için çalıştıramıyorum ama proje açıklamasını bıraktım
Bunun sonucunda sezgisel olmayan yollar izlemek ya da baştan yeniden yazmak gerekebiliyor
Hatta geçerli olup da üretim yolu bulunmayan yapılar bile mümkün
Teoride ilginç ama pratikte düşük kullanışlılığa sahip bir çıkmaz sokak gibi gelmişti
Metin tabanlı arayüzlerin evrenselliğini ve sadeliğini aşmak zor
Özel editör, yeni sürüm kontrolü, ekosistem kopukluğu gibi gerçek dünyadaki kısıtlar fazla büyük
İnsanlar ağaç düzeyinde düşünmediği için sadece sözdizimsel olarak doğru durumlarda kod yazmak aşırı derecede bunaltıcı bir deneyimdi
Sonunda esnek katılığa izin veren araçlar (ör. TypeScript’in kademeli tiplemesi) gerçekten hayatta kalıyor
İlgili kaynaklar için simh, mame, VT11 kodu, dokümantasyon
Henüz genel amaçlı bir editör değil ama ağaç seçim aralığını genişletme yönü umut verici görünüyor
Pantograph bağlantısı
Eksik ama geçerli ağaçları ele alabilen bir parser sistemi üzerine kurulu
<//>gibi boşluk temsilleri sayesinde eksik sözdizimini güvenli biçimde işleyebiliyorÖrneğin
2 + ·, bir<BinaryExpression>ağacı olarak parse edilebiliyorİlgilenirseniz Discord topluluğunda bunu tartışıyoruz
AST düzenlemeye alışık değilim
Sadece fonksiyon argümanları ya da arglist gibi text object’leri kullanıyorum
LSP özelliklerinden de yalnızca tanıma gitme ve yeniden adlandırmayı kullanıyorum
Sonuçta editör becerilerimi daha da geliştirmem gerektiği hissini verdi
Kodla neredeyse aynı sözdizimiyle desen yazıp dönüşümü gözünüzün önünde görebiliyorsunuz
Örneğin
ast-grep -pattern '$A && $A.$B' --rewrite '$A?.$B' -lang tsgibi bir kullanım ile optional chaining dönüşümü yapılabiliyor$X,$Agibi metavariables aynı düğümün eşleşmesini zorunlu kılıyorYapay zeka kodlama ajanları henüz bu tür desenleri iyi kullanamıyor ama aracın kendisi çok sağlam
Çoğu zaman sözdizim düğümü bazında seçip silmek, kopyalamak ya da değiştirmek yeterli oluyor
Ben sık sık büyük ölçekli refactor yapmadığım için bunu öğrenme ihtiyacı hissetmiyorum
Ama büyük servisler geliştiren biri tamamen farklı düşünebilir
Elixir’de macro yazmayı öğrenirken çok şey fark ettim, Lisp de aynı bağlamda geliyor
Dillerin yaklaşımı farklı olsa da sonunda aynı hedefe gidiyorlar
Benim gördüğüm editör sınıflandırması şöyle
Ki üçüncü kategoriye giriyor ve ben bu tür projeleri düzenli olarak takip ediyorum
UI düğümleri normal metin gibi görünüyor ama aslında ağaç yapısındalar
Erken geri bildirim vermek isterseniz profildeki e-posta üzerinden ulaşabilirsiniz
AST düzenlemenin zorluğu keşfedilebilirlik (discoverability)
Ekranda görünse bile çoğu zaman o düğümün adını bilmiyorsunuz
Bu yüzden imlecin etrafını renklerle çerçeveleyip her scope’u görselleştiren bir eklenti fikrim var
“Sonraki fonksiyona git” yerine “sonraki maviye git” diye düşünmek gibi
d mtuşlarına basınca o anda görünen tüm sözdizim düğümlerinin etiketleri gösteriliyor ve doğrudan geçiş yapabiliyorsunuzGeçerli düğümün içini ya da dışını seçmek gibi işlemler faydalı oluyor
Ben VSCode için Ki entegrasyonu yaptım
Sonrasında çok fazla katkı verememiş olmama üzülüyorum ama bu tür temel araç yeniliklerinin çok önemli olduğunu düşünüyorum
Ki VSCode eklenti bağlantısı
Örnekleri görmeden önce pek anlamamıştım ama
“Birinci sınıf sözdizimsel değişiklik” bölümünde virgüllerin otomatik eklenip silinmesini görünce etkilendim
Uygulama mantığı da hatta daha basit olabilir gibi duruyor
Artık Zed’de de Ki entegrasyonu ya da AST tabanlı rewrite denemek istiyorum
Ki deposundaki koda bakabilirsiniz
Yakında bizzat deneyeceğim
Klavye düzeninden bağımsız olması hoşuma gitti
Emacs’in “her şey düzenlenebilir bir buffer’dır” felsefesinden ilham alması da ilginç
Tabii editörlerin her birinde büyük trade-off’lar var, o yüzden kullanmadan anlamak zor gibi
Neovim harika ama düzenleme modelinin sınırları var
Eğer bütünüyle değiştirilebilir bir yapısı olsaydı belki Helix ya da Ki’ye gerek kalmazdı
Dvorak klavyeyle çalıştırınca eşlemeler tamamen bozuldu
Yazılım kendini kullanıcıdan daha akıllı sandığında, kullanıcıyı çaresiz hissettirebiliyor
Tabii ki Emacs’te zaten var
combobulate paketi buna örnek
M-k ile düğüm silebilir ya da tree-sitter sorgularıyla doğrudan arama ve düzenleme yapabilirsiniz
Zaten çok iyi bir entegrasyon var ama AST’ye özel bir editör olursa UX’i daha da ilerletme alanı bulunuyor
Helix iş akışına gerçekten çok yakışan bir özellik
Mevcut hareket → eylem düzenine son parçanın oturması gibi hissettiriyor