cc-modu için önce-önce-kanca


13

cc-modeKaydetmeden önce bir işlevi yürütmek için özelleştirmek istiyorum . Bir çözüm, ihtiyaç duyduğum işi yapan ve daha sonra kaydedilen bir işleve cc-modebağlanmak C-x C-siçin tuş eşlemesini değiştirmek olacaktır .

Benim sorum, bunun için özelleştirebileceğim bir kanca olup olmadığı? CC Kancalar dokümanlar bir söz etmeyin before-save-hooközel olarak cc-mode. Bu bir kanca ile nasıl yapılmalıdır?

Alternatif olarak, bunu nasıl yapabilirim defadvice? Kılavuzu okumaktan görebildiğim tek yol, kaydetmeden önce tavsiyeyi etkinleştirmek ve daha sonra iş bittikten sonra devre dışı bırakmaktı. Kulağa hantal geliyor. adviceS kullanmanın deyimsel yolu ne olurdu ?


3
Eklediğiniz işlev before-save-hookgeçerli ana modu kontrol edebilir (örn. (eq major-mode ...)) Ve özelleştirdiğiniz modla eşleşmiyorsa hiçbir şey yapamaz .
Konstantin

@Konstantin Kabul Edildi. Bu tür bir şey için daha "yerleşik" bir şey olup olmadığını kontrol etmek istedim. IIRC'nin haskell-modeen az bir after/before-savekancası vardır ve bunun prog modları için standart bir uygulama olduğunu varsaydım.
Pradhan

@Constantine: Yorumunuzu bir cevaba dönüştürebilir misiniz (elbette biraz genişleyerek)?
Dan

1
Örnek bir kullanım için bu konuya bakın after-save-hook; aynı prosedürü kullanabilir ancak yerine geçebilirsiniz before-save-hook.
Dan

Yanıtlar:


12

Bir kancanın hareketini belirli bir ana moda kısıtlamanın oldukça yaygın bir yolu, değerini kontrol etmektir major-mode.

Örneğin, bu kanca aşağıdakileri kullanarak arabellekleri kaydetmeden önce bir mesaj yazdırır c++-mode:

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

Bir yan not olarak: bazen CC Modundan büyük bir modun türetilmiş olup olmadığını kontrol etmek yararlı olabilir; eğer c-buffer-is-cc-modeolmadığını kontrol ederek yapabiliriz nil:

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))

19

Alternatif olarak, yerel bir kanca kullanın:

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

Bu ekler MY-HOOK-FUNCiçin tampon yerel before-save-hook her C ++ modu tamponu, veya C ++ Modu türetilmiş bir modda herhangi bir tampon.

Bunu açıkça kontrol eden daha zarif buluyorum major-modeve başka bir tamponu etkilemeden her bir tampon için before-save-hook yerel olarak devre dışı bırakabilmeniz avantajına sahip M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local).


-1

Bir keresinde kaydedildiğinde elisp dosyalarımı otomatik olarak derlemek için böyle bir şeye ihtiyacım vardı, böyle bir yaklaşım kullandım (yaklaşımı cc moduna dönüştürdüm):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
İlk olarak mı demek istediniz c-mode-common-hook? İkincisi, ilgili bir dili before-save-hookilk kez girdiğinizde işlevi ekleyecek gibi görünüyor C, ancak daha sonra her arabellekteki her kaydetmeden hemen önce bu işlev çağrılır. OP'nin yapması gereken, belirli bir modda olan arabellek üzerinde işlevi koşullu olarak çalıştırmaktır (nasıl yapılacağı için @ Constantine'nin yorumuna bakın).
Dan
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.