Defcustom nasıl düzgün kullanılır?


15

Çoğu Emacs kullanıcısı gibi, değişkenleri değiştirerek bir modu özelleştirdim. Bana hiç gelmeyen, özelleştirilebilir bu ve bunun arkasındaki programlama zihniyeti. Bunu eshell için bazı kaynak kodlarına bakmaya başladığımda fark ettim. Ben elisp programcı değilim, ama özellikle em-ls.elkullanmak gibi görünüyor defcustom, defgroupvb Bu global tanımlanmış değişkenleri o elisp kod kullandığı bir gölge dünya olacak gibi görünüyor. Öyleyse bir soru şu olabilir: defcustomKüresel değişkenleri (özelleştirilebilir) yapmanın başka bir yolu var mı?

Birisi beni arkasındaki tüm fikri doğru bir şekilde nasıl kullanacağımı (önce anlayacağımı) defcustom, ne zaman kullanılacağını, neden, ne zaman kullanmadığımı gösterebilir mi? Belki de yeni başlayanlar için yeni bir başlangıç ​​örneği.


Ne istediğini açıklığa kavuşturabilir misin? customizeTesisleri ne zaman kullanacağınız ile ne zaman elle özelleştireceğinizi bilmek ister misiniz ? Yoksa bir mod yazmak mı istiyorsunuz? İkincisi, aslında kendinizi defcustomve benzeri şeyleri kullanarak bulabileceğiniz durumdur .
Dan

Yanıtlar:


20

özelleştirme sistemi bir Emacs özelliği yerleşik tam sorunu çözmek için tasarlanmıştır tarif-programlama ortalama kullanıcı kendi editörü yapılandırmak için ideal bir yol olmayabilir olduğunu.

Özelleştirme işlevinin birincil giriş noktası M-x customize RET(veya Options > Customize Emacs > Top-level Customization Groupmenüden). Buradan ayarları yapmak için etkileşimli bir menü sistemi göreceksiniz. Bu arabirim, tüm ayarların doğru tipte olmasını (sayı, dize, renk vb.) Zorlar ve kullanıcılar Emacs'ı programlı olarak yapılandırırken karşılaşılan önemli bir hata kaynağını önler. Kullanıcı, kullanıcı arayüzü üzerinden yaptığı değişiklikleri sürdürmeyi seçerse, ayarlar kullanıcının başlatma dosyasında özel bir bölüme kaydedilir (read:) .emacs.

defcustomgibi etrafında alt düzey Emacs Lisp işlevselliği sarıcı defvariki değişken beyan eder ve kişiselleştirme arayüzü içinde görünür hale getirir. Ayrıca geliştiricinin uygun bir etkileşimli kontrolü görüntülemek için gereken ek meta verileri sağlamasına izin verir - yani bu değişkente ne tür bir değer depolanır? Rasgele bir dize mi? Bir sayı? Sabit seçeneklerden bir seçim mi? vb. defgroupbu özelleştirilebilir seçenekler için hoş bir hiyerarşi halinde düzenlenebilmeleri için bir gruplama yapısıdır.

Bu işlevsellik, bir veri parçasının, kitaplığın dahili bir ayrıntısı yerine kullanıcı için yapılandırılabilir bir seçenek olarak kabul edilmesi gerektiğinde kullanılmalıdır.

İşte küçük bir kütüphanemden alınan basit bir örnek:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

defgroupÜst düzey altında Özelleştirme arayüzüne yeni bir grup oluşturur convenienceöğe. Daha sonra olası onay kutusu durumlarını saklamak için bir değişkene ihtiyacım vardı. Ben kullanmış olabilir defvar, ama bu kolayca özelleştirilebilir olmasını istiyorum çünkü ben kullanmayı tercih defcustom. Bölüm :group, daha önce tanımlanmış gruba ait olduğunu ve:type bir dizi dizisi olduğunu belirtir. Varsayılan bir değer ve bir açıklama da vardır. Kullanıcı tarafından girilen değerlerin dönüştürülmesi için ek olanaklar da (burada gösterilmemiştir) vardır.

Şimdi çalıştırırsanız M-x customize RETve gezinme için Convenience > Checkbox, aşağıdaki yazıyı bakın:

özelleştirme arayüzü

Dünyanın en güzel arayüzü değil, ancak "Checkbox Durumları" nın değerini ( checkbox-statesdahili olarak) özelleştirmek için etkileşimli araçlara sahip olduğuna dikkat edin . Geçerli dize değerlerini INS(ekle) ve DEL(sil) düğmeleriyle birlikte gösterir ve dize değerlerini düzenleme kutularında düzenlememizi sağlar. İşimiz bittiğinde, değişikliklerimizi uygulayıp uygulamayacağımızı, geri döndürüp uygulayamayacağımızı veya gelecekteki oturumlar için uygulayıp kaydedip kaydedemeyeceğimizi belirleyebiliriz.


2
İyi yazı! Özelleştirme (ve en önemli avantajları defcustom) o vardır otomatik ilgilenir : (1) tip denetimi , yardım sağlanan (bir değişkene yazarını hatalı bir değer atama engelleyen defcustommakul türü sağlamak için yapılan çaba kontrol), (2) başlatma ( :initialize) ve güncelleme katyonları (tetiklenen) ( :set).
Drew

Teşekkürler! Yayını, önerilerinizi yansıtacak şekilde güncelledik.
camdez

7

Defcustom kullanımı global değişkenleri (özelleştirilebilir) yapmanın başka bir yolu mu?

Evet. Özellikle de kodunuzun kullanıcılarının Mx özelleştirme arayüzü ile değişkenleri kolayca değiştirmesini istiyorsanız

defcustom kullanıcılarınıza iki önemli avantaj sağlar: dokümantasyon ve tip güvenliği. Belgelerin orada olması güzel. Tür güvenliği, değişkenlerinizin ne tür geçerli değerler alabileceğini belirlemenizi sağlar.

Elbette , tüm yaptığınız şey kendiniz için özelleştirmek ve daha geniş bir kullanım öngörmüyorsa defvar iyidir. Bununla birlikte, bazıları, özel ve içten içe yapışmanın, aşılamak için iyi bir alışkanlık olduğunu söyleyebilir .

Birisi beni düzgün bir şekilde nasıl kullanacağımı gösterebilir mi?

Defcustom için manuel sayfa başka açıklamalarda bulunuyor. Kılavuzdaki özelleştirmeler konusunun tüm ayrıntıları vardır.

... ne zaman kullanılır, neden, ne zaman olmaz?

Kişisel olarak geliştirme sırasında defcustom daha az hantal buluyorum çünkü defvar ve setq ile yeniden yükleme sorunları ile uğraşmak zorunda değilim .

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.