एलिस्ट के एक तत्व को कैसे बदलें?


36

मेरे पास डिफ़ॉल्ट रूप से यह है auto-mode-alist:

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

(साथ भी emacs -Q)। मैं स्थानापन्न करना चाहते हैं js2-modeके लिए javascript-mode। बेशक, मैं इस्तेमाल कर सकता हूं assq-delete-allऔर फिर add-to-listसे, लेकिन मैं सोच रहा हूं कि क्या बेहतर तरीका नहीं है।

संपादित करें: मैं स्पष्ट रूप से अनुकूलित का उपयोग नहीं करना चाहता , मैं अपने init.elआप को क्राफ्ट करना पसंद करता हूं।

जवाबों:


37

जबकि @ डैन का जवाब पूरी तरह से ठीक समाधान है, यह अनावश्यक है। Emacs यहाँ एक alist का उपयोग करता है, इसका एक कारण यह है कि एक alist के साथ आप सूची के सामने एक नया तत्व जोड़ सकते हैं और यह सूची से नीचे की ओर मेल खाएगा

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

1
कहने के लिए परवाह क्यों downvote?
ड्रॉ हुआ

1
मैंने आपके उत्तर को गलत ठहराया - धन्यवाद, यह जानना अच्छा है। मुझे लगता है कि डाउनवॉटर ने सोचा कि यह समाधान अयोग्य है (मुझे कहना होगा कि मैं सहमत हूं, हालांकि इसे डाउनवॉट करने का एक कारण नहीं माना जाता है - आखिरकार, यह दोनों मेरी समस्या को हल करता है और जानकारी का एक मूल्यवान टुकड़ा है!)
एमबॉर्क

7
कुल मिलाकर, यह इस सवाल का जवाब नहीं देता है कि कैसे प्रतिस्थापित किया जाए । इसका मुद्दा यह है कि आपको बदलने की आवश्यकता नहीं है (जब तक कि आपके द्वारा वर्णित कुछ की आवश्यकता न हो)।
ड्रू

2
प्रश्न वास्तव में तकनीकी अर्थों में प्रतिस्थापित करने के बारे में नहीं था , बल्कि उच्च-स्तरीय अर्थों में बदल रहा था।
एरिक अल्लिक

2
यह हमेशा काम करेगा चाहे वह शुद्ध स्थान पर हो या भविष्य के किसी संस्करण में हटा दिया गया हो।
20

33

setfमान को स्थान पर बदलने के लिए उपयोग करें :

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

यदि आप सूची में एक मूल्य को बदलना चाहते हैं , तो setfसामान्यीकृत मशीनरी है जो आपको ऐसा करने की आवश्यकता है। से निपटने के लिए अधिक मुहावरेदार तरीके के लिए auto-mode-alist, @ ड्रू का उत्तर (और छायांकन की उसकी व्याख्या) देखें।


वाह। मुझे अब बेवकूफ लग रहा है। धन्यवाद! (और हर जगह setfसक्षम होने का विचार वास्तव में जावा लोगों को दिखाया जाना चाहिए।)
mbork

6
@mbork आप पर्ल लोगों को इस क्लासिक स्पष्टीकरण का आनंद दे सकते हैं। lists.warhead.org.uk/pipermail/iwe/2005-July/000130.html
purple_arrows

@ ओंबर्क: वास्तव में मूर्खता महसूस करने का कोई कारण नहीं है - setfआम लिस्प में हर समय उपयोग किया जाता है, लेकिन आप इसे बहुत कम समय में पूरा करते हैं।
दान

@ दान: सच है। अब मैं सोच रहा हूँ कि setf
एलएलएफ

19

वास्तव में कॉन्स सेल को बदलने का सबसे तेज़ तरीका शायद है setcdr

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

(setcdr CELL NEWCDR)

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

यह ध्यान देने योग्य है कि setfपुराने Emacsen में उपलब्ध नहीं है, लेकिन setcdrहै।


*** 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))

क्या आपको पता है कि Emacs का कौन सा संस्करण जोड़ा गया है setf?
दशहरा

