Custom.el yerine setq ile değişkenlerin ayarlanmasının avantajları?


69

Pek çok insanın (uzatma yazarları ve diğerleri) konfigürasyon örnekleri verdiğini görüyorum setq:

(setq foo 'bar)

Bu parametreler çoğu zaman defcustomözelleştirme için kullanılabilir hale getirilerek tanımlanır custom.el.

Genelde custom.elonları ayarlamak için kullanırım. setqBunun yerine kullanmanın herhangi bir avantajı var mı , yoksa iki yöntem kabaca mı?

Yanıtlar:


86

Bazı insanlar kullanımının daha kolay olduğunu düşünebilir setq. Bazı insanlar daha lispy olduğunu düşünebilir. Gerçekte, bu genel durumda saf değildir.

Bazı kullanıcı seçenekleri için önemli olmadığı doğrudur. Ancak diğerleri için fark eder ve setqbu seçenekler için yanlış bir yaklaşımdır. Genel bir kural setqolarak, yanlış bir yaklaşımdır.

Kullanıyorsanız custom-set-variablesveya customize-set-variablebunun yerine kullanıyorsanız veya setqKullanıcı arayüzünü özelleştir (örneğin M-x customize-option) kullanıyorsanız, seçenek değeri için gereken herhangi bir başlatma veya güncelleme kodunun otomatik olarak tetiklendiğinden ve gerektiği gibi çalıştırılacağından emin olursunuz. Kullanırsanız setq, bu olmayacak.

Şimdi, aynı zamanda en kullanıcı seçenekleri, 3. taraf kütüphaneleri için yazılmış Bunlardan özellikle birçok kullanımı yapmazlar durumda defcustomanahtar kelimeler :setve :initializeve kullanma setqonlar için önemli değildir. Ancak birçok vanilya Emacs seçeneği bu anahtar kelimeleri kullanır ve bunu yapanlar setqiçin doğru olan şey değildir. Yani, Lisp kodunu kullanmak ve seçeneklerinizi ayarlamak için Kullanıcı Arayüzünü kullanmak istemiyorsanız, kullanmak yerine custom-set-variablesya da customize-set-variableyerine kullanmanız daha iyi olur setq. Asla acıtmaz ve bazen çok yardımcı olur.

Ancak önerdiğim şey şu ikisinin de yapılması:

  • Bunun için Lisp kodu yazmak yerine UI'yi Özelleştir'i kullanın .

  • Değişken tanımlayıncustom-file ; böylece Özelleştir, bu dosyaya özelleştirmeleri init dosyanıza ( ~/.emacs) yazmaz . IOW, elle yazılmış başlangıç ​​kodunuzu, Customize tarafından yazılan otomatik koddan ayrı tutun.


1
Bu cevap harika ve yeni başlayanlar için gerçekten çok yararlı olduğunu düşünüyorum, bu tür soru / cevapları teşvik etmenin bir yolu var mı?
Willyfrog

5
Bence: set ve: initialize parametrelerinde bile setq, paket yüklenmeden önce okunuyorsa hala çalıştığını söylemeye değer.
Malabarba

2
@Willyfrog Bunu kaldırabilirsin!
Zane Shelby

17
Bundan emin değilim Drew. Özelleştirme şey oldukça karmaşık. Onsuz, emacs sistemi çok daha basittir. Özelleştirme, elisp ile tam olarak örülmeyen bir katmandır. Birincisi, tüm alfabelere göre değişir. Ayrıca, birçok kişiselleştirme değişkenlerle ilgili değildir (örneğin, kancalar, anahtarlar) bu nedenle kişiselleştirme kullanamazsınız. Öyleyse, zaten elisp kodunun durumu var.
Xah Lee,

4
@XahLee. Şey, eminim. ;-) Ama evet, Özelleştir, budur. Anahtarlar, kancalar, font kilidi anahtar sözcükleri, ekran tabloları vb. İçin en iyi şey değildir. Değil o UI harika, ama vb tetikleyiciler, tip denetimi, ele alınması faydalıdır. Hatta programcılar (opsiyonel) gibi şeyler kullanmak isterdim :typeile defvarbunu kullanıcı seçeneklerine sınırlı olmalıdır sanmıyorum -. Ne yazık ki, pek çok programcı kullanımında tembeldir :typeve sonuç çok yardımcı değildir (bu Özelleştirme hatası değildir).
Drew

37

Tercihim setqüzerinde customizeçeşitli nedenlerden dolayı:

  1. Öncelikle ve en önemlisi, değişkenlerin programlı olarak ayarlanmasına izin verir (olduğu gibi (setq foo (calculate-foo))). Bu gücü her zaman DRY'yi saklamak için konfigürasyonumda kullanırım. Benim için, Emacs kullanmanın asıl amacı programlanabilirliktir ve customizearayüz yol almaktan başka bir şey yapmaz.
  2. setqsürüm kontrolü ve kod organizasyonu için kendisini daha iyi ödünç veriyor. Başlatma işlemimi onlarca dosya arasında paylaştım; Her şey büyük bir custom.eldosyada olsaydı, ayarları hızlıca bulmak ve düzenlemek çok daha zor olurdu.
  3. Bu öznel, ancak bana göre bütün customizearayüz 90'ların en kötü kullanıcı arayüzlerinden gelen korkunç bir kalıntı gibi geliyor. Herhangi bir gün Emacs'in gücüyle metni düzenlemeyi tercih ederim.

@Drew :setve ile bazı inceliklerini hakkında bazı iyi noktalar yapar :initialize. Emacs'ı yıllardır kullanıyorum ve bunun gibi nadiren karşılaşıyorum. Ben ne zaman, dışarı takas kolay setqiçin custom-set-variableözel durumlarda.


