Emacs’e Nereden Başlamalı?

Yazılım dünyasının en eski editörlerinden Emacs, günümüzdeki diğer popüler editörlerden farklı bir kullanma ve öğrenme disiplini istiyor. Bazı temel özelliklerini öğrenmeden editörde bir dosya açmak bile zor. O nedenle Emacs’in kendi içinde gelen tutorial’ını en azından bir kez okumak, öğrendiklerini uygulamak ve birkaç hafta sabırla kullanmak gerekiyor.

Emacs Linux, Windows ve macOS işletim sistemlerinde çalışıyor. Yükleyip editörü açtığınızda ilk hali muhtemelen arzu ettiğiniz gibi görünmeyecek. Bir yandan Emacs’i öğrenirken, bir yandan da kendi zevkinize göre özelleştirmeye başlamanızı öneriyorum. İnternette yüzlerce Emacs config dosyası bulabilirsiniz, bazı kullanıcılar işi bir adım daha ileriye götürüp SpacemacsStarterKit gibi projelerle kullanıcıların ortalama ihtiyaçlarına göre hazır config dosyaları sunuyorlar. Deneyebilirsiniz; ama bana göre bu iyi bir başlangıç olmaz. Elinizde neredeyse her şeyi yapılandırabileceğiniz bir editör var ve bunu başkalarının zevklerine göre ayarlamak yerine, kendi ihtiyaçlarınızı tespit edip, bu ihtiyaçları başkalarının nasıl çözdüğüne bakarak kendi editörünüzü kendiniz yapılandırmanız daha doğru bir yaklaşım olur.

Spacemacs’te Emacs’in görünümü bu şekilde.

Emacs kendine özel bir Lisp yorumlayıcısıyla birlikte geliyor. Config dosyalarınızı bir Lisp script’i yazar gibi hazırlıyorsunuz. Daha önce hiç Lisp yazmadıysanız, buradan başlayabilirsiniz:

https://learnxinyminutes.com/docs/elisp

Config dosyası genellikle kullanıcı ev dizininizde ~/emacs.el veya ~/.emacs.d/init.el olarak saklanıyor. Yapılandırma dosyası hakkında daha fazla bilgi almak için okumaya buradan başlayabilirsiniz:

https://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html

Belgeyi okuyup config dosyası hazırlamak gözünüzü korkutmasın, size açıklayarak küçük bir örnek göstereceğim. Benim config dosyam, önce paketleri kontrol etmek, eğer kurulmamış paket varsa da kurmakla başlıyor. Paketler, editöre ekstra özellik kazandıran kodlar içerir ve bunlar genellikle küçük dosyalardan oluşmazlar, örneğin HTML kodları, içinde CSS ve JavaScript kodu barındırdığında parse etmesi çok zordur, bunun için ek paket kurmak isteyebilirsiniz veya Emacs içinde bir git istemcisi kullanmak isteyebilirsiniz. Helm paketi ile Emacs komut satırını daha da güçlendirmek isteyebilirsiniz:

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(when (not package-archive-contents) (package-refresh-contents))
(defvar my-packages
  '(auto-complete
    flx-ido
    helm
    helm-ag
    helm-ls-git
    js2-mode
    magit
    markdown-mode
    scss-mode
    web-mode)
  "A list of packages to ensure are installed at launch.")
(dolist (p my-packages)
  (when (not (package-installed-p p)) (package-install p)))
Lisp

Editörü kullandıkça bazı ihtiyaçlar ortaya çıkmaya başlıyor. Örneğin bir projede çok uzun süre çalışıp daha sonra başka bir projeye geçmek istediğimde arka planda açık olan tüm dosya yedeklerini silmek istiyorum. Bunun için `kill-other-buffers` adında bir fonksiyon yazdım ve bu fonksiyonu bir klavye kısayoluna atadım (Ctrl c, k):

(defun kill-other-buffers ()
 “Kill all other buffers.”
 (interactive)
 (mapc ‘kill-buffer (delq (current-buffer) (buffer-list)))
 (message “All other buffers are killed..”))(global-set-key (kbd “C-c k”) ‘kill-other-buffers)
Lisp

Emacs’i olabildiğince sade kullanmaya çalışıyorum. O nedenle menüyü, açılış ekranını kaldırdım, imleç pozisyonunu satır uzunluğunu anlayabilecek şekilde yapılandırdım, fontumu değiştirdim, dosya kaydederken beyaz boşlukların otomatik silinmesini sağladım, parantezlerin otomatik kapatılması gibi birçok ayarı etkinleştirdim:

(setq-default truncate-lines t)
(setq inhibit-splash-screen t)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(tool-bar-mode -1)
(setq visible-bell 1)
(column-number-mode t)
(set-face-attribute ‘default nil :font “Fira Code” :height 105 :weight ‘normal :width ‘normal)
(ido-mode 1)
(ido-everywhere 1)
(flx-ido-mode 1)
(setq ido-enable-flex-matching t)
(setq ido-use-faces nil)
(setq-default indent-tabs-mode nil)
(electric-pair-mode 1)
(add-hook ‘before-save-hook ‘delete-trailing-whitespace)
(ac-config-default)
Lisp

Editörde dosya açarken, aynı dizinde geçici bir dosya oluşturulduğunu göreceksiniz. Bu dosyaların ortalıkta değil de, başka bir yerde tek bir dizin içinde saklanmasını sağlıyorum:

(setq backup-directory-alist `((“.*” . ,temporary-file-directory)))
(setq auto-save-file-name-transforms `((“.*” ,temporary-file-directory t)))
Lisp

Son olarak, normalde uzun satırları kırmayı sevmiyorum, tek satırda göstermesi benim için daha iyi; ama metin dosyaları hariç, onlarda uzun satırları kırıp satırbaşıymış gibi göstermesini sağlıyorum:

(add-hook ‘markdown-mode-hook ‘visual-line-mode)
(add-hook ‘text-mode-hook ‘visual-line-mode)
Lisp

40 yıllık editör için yapılandırmam bundan ibaret. Yapılandırmanızı ne kadar basit tutarsanız o kadar iyi. Eğer Emacs ile ilgileniyorsanız, aşağıdaki linklere de göz atın, istediğiniz zaman yorum yazıp bana soru iletebilirsiniz.

Kaynaklar

  1. Bilgem Çakır, “Kullandığım Araçlar: Emacs”, https://youtu.be/qXw0ocR_XBI
  2. Üstün Özgür, “Emacs: Özgür Yazılım Devriminin Editörü”, https://youtu.be/FsN3Yp05_aQ
  3. Örnek config dosyası: https://github.com/gkmngrgn/emacs-config/blob/master/init.el
  4. Spacemacs projesi: http://spacemacs.org/
  5. Awesome Emacs: https://github.com/emacs-tw/awesome-emacs