{"id":42801,"date":"2026-06-23T21:12:56","date_gmt":"2026-06-23T18:12:56","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/"},"modified":"2026-06-23T21:13:21","modified_gmt":"2026-06-23T18:13:21","slug":"emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/","title":{"rendered":"Emacs&#8217; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?"},"content":{"rendered":"<h2>Emacs&#8217; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?<\/h2>\n<p>Lisp tabanl\u0131 dillerle \u00e7al\u0131\u015f\u0131rken, \u00f6zellikle Emacs Lisp, Clojure veya Common Lisp gibi leh\u00e7elerde, kodun yap\u0131sal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak ve parantez y\u0131\u011f\u0131nlar\u0131 aras\u0131nda kaybolmamak b\u00fcy\u00fck bir zorluk olabilir. Geleneksel metin d\u00fczenleme yakla\u015f\u0131mlar\u0131, Lisp&#8217;in benzersiz S-expression (sembolik ifade) yap\u0131s\u0131yla ba\u015fa \u00e7\u0131kmada \u00e7o\u011fu zaman yetersiz kal\u0131r. \u0130\u015fte tam bu noktada Emacs&#8217;in <code>lispy-mode<\/code> paketi devreye girerek, Lisp kodunu sadece bir metin y\u0131\u011f\u0131n\u0131 olarak de\u011fil, mant\u0131ksal bir yap\u0131 olarak ele almam\u0131z\u0131 sa\u011flayan devrim niteli\u011finde bir \u00e7\u00f6z\u00fcm sunar. Bu makalede, <code>lispy-mode<\/code>&#8216;un temel prensiplerinden ba\u015flayarak, ger\u00e7ek d\u00fcnya senaryolar\u0131nda karma\u015f\u0131k Lisp kodlar\u0131n\u0131 nas\u0131l kolayca refakt\u00f6r edebilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Amac\u0131m\u0131z, da\u011f\u0131n\u0131k ve i\u00e7 i\u00e7e ge\u00e7mi\u015f bir Elisp yap\u0131land\u0131rmas\u0131n\u0131, <code>lispy-mode<\/code>&#8216;un sundu\u011fu yap\u0131sal d\u00fczenleme yetenekleriyle nas\u0131l d\u00fczenli, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir bir hale getirebilece\u011finizi g\u00f6stermektir.<\/p>\n<h2>Lisp Kod D\u00fczenlemede Neden Geleneksel Y\u00f6ntemler Yetersiz Kal\u0131r?<\/h2>\n<p>Lisp dilleri, di\u011fer \u00e7o\u011fu programlama dilinden farkl\u0131 olarak, kodu ve veriyi ayn\u0131 temel yap\u0131ta\u015flar\u0131 olan S-expression&#8217;lar (sembolik ifadeler) arac\u0131l\u0131\u011f\u0131yla temsil eder. Bu, Lisp&#8217;e inan\u0131lmaz bir esneklik ve makro yazma yetene\u011fi kazand\u0131rsa da, ayn\u0131 zamanda parantezlerin yo\u011fun kullan\u0131m\u0131 nedeniyle &#8220;parantez cehennemi&#8221; (paren hell) olarak bilinen bir zorlu\u011fu da beraberinde getirir. S\u0131radan bir metin d\u00fczenleyiciyle Lisp kodu \u00fczerinde \u00e7al\u0131\u015f\u0131rken, bir parantezi yanl\u0131\u015fl\u0131kla silmek, kopyalamak veya ta\u015f\u0131mak, t\u00fcm program\u0131n s\u00f6zdizimini (syntax) bozabilir ve saatler s\u00fcren hata ay\u0131klama (debugging) seanslar\u0131na yol a\u00e7abilir. Bu durum, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k projelerde veya Emacs&#8217;in kendi yap\u0131land\u0131rma dosyas\u0131 olan <code>init.el<\/code> gibi i\u00e7 i\u00e7e ge\u00e7mi\u015f Elisp kodlar\u0131yla u\u011fra\u015f\u0131rken daha da belirginle\u015fir.<\/p>\n<p>Geleneksel d\u00fczenleme y\u00f6ntemleri, karakter bazl\u0131 veya sat\u0131r bazl\u0131 i\u015flemlerle s\u0131n\u0131rl\u0131d\u0131r. \u00d6rne\u011fin, bir ifadenin i\u00e7indeki bir arg\u00fcman\u0131 de\u011fi\u015ftirmek istedi\u011finizde, genellikle imleci o arg\u00fcman\u0131n ba\u015f\u0131na getirip siler, sonra yenisini yazars\u0131n\u0131z. Ancak Lisp&#8217;te bir &#8220;arg\u00fcman&#8221; veya &#8220;ifade&#8221;, birden fazla sat\u0131ra yay\u0131lm\u0131\u015f karma\u015f\u0131k bir S-expression olabilir. Bu durumda, manuel olarak do\u011fru parantez \u00e7iftini bulmak, se\u00e7mek ve ta\u015f\u0131mak olduk\u00e7a zahmetli ve hataya a\u00e7\u0131kt\u0131r. Bir ifadeyi kopyalay\u0131p yap\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, bazen fazladan bir parantez ekler, bazen de eksik b\u0131rak\u0131rs\u0131n\u0131z. Bu k\u00fc\u00e7\u00fck hatalar, kodun derlenmesini veya \u00e7al\u0131\u015fmas\u0131n\u0131 engelleyebilir. Lisp&#8217;in g\u00fcc\u00fc, kodun kendisinin veri olmas\u0131 ve bu verinin programatik olarak manip\u00fcle edilebilir olmas\u0131d\u0131r. Ancak geleneksel d\u00fczenleyiciler bu g\u00fcc\u00fc g\u00f6rmezden gelir ve kodu sadece bir metin dizisi olarak ele al\u0131r.<\/p>\n<p>Emacs, Lisp ile derin bir ba\u011fa sahip oldu\u011fundan, Lisp kodunu d\u00fczenlemek i\u00e7in yerle\u015fik bir\u00e7ok \u00f6zelli\u011fe sahiptir. \u00d6rne\u011fin, <code>paredit-mode<\/code> gibi paketler, parantez e\u015fle\u015ftirmeyi ve temel yap\u0131sal d\u00fczenlemeleri kolayla\u015ft\u0131r\u0131r. Ancak <code>lispy-mode<\/code>, bu kavram\u0131 daha da ileri ta\u015f\u0131yarak, Lisp kodunu bir a\u011fa\u00e7 yap\u0131s\u0131 olarak ele al\u0131r ve kullan\u0131c\u0131n\u0131n bu a\u011fa\u00e7 \u00fczerinde sezgisel ve verimli bir \u015fekilde gezinmesini, de\u011fi\u015ftirmesini ve yeniden yap\u0131land\u0131rmas\u0131n\u0131 sa\u011flar. Bu sayede, parantezlerin nerede ba\u015flay\u0131p bitti\u011fini s\u00fcrekli takip etmek zorunda kalmazs\u0131n\u0131z; bunun yerine, do\u011frudan mant\u0131ksal ifadelere odaklan\u0131rs\u0131n\u0131z. Bu yakla\u015f\u0131m, sadece hata oran\u0131n\u0131 d\u00fc\u015f\u00fcrmekle kalmaz, ayn\u0131 zamanda kod yazma ve refakt\u00f6r etme h\u0131z\u0131n\u0131z\u0131 da \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Lisp&#8217;in felsefesini ger\u00e7ekten kucaklayan bir d\u00fczenleme deneyimi i\u00e7in <code>lispy-mode<\/code> vazge\u00e7ilmez bir ara\u00e7 haline gelir.<\/p>\n<h2>Lispy-mode Nedir ve Temel Kavramlar\u0131 Nelerdir?<\/h2>\n<p><code>Lispy-mode<\/code>, Emacs kullan\u0131c\u0131lar\u0131 i\u00e7in Lisp tabanl\u0131 dilleri (Emacs Lisp, Common Lisp, Clojure, Racket vb.) \u00e7ok daha verimli bir \u015fekilde d\u00fczenlemeyi sa\u011flayan g\u00fc\u00e7l\u00fc bir yap\u0131sal d\u00fczenleme (structural editing) paketidir. Temel amac\u0131, Lisp kodunu karakter veya sat\u0131r baz\u0131nda de\u011fil, S-expression&#8217;lar (sembolik ifadeler) baz\u0131nda manip\u00fcle etmenizi sa\u011flamakt\u0131r. Bu sayede, parantezleri elle y\u00f6netme y\u00fck\u00fcnden kurtulur, kodun mant\u0131ksal yap\u0131s\u0131na odaklanabilirsiniz. <code>Lispy-mode<\/code>, <code>paredit-mode<\/code> gibi di\u011fer yap\u0131sal d\u00fczenleyicilere g\u00f6re daha minimalist bir aray\u00fcz ve daha sezgisel bir komut seti sunar, bu da onu hem yeni ba\u015flayanlar hem de deneyimli kullan\u0131c\u0131lar i\u00e7in cazip k\u0131lar.<\/p>\n<p><code>Lispy-mode<\/code>&#8216;un kalbinde, Lisp kodunun S-expression&#8217;lardan olu\u015fan bir a\u011fa\u00e7 yap\u0131s\u0131 oldu\u011fu fikri yatar. Her S-expression, bir ifadeyi, bir fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131, bir de\u011fi\u015fken tan\u0131m\u0131n\u0131 veya bir veri yap\u0131s\u0131n\u0131 temsil edebilir. <code>Lispy-mode<\/code> ile imleciniz her zaman belirli bir S-expression&#8217;\u0131n i\u00e7inde veya \u00fczerinde bulunur ve t\u00fcm i\u015flemleriniz bu S-expression&#8217;lar \u00fczerinde ger\u00e7ekle\u015fir. \u00d6rne\u011fin, bir S-expression&#8217;\u0131 silmek, kopyalamak veya ba\u015fka bir yere ta\u015f\u0131mak istedi\u011finizde, <code>lispy-mode<\/code> otomatik olarak t\u00fcm parantezleri ve i\u00e7indeki i\u00e7eri\u011fi do\u011fru bir \u015fekilde y\u00f6netir. Bu, kodunuzun s\u00f6zdizimsel olarak her zaman ge\u00e7erli kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Temel <code>lispy-mode<\/code> komutlar\u0131 genellikle tek tu\u015fla veya basit tu\u015f kombinasyonlar\u0131yla tetiklenir ve \u00e7o\u011fu zaman Emacs&#8217;in kendi hareket komutlar\u0131na benzer bir mant\u0131k izler. \u00d6rne\u011fin:<\/p>\n<ul>\n<li><code>s<\/code> (sexp-forward): \u0130mleci bir sonraki S-expression&#8217;a ta\u015f\u0131r.<\/li>\n<li><code>w<\/code> (sexp-backward): \u0130mleci bir \u00f6nceki S-expression&#8217;a ta\u015f\u0131r.<\/li>\n<li><code>e<\/code> (sexp-down): \u0130mleci mevcut S-expression&#8217;\u0131n i\u00e7ine, ilk alt S-expression&#8217;a indirir.<\/li>\n<li><code>u<\/code> (sexp-up): \u0130mleci mevcut S-expression&#8217;\u0131n d\u0131\u015f\u0131na, bir \u00fcst S-expression&#8217;a \u00e7\u0131kar\u0131r.<\/li>\n<li><code>d<\/code> (lispy-delete): Mevcut S-expression&#8217;\u0131 siler.<\/li>\n<li><code>k<\/code> (lispy-kill): Mevcut S-expression&#8217;\u0131 keser (kill ring&#8217;e atar).<\/li>\n<li><code>y<\/code> (lispy-yank): Kesilen S-expression&#8217;\u0131 yap\u0131\u015ft\u0131r\u0131r.<\/li>\n<li><code>(<\/code> (lispy-wrap): Se\u00e7ili b\u00f6lgeyi veya mevcut S-expression&#8217;\u0131 yeni bir parantez i\u00e7ine al\u0131r (sarmalar).<\/li>\n<li><code>C-<right><\/code> (lispy-splice): Mevcut S-expression&#8217;\u0131n parantezlerini kald\u0131r\u0131r ve i\u00e7eri\u011fini bir \u00fcst seviyeye ta\u015f\u0131r.<\/li>\n<\/ul>\n<p>Bu komutlar, Lisp kodunda \u00e7ok h\u0131zl\u0131 bir \u015fekilde gezinmenizi ve de\u011fi\u015fiklikler yapman\u0131z\u0131 sa\u011flar. Geleneksel Emacs hareket komutlar\u0131 (<code>C-f<\/code>, <code>C-b<\/code>, <code>C-n<\/code>, <code>C-p<\/code>) karakter veya sat\u0131r baz\u0131nda hareket ederken, <code>lispy-mode<\/code>&#8216;un hareket komutlar\u0131 do\u011frudan S-expression&#8217;lar \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu, \u00f6zellikle karma\u015f\u0131k ve derinlemesine i\u00e7 i\u00e7e ge\u00e7mi\u015f Lisp kodlar\u0131nda gezinirken b\u00fcy\u00fck bir avantaj sa\u011flar. \u00d6rne\u011fin, <code>C-f<\/code> ile bir karakter ileri giderken, <code>s<\/code> ile t\u00fcm bir fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131 veya veri yap\u0131s\u0131n\u0131 atlayabilirsiniz.<\/p>\n<p><strong>Kurulum ve \u0130lk Ad\u0131mlar:<\/strong><\/p>\n<p><code>Lispy-mode<\/code>&#8216;u kurmak olduk\u00e7a basittir. Emacs&#8217;in paket y\u00f6neticisi (<code>M-x package-list-packages<\/code>) arac\u0131l\u0131\u011f\u0131yla veya <code>use-package<\/code> gibi bir paketle <code>init.el<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki sat\u0131rlar\u0131 ekleyerek kurabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>(require 'package)\n(add-to-list 'package-archives '(\"melpa\" . \"https:\/\/melpa.org\/packages\/\") t)\n(package-initialize)\n(unless (package-installed-p 'lispy)\n  (package-refresh-contents)\n  (package-install 'lispy))\n\n(add-hook 'emacs-lisp-mode-hook #'lispy-mode)\n(add-hook 'clojure-mode-hook #'lispy-mode)\n(add-hook 'common-lisp-mode-hook #'lispy-mode)\n;; Di\u011fer Lisp modlar\u0131 i\u00e7in de ekleyebilirsiniz<\/code><\/pre>\n<\/div>\n<p>Bu yap\u0131land\u0131rma, Emacs&#8217;i ba\u015flatt\u0131\u011f\u0131n\u0131zda <code>lispy-mode<\/code>&#8216;u otomatik olarak y\u00fckler ve ilgili Lisp modlar\u0131 i\u00e7in etkinle\u015ftirir. Kurulumdan sonra, bir Elisp dosyas\u0131 a\u00e7t\u0131\u011f\u0131n\u0131zda veya <code>M-x lispy-mode<\/code> komutunu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>lispy-mode<\/code> aktif hale gelecektir. Art\u0131k imlecinizi Lisp kodu \u00fczerinde hareket ettirip yukar\u0131da bahsedilen komutlar\u0131 deneyerek, yap\u0131sal d\u00fczenlemenin g\u00fcc\u00fcn\u00fc hissetmeye ba\u015flayabilirsiniz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Karma\u015f\u0131k Bir Elisp Yap\u0131land\u0131rmas\u0131n\u0131 Refakt\u00f6r Etmek<\/h2>\n<p>\u015eimdi, <code>lispy-mode<\/code>&#8216;un ger\u00e7ek potansiyelini g\u00f6zler \u00f6n\u00fcne serecek, karma\u015f\u0131k bir senaryoya dalal\u0131m: Y\u0131llar i\u00e7inde birikmi\u015f, da\u011f\u0131n\u0131k ve az d\u00fczenlenmi\u015f bir Emacs yap\u0131land\u0131rma dosyas\u0131n\u0131 (<code>init.el<\/code>) refakt\u00f6r etmek. Emacs kullan\u0131c\u0131lar\u0131 bilir ki, bu dosya zamanla b\u00fcy\u00fcr, farkl\u0131 paketlerin ayarlar\u0131, ki\u015fisel fonksiyonlar ve ge\u00e7ici \u00e7\u00f6z\u00fcmlerle dolar. Sonu\u00e7, genellikle okunmas\u0131 ve s\u00fcrd\u00fcr\u00fclmesi zor, i\u00e7 i\u00e7e ge\u00e7mi\u015f bir kod y\u0131\u011f\u0131n\u0131d\u0131r. Senaryomuzda, belirli bir mod\u00fcl\u00fc, \u00f6rne\u011fin &#8220;proje y\u00f6netimi&#8221; ile ilgili ayarlar\u0131 ve fonksiyonlar\u0131, ana dosyadan ay\u0131rarak daha d\u00fczenli bir hale getirece\u011fiz. Ayr\u0131ca, bu mod\u00fcl i\u00e7indeki baz\u0131 karma\u015f\u0131k ifadelere yeni arg\u00fcmanlar ekleyerek veya onlar\u0131 yeni fonksiyonlara d\u00f6n\u00fc\u015ft\u00fcrerek daha esnek hale getirece\u011fiz.<\/p>\n<p><strong>Mevcut Durumun Betimlemesi:<\/strong><\/p>\n<p>Hayal edin ki, <code>init.el<\/code> dosyan\u0131zda a\u015fa\u011f\u0131daki gibi bir b\u00f6l\u00fcm var. Bu b\u00f6l\u00fcm, birka\u00e7 farkl\u0131 proje y\u00f6netimi arac\u0131n\u0131 (\u00f6rne\u011fin, <code>projectile<\/code>, <code>magit<\/code> entegrasyonu ve \u00f6zel bir dosya bulucu) yap\u0131land\u0131rmak i\u00e7in yaz\u0131lm\u0131\u015f, ancak zamanla eklemelerle karma\u015f\u0131kla\u015fm\u0131\u015f. Birka\u00e7 i\u00e7 i\u00e7e ge\u00e7mi\u015f <code>if<\/code>, <code>progn<\/code> ve <code>lambda<\/code> ifadesi i\u00e7eriyor ve her \u015fey tek bir b\u00fcy\u00fck blok i\u00e7inde yer al\u0131yor. Bu durum, bu ayarlar\u0131 ba\u015fka bir dosyaya ta\u015f\u0131mak veya mod\u00fcler hale getirmek istedi\u011finizde b\u00fcy\u00fck bir ba\u015f a\u011fr\u0131s\u0131 yarat\u0131yor.<\/p>\n<div class=\"code-container\">\n<pre><code>;;; Proje Y\u00f6netimi Ayarlar\u0131 - Karma\u015f\u0131k ve Da\u011f\u0131n\u0131k B\u00f6l\u00fcm\n(if (eq system-type 'gnu\/linux)\n    (progn\n      (message \"Linux sisteminde proje ayarlar\u0131 y\u00fckleniyor...\")\n      (setq projectile-project-search-path '(\"~\/projeler\/\" \"~\/i\u015f\/\"))\n      (unless (package-installed-p 'projectile)\n        (package-install 'projectile))\n      (projectile-mode +1)\n      (add-hook 'prog-mode-hook #'projectile-mode)\n      (when (require 'magit nil t)\n        (message \"Magit entegrasyonu etkinle\u015ftiriliyor.\")\n        (setq magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))\n      (define-key projectile-mode-map (kbd \"C-c p\") 'projectile-command-map)\n      (lambda ()\n        (interactive)\n        (let ((proje-adi (read-string \"Proje Ad\u0131: \")))\n          (find-file (format \"\/home\/kullanici\/projeler\/%s\/README.md\" proje-adi))))\n      (message \"\u00d6zel proje komutlar\u0131 y\u00fcklendi.\"))\n  (message \"Di\u011fer sistemlerde varsay\u0131lan proje ayarlar\u0131 kullan\u0131l\u0131yor.\"))\n\n;; Di\u011fer yap\u0131land\u0131rmalar burada devam ediyor...<\/code><\/pre>\n<\/div>\n<p>Bu kod blo\u011fu olduk\u00e7a karma\u015f\u0131k. \u0130\u00e7inde bir sistem t\u00fcr\u00fc kontrol\u00fc (<code>if (eq system-type 'gnu\/linux)<\/code>), bir dizi yap\u0131land\u0131rma ad\u0131m\u0131 (<code>progn<\/code>), bir paket kurulum kontrol\u00fc (<code>unless (package-installed-p 'projectile)<\/code>), bir ba\u015fka paket entegrasyonu (<code>when (require 'magit nil t)<\/code>) ve hatta anonim bir fonksiyon (<code>lambda<\/code>) var. Bu b\u00f6l\u00fcm\u00fc ana <code>init.el<\/code> dosyas\u0131ndan ay\u0131r\u0131p, \u00f6rne\u011fin <code>my-project-config.el<\/code> ad\u0131nda ayr\u0131 bir dosyaya ta\u015f\u0131mak ve belki de <code>my-project-setup-linux<\/code> ad\u0131nda bir fonksiyona sarmak istiyoruz. Ayr\u0131ca, <code>projectile-project-search-path<\/code> ayar\u0131n\u0131 dinamik hale getirmek ve <code>lambda<\/code> fonksiyonunu daha genel bir yard\u0131mc\u0131 fonksiyona d\u00f6n\u00fc\u015ft\u00fcrmek de hedeflerimiz aras\u0131nda.<\/p>\n<p>Geleneksel bir metin d\u00fczenleyiciyle bu i\u015flemi yapmak, imleci do\u011fru parantezlerin ba\u015f\u0131na ve sonuna getirmek, se\u00e7imi geni\u015fletmek, kesmek, yeni dosyaya yap\u0131\u015ft\u0131rmak ve sonra ana dosyada kalan bo\u015fluklar\u0131 temizlemek anlam\u0131na gelir. Bu, \u00f6zellikle i\u00e7 i\u00e7e ge\u00e7mi\u015f <code>progn<\/code> ve <code>lambda<\/code> ifadelerinde, parantez e\u015fle\u015ftirmeyi elle kontrol etmeyi gerektirdi\u011finden olduk\u00e7a hataya a\u00e7\u0131kt\u0131r. <code>lispy-mode<\/code> ile bu s\u00fcre\u00e7, S-expression&#8217;lar \u00fczerinde yap\u0131sal olarak hareket ederek \u00e7ok daha g\u00fcvenli ve h\u0131zl\u0131 hale gelir. \u015eimdi, bu refakt\u00f6r i\u015flemini <code>lispy-mode<\/code> kullanarak ad\u0131m ad\u0131m nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimize bakal\u0131m.<\/p>\n<h2>Ad\u0131m Ad\u0131m Refakt\u00f6r: Lispy-mode ile Yap\u0131sal Ta\u015f\u0131ma ve D\u00f6n\u00fc\u015ft\u00fcrme<\/h2>\n<p>Yukar\u0131daki karma\u015f\u0131k Elisp blo\u011funu refakt\u00f6r etme s\u00fcrecini <code>lispy-mode<\/code> komutlar\u0131yla ad\u0131m ad\u0131m inceleyelim. Amac\u0131m\u0131z, Linux&#8217;a \u00f6zel proje ayarlar\u0131n\u0131 ayr\u0131 bir fonksiyona ta\u015f\u0131mak ve daha sonra bu fonksiyonu ba\u015fka bir dosyaya kaydetmek.<\/p>\n<p><strong>1. Ana Blo\u011fu Se\u00e7me ve Kesme:<\/strong><\/p>\n<p>\u0130lk olarak, t\u00fcm Linux&#8217;a \u00f6zg\u00fc yap\u0131land\u0131rma blo\u011funu (<code>(progn ...)<\/code> ifadesini) se\u00e7memiz ve kesmemiz gerekiyor. \u0130mlecinizi <code>(progn<\/code> ifadesinin hemen ba\u015f\u0131na getirin.<\/p>\n<div class=\"code-container\">\n<pre><code>(if (eq system-type 'gnu\/linux)\n    |> (progn\n      (message \"Linux sisteminde proje ayarlar\u0131 y\u00fckleniyor...\")\n      ...\n      (message \"\u00d6zel proje komutlar\u0131 y\u00fcklendi.\"))\n  (message \"Di\u011fer sistemlerde varsay\u0131lan proje ayarlar\u0131 kullan\u0131l\u0131yor.\"))<\/code><\/pre>\n<\/div>\n<p>\u015eimdi, <code>lispy-mode<\/code>&#8216;da <code>k<\/code> (<code>lispy-kill<\/code>) tu\u015funa bas\u0131n. <code>lispy-mode<\/code>, imlecinizin bulundu\u011fu S-expression&#8217;\u0131 (yani t\u00fcm <code>progn<\/code> blo\u011funu) otomatik olarak se\u00e7ecek ve kill ring&#8217;e atacakt\u0131r. Ana <code>if<\/code> ifadesi art\u0131k \u015f\u00f6yle g\u00f6r\u00fcnecek:<\/p>\n<div class=\"code-container\">\n<pre><code>(if (eq system-type 'gnu\/linux)\n    nil ; Bo\u015f bir ifade veya ba\u015fka bir \u015feyle de\u011fi\u015ftirilebilir\n  (message \"Di\u011fer sistemlerde varsay\u0131lan proje ayarlar\u0131 kullan\u0131l\u0131yor.\"))<\/code><\/pre>\n<\/div>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>progn<\/code> blo\u011fu gitti ve yerine <code>nil<\/code> (veya imlecin konumu) kald\u0131. Bu, kodun hala ge\u00e7erli bir Elisp s\u00f6zdizimine sahip oldu\u011fu anlam\u0131na gelir.<\/p>\n<p><strong>2. Yeni Bir Fonksiyon Tan\u0131mlama ve Kodu Yap\u0131\u015ft\u0131rma:<\/strong><\/p>\n<p>\u015eimdi bu kodu yeni bir fonksiyona sarmalamak istiyoruz. Bo\u015f bir yere gidin ve yeni bir fonksiyon tan\u0131m\u0131 yazmaya ba\u015flay\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-project-setup-linux ()\n  )<\/code><\/pre>\n<\/div>\n<p>\u0130mlecinizi <code>()<\/code> parantezlerinin i\u00e7ine getirin ve <code>y<\/code> (<code>lispy-yank<\/code>) tu\u015funa basarak kesti\u011finiz <code>progn<\/code> blo\u011funu yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-project-setup-linux ()\n  (progn\n    (message \"Linux sisteminde proje ayarlar\u0131 y\u00fckleniyor...\")\n    (setq projectile-project-search-path '(\"~\/projeler\/\" \"~\/i\u015f\/\"))\n    (unless (package-installed-p 'projectile)\n      (package-install 'projectile))\n    (projectile-mode +1)\n    (add-hook 'prog-mode-hook #'projectile-mode)\n    (when (require 'magit nil t)\n      (message \"Magit entegrasyonu etkinle\u015ftiriliyor.\")\n      (setq magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))\n    (define-key projectile-mode-map (kbd \"C-c p\") 'projectile-command-map)\n    (lambda ()\n      (interactive)\n      (let ((proje-adi (read-string \"Proje Ad\u0131: \")))\n        (find-file (format \"\/home\/kullanici\/projeler\/%s\/README.md\" proje-adi))))\n    (message \"\u00d6zel proje komutlar\u0131 y\u00fcklendi.\")))<\/code><\/pre>\n<\/div>\n<p>Art\u0131k t\u00fcm karma\u015f\u0131k kod blo\u011fu, <code>my-project-setup-linux<\/code> ad\u0131nda yeni bir fonksiyonun i\u00e7ine ta\u015f\u0131nm\u0131\u015f oldu. Bu fonksiyonu ayr\u0131 bir dosyaya kaydedip ana <code>init.el<\/code> dosyan\u0131zdan <code>(load-file \"~\/path\/to\/my-project-config.el\")<\/code> veya <code>(require 'my-project-config)<\/code> ile y\u00fckleyebilirsiniz.<\/p>\n<p><strong>3. \u0130\u00e7 \u0130\u00e7e Ge\u00e7mi\u015f Bir \u0130fadeyi Yukar\u0131 \u00c7\u0131karma (Splicing):<\/strong><\/p>\n<p><code>progn<\/code> ifadesi genellikle gereksizdir, \u00e7\u00fcnk\u00fc bir fonksiyonun g\u00f6vdesi zaten bir dizi ifadeyi bar\u0131nd\u0131rabilir. <code>lispy-mode<\/code> ile bu <code>progn<\/code> ifadesini kolayca kald\u0131rabiliriz. \u0130mlecinizi <code>(progn<\/code> ifadesinin ba\u015f\u0131na getirin:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-project-setup-linux ()\n  |> (progn\n    (message \"Linux sisteminde proje ayarlar\u0131 y\u00fckleniyor...\")\n    ...))<\/code><\/pre>\n<\/div>\n<p>\u015eimdi <code>C-<right><\/code> (<code>lispy-splice<\/code>) tu\u015f kombinasyonuna bas\u0131n. Bu komut, mevcut S-expression&#8217;\u0131n parantezlerini kald\u0131r\u0131r ve i\u00e7indeki i\u00e7eri\u011fi bir \u00fcst seviyeye ta\u015f\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-project-setup-linux ()\n  (message \"Linux sisteminde proje ayarlar\u0131 y\u00fckleniyor...\")\n  (setq projectile-project-search-path '(\"~\/projeler\/\" \"~\/i\u015f\/\"))\n  (unless (package-installed-p 'projectile)\n    (package-install 'projectile))\n  (projectile-mode +1)\n  (add-hook 'prog-mode-hook #'projectile-mode)\n  (when (require 'magit nil t)\n    (message \"Magit entegrasyonu etkinle\u015ftiriliyor.\")\n    (setq magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))\n  (define-key projectile-mode-map (kbd \"C-c p\") 'projectile-command-map)\n  (lambda ()\n    (interactive)\n    (let ((proje-adi (read-string \"Proje Ad\u0131: \")))\n      (find-file (format \"\/home\/kullanici\/projeler\/%s\/README.md\" proje-adi))))\n  (message \"\u00d6zel proje komutlar\u0131 y\u00fcklendi.\"))<\/code><\/pre>\n<\/div>\n<p><code>progn<\/code> ifadesi art\u0131k yok, kod daha d\u00fczg\u00fcn g\u00f6r\u00fcn\u00fcyor.<\/p>\n<p><strong>4. Bir \u0130fadeyi Yeni Bir Fonksiyonla Sarmalama (Wrapping):<\/strong><\/p>\n<p>\u015eimdi, anonim <code>lambda<\/code> fonksiyonunu daha genel bir yard\u0131mc\u0131 fonksiyona d\u00f6n\u00fc\u015ft\u00fcrmek istiyoruz. \u0130mlecinizi <code>(lambda<\/code> ifadesinin ba\u015f\u0131na getirin:<\/p>\n<div class=\"code-container\">\n<pre><code>...\n  |> (lambda ()\n    (interactive)\n    (let ((proje-adi (read-string \"Proje Ad\u0131: \")))\n      (find-file (format \"\/home\/kullanici\/projeler\/%s\/README.md\" proje-adi))))\n  (message \"\u00d6zel proje komutlar\u0131 y\u00fcklendi.\"))<\/code><\/pre>\n<\/div>\n<p><code>lispy-mode<\/code>&#8216;da <code>(<\/code> (sol parantez) tu\u015funa bas\u0131n. Bu, imlecinizin bulundu\u011fu S-expression&#8217;\u0131 yeni bir parantez i\u00e7ine al\u0131r. \u015eimdi bu yeni parantezin i\u00e7ine <code>defun my-open-project-readme (project-name)<\/code> yaz\u0131n (veya <code>defun<\/code> blo\u011funu yaz\u0131n ve sonra <code>y<\/code> ile <code>lambda<\/code>&#8216;y\u0131 yap\u0131\u015ft\u0131r\u0131n). Sonu\u00e7 olarak \u015f\u00f6yle bir \u015fey elde edersiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-open-project-readme (project-name)\n  (lambda ()\n    (interactive)\n    (let ((proje-adi (read-string \"Proje Ad\u0131: \")))\n      (find-file (format \"\/home\/kullanici\/projeler\/%s\/README.md\" proje-adi)))))<\/code><\/pre>\n<\/div>\n<p>\u015eimdi <code>lambda<\/code> ifadesini bu yeni fonksiyonun g\u00f6vdesine ta\u015f\u0131mam\u0131z ve arg\u00fcmanlar\u0131 ayarlamam\u0131z gerekiyor. \u0130lk olarak <code>lambda<\/code> ifadesini <code>k<\/code> ile kesin. Ard\u0131ndan, <code>my-open-project-readme<\/code> fonksiyonunun g\u00f6vdesine <code>y<\/code> ile yap\u0131\u015ft\u0131r\u0131n. <code>lambda<\/code>&#8216;n\u0131n i\u00e7indeki <code>proje-adi<\/code> de\u011fi\u015fkenini <code>project-name<\/code> arg\u00fcman\u0131yla de\u011fi\u015ftirin ve <code>interactive<\/code> ifadesini kald\u0131r\u0131n (\u00e7\u00fcnk\u00fc bu fonksiyon art\u0131k do\u011frudan \u00e7a\u011fr\u0131lacak). Bu ad\u0131mlar manuel d\u00fczenleme gerektirse de, <code>lispy-mode<\/code>&#8216;un yap\u0131sal hareketleri sayesinde kod blo\u011funu kolayca ta\u015f\u0131yabildik.<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-open-project-readme (project-name)\n  \"Verilen proje ad\u0131n\u0131n README.md dosyas\u0131n\u0131 a\u00e7ar.\"\n  (find-file (format \"\/home\/kullanici\/projeler\/%s\/README.md\" project-name)))<\/code><\/pre>\n<\/div>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, karma\u015f\u0131k bir <code>lambda<\/code> ifadesini temiz ve yeniden kullan\u0131labilir bir fonksiyona d\u00f6n\u00fc\u015ft\u00fcrd\u00fck. Bu fonksiyonu art\u0131k <code>(my-open-project-readme \"EmacsWidgets\")<\/code> gibi \u00e7a\u011f\u0131rabiliriz. Bu ad\u0131mlar, <code>lispy-mode<\/code>&#8216;un karma\u015f\u0131k refakt\u00f6r i\u015flemlerini ne kadar kolayla\u015ft\u0131rd\u0131\u011f\u0131n\u0131 g\u00f6steriyor. Parantezlerle u\u011fra\u015fmak yerine, do\u011frudan kodun mant\u0131ksal yap\u0131s\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131yoruz.<\/p>\n<h3>Fonksiyon \u00c7\u0131karma ve Arg\u00fcmanlar\u0131 Y\u00f6netme: Lispy-mode&#8217;un G\u00fcc\u00fc<\/h3>\n<p>Refakt\u00f6r s\u00fcrecimizde, mevcut kod blo\u011fundan daha k\u00fc\u00e7\u00fck, yeniden kullan\u0131labilir fonksiyonlar \u00e7\u0131karmak ve bu fonksiyonlara dinamik arg\u00fcmanlar sa\u011flamak, kodun mod\u00fclerli\u011fini ve okunabilirli\u011fini art\u0131racakt\u0131r. <code>lispy-mode<\/code>, bu t\u00fcr i\u015flemlerde bize b\u00fcy\u00fck kolayl\u0131klar sunar.<\/p>\n<p>\u00d6rne\u011fimizdeki <code>my-project-setup-linux<\/code> fonksiyonunun i\u00e7indeki <code>projectile-project-search-path<\/code> ayar\u0131n\u0131 ele alal\u0131m. Varsay\u0131lan olarak <code>'(\"~\/projeler\/\" \"~\/i\u015f\/\")<\/code> olarak ayarl\u0131, ancak bu yolu dinamik olarak belirlemek isteyebiliriz. Fonksiyonumuza bir arg\u00fcman ekleyerek bunu yapabiliriz.<\/p>\n<p><strong>1. Fonksiyona Arg\u00fcman Ekleme:<\/strong><\/p>\n<p><code>my-project-setup-linux<\/code> fonksiyonunun tan\u0131m\u0131na gidin:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-project-setup-linux ()\n  ...)<\/code><\/pre>\n<\/div>\n<p>\u0130mlecinizi <code>()<\/code> parantezlerinin i\u00e7ine getirin ve <code>project-paths<\/code> arg\u00fcman\u0131n\u0131 ekleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-project-setup-linux (project-paths)\n  ...)<\/code><\/pre>\n<\/div>\n<p>\u015eimdi, fonksiyonun g\u00f6vdesindeki <code>(setq projectile-project-search-path '(\"~\/projeler\/\" \"~\/i\u015f\/\"))<\/code> ifadesini bulal\u0131m. \u0130mlecinizi bu S-expression&#8217;\u0131n \u00fczerine getirin. <code>lispy-mode<\/code>&#8216;da <code>e<\/code> (sexp-down) tu\u015funa basarak ifadenin i\u00e7ine girin, ard\u0131ndan <code>s<\/code> (sexp-forward) ile <code>'(\"~\/projeler\/\" \"~\/i\u015f\/\")<\/code> k\u0131sm\u0131na gelin. Bu k\u0131sm\u0131 <code>k<\/code> ile kesin ve yerine <code>project-paths<\/code> yaz\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>(setq projectile-project-search-path project-paths)<\/code><\/pre>\n<\/div>\n<p>Art\u0131k <code>my-project-setup-linux<\/code> fonksiyonunu \u00e7a\u011f\u0131r\u0131rken, arama yollar\u0131n\u0131 d\u0131\u015far\u0131dan belirleyebiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>(my-project-setup-linux '(\"~\/my-personal-projects\/\" \"~\/work\/clients\/\"))<\/code><\/pre>\n<\/div>\n<p>Bu, kodumuzun esnekli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<p><strong>2. Karma\u015f\u0131k \u0130fadeleri D\u00f6n\u00fc\u015ft\u00fcrme: <code>if<\/code>&#8216;ten <code>cond<\/code>&#8216;a Ge\u00e7i\u015f<\/strong><\/p>\n<p>Bazen daha okunabilir veya geni\u015fletilebilir bir yap\u0131ya ge\u00e7mek i\u00e7in ifadeleri d\u00f6n\u00fc\u015ft\u00fcrmek isteyebiliriz. \u00d6rne\u011fin, tek bir <code>if<\/code> ifadesini, birden fazla durumu kontrol edebilen bir <code>cond<\/code> ifadesine \u00e7evirmek. \u015eu anda ana <code>init.el<\/code> dosyam\u0131zda basit bir <code>if<\/code> ifadesi var:<\/p>\n<div class=\"code-container\">\n<pre><code>(if (eq system-type 'gnu\/linux)\n    (my-project-setup-linux '(\"~\/projeler\/\" \"~\/i\u015f\/\"))\n  (message \"Di\u011fer sistemlerde varsay\u0131lan proje ayarlar\u0131 kullan\u0131l\u0131yor.\"))<\/code><\/pre>\n<\/div>\n<p>Bu <code>if<\/code> ifadesini bir <code>cond<\/code> ifadesine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in imlecinizi <code>(if<\/code>&#8216;in \u00fczerine getirin. <code>lispy-mode<\/code>&#8216;da <code>(<\/code> (sol parantez) tu\u015funa basarak t\u00fcm <code>if<\/code> ifadesini yeni bir parantez i\u00e7ine al\u0131n. Ard\u0131ndan bu yeni parantezin i\u00e7ine <code>cond<\/code> yaz\u0131n. \u015eimdi <code>if<\/code>&#8216;in i\u00e7indeki ko\u015ful ve g\u00f6vdeyi <code>cond<\/code>&#8216;a uygun hale getirelim.<br \/>\n<code>if<\/code>&#8216;in ilk arg\u00fcman\u0131 olan <code>(eq system-type 'gnu\/linux)<\/code> ko\u015fulunu ve ikinci arg\u00fcman\u0131 olan <code>(my-project-setup-linux ...)<\/code> ifadesini bir <code>cond<\/code> clause&#8217;u olarak ayarlay\u0131n. Ard\u0131ndan <code>if<\/code>&#8216;in \u00fc\u00e7\u00fcnc\u00fc arg\u00fcman\u0131 olan <code>(message ...)<\/code> ifadesini <code>t<\/code> (true) clause&#8217;u olarak ayarlay\u0131n.<\/p>\n<div class=\"code-container\">\n<pre><code>(cond\n ((eq system-type 'gnu\/linux)\n  (my-project-setup-linux '(\"~\/projeler\/\" \"~\/i\u015f\/\")))\n (t\n  (message \"Di\u011fer sistemlerde varsay\u0131lan proje ayarlar\u0131 kullan\u0131l\u0131yor.\")))<\/code><\/pre>\n<\/div>\n<p>Bu d\u00f6n\u00fc\u015f\u00fcm, manuel olarak yap\u0131ld\u0131\u011f\u0131nda parantez hatalar\u0131na yol a\u00e7abilecekken, <code>lispy-mode<\/code>&#8216;un yap\u0131sal komutlar\u0131 sayesinde \u00e7ok daha g\u00fcvenli bir \u015fekilde ger\u00e7ekle\u015ftirilebilir. \u00d6zellikle <code>(<\/code> (lispy-wrap) ve <code>C-<right><\/code> (lispy-splice) gibi komutlar, bu t\u00fcr d\u00f6n\u00fc\u015f\u00fcmlerde paha bi\u00e7ilmezdir. <code>lispy-mode<\/code>, kodun sadece metin de\u011fil, manip\u00fcle edilebilir bir yap\u0131 oldu\u011funu s\u00fcrekli hat\u0131rlat\u0131r.<\/p>\n<p><strong>3. \u00c7oklu D\u00fczenleme (Multi-cursor) ile Entegrasyon:<\/strong><\/p>\n<p>Bazen birden fazla benzer ifadeyi ayn\u0131 anda de\u011fi\u015ftirmek isteyebiliriz. Emacs&#8217;in <code>multiple-cursors<\/code> paketi, <code>lispy-mode<\/code> ile harika bir uyum i\u00e7indedir. \u00d6rne\u011fin, bir listedeki t\u00fcm elemanlar\u0131n ba\u015f\u0131na bir prefix eklemek istedi\u011finizde:<\/p>\n<div class=\"code-container\">\n<pre><code>(list \"elma\" \"armut\" \"kiraz\")<\/code><\/pre>\n<\/div>\n<p>\u0130mlecinizi <code>\"elma\"<\/code>n\u0131n \u00fczerine getirin. <code>lispy-mode<\/code>&#8216;da <code>s<\/code> (sexp-forward) tu\u015funa basarak s\u0131rayla di\u011fer string&#8217;lerin \u00fczerine gelin ve her birinin \u00fczerinde <code>C-><\/code> (<code>mc\/mark-next-like-this<\/code>) tu\u015funa basarak \u00e7oklu imle\u00e7 olu\u015fturun. Art\u0131k t\u00fcm string&#8217;lerin ba\u015f\u0131nda imle\u00e7leriniz var. \u015eimdi <code>\"\u00f6n-ek-\"<\/code> yaz\u0131n. T\u00fcm se\u00e7ili string&#8217;lerin ba\u015f\u0131na bu \u00f6n-ek eklenecektir. Bu, yap\u0131sal hareketlerle \u00e7oklu d\u00fczenlemeyi birle\u015ftirmenin ne kadar g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6sterir.<\/p>\n<div class=\"code-container\">\n<pre><code>(list \"\u00f6n-ek-elma\" \"\u00f6n-ek-armut\" \"\u00f6n-ek-kiraz\")<\/code><\/pre>\n<\/div>\n<p>Bu ad\u0131mlar, <code>lispy-mode<\/code>&#8216;un karma\u015f\u0131k Lisp kodunu refakt\u00f6r etme, d\u00f6n\u00fc\u015ft\u00fcrme ve y\u00f6netme konusundaki \u00fcst\u00fcn yeteneklerini a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r. Kodun yap\u0131s\u0131n\u0131 anlamas\u0131 ve bu yap\u0131 \u00fczerinde g\u00fcvenli i\u015flemler yap\u0131lmas\u0131na olanak tan\u0131mas\u0131, Lisp geli\u015ftiricileri i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline gelmesini sa\u011flar.<\/p>\n<h2>Lispy-mode Deneyiminizi Nas\u0131l \u0130leri Seviyeye Ta\u015f\u0131rs\u0131n\u0131z?<\/h2>\n<p><code>Lispy-mode<\/code>&#8216;un temel komutlar\u0131nda ustala\u015ft\u0131ktan sonra, Emacs&#8217;teki Lisp geli\u015ftirme deneyiminizi bir sonraki seviyeye ta\u015f\u0131yacak baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve entegrasyon y\u00f6ntemleri bulunmaktad\u0131r. Bu ipu\u00e7lar\u0131, i\u015f ak\u0131\u015f\u0131n\u0131z\u0131 h\u0131zland\u0131racak ve <code>lispy-mode<\/code>&#8216;dan maksimum verim alman\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<p><strong>1. Klavye K\u0131sayollar\u0131n\u0131 \u00d6\u011frenme ve \u00d6zelle\u015ftirme:<\/strong><\/p>\n<p><code>Lispy-mode<\/code>&#8216;un g\u00fcc\u00fc, sezgisel ve ergonomik klavye k\u0131sayollar\u0131nda yatar. T\u00fcm komutlar\u0131 ezberlemek yerine, en s\u0131k kulland\u0131klar\u0131n\u0131z\u0131 i\u00e7selle\u015ftirmeye odaklan\u0131n. <code>lispy-mode<\/code>&#8216;da iken <code>?<\/code> tu\u015funa basarak t\u00fcm mevcut k\u0131sayollar\u0131n bir listesini g\u00f6rebilirsiniz. Kendi \u00f6zel ihtiya\u00e7lar\u0131n\u0131za g\u00f6re k\u0131sayollar\u0131 \u00f6zelle\u015ftirmek de m\u00fcmk\u00fcnd\u00fcr. \u00d6rne\u011fin, belirli bir <code>lispy-mode<\/code> komutunu daha kolay eri\u015filebilir bir tu\u015fa atayabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>(with-eval-after-load 'lispy\n  (define-key lispy-mode-map (kbd \"C-c C-s\") 'lispy-splice) ; C-c C-s ile splice yap\n  (define-key lispy-mode-map (kbd \"C-c C-w\") 'lispy-wrap)) ; C-c C-w ile wrap yap<\/code><\/pre>\n<\/div>\n<p>Bu t\u00fcr \u00f6zelle\u015ftirmeler, kas haf\u0131zan\u0131z\u0131 geli\u015ftirmenize ve daha h\u0131zl\u0131 kod yazman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p><strong>2. Di\u011fer Emacs Paketleriyle Entegrasyon:<\/strong><\/p>\n<p><code>Lispy-mode<\/code>, tek ba\u015f\u0131na g\u00fc\u00e7l\u00fc olsa da, di\u011fer Emacs paketleriyle birle\u015fti\u011finde ger\u00e7ek potansiyelini ortaya koyar:<\/p>\n<ul>\n<li><strong><code>Magit<\/code> (Git aray\u00fcz\u00fc):<\/strong> Lisp kodunuzu refakt\u00f6r ederken veya de\u011fi\u015ftirirken, <code>Magit<\/code> ile entegrasyon, yapt\u0131\u011f\u0131n\u0131z yap\u0131sal de\u011fi\u015fiklikleri kolayca g\u00f6zden ge\u00e7irmenizi ve s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutman\u0131z\u0131 sa\u011flar. <code>Magit<\/code>&#8216;in diff (fark) g\u00f6r\u00fcn\u00fcm\u00fc, <code>lispy-mode<\/code> ile yap\u0131lan d\u00fczenlemelerin mant\u0131ksal farklar\u0131n\u0131 daha iyi anlaman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<li><strong><code>Org-mode<\/code> (Not alma ve organizasyon):<\/strong> Emacs Lisp ile <code>Org-mode<\/code>&#8216;da bloklar i\u00e7inde kod yazarken, <code>lispy-mode<\/code>&#8216;u etkinle\u015ftirerek bu bloklardaki Lisp kodunu da yap\u0131sal olarak d\u00fczenleyebilirsiniz. Bu, teknik belgelerinizdeki veya notlar\u0131n\u0131zdaki kod \u00f6rneklerini y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong><code>Yasnippet<\/code> (Kod par\u00e7ac\u0131klar\u0131):<\/strong> S\u0131k kulland\u0131\u011f\u0131n\u0131z Lisp yap\u0131lar\u0131 i\u00e7in <code>Yasnippet<\/code> \u015fablonlar\u0131 olu\u015fturarak, <code>lispy-mode<\/code> ile bu \u015fablonlar\u0131 h\u0131zla geni\u015fletebilirsiniz. \u00d6rne\u011fin, yeni bir <code>defun<\/code> veya <code>lambda<\/code> ifadesi olu\u015fturmak i\u00e7in bir \u015fablon kullanabilir ve ard\u0131ndan <code>lispy-mode<\/code> ile i\u00e7indeki bo\u015fluklar\u0131 doldurabilir veya de\u011fi\u015ftirebilirsiniz.<\/li>\n<li><strong><code>Eldoc<\/code> (Dok\u00fcmantasyon):<\/strong> <code>Eldoc<\/code>, imlecinizin alt\u0131ndaki Lisp fonksiyonlar\u0131n\u0131n veya de\u011fi\u015fkenlerinin belgelerini mini-buffer&#8217;da g\u00f6sterir. <code>lispy-mode<\/code> ile kod i\u00e7inde gezinirken, <code>Eldoc<\/code> size an\u0131nda ba\u011flamsal bilgi sa\u011flayarak, fonksiyonlar\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 hat\u0131rlaman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<p><strong>3. Makrolar ve Kendi Komutlar\u0131n\u0131z\u0131 Yazma:<\/strong><\/p>\n<p>Emacs&#8217;in en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri makrolard\u0131r. Belirli bir dizi <code>lispy-mode<\/code> komutunu s\u0131k\u00e7a tekrar etti\u011finizi fark ederseniz, bu komut dizisini bir makro olarak kaydedebilir ve tek bir tu\u015fla \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u00d6rne\u011fin, belirli bir S-expression&#8217;\u0131 kesip, yeni bir <code>let<\/code> blo\u011funa sarmalayan bir makro olu\u015fturabilirsiniz. Daha karma\u015f\u0131k otomasyonlar i\u00e7in, kendi Elisp fonksiyonlar\u0131n\u0131z\u0131 yazarak <code>lispy-mode<\/code>&#8216;un i\u015flevselli\u011fini geni\u015fletebilirsiniz. <code>lispy-mode<\/code>&#8216;un API&#8217;sini kullanarak, mevcut komutlar\u0131 birle\u015ftiren veya yeni yap\u0131sal d\u00fczenleme i\u015flemleri tan\u0131mlayan \u00f6zel fonksiyonlar olu\u015fturabilirsiniz.<\/p>\n<div class=\"code-container\">\n<pre><code>(defun my-lispy-wrap-with-let ()\n  \"Mevcut S-expression'\u0131 bir 'let' blo\u011funa sarar.\"\n  (interactive)\n  (lispy-wrap)\n  (insert \"let (()) \")\n  (lispy-backward-up-list 2) ; 'let'in i\u00e7ine git\n  (lispy-down) ; () i\u00e7ine git\n  (lispy-backward)) ; \u0130lk parantezin d\u0131\u015f\u0131na \u00e7\u0131k<\/code><\/pre>\n<\/div>\n<p>Bu basit \u00f6rnek, kendi komutlar\u0131n\u0131z\u0131 yazarak i\u015f ak\u0131\u015f\u0131n\u0131z\u0131 ne kadar \u00f6zelle\u015ftirebilece\u011finizi g\u00f6sterir.<\/p>\n<p><strong>4. Lispy-mode&#8217;un Ayarlar\u0131 (<code>customize<\/code>):<\/strong><\/p>\n<p><code>M-x customize-group RET lispy RET<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak <code>lispy-mode<\/code>&#8216;un bir\u00e7ok ayar\u0131na eri\u015febilirsiniz. Buradan, hareket komutlar\u0131n\u0131n davran\u0131\u015f\u0131ndan, parantez renklendirmesine ve otomatik hizalamaya kadar \u00e7e\u015fitli se\u00e7enekleri kendi tercihlerinize g\u00f6re ayarlayabilirsiniz. \u00d6rne\u011fin, <code>lispy-display-mode<\/code> ayar\u0131 ile imlecin etraf\u0131ndaki parantezlerin g\u00f6rselle\u015ftirme \u015feklini de\u011fi\u015ftirebilirsiniz. Bu ayarlar\u0131 ke\u015ffetmek, <code>lispy-mode<\/code> deneyiminizi ki\u015fiselle\u015ftirmenize ve daha konforlu hale getirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p><code>Lispy-mode<\/code>&#8216;u ileri seviyede kullanmak, sadece komutlar\u0131 bilmekten \u00f6te, onu kendi i\u015f ak\u0131\u015f\u0131n\u0131za entegre etmek ve Emacs&#8217;in di\u011fer g\u00fc\u00e7l\u00fc \u00f6zellikleriyle birle\u015ftirmek anlam\u0131na gelir. Bu sayede, Lisp kodunuzla \u00e7ok daha h\u0131zl\u0131, g\u00fcvenli ve keyifli bir \u015fekilde etkile\u015fim kurabilirsiniz.<\/p>\n<h2>Sonu\u00e7: Lispy-mode ile Lisp Kodunuzu Evcille\u015ftirin<\/h2>\n<p>Bu makale boyunca, Emacs&#8217;in <code>lispy-mode<\/code> paketinin Lisp tabanl\u0131 dillerle \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015f\u0131lan zorluklara nas\u0131l yenilik\u00e7i \u00e7\u00f6z\u00fcmler sundu\u011funu detayl\u0131 bir \u015fekilde inceledik. Geleneksel metin d\u00fczenleme y\u00f6ntemlerinin Lisp&#8217;in yap\u0131sal do\u011fas\u0131 kar\u015f\u0131s\u0131ndaki yetersizli\u011fini vurgulayarak ba\u015flad\u0131k ve <code>lispy-mode<\/code>&#8216;un S-expression bazl\u0131 yap\u0131sal d\u00fczenleme felsefesini anlatt\u0131k. Temel komutlar\u0131ndan kurulumuna kadar ad\u0131m ad\u0131m ilerledik ve \u00f6zellikle karma\u015f\u0131k bir Elisp yap\u0131land\u0131rmas\u0131n\u0131 refakt\u00f6r etme senaryosu \u00fczerinden <code>lispy-mode<\/code>&#8216;un ger\u00e7ek d\u00fcnya g\u00fcc\u00fcn\u00fc g\u00f6sterdik. Bir <code>progn<\/code> blo\u011funu kesip yeni bir fonksiyona yap\u0131\u015ft\u0131rmaktan, <code>lambda<\/code> ifadelerini daha temiz fonksiyonlara d\u00f6n\u00fc\u015ft\u00fcrmeye ve arg\u00fcmanlar\u0131 y\u00f6netmeye kadar bir\u00e7ok yap\u0131sal i\u015flemi <code>lispy-mode<\/code>&#8216;un sezgisel komutlar\u0131yla nas\u0131l g\u00fcvenli ve verimli bir \u015fekilde ger\u00e7ekle\u015ftirebilece\u011fimizi g\u00f6rd\u00fck. Ayr\u0131ca, <code>lispy-mode<\/code> deneyiminizi ileri seviyeye ta\u015f\u0131yacak klavye k\u0131sayolu \u00f6zelle\u015ftirmeleri, di\u011fer Emacs paketleriyle entegrasyon ve kendi komutlar\u0131n\u0131z\u0131 yazma gibi ileri d\u00fczey ipu\u00e7lar\u0131na da de\u011findik.<\/p>\n<p><code>Lispy-mode<\/code>, Lisp kodunu sadece bir karakter dizisi olarak de\u011fil, anlaml\u0131 ve manip\u00fcle edilebilir bir yap\u0131 olarak g\u00f6rmemizi sa\u011flar. Bu yakla\u015f\u0131m, &#8220;parantez cehennemi&#8221; korkusunu ortadan kald\u0131r\u0131r, kodun s\u00f6zdizimsel b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc her zaman korur ve geli\u015ftiricinin zihinsel y\u00fck\u00fcn\u00fc azalt\u0131r. Sonu\u00e7 olarak, daha az hata yapar, daha h\u0131zl\u0131 kod yazar ve refakt\u00f6r i\u015flemlerini \u00e7ok daha kolay hale getirirsiniz. \u0130ster Emacs yap\u0131land\u0131rman\u0131z\u0131 d\u00fczenliyor olun, ister karma\u015f\u0131k bir Clojure uygulamas\u0131nda \u00e7al\u0131\u015f\u0131yor olun, <code>lispy-mode<\/code> Lisp kodunuzu evcille\u015ftirmenize ve geli\u015ftirme s\u00fcrecinizden daha fazla keyif alman\u0131za yard\u0131mc\u0131 olacak vazge\u00e7ilmez bir ara\u00e7t\u0131r. Emacs ekosisteminin bu m\u00fccevherini ke\u015ffetmek, Lisp ile olan ili\u015fkinizi kesinlikle d\u00f6n\u00fc\u015ft\u00fcrecektir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Lispy-mode sadece Lisp i\u00e7in mi?<\/strong><\/p>\n<p>Evet, <code>lispy-mode<\/code> \u00f6zellikle Lisp tabanl\u0131 diller (Emacs Lisp, Common Lisp, Clojure, Racket, Scheme vb.) i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu dillerin S-expression yap\u0131s\u0131n\u0131 kullanarak yap\u0131sal d\u00fczenleme sa\u011flar. Di\u011fer diller i\u00e7in benzer i\u015flevsellik sunan farkl\u0131 paketler (\u00f6rne\u011fin, C benzeri diller i\u00e7in <code>smartparens<\/code>) bulunabilir, ancak <code>lispy-mode<\/code>&#8216;un odak noktas\u0131 Lisp&#8217;tir.<\/p>\n<p><strong>2. Paredit&#8217;ten fark\u0131 nedir?<\/strong><\/p>\n<p>Hem <code>lispy-mode<\/code> hem de <code>paredit-mode<\/code> yap\u0131sal d\u00fczenleme sa\u011flayan Emacs paketleridir. Ancak felsefeleri ve komut setleri farkl\u0131l\u0131k g\u00f6sterir. <code>Paredit<\/code>, parantez e\u015fle\u015ftirmeyi ve yap\u0131sal d\u00fczenlemeyi daha kat\u0131 kurallarla ve otomatik olarak yapmaya odaklan\u0131r, genellikle parantezlerin manuel olarak yaz\u0131lmas\u0131na izin vermez. <code>Lispy-mode<\/code> ise daha minimalist bir komut seti sunar, daha az otomatik m\u00fcdahalede bulunur ve kullan\u0131c\u0131ya daha fazla kontrol verir. Baz\u0131 kullan\u0131c\u0131lar <code>lispy-mode<\/code>&#8216;un daha sezgisel ve \u00f6\u011frenmesi daha kolay oldu\u011funu d\u00fc\u015f\u00fcn\u00fcrken, di\u011ferleri <code>paredit<\/code>&#8216;in kat\u0131 yap\u0131s\u0131n\u0131 tercih eder. Se\u00e7im ki\u015fisel tercihe ba\u011fl\u0131d\u0131r.<\/p>\n<p><strong>3. Performans sorunlar\u0131 ya\u015far m\u0131y\u0131m?<\/strong><\/p>\n<p>Genel olarak, <code>lispy-mode<\/code> olduk\u00e7a optimize edilmi\u015ftir ve modern sistemlerde \u00f6nemli bir performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olmaz. \u00c7ok b\u00fcy\u00fck Lisp dosyalar\u0131nda (on binlerce sat\u0131r) baz\u0131 durumlarda k\u00fc\u00e7\u00fck gecikmeler ya\u015fanabilir, ancak bu durum nadirdir ve \u00e7o\u011fu kullan\u0131c\u0131 i\u00e7in fark edilmez. Emacs&#8217;in kendisinin performans ayarlar\u0131 (\u00f6rne\u011fin, \u00e7\u00f6p toplama e\u015fikleri) de genel performans\u0131 etkileyebilir.<\/p>\n<p><strong>4. \u00d6\u011frenme e\u011frisi zor mu?<\/strong><\/p>\n<p>Ba\u015flang\u0131\u00e7ta, <code>lispy-mode<\/code>&#8216;un geleneksel metin d\u00fczenleme yakla\u015f\u0131mlar\u0131ndan farkl\u0131 bir d\u00fc\u015f\u00fcnce yap\u0131s\u0131 gerektirmesi nedeniyle bir \u00f6\u011frenme e\u011frisi olabilir. Ancak komutlar\u0131 genellikle tek tu\u015fluk veya basit kombinasyonlar oldu\u011fu i\u00e7in, temel hareket ve d\u00fczenleme komutlar\u0131nda ustala\u015fmak nispeten h\u0131zl\u0131d\u0131r. Birka\u00e7 saatlik pratik ve <code>?<\/code> tu\u015fu ile komut listesini s\u0131k s\u0131k kontrol etmek, \u00f6\u011frenme s\u00fcrecini h\u0131zland\u0131racakt\u0131r. Yap\u0131sal d\u00fczenlemenin getirdi\u011fi verimlilik, bu ba\u015flang\u0131\u00e7taki \u00e7abaya de\u011ferdir.<\/p>\n<p><strong>5. Hangi Lisp leh\u00e7eleri destekleniyor?<\/strong><\/p>\n<p><code>Lispy-mode<\/code>, Emacs Lisp (Elisp), Common Lisp, Clojure, Scheme ve Racket gibi ba\u015fl\u0131ca Lisp leh\u00e7elerini destekler. Bu leh\u00e7elerin hepsi S-expression tabanl\u0131 oldu\u011fundan, <code>lispy-mode<\/code>&#8216;un yap\u0131sal d\u00fczenleme yetenekleri bu dillerin t\u00fcm\u00fcnde etkin bir \u015fekilde kullan\u0131labilir. Genellikle, ilgili dil modunu etkinle\u015ftirdi\u011finizde <code>lispy-mode<\/code>&#8216;u da o mod i\u00e7in a\u00e7man\u0131z yeterlidir.<\/p>\n<p>#Emacs #Lisp #LispyMode #Yap\u0131salD\u00fczenleme #Elisp #Programlama #Geli\u015ftirmeAra\u00e7lar\u0131 #Refactoring<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/lispy-mode-lisp-code-refactoring-demo\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/lispy-mode-lisp-code-refactoring-demo<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Lisp tabanl\u0131 dillerle \u00e7al\u0131\u015f\u0131rken, \u00f6zellikle Emacs Lisp, Clojure veya Common Lisp gibi leh\u00e7elerde, kodun yap\u0131sal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak ve parantez y\u0131\u011f\u0131nlar\u0131 aras\u0131nda kaybolmamak b\u00fcy\u00fck bir zorluk olabilir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-42801","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Emacs&#039; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Emacs&#039; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?\" \/>\n<meta property=\"og:description\" content=\"Lisp tabanl\u0131 dillerle \u00e7al\u0131\u015f\u0131rken, \u00f6zellikle Emacs Lisp, Clojure veya Common Lisp gibi leh\u00e7elerde, kodun yap\u0131sal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak ve parantez y\u0131\u011f\u0131nlar\u0131 aras\u0131nda kaybolmamak b\u00fcy\u00fck bir zorluk olabilir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-23T18:12:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-23T18:13:21+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Emacs&#8217; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?\",\"datePublished\":\"2026-06-23T18:12:56+00:00\",\"dateModified\":\"2026-06-23T18:13:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\"},\"wordCount\":4038,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\",\"name\":\"Emacs' Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-23T18:12:56+00:00\",\"dateModified\":\"2026-06-23T18:13:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Emacs&#8217; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Emacs' Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/","og_locale":"tr_TR","og_type":"article","og_title":"Emacs' Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?","og_description":"Lisp tabanl\u0131 dillerle \u00e7al\u0131\u015f\u0131rken, \u00f6zellikle Emacs Lisp, Clojure veya Common Lisp gibi leh\u00e7elerde, kodun yap\u0131sal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak ve parantez y\u0131\u011f\u0131nlar\u0131 aras\u0131nda kaybolmamak b\u00fcy\u00fck bir zorluk olabilir.","og_url":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-23T18:12:56+00:00","article_modified_time":"2026-06-23T18:13:21+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Emacs&#8217; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?","datePublished":"2026-06-23T18:12:56+00:00","dateModified":"2026-06-23T18:13:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/"},"wordCount":4038,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/","url":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/","name":"Emacs' Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-23T18:12:56+00:00","dateModified":"2026-06-23T18:13:21+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/emacs-lispy-mode-ile-karmasik-lisp-kodunu-nasil-sekillendirirsiniz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Emacs&#8217; Lispy-mode ile Karma\u015f\u0131k Lisp Kodunu Nas\u0131l \u015eekillendirirsiniz?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42801","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=42801"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42801\/revisions"}],"predecessor-version":[{"id":42802,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42801\/revisions\/42802"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42801"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42801"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42801"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}