Girintili bir bloktan önce kod eklerken veya kaldırırken elisp kodunu otomatik olarak yeniden girintileme


18

Diyelim ki bir elisp kodu var:

(+ 2 3▮(+ 3
          4))

Sembol eklediğimde veya kaldırdığımda, sexp'i imleçten sonra otomatik olarak yeniden girintili hale getirmenin bir yolu var mı?

Yani bastıktan sonra SPC 4 SPCotomatik olarak alacağım:

(+ 2 3 4 ▮(+ 3
             4))

Bu kılavuzu arayarak mark-sexptakip edebilirim indent-region. Bunu yapmanın daha iyi yolları var mı?


Herhangi bir uygun varsayılan tuş takımı olduğunu sanmıyorum, ancak kolayca kendiniz oluşturabilirsiniz.
shosti

Biliyorum ama özellikle bunu yapmanın daha iyi yolları olduğunu merak ediyorum . Örneğin ne electric-indent-modekadar iyi haritalama daha <return>hiçnewline-and-indent
Maciej Goszczycki

Yanıtlar:


14

mark-sexp+ Yerine indent-region, tuşuna basabilirsiniz C-M-q. Bu arayacak indent-pp-sexp. Otomatik değil, iki komutu çağırmaktan biraz daha iyi.

Veya kullanıyorsanız paredit-modetuşuna basın M-q. Bu, içinde bulunduğunuz tüm fonksiyon tanımını hatırlatacaktır.


1
(add-hook 'post-self-insert-hook 'indent-pp-sexp)iyi çalışıyor.
Maciej Goszczycki

İyi görünüyor. Bu bazı modlarda pahalı olabilir, ancak yine de hoş bir yaklaşımdır.
Dmitry

Smartparens kullanıcıları için, geçerli defun'u ile yeniden gönderebilirsiniz M-x sp-indent-defun. Bunu buna bağlarım C-M-q.
Radon Rosborough

15

Agresif Girinti Modu

Bazı insanlar bunu istediğinden, bu cevabı bir pakete dönüştürdüm .

Melpa'yı yapılandırdıysanız,

M-x package-install RET aggressive-indent

Tüm seçenekler için Benioku dosyasına bakın , ancak açmanın en basit yolu:

(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)

Eski Cevap

Aşağıdakiler yalnızca elisp arabelleklerinde otomatik girinti yapar. Bir şeyleri sildiğinizde veya sorduğunuzda da (yalnızca yazmak yerine) çalışmanın avantajı vardır. Diğer modlara da eklemek kolaydır.

Bu işlev, noktanın içinde bulunduğu s ifadesini girintili kılacaktır. İsterseniz bir anahtara bağlayabilirsiniz, ancak önce aşağıya bakın.

(require 'cl-lib)

(defun endless/indent-defun ()
  "Indent current defun.
Do nothing if mark is active (to avoid deactivating it), or if
buffer is not modified (to avoid creating accidental
modifications)."
  (interactive)
  (ignore-errors
    (unless (or (region-active-p)
                buffer-read-only
                (null (buffer-modified-p)))
      (let ((l (save-excursion (beginning-of-defun 1) (point)))
            (r (save-excursion (end-of-defun 1) (point))))
        (cl-letf (((symbol-function 'message) #'ignore))
          (indent-region l r))))))

Bu kanca, herhangi bir şey yazdıktan sonra, ancak elisp arabelleklerinde bu işlevin çalışmasını sağlayacak şekilde yapar. Bu, her şeyi her zaman girintili tutmalıdır.

(add-hook
 'emacs-lisp-mode-hook
 (lambda ()
   (add-hook 'post-command-hook
             #'endless/indent-defun nil 'local)))

Dene! Oldukça iyi çalışıyor.

Ayrıca, @ holocronweaver'ın yorumlardaki önerisini izleyerek, c benzeri diller için aşağıdakine benzer bir şey kullanabilirsiniz:

(define-key c++-mode-map ";"
  (lambda () (interactive)
    (insert ";")
    (endless/indent-defun)))

Bu susturulmuş otomatik girintili mesajlar ve noktalı virgülle satırları bitiren daha iyi işlenmiş diller mükemmel olurdu.
holocronweaver

@holocronweaver, deneyebilirim. Hangi büyük modda girintili mesajlar var? Ve noktalı virgüllerle ilgili sorun nedir?
Malabarba

Emacs bagajında ​​denediğim tüm modlar, elisp dahil olmak üzere girinti mesajları üretti. Noktalı virgüller birçok dilde bir satırı sonlandırdığından, noktalı virgül yazana kadar aşağıdaki satır, geçerli satırın bir parçasıymış gibi atlar.
holocronweaver

@holocronweaver Mesajları susturdu. Gösterdiğiniz için teşekkürler.
Malabarba

Düzeltme için teşekkürler! Noktalı virgül sorununa bir çözüm, yalnızca noktalı virgül yazıldığında c-modu dillerinde girintidir.
holocronweaver

3

Önceden var olan bir çözümü bilmiyorum, ancak bunu post-self-insert-hookkendiniz gerçekleştirmek için kullanabilirsiniz :

(defun my-indent-next-sexp ()
  (interactive)
  (mark-sexp)
  (indent-region))

(add-hook 'post-self-insert-hook 'my-indent-next-sexp)

Yine de potansiyel performans sorunları hakkında endişelenirim.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.