Bir alist elemanı nasıl değiştirilir?


36

Benim varsayılan olarak bu var auto-mode-alist:

("\\.js\\'" . javascript-mode)

(hatta emacs -Q). Ben yerine istediğiniz js2-modeiçin javascript-mode. Tabii ki, ben kullanabilir assq-delete-allve daha sonra add-to-listtekrar ama daha iyi bir yolu olup olmadığını merak ediyorum.

Düzenleme: Açıkça Özelleştir'i kullanmak istemiyorum , init.elkendimi üretmeyi tercih ediyorum.

Yanıtlar:


37

@ Dan'ın cevabı mükemmel bir çözüm olsa da, gereksiz. Emacs'in bir listeyi kullanmasının sebeplerinden biri, bir listeyle listenin önüne yeni bir öğe ekleyebilmenizdir ve listeyi daha da aşağıya çekecek şekilde gölgelemektir .

(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))

1
Neden aşağı oy verdiğini söylemek ister misin?
Drew

1
Cevabınızı yükselttim - teşekkürler, bilmek güzel. Sanırım downvoter bu çözümün kararsız olduğunu düşündü (kabul etmeliyim, buna rağmen düşürmek için bir neden düşünmemek zorundayım - sonuçta, hem sorunumu çözüyor hem de değerli bir bilgi!)
mbork

7
Kuşkusuz, nasıl değiştirileceği sorusuna cevap vermiyor . Onun noktası olduğunu gerekmez (sen açıklanan olandan başka bir gerek olmadıkça) yerine.
Drew

2
soru değildi gerçekten teknik anlamda değiştirilmesi ziyade üst düzey anlamda değiştirme hakkında.
Erik Allik

2
Eksileri saf alanda ise veya gelecek sürümlerde kaldırılacak olursa olsun, bu her zaman işe yarayacaktır.
politza

33

Yerdeki setfdeğeri değiştirmek için kullanın :

(setf (cdr (rassoc 'javascript-mode auto-mode-alist)) 'js2-mode)

Listedeki bir değeri değiştirmek istiyorsanız , o zaman setfyapmanız gereken genelleştirilmiş makinedir. Bununla başa çıkmak için daha aptalca bir yol için auto-mode-alist@ Drew'un cevabına (ve gölgelemenin açıklaması) bakın.


Vay. Şimdi kendimi aptal hissediyorum. Teşekkürler! (Ve (neredeyse) fikri her yerde setfJava adamlarına gösterilmeli.)
mbork

6
@mbork Perl adamları için bu klasik açıklamanın tadını çıkarabilirsiniz. lists.warhead.org.uk/pipermail/iwe/2005-Temmuz/000130.html
purple_arrows 11:14

@mbork: gerçekten aptal hissetmek için hiçbir sebep yok - setfCommon Lisp'te her zaman kullanılır, ancak elisp'te çok daha az rastlarsınız.
Dan

@Dan: doğru. Elisp kullandığı Şimdi neden merak ediyorum setfbu yüzden nadiren CL ... karşılaştırıldığında,
mbork

19

Eksileri hücresini gerçekten değiştirmenin en hızlı yolu muhtemelen setcdr

setcdr is a built-in function in `C source code'.

(setcdr CELL NEWCDR)

Set the cdr of CELL to be NEWCDR.  Returns NEWCDR.

setfEski Emacsen'de bulunmadığını, ancak setcdrolduğunu belirtmekte fayda var .


*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (setq tmp '((one . 1) (two . 2) (three . 4)))
((one . 1)
 (two . 2)
 (three . 4))

ELISP> (setcdr (assq 'three tmp) 3)
3 (#o3, #x3, ?\C-c)
ELISP> tmp
((one . 1)
 (two . 2)
 (three . 3))

Hangi Emac versiyonunun eklendiğini biliyor musunuz setf?
dshepherd

1
@ ddsperd el-değil, hayır. Neden bilmen gerekiyor? Yeni geliştirme için hedeflenmesi gereken tüm emirlerin setf olacağını söyleyeceğim, ancak bunu ayarlamak istediğiniz veri türüyle ilgili olmayabilir. Bunlara genelleştirilmiş değişkenler denir .
Sean Allred

Bazı yeni kodlarda setf kullanmanın uygun olup olmadığını bilmek istedim, ancak sizin dediğiniz gibi bir versiyonun son versiyonuna kadar istediğim şey için genel bir değişken yoktu.
dshepherd

5

OP, dize tuşlarına sahip alistleri ele alan bir çözüm istiyor. Bununla başa çıkmak için bu soruyu görün . Şans eseri sadece islamcıları sadece sembol tuşları ile tutmanız gerekiyorsa, o zaman Emacs 25'ten itibaren kullanabilirsiniz:

(setf (alist-get <key> <alist>) <value>)

Bir cdr değiştirmek için Emacs 26'ya erişiminiz varsa, bu teknik aşağıdaki gibi string tuşlarıyla çalışır:

(setf (alist-get "\\.js\\'" auto-mode-alist nil nil #'equal) 'js2-mode)

Emacs 26'da dize anahtarlarını işlemenin başka yolları da olduğunu unutmayın; bkz bu soruyu yukarıda da belirtildiği gibi.


(setf (alist-get "\\.js\\'" auto-mode-alist nil nil #'equal) 'js2-mode)çalışması gerekir (yine de Emacs 26 gerektirir).
npostavs

@RadonRosborough: Bir düzenleme özelliği var. Cevabınızı düzeltmeyi düşünün.
antonio,

alist-getDize ile kullanıyorsunuz "\\.js\\'", ancak alist-getdayanıyor assq, bu nedenle yanıtınızda iddia ettiğiniz bir dize ile çalışmaz.
antonio

@ antony Oh evet, tamamen haklısın. Gönderildiği gibi soru aslında dize tuşları işleyen bir çözüm gerektirdiğini fark etmemişti. Düzenlemeyi yapacağım, teşekkürler!
Radon Rosborough

2

Javascript-modunu bir daha kullanmayacağınızı biliyorsanız, auto-mode-alist'e dokunulmaz ve init.el'inizi ekleyin.

  (defalias 'javascript-mode 'js2-mode "Some handy explanation goes here.")

1
Aslında hayır yoktur javascript-mode, gerçekten: javascript-modesadece bir takma addır js-mode(varsayılan olarak) ve bu şekilde yapıldığını özellikle tercih ettikleri eğer önermek gibi kullanıcıların yapabileceği şekilde js2-mode(kullanım yeteneğini kaybetmeden js-modeistedikleri taktirde).
Stefan

Cevabımı cperl modu ve nxml modu için takma alışkanlığından türettim. Peki burada hile ne yapardın? (defalias 'js modu' js2 modu)?
Matthias

1
Beni Yanlış Anladın. Cevabınızın tam olarak doğru olduğunu ve "javascript-mode" kullanmanızı engellemediğini söylüyorum, çünkü bu isim ile adlandırdığınız şey gerçekten js-mode( perl-modeörneğin, bunun için olanların aksine ).
Stefan,

Anladım ... (geçici javascript modu kullanıcısı burada)
Matthias
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.