Etkin küçük modları emacs'de nasıl listelersiniz?
Etkin küçük modları emacs'de nasıl listelersiniz?
Yanıtlar:
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).
boundp
yerine kullanarak . symbolp
condition-case
describe-mode
bir şekilde etkinleştirilmiş küçük modların bir listesini bulabilirim, neden yapamıyorum? Bu yüzden kaynak kodunu okuduktan sonra, hem minor-mode-list
ve hem de aktif küçük modların listesini aldığını fark ettim minor-mode-alist
. Üçüncü taraf dash.el
liste 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.
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:
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-buffer
umursamıyorsanız parametreyi dışarıda bırakın ).$buf
.with-current-buffer $buf
Emacs'e, vücuttaki tüm kodun $buf
ekranda 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 .when <some mode variable>
bir modun etkin olup olmadığını kontrol etmenin doğru yolu; if
ve 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
.Zevk almak! Daha büyük ve daha temiz lisp koduna doğru!
İş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))