1
@ हैंडशीप ऑफ-हैंड नहीं, नहीं। तुम क्यों जानना चाहते हो? मैं कहूंगा कि नए विकास के लिए लक्षित होने वाले किसी भी ईएसीएस को सेट करना होगा, लेकिन जिस तरह का डेटा आप सेट करना चाहते हैं, उसके लिए इसे संभालना नहीं हो सकता है। वे सामान्यीकृत चर कहलाते हैं ।
सीन एलेड

मैं जानना चाहता था कि क्या कुछ नए कोड में सेटफ़ का उपयोग करना ठीक है, लेकिन जैसा कि आपने कहा कि यह पता चलता है कि जो कुछ भी हाल ही में एक संस्करण था, उसके लिए कोई सामान्यीकृत चर नहीं था।
dshepherd

5

ओपी एक समाधान के लिए पूछता है जो स्ट्रिंग कुंजी वाले एलिस्ट को संभालता है। इसे संभालने के लिए, इस प्रश्न को देखें । यदि संयोग से आपको केवल प्रतीक कुंजियों के साथ मुट्ठी को संभालने की आवश्यकता है, तो 25 Emacs के रूप में आप उपयोग कर सकते हैं:

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

एक सीडीआर को बदलने के लिए। यदि आपके पास 26 Emacs तक पहुँच है, तो यह तकनीक स्ट्रिंग कुंजियों के साथ काम करती है, इस प्रकार है:

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

ध्यान दें कि स्ट्रिंग कुंजियों को संभालने के लिए Emacs 26 में अन्य तरीके भी हैं; देखने के इस सवाल के रूप में ऊपर उल्लेख किया।


(setf (alist-get "\\.js\\'" auto-mode-alist nil nil #'equal) 'js2-mode)काम करना चाहिए (हालांकि 26 Emacs की आवश्यकता है)।
npostavs

@RadonRosborough: इसमें एडिट फीचर है। आप जवाब तय करने पर विचार करें।
एंटोनियो

आप alist-getस्ट्रिंग के साथ उपयोग कर रहे हैं "\\.js\\'", लेकिन alist-getयह आधारित है assq, इसलिए यह स्ट्रिंग के साथ काम नहीं करेगा जैसा कि आप अपने उत्तर में दावा करते हैं।
एंटोनियो

@antonio ओह हाँ, आप पूरी तरह से सही हैं। मुझे एहसास नहीं था कि वास्तव में पोस्ट किए गए प्रश्न को एक समाधान की आवश्यकता होती है जो स्ट्रिंग कुंजियों को संभालती है। मैं संपादन करता हूँ, धन्यवाद!
रेडॉन रोसबोरो

2

यदि आप जानते हैं कि आप जावास्क्रिप्ट-मोड का उपयोग नहीं करेंगे तो फिर से ऑटो-मोड-एलिस्ट को अछूता रहने दें और अपने init.el में जोड़ें।

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

1
वास्तव में, वास्तव में ऐसा नहीं है javascript-mode: javascript-modeकेवल js-mode(या डिफ़ॉल्ट रूप से) के लिए एक उपनाम है और यह विशेष रूप से इस तरह से किया गया था ताकि उपयोगकर्ता आप की तरह सुझाव दे सकें यदि वे चाहें js2-mode( यदि वे चाहें js-modeतो उपयोग करने की क्षमता खोए बिना )।
स्टीफन

मैंने अपना जवाब cperl-mode और nxml- मोड के लिए उपनाम की आदत से प्राप्त किया। तो यहाँ क्या चाल होगी? (डिफालियाज़ 'js-mode' js2-mode)?
मथायस

1
आपने मुझे गलत समझा। मैं कह रहा हूं कि आपका उत्तर बिल्कुल सही है और आपको "जावास्क्रिप्ट-मोड" का उपयोग करने से नहीं रोकता है क्योंकि आप उस नाम से कॉल करते हैं जो वास्तव में है js-mode( perl-modeउदाहरण के लिए , इसके विपरीत जो होता है )।
स्टीफन

मिल गया ... (आकस्मिक जावास्क्रिप्ट-मोड उपयोगकर्ता यहाँ)
मथायस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.