リストの要素を置き換える方法は?


36

私はこれをデフォルトで持っていますauto-mode-alist

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

(でもemacs -Q)。の代わりにしたいjs2-modeですjavascript-mode。もちろん、使用assq-delete-allしてからadd-to-listもう一度使用することもできますが、より良い方法がないかどうか疑問に思っています。

編集:明示的にカスタマイズを使用したくありませんinit.el。自分で作成することを好みます。

回答:


37

@Danの答えは完全に素晴らしい解決策ですが、それは不要です。ここでEmacsがalistを使用する理由の1つは、alistを使用すると、リストの先頭に新しい要素を追加するだけで、リストのさらに下の一致シャドーするためです。

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

1
なぜ下票するのかを気にかけますか?
ドリュー14

1
私はあなたの答えを支持しました-ありがとう、知っているのは良いことです。私は(! -すべての後に、その両方が私の問題を解決し、情報の貴重な作品である私は、私は同意することを言わなければならない、しかしそれdownvotingの理由は考えていない)downvoterは、このソリューションは無粋であると考え推測
mbork

7
確かに、それはを置き換える方法の質問には答えません。そのポイントは、あなた交換する必要がないということです(あなたが説明したもの以外の何らかの必要性がない限り)。
ドリュー14

2
問題は、技術的な意味での置き換えではなく、より高いレベルの意味での変更についてでした
エリックアリク14年

2
これは、短所が純粋なスペースにある場合でも、将来のバージョンで削除される場合でも、常に機能します。
ポリツァ

33

使用setfして値を変更します:

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

リスト内の値を置き換えたい場合setfは、そうする必要がある一般的な機械です。を扱うより慣用的な方法については、auto-mode-alist@ Drewの回答(およびシャドウイングの説明)を参照してください。


ワオ。今はバカだ ありがとう!(そして、(ほぼ)すべての場所のアイデアsetfをJavaの人たちに実際に示す必要があります。)
mbork 14

6
@mbork Perlの人たちへのこの古典的な説明をお楽しみください。 lists.warhead.org.uk/pipermail/iwe/2005-July/000130.html
purple_arrows

@mbork:馬鹿げていると感じる理由は本当にありません-Common setfLispでは常に使用されていますが、elispではあまり頻繁に実行されません。
ダン

@Dan:true。elispのは使用していない、なぜ今、私は思ったんだけどsetfCLに比べ、そうめったに...
mbork

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か知っていますか?
dshepherd

1
@dsheperdはオフハンドではありません。なぜあなたは知る必要があるのですか?新規開発のターゲットとすべきemacsにはsetfがありますが、設定したい種類のデータには対応していない可能性があります。それらは一般化変数と呼ばれます
ショーンオール

新しいコードでsetfを使用しても大丈夫かどうかを知りたかったのですが、あなたが言ったように、とにかくあまりにも最近のバージョンまで、私が欲しかったものに対する一般化された変数はありませんでした。
dshepherd

5

OPは、文字列キーを持つリストを処理するソリューションを求めています。それを処理するには、この質問を参照してください。偶然にシンボルキーを持つリストを処理する必要がある場合、Emacs 25の時点では次を使用できます。

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

cdrを置き換える。Emacs 26にアクセスできる場合、この手法は次のように文字列キーで機能します。

(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)動作するはずです(ただし、Emacs 26が必要です)。
npostavs

@RadonRosborough:編集機能があります。答えを修正することを検討してください。
アントニオ

あなたはalist-get文字列"\\.js\\'"で使用していますが、に alist-get基づいていassqますので、答えで主張するように文字列では動作しません。
アントニオ

@antonioそうそう、あなたは完全に正しいです。私は投稿された質問が実際に文字列キーを処理する解決策を必要とすることを理解していませんでした。編集します、ありがとう!
ラドンロズバラ

2

javascript-modeを再び使用しないことがわかっている場合は、auto-mode-alistをそのままにしてinit.elに追加します。

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

1
実際には、実際にはありませjavascript-modeん:( デフォルト)のjavascript-modeエイリアスにすぎず、ユーザーが希望する場合は(必要に応じて使用する機能を失うことなく)ユーザーが提案できるように、特にjs-modeこの方法で行われました。js2-modejs-mode
ステファン

私は、答えをcperl-modeとnxml-modeのエイリアシングの習慣から導き出しました。では、ここで何をするのでしょうか?(defalias 'js-mode' js2-mode)?
マティアス

1
あなたは私を誤解した。あなたの答えは正確であり、「javascript-mode」を使用することを妨げるものではないと言っています。なぜなら、あなたはその名前で呼ぶものが実際にあるからですjs-modeperl-modeたとえば、
ステファン

それを手に入れた...(ここでは、カジュアルなjavascriptのモードのユーザー)
マティアス・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.