Emacs Lisp'de setq ve setq-default arasındaki fark


89

Emacs Lisp hakkında bir sorum var. Setq ve setq-default arasındaki fark nedir ?

Öğreticiler, setq'in yerel arabellekte etkili olduğunu, setq-default ise tüm arabellekleri etkilediğini söylüyor .

Yazdım Örneğin, (a-var a-değişkenler değer setq) içinde init.el , yeni bir tampon Emacs başlayan ve açıldıktan sonra bulunan, bir-var da vardır ve değeri olan bir-değişkenler değer . Orada olmaması gerektiğini sanıyordum. Setq ve setq-default arasında bir fark yok gibi görünüyor .

Anlayışımda bir sorun mu var?

Örneğin:

  1. Yazdım (123 Merhaba setq) içinde init.el dosyası, ve çalıştırmak abuffer emacs kabuk, daha sonra, giriş "Merhaba Cx Ce" , bu "123" gösterir. Bunu tüm yeni tamponlarda çalıştırdığımda da aynı şey oluyor.

  2. Yazdığım (setq sekme genişliği 4) içinde init.el dosyası. Sekme genişliğinde Cx Ce çalıştırdığımda , "8" gösteriyor (Geçerli mod "Metin" dir). Ancak (setq-default tab-width 4) kullandığımda "4" gösteriyor. Bu fenomeni açıklayamam.

Yanıtlar:


102

Emacs'teki bazı değişkenler "ara bellek yereldir", yani her arabelleğin o değişken için genel varsayılanı geçersiz kılan ayrı bir değere sahip olmasına izin verilir. tab-widthtampon yerel değişkene iyi bir örnektir.

Bir değişken arabellek yerel ise, setqyerel değerini geçerli arabellekte setq-defaultayarlar ve genel varsayılan değeri ayarlar.

Bir değişken tampon yerel değilse, o zaman setqve setq-defaultaynı şeyi yapın.

Durum 2'de, geçerli arabellekte arabellek (setq tab-width 4)yerel değerini tab-width4 olarak ayarlayın ve genel varsayılan değeri tab-width8 olarak bırakın, böylece tab-widthyerel değeri olmayan farklı bir arabellekte değerlendirdiğinizde bunu 8 gördünüz. Sonra, varsayılan değeri 4 olarak ayarladığınızda, hala yerel bir değere sahip olmadığı için bu tampon onu aldı.


Ben (sekme genişliği 4'ü ayarlar) ve değerlendirdiğinde, her arabellekte her zaman 8'dir. Neden bilmiyorum Etkili görünmüyor. Ancak (sets-default tab-width 4) kullandığımda, her arabellekte etkili oluyor. Ayrıca nedenini bilmiyorum :(
ruanhao

(setq tab-width 4)ifadeyi değerlendirdiğiniz tamponda etkili olur; Eğer *scratch*arabellekte değerlendirirseniz, o zaman tampondaki değerini inceleyin.
2013

1
tab-widthbir tampon yerel değişkendir. Yani siz (setq tab-width 4), o anki tamponda sadece 4'e ayarlanır. Diğer tüm arabellekler tab-width, genel varsayılan olan 8'i korur . Siz (setq-default tab-width 4), genel varsayılanı tab-width4 olarak değiştirirsiniz , yani artık tab-widthkendini tanımlamayan her arabellekte bu yeni varsayılan bulunur.
dfan

3
Evet. Emacs'ın Başlangıçtaki İşlem Sırası listesine bakın .
İnit

1
@ruanhao Eğer init.el'de (setq tab-width 4) iseniz, o zaman sadece o tampona (init.el) uygulanacaktır. Bu değişikliğin tüm yeni tamponlara uygulanmasını istiyorsanız, (setq-default tab-width 4) bunu başaracaktır. Ek olarak, belirli bir dosya türü için bir mod oluşturmak istiyorsanız, genel varsayılanı geçersiz kılmamak için muhtemelen (setq tab-width 4) kullanmak isteyeceksiniz.
Hemm
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.