3 puan yazan GN⁺ 2023-11-11 | 1 yorum | WhatsApp'ta paylaş
  • RSI’nin yeniden nüksetmesiyle kod yazarken giriş yöntemini tekrar değiştirmek zorunda kalınan bir durumda, VS Code eklentisi Cursorless ses tabanlı kod düzenlemenin merkez aracı haline geldi
  • Cursorless, kod token’larına renk ve harf tabanlı hat ekleyerek kullanıcının ekrandaki konumları sözle işaret etmesini ve silme, taşıma, ekleme gibi işlemleri yapmasını sağlıyor
  • Bunu basit imleç hareketinden daha güçlü kılan şey, green urge past green bat gibi yol tarifini dilin AST farkındalığıyla birleştirerek fonksiyon, lambda ve tanım gövdesi gibi yapısal birimleri işleyebilmesi
  • Talon komutları doğrudan yazıldığında, async <destination> gibi eklemeler veya Go metot bildirimi gibi uzun girişler daha kısa sesli komutlarla otomatikleştirilebiliyor
  • Sesle kod yazmak söylenmesi gereken kelimeleri ortadan kaldırmıyor, ancak kodu zihinde anlama biçimine daha yakın bir komut sistemi kurabiliyor

RSI’nin nüksetmesi ve Cursorless kullanmaya başlama bağlamı

  • Yeni bir işe başlarken RSI yeniden nüksetti ve daha önce olduğu gibi teknik yazarlığa yaslanmak yerine yeniden programlama yapmanın bir yoluna ihtiyaç doğdu
  • Emacs kullanıcısı olunmasına rağmen bu kez tek bir eklenti yüzünden Visual Studio Code kullanılıyor
  • Bu eklenti Cursorless; sesli kontrol yazılımıyla birleştiğinde AST düzeyinde kod düzenleme mümkün oluyor
  • Daha önce Cursorless çoğunlukla ekranda gezinmek için kullanılırken, bu kez mümkün olan tüm işlere daha derin şekilde uygulanmak isteniyor
  • Slack ve Discord mesajlarında da böyle bir giriş yönteminin olması isteniyor

Konumları hat, target ve destination ile söyleyerek belirtme yöntemi

  • Cursorless’in temel birimleri target ve destination
    • target, belge içindeki tekil bağlantı noktalarını ifade eder
    • destination, belirli bir target’a göre tanımlanan göreli konumu ifade eder
  • Belgedeki token’lara renk ve harflerden oluşan hat eklenir
    • hat’in konumu adını belirler
    • hat’in rengi belirsizliği giderir
  • Örnek JavaScript kodunda function kelimesindeki u harfinin üzerinde yeşil bir hat varsa, o kelime green urge diye çağrılabilir
  • Ardından bu target üzerinde o kelimeyi silme ya da başka bir yere taşıma komutları verilebilir
  • Yalnızca bu yöntemle bile sesle, Vim motion’a yakın bir kullanım mümkün hale gelir

AST farkındalığının getirdiği yapısal düzenleme

  • Cursorless’in gücü yalnızca basit konum belirtmeyle sınırlı değil; path ve dilin AST farkındalığını birlikte kullanmasından geliyor
  • green urge past green bat gibi bir ifade ile ekrandaki function fetchBlog aralığı seçilebiliyor
  • Dilin AST yapısı anlaşıldığı için tüm fonksiyonu silmek veya başka bir yere taşımak da mümkün oluyor
  • visualize lambdas komutu, fonksiyon içindeki lambda’ları ayrı yapısal birimler olarak görselleştiriyor
  • AST birimleri de birer target olabildiğinden, bir tanımın gövdesi seçilip o aralıkta refaktör etmeye devam edilebiliyor
  • Örnekte bir fonksiyonu asenkron fonksiyona dönüştüren refaktör çok daha kolay hale geliyor

Talon komutlarıyla genişleyen sesli kod yazımı

  • Cursorless ile Talon birlikte kullanıldığında, özel sesli komutlar doğrudan yazılabiliyor
  • async <user.cursorless_destination> örneği, belirtilen destination’ın önüne "async" ekleyen bir komut
