Kancaları nasıl “gruplandırabilirim”?


14

Sondaki boşlukların görüntülenmesi, arabellek sınırlarının görüntülenmesi, gökkuşağı renkli sınırlayıcılar ve çoğu modda etkinleştirmek istediğim daha pek çok şey veya daha ziyade, tüm programlama ve metinle ilgili olanları ( diyelim ki ediff-mode, ana modla çatışır), istisna kuralları olan küreselleştirilmiş bir küçük modu kullanmak yerine. En modlarını türetilir yana prog-modeya da text-mode, her iki söz konusu fonksiyonu ilave edilmesi prog-mode-hookve text-mode-hookçalışır, ancak örneğin, bu tarifnamede aşağıdaki yeterli modu vardır css-modeya da LaTeX-mode.

Şimdilik sadece bir kanca fonksiyon eklemek için tüm bu modları kapsayan bir kanca tanımlamak istiyorum. Diyelim non-special-mode-hook(ayırt etmek için special-mode-hook). Yapıldığı tüm büyük modlar için çalıştırılan böyle bir kancayı nasıl oluşturabilirim?


Yanıtlar:


19

Bu ayarları bir işlev içinde gruplandırın ve bu işlevi ilgili tüm kanca işlevlerine ekleyin:

(defun my-non-special-mode-setup ()
  (setq show-trailing-whitespace t)
  ...)
(dolist (hook '(prog-mode-hook text-mode-hook css-mode-hook ...))
  (add-hook hook 'my-non-special-mode-setup))

Bunu yapmanın başka hiçbir yolu daha kısa olamaz: ne olursa olsun, bir yerde beyaz listeye veya kara listeye sahip olacaksınız. Pratikte, listeye eklenmesi gereken birkaç mod bulacaksınız, bu yüzden sadece işleri basit tutmanızı öneririm.

Kendi yapılandırmamda, birkaç lisp odaklı modun yapılandırmasını birleştirmek için tam olarak bu hileyi kullanıyorum .


Teşekkür ederim, sanırım bu çözümü diğer yararlı gruplara da (lispy gibi) uyarlayacağım.
wasamasa

1
Ben de tam olarak bunu yapıyorum: github.com/purcell/emacs.d/blob/…
sanityinc

1
Mükemmel, cevabınıza URL'yi ekleyebilir misiniz? Vurgulanan snippet'in sadece gerçek kullanımı çok iyi açıklamakla kalmayıp aynı zamanda daha büyük bir "kanca" alt kümesi olarak Emacs Lisp ile ilgili "kanca" kullanımı ve mevcut ana modlardan otomatik olarak kanca adları nasıl oluşturulacağı gibi daha fazla kullanım gösterdiğine inanıyorum ile derived-mode-hook-name.
wasamasa

Sadece için, benim daha bu fazla gibi ben (dolist ...)vs (add-hook ...)<tekrarı>. Ben sadece moda özgü değişiklikleri ayrı (mod başına dosya use-package,, el-get) tutarken benim ile yapışır . Her ikisi de hepsi bir arada çözümler ancak farklı bakış açılarından.
Jonathan Leech-Pepin

Buraya sıfır olmayan bir APPENDargüman sunmazsanız add-hook, kancaların sağladığınız liste sırasından ters sırada çağrılacağını unutmayın. Bunda yanlış bir şey yok; sadece siparişin önemli olduğu durumlarda bunun farkında ol.
Drew

5

after-change-major-mode-hookYeni modun ilginç bir işlev olup olmadığını (muhtemelen üzerinden (not (derived-mode-p 'special-mode))) kontrol eden ve çalıştığında bir işlev ekleyebilirsiniz non-special-mode-hook.


Bu oldukça şık görünüyor (bir kez tüm "özel" modları anladıktan sonra sadece bir kaçını kullanmak fundamental-mode, ancak sadece metin görüntülemek daha fazlasını yapmak), ama benim zevkime göre biraz fazla büyü. Bu yüzden upvote.
wasamasa

4

Kendimi sık sık @ sanityinc'in ayarlarımı ve küçük mod aktivasyonlarını bir defun içinde sarma ve çağrmak için kancalar arasında dolaşarak yaptıklarını gördüm, ancak daha temiz bir yaklaşım istedim, bu yüzden bu makroyu yazdım:

(defmacro hook-modes (modes &rest body)
  (declare (indent 1))
  `(--each ,modes
     (add-hook (intern (format "%s-hook" it))
               (lambda () ,@body))))

Not: dash.elTemizlik için kullanıyorum, ancak kullanıma kolayca uyarlanabilir (dolist).

Ardından gruplanmış modları liste değişkenleri olarak tanımlayabilir ve şöyle kullanabilirsiniz:

(defvar progish-modes
  '(prog-mode css-mode sgml-mode))

(hook-modes progish-modes
  (highlight-symbol-mode)
  (highlight-symbol-nav-mode))

1
Burada derived-mode-hook-namebir modun kanca değişkeninin adını almak ve böylece internhile önlemek için kullanabilirsiniz unutmayın .
sanityinc

@sanityinc TIL derived-mode-hook-name. güzel ipucu!
waymondo

1

Tüm bu türetilmemiş modlar için çalışan yeni bir kanca tanımlamak yerine aşağıdakileri yapabilirsiniz.

(defun run-my-hooks ()
  "Run all the following functions in the hook"
  (smartparens-mode 1)
  (whitespace-mode 1)
  (my-needed-mode 1)
  ...)

(add-hook 'specific-mode-hook 'run-my-hooks)
(add-hook 'another-mode-hook 'run-my-hooks)

Yine de tüm modlara eklemeniz gerekecektir, ancak işlevinizi tüm modları içerecek şekilde tanımlayarak, ek özellikler eklerken / kaldırırken yalnızca bir tanımı değiştirmeniz gerekecektir.


-2

Belki bunu deneyebilirsiniz:

(setq lisp-dialects-mode-hook '(lisp-mode-hook
                            lisp-interaction-mode-hook
                            emacs-lisp-mode-hook
                            ;; common-lisp-mode-hook
                            scheme-mode-hook
                            clojure-mode-hook
                            cider-repl-mode-hook
                            ))

(add-hook 'lisp-dialects-mode-hook 'func)
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.