Emacs için otomatik hizalama paketi veya modu var mı?


15

Tampon içeriğini anında hizalamak istediğim dosyaları (örneğin, Kukla tezahürleri) düzenlediğim zamanlar var. Örneğin, ben seçtim sürece kullanabilirsiniz align-regexpveya alignbu gibi kod hizalamak için biliyorum:

# M-x align-regexp "=>" will line everything up nicely 
file { "/etc/foo":
  ensure => present,
  mode => "0666",
  source => "puppet:///modules/example/foo",
}

Ama gerçekten istediğim, bunun bir bölgeyi veya tüm tamponu seçmek zorunda kalmadan anında gerçekleşmesini sağlamak . Bunu yapacak bir paket veya mod var mı, yoksa ilgilendiğim modda inşa edilmesi gereken bir şey mi var?

Düzenleme: Ben bu günlerde kod ne bu yana Kukla ve CFEngine hakkında sordum ve hizalanmış metin için güçlü bir tercih var. Bununla birlikte, anında hizalamanın Emacs modlarında (çoğunlukla programlama dilleri modlarında) yaygın olan bir özellik olup olmadığını veya çoğu insanın kaydederken veya bazılarında hizalanıp hizalanmadığını merak ettim (ve bunu iyi ifade etmedim). diğer nokta.


Art arda daha büyük kapsamları seçmek için yararlı olan genişleme bölgesi vardır .
bastibe

1
Genellikle neyi hizalayacağınız hakkında daha fazla bilgi verebilir misiniz? Sadece eşit işaretler mi ve kukla modunda mı? @Malabarba tarafından otomatik girintiye yönelik bu Emacs SE yanıtındaki kodu istediğinizi elde etmek için değiştirebilirsiniz. Bunun yerine indent-regionsahip align-to-equalsgibi bu işlevi (defun align-to-equals (begin end) (interactive "r") (align-regexp begin end "\\(\\s-*\\)=" 1 1 nil)); ve emacs-lisp-mode-hookile puppet-mode-hook.
Kaushal Modi

Yanıtlar:


5

Otomatik hizalama için bir bölgeyi işaretlemek istiyorsanız, muhtemelen aşağıdaki gibi bir şeyle yapmak çok zor değildir:

(require 'cl-lib)

(defvar my--auto-align-overlays nil)
(make-variable-buffer-local 'my--auto-align-overlays)

(defun my-auto-align (beg end regexp)
  (interactive "r\nsRegexp: ")
  (let ((ol (make-overlay beg end)))
    (overlay-put ol 'evaporate t)
    (overlay-put ol 'my--auto-align-regexp regexp)
    (overlay-put ol 'modification-hooks '(my--auto-align-function))
    (push ol my--auto-align-overlays)
    (add-hook 'post-command-hook 'my--auto-align-pch nil t)))

(defun my--auto-align-function (ol &rest _args)
  (cl-pushnew ol my--auto-align-overlays)
  (add-hook 'post-command-hook 'my--auto-align-pch nil t))

(defun my--auto-align-pch ()
  (dolist (ol my--auto-align-overlays)
    (align-regexp (overlay-start ol) (overlay-end ol)
                  (concat "\\(\\s-*\\)" (overlay-get ol 'my--auto-align-regexp))
                  1 align-default-spacing))
  (setq my--auto-align-overlays nil)
  (remove-hook 'post-command-hook 'my--auto-align-pch))

Ancak tam otomatik olmasını istiyorsanız, hangi bölgeleri otomatik olarak hizalamak istediğinizi (ve hangi regexp ile) karakterize etmenin bir yolunu bulmanız gerekir, bu da daha zordur. Sanırım bazı normal ifadeler sağlayabilir ve daha sonra bu normal ifadelerden biriyle eşleşen ardışık satırlar için arabelleği tarayabilirsiniz.


Daha önce kaplama kullanmadım, ancak Elisp kılavuzu görünüşü değiştirmek için olduklarını söylüyor - bunu doğru anladım mı? Öyleyse, bu yanıt, kaydedildikten sonra dosyanın gerçek içeriğinden ziyade yalnızca arabellek görünümünü değiştirdiği anlamına mı geliyor? (Aradığım ikinci şey, ancak görünüşü değiştirmek ilginç bir seçenek olurdu.)
Saint Aardvark Halı

2
@SaintAardvarktheCarpeted Kaplamalar genellikle görünümü değiştirmek için kullanılır, ancak uygulanabilirlikleri bunun ötesine geçer. Bu cevapta (IIUC), bindirmeler hizalanacak bölgeleri işaretlemek için kullanılır (böylece tampon sadece görünüm değil, gerçekten değiştirilir). İşlev my-auto-alignbu kaplamaları tanımlamak için kullanılır (hizalamak istediğiniz bölgeleri işaretleyin). Stefan (bence) Stefan'ın tüm bu sorunlardan geçmesinin sebebi, (tamponun aksine) sadece tüm tamponu hizalamaya çalışırsanız, istenmeyen sonuçlar elde edersiniz, bu yüzden parçaları bir seferde hizalamanız gerekir.
Malabarba

3

Kukla Modu sağlar puppet-align-block. Bu işlevin otomatik olarak çağrılmasını ayarlayabilirsiniz; örneğin, post-command-hookyerel olarak (denenmemiş) ekleyerek :

(defun puppet-auto-align ()
  (unless (puppet-in-string-or-comment-p)
    (puppet-align-block)))

(define-minor-mode puppet-auto-align-mode
  :init-value nil
  :keymap nil
  :lighter "PAl"
  :group 'puppet-lint
  (if puppet-auto-align-mode
      (add-hook 'post-command-hook #'puppet-auto-align nil 'local)
    (remove-hook 'post-command-hook #'puppet-auto-align 'local)))

(add-hook 'puppet-mode-hook #'puppet-auto-align-mode)

Yine de, bunu yapmamak için iyi bir neden olduğunu unutmayın. Özellikle akıllı değildir ve otomatik hizalama daha kıvrımlı bir Kukla kodu için işe yaramazsa, herhangi bir yerde yapabileceğiniz herhangi bir manuel hizalamanın üzerine yazacaktır.

Bu nedenle - Kukla Modu sürdürücüsü olarak konuşuyorum - buna karşı öneriyorum ve bu kodu kullanıyorsanız size yardımcı olmayacağız veya hata raporlarını kabul etmeyeceğiz.

Ayrıca, büyük kaynak blokları için yavaş olabilir, bu nedenle muhtemelen post-command-hookdoğrudan yerine boşta bir zamanlayıcı kullanmak istersiniz .

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.