[state] async <user.cursorless_destination>:
    user.cursorless_insert(cursorless_destination, "async")
  • Talon komutları genel olarak iki bölüme ayrılır
    • pattern: kullanıcının söylediği kelimeler
    • capture: söylenen içerikten çıkarılan hedef
  • Bu örnekte pattern async, capture ise async eklenecek hedef konum
  • <user.cursorless_destination> capture’ı, herhangi bir target’ın önü ya da arkası gibi bir konumu belirtmeye yarayan özel bir capture
  • Daha karmaşık komutlar da mümkün; Go metot bildirimi oluşturan bir Talon kuralı örnek olarak veriliyor
(method|meth) <user.letter> [<user.go_pointer>] [<user.go_visibility>] <user.text> [over] [<user.go_visibility>] named <user.text> [over]:
    user.go_method(go_pointer or "", letter, go_visibility_1 or "public", text_1, go_visibility_2 or "public", text_2)

Go metot bildirimi ve pointer ifadesi üzerine deneyler

  • Go’da metotlar şu yapıda olur
func (reciever *Type) MethodName() {
    // function body here or something
}
  • Go’da geleneksel anlamda metotlardan ziyade, belirli bir struct içinde ad alanına yerleştirilmiş bir receiver alan fonksiyonlar olduğu açıklanıyor
  • Bu kodu otomasyon olmadan sesle girmek için uzun bir komut dizisi söylemek gerekiyor

state funk args word reciever space star hammer type over go right space hammer method name args go right brack enter

  • Talon kuralı kullanıldığında ise bunu daha kısa söylemek mümkün

meth r raised type named method name over

  • Hâlâ söylenmesi gereken çok kelime var, ancak giriş daha verimli ve zihindeki kavramsallaştırma biçimine daha yakın hale geliyor
  • raised, Go pointer kavramını farklı ifade etme denemesi
    • Go pointer sözdizimi C tarzıdır; * işaretinin pointer değerini normal değere indirmek (lower), & işaretinin ise normal değeri pointer değerine yükseltmek (raise) için kullanıldığı yorumuna dayanılıyor
    • Go için Talon bağlarını yeniden tasarlarken, pointer değerlerini raising/lowering kavramı altında birleştirmenin anlamayı kolaylaştırıp kolaylaştırmadığı deneniyor
  • GitHub Copilot Voice beta programına katılıp bunu Talon tabanlı sesli kod yazımıyla karşılaştırmak isteniyor

