Etkin küçük modları emacs'de nasıl listelersiniz?


Yanıtlar:


125

C-h mveya M-x describe-modetüm etkin ikincil modları (ve ana modu) ve her birinin kısa bir açıklamasını gösterir.


21

Tüm ikincil mod komutlarının bir listesi değişkende saklanır minor-mode-list. Aktif olup olmadıklarını bulmak genellikle aynı isimdeki değişkeni kontrol ederek yapılır. Böylece bunun gibi bir şey yapabilirsiniz:

(defun which-active-modes ()
  "Give a message of which minor modes are enabled in the current buffer."
  (interactive)
  (let ((active-modes))
    (mapc (lambda (mode) (condition-case nil
                             (if (and (symbolp mode) (symbol-value mode))
                                 (add-to-list 'active-modes mode))
                           (error nil) ))
          minor-mode-list)
    (message "Active modes are %s" active-modes)))

Not: Bu yalnızca geçerli arabellek için çalışır (çünkü küçük kipler yalnızca belirli arabelleklerde etkinleştirilebilir).


harita içinde listeye ekle? kıvrımlı.
jrockway

4
@jrockway En gurur duyduğum lisp anım değil.
Trey Jackson

Sizin boundpyerine kullanarak . symbolpcondition-case
Lassi

4

describe-modebir şekilde etkinleştirilmiş küçük modların bir listesini bulabilirim, neden yapamıyorum? Bu yüzden kaynak kodunu okuduktan sonra, hem minor-mode-listve hem de aktif küçük modların listesini aldığını fark ettim minor-mode-alist. Üçüncü taraf dash.elliste işleme kitaplığını kullanarak şu kodla geldim:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)

Bu nedenle, örneğin tüm küçük modları devre dışı bırakmak için şunu kullanın -each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
        (funcall it -1))

Küçük modların listesini bir değişkene kaydetmeyi unutmayın, aksi takdirde Emacs'i yeniden başlatmanız veya hafızayla etkinleştirmeniz gerekir.


3

Belirli bir modu etkin olan tüm arabelleklerle programlı olarak bir şeyler yapmak istiyorsanız , en iyi, en minimalist, en temiz, yerleşik çözüm aşağıdaki gibidir:

(dolist ($buf (buffer-list (current-buffer)))
  (with-current-buffer $buf
    (when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
      (message "x %s" $buf))))

Aşağıdakileri yapar:

  1. buffer-listŞu anda aktif olan arabellek listenin başında olacak şekilde tüm arabelleklerin bir listesini alın (böylece ilk önce ele alınır, genellikle ne isterseniz, ancak current-bufferumursamıyorsanız parametreyi dışarıda bırakın ).
  2. Arabellek listesi boyunca döngü yapın ve her bir arabellek adını değişkene atayın $buf.
  3. with-current-buffer $bufEmacs'e, vücuttaki tüm kodun $bufekranda gerçekten görüntülediğiniz arabellek yerine arabellek içinde çalışıyormuş gibi çalışması gerektiğini söylemek için kullanın .
  4. when <some mode variable>bir modun etkin olup olmadığını kontrol etmenin doğru yolu; ifve diğer bu tür yöntemleri de kullanabilirsiniz . Her iki durumda da amaç, küçük veya büyük modun ana mod değişkeninin arabellekte ayarlanıp ayarlanmadığını kontrol etmektir. Hemen hemen tüm modlar, modun "tanımlanması" yoluyla bir değişkeni tanımlar, bu mod otomatik olarak modun adını taşıyan bir tampon-yerel değişken oluşturmalarına neden olur, bu da böyle çalışır. Ve standart bir değişkenleri yoksa, "geçiş" kodlarının onları nasıl açıp kapatacaklarını nasıl belirlediğini görmek için kendi kaynak kodlarına bakın. % 99'u modename değişkeninin varlığını kullanıyor (ve kullanmazlarsa, bunu modun yazarına bir hata olarak bildirmenizi öneririm). Örneğin, bir arabellekte boşluk modu etkin olup olmadığını kontrol etmek için diyebilirsiniz when whitespace-mode.
  5. Bundan sonra, sadece Mesajlar tamponuna bir "x" ve modu aktif olan tamponun adı ile bir mesaj çıkarır. Keşfedilen tamponla yapmak istediğiniz her şeyi yapmak için kendi kodunuzu koyacağınız yer burasıdır.

Zevk almak! Daha büyük ve daha temiz lisp koduna doğru!


2

İşte diğer yanıtlarda zaten ele alınmış olan yöntemlerden bazılarına benzer basit bir alternatif pasaj:

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
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.