리스트의 요소를 바꾸는 방법?


36

내 기본적으로 이것을 가지고 있습니다 auto-mode-alist:

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

(로도 emacs -Q). 나는 대체하고 싶습니다 js2-mode위해 javascript-mode. 물론, 내가 사용할 수있는 assq-delete-all다음 add-to-list다시,하지만 난 더 나은 방법이 아닌지 궁금하네요.

편집 : 나는 분명히 사용자 정의를 사용 하고 싶지 않습니다init.el . 내 자신을 만드는 것을 선호합니다 .

답변:


37

@Dan의 대답은 완벽하게 훌륭한 솔루션이지만 불필요합니다. 여기서 Emacs 가리스트를 사용하는 이유 중 하나는 리스트를 사용하여리스트 앞에 새로운 요소를 추가 할 수 있고리스트의 아래 부분에 그림자가 일치 하기 때문입니다 .

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

1
왜 downvote를 말 할까?
Drew

1
나는 당신의 대답을 찬성했습니다-감사합니다. downvoter는이 솔루션이 우아하지 않다고 생각했다고 생각합니다 (나는 downvoting의 이유를 고려하지 않더라도 동의한다고 말해야합니다. 결국 내 문제를 해결하고 가치있는 정보입니다!)
mbork

7
물론 교체 방법에 대한 질문에는 대답하지 않습니다 . 요점은 교체 할 필요가 없다는 것입니다 (설명한 것 이외의 다른 필요가없는 한).
Drew

2
문제는 실제로 기술적 인 의미의 교체가 아니라 상위 수준의 변화에 ​​관한 것이 었습니다.
Erik Allik

2
이것은 단점이 순수한 공간에 있거나 향후 버전에서 제거 될지라도 항상 작동합니다.
politza

33

setf적절한 값을 변경하는 데 사용하십시오 .

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

목록의 값 을 바꾸 려면 setf일반화해야합니다. 를 다루는 관용적 인 방법 auto-mode-alist은 @Drew의 답변과 그림자에 대한 설명을 참조하십시오.


와우. 지금 바보 같아 감사! (그리고 (거의) 가능한 모든 장소에 대한 아이디어 setf는 실제로 자바 사람들에게 보여 져야한다.)
mbork

6
@mbork Perl 사람들에게이 고전적인 설명을 즐길 수 있습니다. lists.warhead.org.uk/pipermail/iwe/2005-July/000130.html
purple_arrows

@mbork : 어리석은 느낌이 전혀 없습니다-Common setfLisp에서는 항상 사용되지만 elisp에서는 자주 사용하지 않습니다.
Dan

@ 단 : 사실. 이제 나는 setfCL에 비해
Elisp가

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를 가지게 될 것이라고 말하고 싶지만, 설정하고자하는 종류의 데이터를 처리하지 못할 수도있다. 이를 일반화 된 변수 라고 합니다 .
Sean Allred

새로운 코드에서 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-getstring을 사용 하고 "\\.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그들이 원하는 경우).
Stefan

cperl-mode 및 nxml-mode의 별칭 지정 습관에서 내 대답을 얻었습니다. 그래서 여기서 트릭을 어떻게할까요? (defalias 'js-mode'js2-mode)?
Matthias

1
당신은 나를 오해했다. 나는 당신의 대답이 정확히 맞으며 그 이름으로 부르는 것이 실제로 js-mode( perl-mode예를 들어 일어나는 것과는 달리) "javascript-mode"를 사용하지 못하게한다고 말하고 있습니다 .
Stefan

... (캐주얼 자바 스크립트 모드 사용자)
Matthias
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.