1 yorum

 
GN⁺ 2023-11-11
Hacker News yorumları
  • Yazarı benim; burada bu kadar iyi karşılanacağını beklemiyordum.
    İlgileniyorsanız, üzerinde denemeler yaptığım Talon ayarları deposunu buraya koydum: https://github.com/Xe/invocations

    • Bileklerim genel olarak iyi, ama aileden gelen erken başlangıçlı osteoartrit yüzünden parmak eklemlerim her zaman iyi durumda olmuyor.
      Bir gün klavyeden ziyade bu şekilde çalışmanın şart olmasa bile çok daha az acı verdiği bir dönem gelecek gibi geliyor; pratik bir seçenek olduğunu bilmek güzel.
    • HN kitlesinin tam seveceği bir yazı gibi görünüyor.
      Böyle bir kurulumu her gördüğümde nöroçeşitliliğimin diğer insanlardan epey farklı olduğunu hissediyorum. Ekranı anlamak ve içinde gezinmek için zihinde tutulması gereken bağlam ve soyutlama inanılmaz; bu da ancak dillere ve IDE/CLI'lara onlarca yıl alıştıktan sonra mümkünmüş gibi görünüyor.
      “Zamanla Vim komutları gibi ikinci doğa hâline gelir” kısmını da gerçekten öyle öğrenmek gerekir gibi. 30 yıldır bilgisayar kullanıyorum ama bu düzeyde kodlama ustalığı hâlâ hem kafa karıştırıcı hem de hayranlık uyandırıcı.
    • Emacs çözümüne de bakıp bakmadığını merak ediyorum.
      Pek iyi mi değildi, yoksa VS Code tarafındaki çözüm çok daha mı iyi görünüyordu, bilmek isterim.
    • Bu yazı sayesinde Talon'u gerçekten merak edip hemen daldım; şimdiden Warp terminali için bir uygulama katmanı oluşturdum ve normalde algılanmayan terminal Emacs'ını da Talon'a görünür hâle getirdim.
      Cursorless ile çok ilgilenmiyorum; çünkü VSCode kullanmıyorum ve Vim/Evil modundaki metin nesneleri de aynı derecede güçlü, üstelik görsel olarak daha az gürültülü. Bu kavramın tamamı konusunda çok heyecanlıyım.
  • Bu, tree-sitter AST kullanarak buffer'ın “parçaları” üzerinde işlem yapma yöntemine benziyor.
    Öyleyse Vim/Evil'deki metin nesnelerine çok benziyor, sadece üzerine ses bileşeni eklenmiş.
    Buna “kaydet ve sonra çalıştır” gibi bir özellik eklenirse potansiyeli büyük görünüyor. Klavyeyle X işini yaparken, sıradaki Y işi ekranda görünüyorsa ve basit bir işse Y komutunu söyleyip X bittikten sonra bir düğmeye basarak sesli komutu çalıştırabilirsiniz. Yazmakla konuşmayı sırayla yapmaktan çok daha iyi.
    Yazmak ve konuşmak farklı bilişsel alanları kullanıyor; sözdizimini anladıktan sonra yazılım geliştirmek de o kadar dilsel bir iş değil. Aynı anda yazıp konuşabiliyorsanız akış durumuna girmek daha kolay olabilir; bir tür güçlendirilmiş rubber duck debugging gibi görünüyor. Not almak da mümkün olabilir.
    Bir Emacs paketi çıkacak gibi.

    • Emacs, Emacspeak sayesinde ters yönde, yani yazabiliyor ama ekranı göremiyorsanız oldukça iyi.
      Ama bu alanı yakalaması zaman alacak gibi. Görüntüleme motoru Cursorless tarzı işaretlemeyi işleyemiyor ve tree-sitter entegrasyonu da henüz olgun değil. Bizzat denedim.
    • Sesle programlama için şu demoyu görmek iyi olur: https://youtu.be/GM_siEPD4Ws?si=f52wK3tqqJaCQPp7
    • VSCode veya JetBrains'i Cursorless eklentisiyle kontrol eden bir Emacs paketi var.
      Yine de yerel Emacs için olanı olsaydı güzel olurdu.
  • Cursorless'ın kendisi değil ama sesli programlama hakkında harika bir sunum ve demo burada: https://youtu.be/GM_siEPD4Ws?si=99ZhC1P4irOyu1pH
    İzlemesi keyifli ve konuşmacı bu alandaki mevcut ortak sorunları da iyi ele alıyor.

  • Nasıl çalıştığını hâlâ tam olarak anlamaya çalışıyorum.
    Klavye yerine ses kullanan avy'ye benziyor; buna AST farkındalığı olan komutlar eklenmiş gibi geliyor: https://karthinks.com/software/avy-can-do-anything/

    • Doğru. Aslında Emacs için yeniden uygulamaya çalıştığımda ilk adım avy tarzı hats yapmak olmuştu.
      Sonra overlay'lerin her zaman görünür olmasını sağlamaya çalıştım ama bir yerde takıldım.
  • Cursorless yazarının Strange Loop sunumu: https://www.youtube.com/watch?v=NcUJnmBqHTY

  • Neden “urge” ve “bat” kullandığını merak ediyorum.
    İlgili harflerle başlayan herhangi bir kelime kullanılamaz mı?

    • Kullanılamaz. Talon'da kısa ve kolay ayırt edilecek şekilde seçilmiş bir ses alfabesi var.
      Ayrıntılar burada: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
    • Söylemesi kolay ve Talon'ın ayırt etmesi kolay olduğu için.
      Eskiden günde 6-8 saat sesle kodlama yaptığınızda bu tür mikro optimizasyonların her birinin kıymetini anlıyorsunuz.
  • Günümüzde göz izleme teknolojisiyle imleci 2 saniyeden uzun süre bakılan konuma koymak yeterli değil mi?
    Araba kullanırken ya da sanat eserlerine bakarken bakışın nerede durduğuna dair çalışmalar aklıma geliyor.

    • Mümkün olabilir ama ekranda konum belirtmek için 2 saniyeden uzun duraklama çok uzun.
      Kodlama sırasında bu şekilde durakladığınız anlar çok fazla oluyor.
    • YouTube'da göz izleyicilerin kodlama veya oyun için kullanıldığı örnekleri görüp gecikmeyi kendiniz değerlendirebilirsiniz. Bir örnek burada: https://youtu.be/FZRgBw8m34c?feature=shared&t=90
    • Sinir sinyali tıklaması eklenmiş göz izleme gerekiyor.
      En az 3-5 düğmeyi algılayabilen, son derece hızlı tepki veren ve doğru bir göz izleme cihazı lazım: tıklama, basma, bırakma, sağa hareket, sola hareket
  • Bu yazı tarzı bana Gödel, Escher, Bach’teki kaplumbağa ile Aşil arasındaki diyalog bölümlerini çok hatırlattı.
    52 yaşındayım ve 1995’ten beri teknik işlerde her gün klavye kullanıyorum. 2000 civarında tekrarlayan kullanım yaralanması yaşadım; klavyenin önüne bilek koymak için kullanılan yumuşak pedler veya dirseği dayamak için kayar aparatlar gibi ergonomik yardımcıları denedim ama hiçbirinin faydası olmadı.
    Bunun yerine yazma biçimimi değiştirdim. Ellerimi ve bileklerimi gevşek bıraktım; tuşlara basmak için parmaklarımı uzatmak yerine kolumu hareket ettirdim ve işe yaradı.
    Hâlâ her gün çok yazıyorum ama 20 yıldır ağrım yok. Kişiden kişiye değişir ama kolları ve elleri kullanma biçimini değiştirmek çok yardımcı olabilir.

    • Lisede bas gitar çalarken edindiğim en büyük içgörü de buydu.
      Hareketi daha büyük kas gruplarına devredebiliyorsanız genelde bunu yapmak iyidir. Kol yerine omuz/sırtı, el yerine kolu, parmak yerine eli kullanmak gibi.
    • Yaklaşık 15 yıl önce birkaç ay boyunca ağır bir tekrarlayan kullanım yaralanması yaşadım; çeşitli alışkanlıklarımı değiştirdikten sonra geçti.
      Kişiden kişiye değişir ama trackball bana çok yardımcı oldu. Bir süre sol tarafta fare, sağ tarafta trackball tutup dönüşümlü kullandım, ama artık buna gerek kalmadı.
      Dinlenmek ve duruşa dikkat etmek de önemli. Özellikle bilek pozisyonu önemli; bu yüzden bileğimi veya kolumu hiçbir yere dayamadan yalnızca parmaklarımın klavyeye değmesini sağlıyorum.
      Çok daha sonra kettlebell ile kuvvet antrenmanına başladım; gücümün ve kan dolaşımımın epey iyileştiğini hissettim.
    • Yazar bunu bilerek böyle yazmış. Karakter sayfasına bakarsanız Sokrates ile öğrencisi arasındaki diyaloğu yansıtacak şekilde tasarlandığını görürsünüz. Bence oldukça zekice.
    • Asıl mesele yazma biçimini değiştirmek.
      Yaklaşık 10 yıl önce sırt ağrısı, boyun ağrısı ve tekrarlayan kullanım yaralanması sorunlarım vardı. Dik oturmayı öğrendim, masa yüksekliğini düzelttim, karides gibi kambur durarak yazmayayım diye masanın üzerindeki eşyaları yeniden düzenledim. Ayrıca aslında o kadar çok yazmam gerekmediğini de fark ettim.
      O zamandan beri hiç ağrım olmadı.
    • Vücudun geri kalanı da önemli. Özellikle baş ve omuzlar ile core bölgesi, kalça ve ayaklara kadar dikkat etmeye değer.
  • Cursorless’ın genel bir özetini ve pratikte nasıl kullanıldığını görmek istiyorsanız, bu yılki Strange Loop sunumu iyiydi: https://youtube.com/watch?v=NcUJnmBqHTY

  • Çok hoşuma gidiyor ve geliştirilmeye devam etmesine seviniyorum, ama gerçekten derinlemesine dalmak için kolunuzu ya da elinizi sakatlamış olmanız veya ağır bir tekrarlayan kullanım yaralanmanız olması gerekiyor gibi.
    Zihinsel başlangıç maliyeti yüksek görünüyor.

    • Katılıyorum; ama Emacs/Vim, Dvorak/Colemak, chorded klavyeler gibi araçların da başlangıç maliyeti yüksek.
      Yine de en büyük kısıt, bunu fiilen yalnızca evden tek başınıza çalışırken kullanabilecek olmanız gibi görünüyor. Dışarıda veya ofiste kullanıldığını hayal etmek zor.
    • Aktif olarak geliştiriliyor olması güzel.
      Ellerimi kullanamaz hale gelirsem kullanırım gibi geliyor.