10
1. Değişkenleri programlı olarak programlı olarak ayarlayabilirsiniz customize-set-variable(s)ve otomatik olarak çalıştırdıkları tetikleyiciler nedeniyle daha iyidir. 2. Tüm set ve / veya kaydedilmiş değişkenlerinizi farklı hiyerarşilerde görmek için çeşitli kişiselleştirme komutlarını kullanabilirsiniz, böylece sürüm kontrolünde ayrı dosyalar kullanmak zorunda kalmadan farklı grupların organizasyonunu otomatik olarak elde edebilirsiniz. 3. Çok daha iyi hale geldi. Kullanıcı arayüzünü beğenmezseniz, özelleştirmeyi kullanmanın diğer tüm avantajlarını elde etmek için yine de kişiselleştirmeyi programlı olarak ve kişiselleştirme modunu engelleyen etkileşimli komutlar aracılığıyla kullanabilirsiniz.
Nick McCurdy

23

Kullanmanın bir avantajı setqyerine customizeokunabilirliği olduğunu. Kişi, her özelleştirmeyi IMO'nun okunabilirliğini artıran bir beğeniye eklemekte serbesttir. Ayrıca modülerliği artıran ilgili özelleştirmeleri birlikte gruplayabilirsiniz. Son olarak, elisp arabelleğinde gezinmenin daha "kolay" olduğunu ve daha sonra gezinmenin kişisel kullanıcı arayüzü ve widget'ları özelleştirdiğini iddia ediyorum.

Öte yandan, kişiselleştirme, işler yoldayken paha biçilemez olan varsayılan değerlere kolayca dönmenizi sağlar.

EDIT: Drew'un cevabı, customize-set-variablesişaret ettiğim tüm avantajları sağlayabilecek harika bir neden sağlar. Bununla birlikte, Özelleştirme Kullanıcı Arabirimi, farklı platformlardaki taşınabilir yapılandırmalara ham elisp kadar kolay bir şekilde borç vermez. Os bağımlı ayarına sahip bir değişkene ihtiyacınız varsa, birçok durumda açıklığa kavuşturmak için geri dönüş yapmanız gerekecektir. Elisp arabelleklerinde kolay gezinme hakkındaki noktam hala duruyor.


Ayrıca, varsayılan değere geri dönebilir setq, setqsatırı yorumlayabilir ve emacs'ı yeniden başlatabilirsiniz.
T. Verron

3
Evet, ancak kişiselleştirme sinir bozucu yeniden başlatmalar olmadan geri dönebilir. Yeni ayarları denemek için son derece yararlı.
Vamsi

2
Ek açıklama ile ilgili olarak, kişiselleştirme arayüzü, değiştirdiğiniz her değişkene bir yorum eklemenizi sağlar.
Andrew Swann

custom-set-variables ise "ham elisp" ve birden çok makinelerde her gün kullanabilirsiniz. Sadece kişiselleştirmenin yazdığı yerden kopyalayın (eğer kendiniz yazmadıysanız).
Croad Langshan

<kbd> Mx customize- * </kbd> arayüzünde bir yorumun bir değişkenle birlikte saklanmasına izin veren bir "yorum" alanı vardır.
kdb

-1

Diğer bir alternatif ise John Wiegley'in kullanım paketini kullanmaktır . Bu, emacs 24+ paket başlatma işlemiyle güzelce oynayan paketleri yapılandırmak için programlı bir yol sağlar. Benioku kullanımına bir örnek:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

Mesele şu ki, kullanım paketi bir makrodur ve argümanlarını hemen değerlendirmez. :initVe :configparametreler mümkün tek bir yerde her paketin konfigürasyonuna sahip, ancak her parçası başlangıçı uygun bir aşamasında yürütmek için yapım başlatma sürecinin farklı aşamalarında değerlendirilir.

Gibi use-packagebir paket olmadan bazı paketler başlangıç ​​kodunun (package-initialize)bir kısmını daha önce gitmek ve başka bir kısmını daha sonra gitmek için gerektirir. Bunun gibi çok sayıda paketiniz varsa, o zaman iadesi başlatılmaları serpiştirilmelidir.

Bunun bir başka yararı da use-package, .emacs'leri yeni bir makineye götürürseniz veya yapılandırmanızı başka bir kullanıcıyla paylaşırsanız ve bir paketin gerçekten yüklenmesi gerekene kadar tüm başlatma işlemlerinin ertelenmesi durumunda eksik paketleri otomatik olarak paket.el'i kullanarak kurmasıdır.

Başlatma işlemi üzerinde daha fazla kontrol sağlayan ek anahtar sözcük argümanları da vardır.

Tüm söylenen, özelleştirmenin büyük bir avantajı, size herhangi bir pakette ne yapılandırılacağını göstermesidir. Bu, paketlerimin çoğunda hala kullanmamın bir nedeni.


2
Bu aslında soruyu cevaplamıyor. Cevabınız, setq kullanarak neden açıklama yapmıyorsunuz?
J David Smith

3
Bence use-packagemodüler konfigürasyonun avantajlarını ve aynı zamanda paketleri tek bir yerde ithal edip konfigüre etmenin avantajlarını sunuyor. Ama evet, örnek kullanıyor setq. customize-set-variableBurada da kullanılmış olabilir mi? Emin değilim. Bunun customize-set-valueiçin değiştirebilir miyiz (veya ) setq?
mike,

4
Lütfen :customanahtar kelimeyi kullanması için örneği değiştirin .
Toon Claes
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.